From 7e061f5eefc328d4826fa20099ad33f9a7b49e59 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 16 Sep 2014 15:09:29 +0200 Subject: [PATCH] consider non-annotated method parameters also nullable in paranoid dfa mode (IDEA-129898) --- .../codeInspection/dataFlow/value/DfaVariableValue.java | 8 +++++++- .../codeInspection/dataFlow/DataFlowInspection.java | 2 +- .../inspection/dataFlow/fixture/ParanoidMode.java | 4 ++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java index 76d0be269059..65b5e61b28a7 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaVariableValue.java @@ -30,6 +30,7 @@ import com.intellij.codeInspection.dataFlow.DfaPsiUtil; import com.intellij.codeInspection.dataFlow.Nullness; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Trinity; +import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -40,8 +41,13 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import static com.intellij.patterns.PsiJavaPatterns.*; + public class DfaVariableValue extends DfaValue { + private static final ElementPattern MEMBER_OR_METHOD_PARAMETER = + or(psiMember(), psiParameter().withSuperParent(2, psiMember())); + public static class Factory { private final MultiMap,DfaVariableValue> myExistingVars = new MultiMap, DfaVariableValue>(); private final DfaValueFactory myFactory; @@ -165,7 +171,7 @@ public class DfaVariableValue extends DfaValue { return nullability; } - Nullness defaultNullability = var instanceof PsiMember && myFactory.isUnknownMembersAreNullable() ? Nullness.NULLABLE : Nullness.UNKNOWN; + Nullness defaultNullability = myFactory.isUnknownMembersAreNullable() && MEMBER_OR_METHOD_PARAMETER.accepts(var) ? Nullness.NULLABLE : Nullness.UNKNOWN; if (var instanceof PsiParameter && var.getParent() instanceof PsiForeachStatement) { PsiExpression iteratedValue = ((PsiForeachStatement)var.getParent()).getIteratedValue(); 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 e383b6a4e89a..d7ec7920d09b 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -117,7 +117,7 @@ public class DataFlowInspection extends DataFlowInspectionBase { } }); - myTreatUnknownMembersAsNullable = new JCheckBox("Treat non-annotated methods and fields as @Nullable"); + myTreatUnknownMembersAsNullable = new JCheckBox("Treat non-annotated members and parameters as @Nullable"); myTreatUnknownMembersAsNullable.setSelected(TREAT_UNKNOWN_MEMBERS_AS_NULLABLE); myTreatUnknownMembersAsNullable.getModel().addChangeListener(new ChangeListener() { @Override diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ParanoidMode.java b/java/java-tests/testData/inspection/dataFlow/fixture/ParanoidMode.java index 96448a4d0d95..792d7a1de5b7 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ParanoidMode.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ParanoidMode.java @@ -7,6 +7,10 @@ class Test { o.hashCode(); } + void parameter(Object o) { + o.hashCode(); + } + void callUnknownMethod() { unknownObject().hashCode(); }