From cb6448267d83d771312cbf786befee09bdbe242f Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Sun, 9 May 2021 15:42:14 +0700 Subject: [PATCH] [java-dfa] Fix stack flushing GitOrigin-RevId: e953c3be78bcc3e43fcc9777d8573ff3650638e4 --- .../codeInspection/dataFlow/DfaMemoryStateImpl.java | 5 +++-- ...lableCallWithPrecalculatedValueAndSpecialField.java | 10 ++++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/NullableCallWithPrecalculatedValueAndSpecialField.java 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 564be609a685..9e064955d207 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 @@ -1129,8 +1129,9 @@ public class DfaMemoryStateImpl implements DfaMemoryState { doFlush(value, true); } myStack.replaceAll(val -> { - DfType type = val.getDfType(); - if (ContainerUtil.or(type.getDerivedVariables(), dv -> !dv.isStable() && qualifierStatusMap.shouldFlush(val, dv.isCall()))) { + DfType type = getDfType(val); + if (ContainerUtil.or(type.getDerivedVariables(), dv -> type.getDerivedValue(dv) != DfType.TOP && + !dv.isStable() && qualifierStatusMap.shouldFlush(val, dv.isCall()))) { return myFactory.fromDfType(type.getBasicType()); } return val; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableCallWithPrecalculatedValueAndSpecialField.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableCallWithPrecalculatedValueAndSpecialField.java new file mode 100644 index 000000000000..f67b7c02ca77 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableCallWithPrecalculatedValueAndSpecialField.java @@ -0,0 +1,10 @@ +import org.jetbrains.annotations.*; +import java.util.List; + +public class NullableCallWithPrecalculatedValueAndSpecialField { + @NotNull List test() { + return getNulableValue(); + } + + native @Nullable List getNulableValue(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index dc98f2258d57..0a42bbe2d3c9 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -702,4 +702,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testGetterNullityAfterCheck() { doTest(); } public void testInferenceNullityMismatch() { doTestWith(insp -> insp.SUGGEST_NULLABLE_ANNOTATIONS = false); } public void testFieldInInstanceInitializer() { doTest(); } + public void testNullableCallWithPrecalculatedValueAndSpecialField() { doTest(); } }