diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ClosureInConstructor.java b/java/java-tests/testData/inspection/dataFlow/fixture/ClosureInConstructor.java new file mode 100644 index 000000000000..71508b99db14 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ClosureInConstructor.java @@ -0,0 +1,19 @@ +import org.jetbrains.annotations.Nullable; + +class A { + private @Nullable Object obj; + + A() { + Runnable r = new Runnable() { + @Override + public void run() { + if (obj == null) { + System.out.println("oops"); + } + } + }; + obj = "hello"; + r.run(); + } + +} 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 0f362ed9a8aa..de6f7d82892a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -763,4 +763,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testFieldLocalNoAliasing() { doTest();} public void testIoContracts() { doTest(); } public void testGetTernary() { doTest(); } + public void testClosureInConstructor() { doTest(); } } diff --git a/platform/analysis-impl/src/com/intellij/codeInspection/dataFlow/memory/DfaMemoryStateImpl.java b/platform/analysis-impl/src/com/intellij/codeInspection/dataFlow/memory/DfaMemoryStateImpl.java index ae63fdca2c73..06e936fd0c18 100644 --- a/platform/analysis-impl/src/com/intellij/codeInspection/dataFlow/memory/DfaMemoryStateImpl.java +++ b/platform/analysis-impl/src/com/intellij/codeInspection/dataFlow/memory/DfaMemoryStateImpl.java @@ -1766,7 +1766,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private @NotNull QualifierStatus calculate(@NotNull DfaValue qualifier) { final DfType dfType = getDfType(qualifier); if (dfType.isImmutableQualifier()) return QualifierStatus.SHOULD_NOT_FLUSH; - if (dfType.isLocal()) { + if (dfType.isLocal() && !myClosure) { return myQualifiersToFlush != null && myQualifiersToFlush.contains(qualifier) ? QualifierStatus.SHOULD_FLUSH_ALWAYS : QualifierStatus.SHOULD_NOT_FLUSH; }