From 59526abd920c46bd0b09ef3d0d7fbe6accfc1f33 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 9 Oct 2017 15:57:53 +0700 Subject: [PATCH] ControlFlowAnalyzer: pop result of resource expression (Java 9) If it's not popped, it causes misbalanced stack which may lead to exceptions/strange behavior in data flow analysis. --- .../dataFlow/ControlFlowAnalyzer.java | 1 + .../fixture/TryWithResourceExpressions.java | 19 +++++++++++++++++++ .../DataFlowInspectionTest.java | 2 ++ 3 files changed, 22 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/TryWithResourceExpressions.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 24e9beddcf1a..17fb15aee450 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -972,6 +972,7 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { } else if (resource instanceof PsiResourceExpression) { ((PsiResourceExpression)resource).getExpression().accept(this); + addInstruction(new PopInstruction()); } final List closerExceptions = ExceptionUtil.getCloserExceptions(resource); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/TryWithResourceExpressions.java b/java/java-tests/testData/inspection/dataFlow/fixture/TryWithResourceExpressions.java new file mode 100644 index 000000000000..fde305d41dc0 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/TryWithResourceExpressions.java @@ -0,0 +1,19 @@ +class Test { + public void closeable(AutoCloseable y) { + try(y) { + System.out.println("Hello"); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + public void incompleteCode(AutoCloseable y) { + try(y { + System.out.println("Hello"); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index 87abe72cbc93..0ed263c12eea 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -546,4 +546,6 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testGetterOfNullableFieldIsNotAnnotated() { doTest(); } public void testGetterOfNullableFieldIsNotNull() { doTest(); } + + public void testTryWithResourceExpressions() { doTest(); } }