diff --git a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java index 42ba2b8dacb..69c11a74081 100644 --- a/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java +++ b/idea/src/org/jetbrains/kotlin/idea/internal/KotlinBytecodeToolWindow.java @@ -46,6 +46,7 @@ import org.jetbrains.kotlin.codegen.KotlinCodegenFacade; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.Progress; import org.jetbrains.kotlin.descriptors.CallableDescriptor; +import org.jetbrains.kotlin.descriptors.FunctionDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor; import org.jetbrains.kotlin.diagnostics.DiagnosticSink; @@ -317,6 +318,30 @@ public class KotlinBytecodeToolWindow extends JPanel implements Disposable { if (call == null) return; ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, call); + checkResolveCall(resolvedCall); + } + + @Override + public void visitMultiDeclaration(@NotNull JetMultiDeclaration multiDeclaration) { + super.visitMultiDeclaration(multiDeclaration); + + for (JetMultiDeclarationEntry entry : multiDeclaration.getEntries()) { + ResolvedCall resolvedCall = + bindingContext.get(BindingContext.COMPONENT_RESOLVED_CALL, entry); + checkResolveCall(resolvedCall); + } + } + + @Override + public void visitForExpression(@NotNull JetForExpression expression) { + super.visitForExpression(expression); + + checkResolveCall(bindingContext.get(BindingContext.LOOP_RANGE_ITERATOR_RESOLVED_CALL, expression.getLoopRange())); + checkResolveCall(bindingContext.get(BindingContext.LOOP_RANGE_HAS_NEXT_RESOLVED_CALL, expression.getLoopRange())); + checkResolveCall(bindingContext.get(BindingContext.LOOP_RANGE_NEXT_RESOLVED_CALL, expression.getLoopRange())); + } + + private void checkResolveCall(ResolvedCall resolvedCall) { if (resolvedCall == null) return; CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); diff --git a/idea/testData/internal/toolWindow/componentInlineFun/componentInlineFun.kt b/idea/testData/internal/toolWindow/componentInlineFun/componentInlineFun.kt new file mode 100644 index 00000000000..2fbf5d34da3 --- /dev/null +++ b/idea/testData/internal/toolWindow/componentInlineFun/componentInlineFun.kt @@ -0,0 +1,9 @@ +package foo + +import inlineFun1.* + +fun test() { + val (a, b) = A() + println(a) + println(b) +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/componentInlineFun/inlineFun.kt b/idea/testData/internal/toolWindow/componentInlineFun/inlineFun.kt new file mode 100644 index 00000000000..a6b494dc24e --- /dev/null +++ b/idea/testData/internal/toolWindow/componentInlineFun/inlineFun.kt @@ -0,0 +1,8 @@ +package inlineFun1 + +class A { + inline fun component1() = foo { 1 } + inline fun component2() = foo { 2 } + + inline fun foo(f: () -> Int) = f() +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/iteratorFun/inlineFun.kt b/idea/testData/internal/toolWindow/iteratorFun/inlineFun.kt new file mode 100644 index 00000000000..badbf7023a0 --- /dev/null +++ b/idea/testData/internal/toolWindow/iteratorFun/inlineFun.kt @@ -0,0 +1,5 @@ +package inlineFun1 + +class A() { + inline fun iterator() : Iterator = throw UnsupportedOperationException() +} \ No newline at end of file diff --git a/idea/testData/internal/toolWindow/iteratorFun/iteratorFun.kt b/idea/testData/internal/toolWindow/iteratorFun/iteratorFun.kt new file mode 100644 index 00000000000..94ee1cff1ec --- /dev/null +++ b/idea/testData/internal/toolWindow/iteratorFun/iteratorFun.kt @@ -0,0 +1,9 @@ +package foo + +import inlineFun1.* + +fun test() { + for (i in A()) { + println(i) + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java index 4d034f91758..29bb6222c29 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/internal/BytecodeToolWindowTestGenerated.java @@ -35,6 +35,12 @@ public class BytecodeToolWindowTestGenerated extends AbstractBytecodeToolWindowT JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/internal/toolWindow"), Pattern.compile("^([^\\.]+)$"), false); } + @TestMetadata("componentInlineFun") + public void testComponentInlineFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/componentInlineFun/"); + doTest(fileName); + } + @TestMetadata("inlineFunctionBodyResolve") public void testInlineFunctionBodyResolve() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/inlineFunctionBodyResolve/"); @@ -65,6 +71,12 @@ public class BytecodeToolWindowTestGenerated extends AbstractBytecodeToolWindowT doTest(fileName); } + @TestMetadata("iteratorFun") + public void testIteratorFun() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/iteratorFun/"); + doTest(fileName); + } + @TestMetadata("multipleInlineFunctionCalls") public void testMultipleInlineFunctionCalls() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/internal/toolWindow/multipleInlineFunctionCalls/");