From 163e5cfbb43c949013f7f280ce408afb22fb9d11 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 3 Dec 2013 17:51:07 +0400 Subject: [PATCH] Properly process this in callee position --- .../jet/lang/cfg/JetControlFlowProcessor.java | 14 +++++++++++++- .../cfg/expressionAsFunction.instructions | 18 ++++++++++++++++++ compiler/testData/cfg/expressionAsFunction.kt | 3 +++ .../testData/cfg/thisExpression.instructions | 16 ++++++++++++++++ compiler/testData/cfg/thisExpression.kt | 3 +++ .../jet/cfg/ControlFlowTestGenerated.java | 10 ++++++++++ 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/cfg/expressionAsFunction.instructions create mode 100644 compiler/testData/cfg/expressionAsFunction.kt create mode 100644 compiler/testData/cfg/thisExpression.instructions create mode 100644 compiler/testData/cfg/thisExpression.kt 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");