diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index aa64c0a469d0..ab7a1238204a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -650,13 +650,15 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return true; } + final boolean containsCalls = dfaLeft instanceof DfaVariableValue && ((DfaVariableValue)dfaLeft).containsCalls(); + // track "x" property state only inside "if (getX() != null) ..." - if (dfaLeft instanceof DfaVariableValue && ((DfaVariableValue)dfaLeft).containsCalls() && (!isNull(dfaRight) || !isNegated)) { + if (containsCalls && !isNotNull(dfaLeft) && isNull(dfaRight) && !isNegated) { return true; } if (dfaLeft == dfaRight) { - return !isNegated; + return containsCalls || !isNegated; } if (isNull(dfaLeft) && isNotNull(dfaRight) || isNull(dfaRight) && isNotNull(dfaLeft)) { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNullable.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNullable.java index 412cf0d92674..99831720bfe7 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNullable.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractWithNullable.java @@ -41,3 +41,21 @@ class Foo { } +class Test { + @NotNull + String getName() { + return ""; + } + + @Nullable + @Contract("!null -> !null") + String convert(@Nullable String name) { + return name; + } + + + @NotNull + String test() { + return convert(getName()); + } +} \ No newline at end of file