diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaCallArguments.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaCallArguments.java index 96dacd4f0fe2..96cdd0bfebcc 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaCallArguments.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaCallArguments.java @@ -88,7 +88,8 @@ public final class DfaCallArguments { state.flushVariables(v -> v.getQualifier() == qualifier && v.getPsiVariable() instanceof PsiMember member && member != method && - member.hasModifierProperty(PsiModifier.PRIVATE)); + member.hasModifierProperty(PsiModifier.PRIVATE) && + !member.hasModifierProperty(PsiModifier.FINAL)); } return; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/PrivateMethodDoNotFlushFinalFields.java b/java/java-tests/testData/inspection/dataFlow/fixture/PrivateMethodDoNotFlushFinalFields.java new file mode 100644 index 000000000000..ccfb50335890 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/PrivateMethodDoNotFlushFinalFields.java @@ -0,0 +1,26 @@ +import org.jetbrains.annotations.Nullable; + +abstract class Foo { + + private final Bar bar; + + @Nullable + public Object foo() { + return bar != null ? bar.a().getObj(getIt(), bar.b()) : null; + } + + protected Foo(@Nullable Bar bar) { + this.bar = bar; + } + + private String getIt() { + return "it"; + } +} + +record Bar(A a, B b) { +} +record A() { + Object getObj(String s, B b) {return new Object();} +} +record B() {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java index b6148f312db1..5a50879ed708 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection21Test.java @@ -146,6 +146,7 @@ public class DataFlowInspection21Test extends DataFlowInspectionTestCase { public void testClassFileGetter() { doTest(); } + public void testPrivateMethodDoNotFlushFinalFields() { doTest(); } public void testGetterVsDirectAccess() { doTest(); } public void testGetterVsDirectAccessRecordOverriddenGetter() { doTest(); } public void testGetterVsDirectAccessNonFinal() { doTest(); }