From ea73902b92e668b327fdb5790428b964ed931378 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 18 Dec 2012 17:52:52 +0100 Subject: [PATCH] IDEA-97017 Constant condition and expression does not recognize previous statments in anonymous inner class --- .../dataFlow/DataFlowRunner.java | 28 +++++++++---------- .../fixture/FieldInitializerInAnonymous.java | 18 ++++++++++++ .../DataFlowInspectionFixtureTest.java | 1 + 3 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/FieldInitializerInAnonymous.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java index b46d48c734ac..dd5183d451d8 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java @@ -36,6 +36,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -69,26 +70,23 @@ public class DataFlowRunner { @Nullable protected Collection createInitialStates(@NotNull PsiElement psiBlock, InstructionVisitor visitor) { - if (psiBlock.getParent() instanceof PsiMethod) { - final PsiClass containingClass = ((PsiMethod)psiBlock.getParent()).getContainingClass(); - if (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass)) { - final PsiElement parent = containingClass.getParent(); - final PsiCodeBlock block = DfaUtil.getTopmostBlockInSameClass(parent); - if ((parent instanceof PsiNewExpression || parent instanceof PsiDeclarationStatement) && block != null) { - final EnvironmentalInstructionVisitor envVisitor = new EnvironmentalInstructionVisitor(visitor, parent); - final RunnerResult result = analyzeMethod(block, envVisitor); - if (result == RunnerResult.OK) { - final Collection closureStates = envVisitor.getClosureStates(); - if (!closureStates.isEmpty()) { - return closureStates; - } + PsiClass containingClass = PsiTreeUtil.getParentOfType(psiBlock, PsiClass.class); + if (containingClass != null && PsiUtil.isLocalOrAnonymousClass(containingClass)) { + final PsiElement parent = containingClass.getParent(); + final PsiCodeBlock block = DfaUtil.getTopmostBlockInSameClass(parent); + if ((parent instanceof PsiNewExpression || parent instanceof PsiDeclarationStatement) && block != null) { + final EnvironmentalInstructionVisitor envVisitor = new EnvironmentalInstructionVisitor(visitor, parent); + final RunnerResult result = analyzeMethod(block, envVisitor); + if (result == RunnerResult.OK) { + final Collection closureStates = envVisitor.getClosureStates(); + if (!closureStates.isEmpty()) { + return closureStates; } - return null; } + return null; } } - return Arrays.asList(createMemoryState()); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FieldInitializerInAnonymous.java b/java/java-tests/testData/inspection/dataFlow/fixture/FieldInitializerInAnonymous.java new file mode 100644 index 000000000000..0eddf388f4c2 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FieldInitializerInAnonymous.java @@ -0,0 +1,18 @@ +import org.jetbrains.annotations.Nullable; + +class Zoo2 { + + void foo(@Nullable Object foo) { + if (foo == null) { + return; + } + + new Runnable() { + int hc = foo.hashCode(); + + public void run() { + } + }.run(); + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 229e2768179b..a8f16bc47040 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -51,6 +51,7 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testLocalClass() throws Throwable { doTest(); } public void testFieldInAnonymous() throws Throwable { doTest(); } + public void testFieldInitializerInAnonymous() throws Throwable { doTest(); } public void testNullableField() throws Throwable { doTest(); } public void testCanBeNullDoesntImplyIsNull() throws Throwable { doTest(); } public void testAnnReport() throws Throwable { doTest(); }