From 652c11aa07d91e2b0a6a4b9865a8c860970ee355 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 14 Apr 2011 16:54:08 +0400 Subject: [PATCH] Some fixes for try...finally --- .../jetbrains/jet/lang/cfg/JetControlFlowProcessor.java | 6 ++++++ .../org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java | 4 ++++ idea/testData/cfg/Finally.jet | 8 ++++++++ idea/testData/checker/UnreachableCode.jet | 5 +++++ idea/tests/org/jetbrains/jet/cfg/JetControlFlowTest.java | 2 +- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 23960868aae..42c35e15901 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -275,9 +275,15 @@ public class JetControlFlowProcessor { final JetFinallySection finallyBlock = expression.getFinallyBlock(); if (finallyBlock != null) { builder.enterTryFinally(new GenerationTrigger() { + private boolean working = false; + @Override public void generate() { + // This checks are needed for the case of having e.g. return inside finally: 'try {return} finally{return}' + if (working) return; + working = true; value(finallyBlock.getFinalExpression(), true, inCondition); + working = false; } }); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index eb04d9d63aa..4873be43403 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -290,6 +290,10 @@ public class TopDownAnalyzer { // This is needed in order to highlight only '1 < 2' and not '1', '<' and '2' as well Set rootElements = findRootExpressions(unreachableElements); + // TODO : (return 1) || (return 2) -- only || and right of it is unreachable + // TODO : try {return 1} finally {return 2}. Currently 'return 1' is reported as unreachable, + // though it'd better be reported more specifically + for (JetElement element : rootElements) { semanticServices.getErrorHandler().genericError(element.getNode(), "Unreachable code"); } diff --git a/idea/testData/cfg/Finally.jet b/idea/testData/cfg/Finally.jet index 76296e3f616..1e4e5003cfb 100644 --- a/idea/testData/cfg/Finally.jet +++ b/idea/testData/cfg/Finally.jet @@ -123,3 +123,11 @@ fun t3(a : Int) { } } +fun tf() { + try { + return 1 + } + finally { + return 2 + } +} \ No newline at end of file diff --git a/idea/testData/checker/UnreachableCode.jet b/idea/testData/checker/UnreachableCode.jet index 557d8f1c67d..fe4b113f4d8 100644 --- a/idea/testData/checker/UnreachableCode.jet +++ b/idea/testData/checker/UnreachableCode.jet @@ -129,3 +129,8 @@ fun blockAndAndMismatch() : Boolean { (return true) || (return false) 1 } + +fun tf() { + try {return} finally{return} + 1 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/cfg/JetControlFlowTest.java b/idea/tests/org/jetbrains/jet/cfg/JetControlFlowTest.java index 9d576b1c191..56357f955fb 100644 --- a/idea/tests/org/jetbrains/jet/cfg/JetControlFlowTest.java +++ b/idea/tests/org/jetbrains/jet/cfg/JetControlFlowTest.java @@ -58,7 +58,7 @@ public class JetControlFlowTest extends JetTestCaseBase { }; - AnalyzingUtils.analyzeNamespace(file.getRootNamespace(), ErrorHandler.THROW_EXCEPTION, new JetControlFlowDataTraceFactory() { + AnalyzingUtils.analyzeNamespace(file.getRootNamespace(), ErrorHandler.DO_NOTHING, new JetControlFlowDataTraceFactory() { @NotNull @Override public JetPseudocodeTrace createTrace(JetElement element) {