From 404f4e3fca753358d9de44c5eb50fd6d71e41b6b Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 23 Jan 2014 09:46:44 +0100 Subject: [PATCH] IDEA-119663 false positive Constant conditions & exceptions: "Argument ... might be null" --- .../dataFlow/ControlFlowAnalyzer.java | 5 +- .../dataFlow/fixture/OptionalThis.java | 46 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/OptionalThis.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 0d24142866bb..75f241975083 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 @@ -1849,13 +1849,12 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { return null; } - PsiExpression qualifier = refExpr.getQualifierExpression(); - if (qualifier == null) { + if (DfaValueFactory.isEffectivelyUnqualified(refExpr)) { return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, null); } if (!(var instanceof PsiField) || !var.hasModifierProperty(PsiModifier.TRANSIENT) && !var.hasModifierProperty(PsiModifier.VOLATILE)) { - DfaVariableValue qualifierValue = createChainedVariableValue(qualifier); + DfaVariableValue qualifierValue = createChainedVariableValue(refExpr.getQualifierExpression()); if (qualifierValue != null) { return myFactory.getVarFactory().createVariableValue(var, refExpr.getType(), false, qualifierValue); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/OptionalThis.java b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalThis.java new file mode 100644 index 000000000000..4e8547d72647 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalThis.java @@ -0,0 +1,46 @@ +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class TestInspection { + + private static class StringWrapper { + private String inner = null; + + @Nullable + public String getString() { + return inner; + } + } + + @NotNull + private final StringWrapper wrapper; + + @Nullable + private String string = null; + + public TestInspection() { + wrapper = new StringWrapper(); + } + + public void doTest() { + if (this.wrapper.getString() != null) { + doSomething(this.wrapper.getString()); + } + if (this.wrapper.getString() != null) { + doSomething(wrapper.getString()); + } + if (wrapper.getString() != null) { + doSomething(this.wrapper.getString()); + } + if (wrapper.getString() != null) { + doSomething(wrapper.getString()); + } + if (this.string != null) { + doSomething(this.string); + } + } + + private void doSomething(@NotNull String s) { + //... + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 69c31a6b270b..e4cf4c7480a5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -104,6 +104,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testChainedFinalFieldAccessorsDfa() throws Throwable { doTest(); } public void testAccessorPlusMutator() throws Throwable { doTest(); } public void testClosureVariableField() throws Throwable { doTest(); } + public void testOptionalThis() { doTest(); } public void testAssigningNullableToNotNull() throws Throwable { doTest(); } public void testAssigningUnknownToNullable() throws Throwable { doTest(); }