diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/OverwrittenFieldAnalyzer.java b/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/OverwrittenFieldAnalyzer.java index 52d35fd61520..43d606748ed6 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/OverwrittenFieldAnalyzer.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/OverwrittenFieldAnalyzer.java @@ -146,6 +146,8 @@ final class OverwrittenFieldAnalyzer { return "@" + write + (wasRead ? " (wasRead)" : ""); } } + + private record EntryPointAnchor() implements DfaAnchor {} private record WriteAnchorDescriptor(@NotNull DfaVariableValue var) implements VariableDescriptor { @Override @@ -163,6 +165,11 @@ final class OverwrittenFieldAnalyzer { return DfWriteTopType.INSTANCE; } + @Override + public @NotNull DfType getInitialDfType(@NotNull DfaVariableValue thisValue, @Nullable PsiElement context) { + return new DfWriteAnchorType(new EntryPointAnchor(), false); + } + @Override public String toString() { return "writtenAt(" + var + ")"; @@ -220,7 +227,7 @@ final class OverwrittenFieldAnalyzer { varsToFlush.forEach(state::flushVariable); if (var.getPsiVariable() instanceof PsiField && anchor != null) { DfaVariableValue wnr = myFactory.getVarFactory().createVariableValue(new WriteAnchorDescriptor(var)); - state.meetDfType(wnr, new DfWriteAnchorType(anchor, false)); + state.updateDfType(wnr, old -> new DfWriteAnchorType(anchor, false)); } } } diff --git a/java/java-tests/testData/inspection/defUse/FieldNoOverwriteEmptyElse.java b/java/java-tests/testData/inspection/defUse/FieldNoOverwriteEmptyElse.java new file mode 100644 index 000000000000..c5b7e5f6c941 --- /dev/null +++ b/java/java-tests/testData/inspection/defUse/FieldNoOverwriteEmptyElse.java @@ -0,0 +1,12 @@ +public class FieldNoOverwriteEmptyElse { + boolean myField; + + void test(int x) { + if (x != 1) { + myField = true; + } + if (x == 3) { + myField = false; + } else {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DefUseTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DefUseTest.java index 6ecab8e82668..cab82951f5e7 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DefUseTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DefUseTest.java @@ -62,6 +62,7 @@ public class DefUseTest extends LightJavaCodeInsightFixtureTestCase { public void testFieldOverwrite() { doTest(); } public void testFieldOverwriteAfterQualifierUpdate() { doTest(); } public void testFieldNoOverwrite() { doTest(); } + public void testFieldNoOverwriteEmptyElse() { doTest(); } public void testAssignmentInCatch() { doTest(); } public void testFieldCouldBeUsedOutside() { doTest(); }