diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/inst/MethodCallInstruction.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/inst/MethodCallInstruction.java index 107817a71464..aee31d6f7319 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/inst/MethodCallInstruction.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/inst/MethodCallInstruction.java @@ -393,21 +393,14 @@ public class MethodCallInstruction extends ExpressionPushingInstruction { DfaValue precalculated = getPrecalculatedReturnValue(); PsiType type = getResultType(); - SpecialField field = SpecialField.findSpecialField(myTargetMethod); - if (field != null) { - return field.createValue(factory, qualifierValue); + VariableDescriptor descriptor = JavaDfaValueFactory.getAccessedVariableOrGetter(myTargetMethod); + if (descriptor instanceof SpecialField || descriptor != null && qualifierValue instanceof DfaVariableValue) { + return descriptor.createValue(factory, qualifierValue); } if (precalculated != null) { return precalculated; } - if (getContext() instanceof PsiMethodReferenceExpression && qualifierValue instanceof DfaVariableValue) { - VariableDescriptor descriptor = JavaDfaValueFactory.getAccessedVariableOrGetter(myTargetMethod); - if (descriptor != null) { - return descriptor.createValue(factory, qualifierValue); - } - } - if (type != null && !(type instanceof PsiPrimitiveType)) { Nullability nullability = myReturnNullability; Mutability mutable = Mutability.UNKNOWN; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/OptionalAsQualifier.java b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalAsQualifier.java new file mode 100644 index 000000000000..fac43bb8b2fb --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/OptionalAsQualifier.java @@ -0,0 +1,36 @@ +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class OptionalAsQualifier { + + private static void example(@Nullable Container value) { + Optional optional = Optional.ofNullable(value); + if (optional.isPresent() && optional.get().getValue() != null) { + foo(optional.get().getValue()); + } + + if (value != null) { + if (value.getValue() != null) { + foo(value.getValue()); + } + } + } + + private static void foo(@NotNull Object val) {} + + private static class Container { + @Nullable private final Object val; + + private Container(@Nullable Object val) { + this.val = val; + } + + @Nullable + public Object getValue() { + return val; + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java index 89c3760d3bf6..f28d90edc057 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -260,6 +260,7 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { public void testLambdaAfterNullCheck() { doTest(); } public void testFlatMapSideEffect() { doTest(); } public void testOptionalValueTracking() { doTest(); } + public void testOptionalAsQualifier() { doTest(); } public void testClearZeroesSize() { doTest(); } public void testLambdaInlineReassignReturnWithDeeperEquality() { doTest(); }