[java-dfa] DfaCallArguments: do not flush private final variables

GitOrigin-RevId: 054aab1ac093caff699f8710576dd929f66b8674
This commit is contained in:
Tagir Valeev
2025-01-02 13:57:07 +00:00
committed by intellij-monorepo-bot
parent 20a12d835e
commit 315776757a
3 changed files with 29 additions and 1 deletions
@@ -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;
}
@@ -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() {}
@@ -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(); }