From 09a1736ab6e9f41fba35dde6e3fefd130bb1751e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 2 Dec 2013 21:49:40 +0400 Subject: [PATCH] Recovery in qualified expressions --- .../jet/lang/cfg/JetControlFlowProcessor.java | 30 ++++++++++++++++--- compiler/testData/cfg/unresolved.instructions | 19 ++++++++++++ compiler/testData/cfg/unresolved.kt | 3 ++ .../jet/cfg/ControlFlowTestGenerated.java | 5 ++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/cfg/unresolved.instructions create mode 100644 compiler/testData/cfg/unresolved.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 ed6f10346de..03b6e3c2f69 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.cfg; import com.google.common.collect.Lists; +import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; @@ -78,7 +79,7 @@ public class JetControlFlowProcessor { private Pseudocode generate(@NotNull JetElement subroutine) { builder.enterSubroutine(subroutine); - CFPVisitor cfpVisitor = new CFPVisitor(false); + CFPVisitor cfpVisitor = new CFPVisitor(builder, false); if (subroutine instanceof JetDeclarationWithBody) { JetDeclarationWithBody declarationWithBody = (JetDeclarationWithBody) subroutine; List valueParameters = declarationWithBody.getValueParameters(); @@ -104,6 +105,8 @@ public class JetControlFlowProcessor { private class CFPVisitor extends JetVisitorVoid { + private final JetControlFlowBuilder builder; + private final boolean inCondition; private final JetVisitorVoid conditionVisitor = new JetVisitorVoid() { @@ -130,7 +133,8 @@ public class JetControlFlowProcessor { } }; - private CFPVisitor(boolean inCondition) { + private CFPVisitor(@NotNull JetControlFlowBuilder builder, boolean inCondition) { + this.builder = builder; this.inCondition = inCondition; } @@ -145,7 +149,7 @@ public class JetControlFlowProcessor { visitor = this; } else { - visitor = new CFPVisitor(inCondition); + visitor = new CFPVisitor(builder, inCondition); } element.accept(visitor); checkNothingType(element); @@ -702,7 +706,25 @@ public class JetControlFlowProcessor { public void visitQualifiedExpression(@NotNull JetQualifiedExpression expression) { JetExpression selectorExpression = expression.getSelectorExpression(); if (selectorExpression != null) { - generateInstructions(selectorExpression, false); + final Ref error = new Ref(false); + JetControlFlowBuilderAdapter adapter = new JetControlFlowBuilderAdapter() { + @NotNull + @Override + protected JetControlFlowBuilder getDelegateBuilder() { + return builder; + } + + @Override + public void compilationError(@NotNull JetElement element, @NotNull String message) { + error.set(true); + super.compilationError(element, message); + } + }; + new CFPVisitor(adapter, inCondition).generateInstructions(selectorExpression, false); + + if (error.get()) { + generateInstructions(expression.getReceiverExpression(), false); + } } } diff --git a/compiler/testData/cfg/unresolved.instructions b/compiler/testData/cfg/unresolved.instructions new file mode 100644 index 00000000000..1ded5bbfb2b --- /dev/null +++ b/compiler/testData/cfg/unresolved.instructions @@ -0,0 +1,19 @@ +== test == +fun test(a: Any) { + a.foo() +} +--------------------- +L0: + NEXT:[v(a: Any)] PREV:[] + v(a: Any) NEXT:[w(a)] PREV:[] + w(a) NEXT:[error(foo, No resolved call)] PREV:[v(a: Any)] + error(foo, No resolved call) NEXT:[error(foo, No resolved call)] PREV:[w(a)] + error(foo, No resolved call) NEXT:[r(a)] PREV:[error(foo, No resolved call)] + r(a) NEXT:[] PREV:[error(foo, No resolved call)] +L1: + NEXT:[] PREV:[r(a)] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== diff --git a/compiler/testData/cfg/unresolved.kt b/compiler/testData/cfg/unresolved.kt new file mode 100644 index 00000000000..6137dc5e493 --- /dev/null +++ b/compiler/testData/cfg/unresolved.kt @@ -0,0 +1,3 @@ +fun test(a: Any) { + a.foo() +} \ 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 ad139f51f2a..1732b0c3260 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -161,4 +161,9 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest("compiler/testData/cfg/ShortFunction.kt"); } + @TestMetadata("unresolved.kt") + public void testUnresolved() throws Exception { + doTest("compiler/testData/cfg/unresolved.kt"); + } + }