diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index c153b2ad5df..5cf0978bef1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -190,7 +190,19 @@ public class JetControlFlowProcessor { @Override public void visitThisExpression(@NotNull JetThisExpression expression) { ResolvedCall resolvedCall = getResolvedCall(expression); - builder.readThis(expression, resolvedCall == null ? null : (ReceiverParameterDescriptor) resolvedCall.getResultingDescriptor()); + if (resolvedCall == null) { + builder.readThis(expression, null); + return; + } + + CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); + if (resultingDescriptor instanceof ReceiverParameterDescriptor) { + builder.readThis(expression, (ReceiverParameterDescriptor) resultingDescriptor); + } + else if (resultingDescriptor instanceof ExpressionAsFunctionDescriptor) { + // TODO: no information about actual target + builder.readThis(expression, null); + } } @Override diff --git a/compiler/testData/cfg/expressionAsFunction.instructions b/compiler/testData/cfg/expressionAsFunction.instructions new file mode 100644 index 00000000000..9f69956366b --- /dev/null +++ b/compiler/testData/cfg/expressionAsFunction.instructions @@ -0,0 +1,18 @@ +== invoke == +fun invoke(f: () -> Unit) { + (f)() +} +--------------------- +L0: + NEXT:[v(f: () -> Unit)] PREV:[] + v(f: () -> Unit) NEXT:[w(f)] PREV:[] + w(f) NEXT:[r(f)] PREV:[v(f: () -> Unit)] + r(f) NEXT:[call((f), )] PREV:[w(f)] + call((f), ) NEXT:[] PREV:[r(f)] +L1: + NEXT:[] PREV:[call((f), )] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== diff --git a/compiler/testData/cfg/expressionAsFunction.kt b/compiler/testData/cfg/expressionAsFunction.kt new file mode 100644 index 00000000000..5155947b7f6 --- /dev/null +++ b/compiler/testData/cfg/expressionAsFunction.kt @@ -0,0 +1,3 @@ +fun invoke(f: () -> Unit) { + (f)() +} \ No newline at end of file diff --git a/compiler/testData/cfg/thisExpression.instructions b/compiler/testData/cfg/thisExpression.instructions new file mode 100644 index 00000000000..feb1e8e2540 --- /dev/null +++ b/compiler/testData/cfg/thisExpression.instructions @@ -0,0 +1,16 @@ +== foo == +fun Function0.foo() { + this() +} +--------------------- +L0: + NEXT:[r(this)] PREV:[] + r(this) NEXT:[call(this, )] PREV:[] + call(this, ) NEXT:[] PREV:[r(this)] +L1: + NEXT:[] PREV:[call(this, )] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== diff --git a/compiler/testData/cfg/thisExpression.kt b/compiler/testData/cfg/thisExpression.kt new file mode 100644 index 00000000000..016713ff628 --- /dev/null +++ b/compiler/testData/cfg/thisExpression.kt @@ -0,0 +1,3 @@ +fun Function0.foo() { + this() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java index 3c56963bcd2..e6f9e934924 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -86,6 +86,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest("compiler/testData/cfg/equals.kt"); } + @TestMetadata("expressionAsFunction.kt") + public void testExpressionAsFunction() throws Exception { + doTest("compiler/testData/cfg/expressionAsFunction.kt"); + } + @TestMetadata("FailFunction.kt") public void testFailFunction() throws Exception { doTest("compiler/testData/cfg/FailFunction.kt"); @@ -176,6 +181,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest("compiler/testData/cfg/ShortFunction.kt"); } + @TestMetadata("thisExpression.kt") + public void testThisExpression() throws Exception { + doTest("compiler/testData/cfg/thisExpression.kt"); + } + @TestMetadata("typeParameter.kt") public void testTypeParameter() throws Exception { doTest("compiler/testData/cfg/typeParameter.kt");