diff --git a/idea/src/org/jetbrains/jet/lang/annotations/LabelsAnnotator.java b/idea/src/org/jetbrains/jet/lang/annotations/LabelsAnnotator.java index 3c2ef490239..c4a4d541ae7 100644 --- a/idea/src/org/jetbrains/jet/lang/annotations/LabelsAnnotator.java +++ b/idea/src/org/jetbrains/jet/lang/annotations/LabelsAnnotator.java @@ -5,6 +5,7 @@ package org.jetbrains.jet.lang.annotations; import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.Annotator; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.JetHighlighter; @@ -16,6 +17,7 @@ import org.jetbrains.jet.lexer.JetTokens; public class LabelsAnnotator implements Annotator { public void annotate(@NotNull PsiElement element, @NotNull final AnnotationHolder holder) { + if (ApplicationManager.getApplication().isUnitTestMode()) return; element.accept(new JetVisitor() { @Override public void visitPrefixExpression(JetPrefixExpression expression) { diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 74108942d7b..d2e54136d6c 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -110,6 +110,11 @@ public class JetControlFlowProcessor { value(expression.getExpression(), false); } + @Override + public void visitThisExpression(JetThisExpression expression) { + builder.readNode(expression); + } + @Override public void visitConstantExpression(JetConstantExpression expression) { builder.readNode(expression); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index a40150373e9..cba6e74c73d 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -1,5 +1,6 @@ package org.jetbrains.jet.lang.resolve; +import com.intellij.openapi.application.ApplicationManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.JetSemanticServices; import org.jetbrains.jet.lang.cfg.JetControlFlowProcessor; @@ -232,17 +233,20 @@ public class TopDownAnalyzer { JetExpression bodyExpression = function.getBodyExpression(); if (bodyExpression != null) { - System.out.println("-------------"); JetControlFlowInstructionsGenerator instructionsGenerator = new JetControlFlowInstructionsGenerator(function); new JetControlFlowProcessor(semanticServices, trace, instructionsGenerator).generate(function, bodyExpression); Pseudocode pseudocode = instructionsGenerator.getPseudocode(); pseudocode.postProcess(); - pseudocode.dumpInstructions(System.out); - System.out.println("-------------"); - try { - pseudocode.dumpGraph(new PrintStream("/Users/abreslav/work/cfg.dot")); - } catch (FileNotFoundException e) { - e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + + if (!ApplicationManager.getApplication().isUnitTestMode()) { + System.out.println("-------------"); + pseudocode.dumpInstructions(System.out); + System.out.println("-------------"); + try { + pseudocode.dumpGraph(new PrintStream("/Users/abreslav/work/cfg.dot")); + } catch (FileNotFoundException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } } } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 1cd31571da2..e992cb10c30 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -264,6 +264,7 @@ public class JetTypeInferrer { }; } + @Nullable private JetType getBlockReturnedType(@NotNull JetScope outerScope, @NotNull List block, @NotNull LabeledJumpDomain jumpDomain) { if (block.isEmpty()) { return JetStandardClasses.getUnitType(); @@ -416,7 +417,9 @@ public class JetTypeInferrer { writableScope.setThisType(receiverType); returnType = getBlockReturnedType(writableScope, body, LabeledJumpDomain.ERROR); } - result = JetStandardClasses.getFunctionType(null, receiverTypeRef == null ? null : receiverType, parameterTypes, returnType); + JetType effectiveReceiverType = receiverTypeRef == null ? null : receiverType; + JetType safeReturnType = returnType == null ? ErrorUtils.createErrorType("") : returnType; + result = JetStandardClasses.getFunctionType(null, effectiveReceiverType, parameterTypes, safeReturnType); } @Override diff --git a/idea/testData/checker/BreakContinue.jet b/idea/testData/checker/BreakContinue.jet new file mode 100644 index 00000000000..de5243502d8 --- /dev/null +++ b/idea/testData/checker/BreakContinue.jet @@ -0,0 +1,28 @@ +class C { + + fun f (a : Boolean, b : Boolean) { + @b (while (true) + @a { + break@f + break + break@b + break@a + }) + + continue + + @b (while (true) + @a { + continue@f + continue + continue@b + continue@a + }) + + break + + continue@f + break@f + } + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTest.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTest.java index fb257b919d0..d59db8f7704 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTest.java @@ -31,4 +31,8 @@ public class JetPsiCheckerTest extends LightDaemonAnalyzerTestCase { public void testQualifiedThis() throws Exception { doTest("/checker/QualifiedThis.jet", true, true); } + + public void testBreakContinue() throws Exception { + doTest("/checker/BreakContinue.jet", true, true); + } }