From 315776757a78956cbac5d67db9df1865b71ec6b6 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 2 Jan 2025 12:50:22 +0100 Subject: [PATCH] [java-dfa] DfaCallArguments: do not flush private final variables GitOrigin-RevId: 054aab1ac093caff699f8710576dd929f66b8674 --- .../dataFlow/DfaCallArguments.java | 3 ++- .../PrivateMethodDoNotFlushFinalFields.java | 26 +++++++++++++++++++ .../DataFlowInspection21Test.java | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/PrivateMethodDoNotFlushFinalFields.java 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(); }