From 4902980df0e34dc54385c5723bc28aaf8a34b79a Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 27 Sep 2011 17:05:42 +0200 Subject: [PATCH] IDEA-68815 ConstantConditions inspection inside timers --- .../dataFlow/ControlFlowAnalyzer.java | 2 +- .../dataFlow/DataFlowInspection.java | 1 + .../dataFlow/DataFlowRunner.java | 4 ++- .../dataFlow/DfaMemoryStateImpl.java | 5 +++ .../dataFlow/value/DfaValueFactory.java | 2 +- .../dataFlow/fixture/FieldInAnonymous.java | 36 +++++++++++++++++++ .../DataFlowInspectionFixtureTest.java | 2 ++ 7 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/FieldInAnonymous.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 5f7256e13009..3e0381d52e60 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1434,7 +1434,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { if (dfaValue instanceof DfaVariableValue) { DfaVariableValue dfaVariable = (DfaVariableValue)dfaValue; PsiVariable psiVariable = dfaVariable.getPsiVariable(); - if (psiVariable instanceof PsiField && !psiVariable.hasModifierProperty(PsiModifier.FINAL)) { + if (psiVariable instanceof PsiField) { addField(dfaVariable); } } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java index df3d7af8225b..c48867c0b0da 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -286,6 +286,7 @@ public class DataFlowInspection extends BaseLocalInspectionTool { PsiField field = (PsiField)resolved; if (!field.hasModifierProperty(PsiModifier.FINAL)) return false; + if (!field.hasModifierProperty(PsiModifier.STATIC)) return false; PsiElement parent = element.getParent(); if (parent instanceof PsiPrefixExpression && ((PsiPrefixExpression)parent).getOperationTokenType() == JavaTokenType.EXCL) { 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 3e27932031b3..9395f50f13c4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowRunner.java @@ -229,7 +229,9 @@ public class DataFlowRunner { @Override public DfaInstructionState[] visitMethodCall(MethodCallInstruction instruction, DataFlowRunner runner, DfaMemoryState memState) { if (myNewExpression == instruction.getCallExpression()) { - myClosureStates.add(memState.createCopy()); + DfaMemoryState copy = memState.createCopy(); + copy.flushFields(runner); + myClosureStates.add(copy); } return super.visitMethodCall(instruction, runner, memState); } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index ec33cc801cc1..d6667d0fda54 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -28,6 +28,7 @@ import com.intellij.codeInspection.dataFlow.value.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressManager; import com.intellij.psi.JavaTokenType; +import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; import com.intellij.psi.util.TypeConversionUtil; @@ -678,6 +679,10 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } public void flushVariable(@NotNull DfaVariableValue variable) { + if (variable.getPsiVariable().hasModifierProperty(PsiModifier.FINAL)) { + return; + } + final int id = variable.getID(); int size = myEqClasses.size(); int interruptCount = 0; diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java index 6f06b9521fa9..6f1bacebce4b 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java @@ -78,7 +78,7 @@ public class DfaValueFactory { PsiExpression initializer = variable.getInitializer(); if (initializer instanceof PsiPolyadicExpression && variable.hasModifierProperty(PsiModifier.FINAL)) { PsiType type = initializer.getType(); - if (type != null && type.equalsToText("java.lang.String")) { + if (type != null && type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { return getNotNullFactory().create(type); } } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FieldInAnonymous.java b/java/java-tests/testData/inspection/dataFlow/fixture/FieldInAnonymous.java new file mode 100644 index 000000000000..92d4a5deb496 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FieldInAnonymous.java @@ -0,0 +1,36 @@ +class Zoo2 { + private boolean condition; + private final boolean condition2; + + Zoo2(boolean condition2) { + this.condition2 = condition2; + } + + Runnable foo() { + if (!condition) { + return new Runnable() { + + public void run() { + if (condition) { + System.out.println("aaa"); + } + } + }; + } + if (!condition2) { + return new Runnable() { + + public void run() { + if (condition2) { + System.out.println("aaa"); + } + } + }; + } + return null; + } + + public void setCondition(boolean condition) { + this.condition = condition; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 4c356e81fe65..af8d11f9b962 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -32,4 +32,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testNullableAnonymousVolatile() throws Throwable { doTest(); } public void testNullableAnonymousVolatileNotNull() throws Throwable { doTest(); } + public void testFieldInAnonymous() throws Throwable { doTest(); } + }