From 1b10ecf7f175de432f1a2df02b111a4fcd2c67e9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 15 Nov 2024 14:12:00 +0100 Subject: [PATCH] [java-dfa] handleClosure: fix escaping of 'this' Regression introduced in IDEA-361818 GitOrigin-RevId: faed510b342995f19cbee5d56138132c7c209662 --- .../dataFlow/java/ControlFlowAnalyzer.java | 3 +++ .../dataFlow/fixture/FieldWriteInLambda.java | 22 +++++++++++++++++++ .../DataFlowInspection8Test.java | 1 + 3 files changed, 26 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/FieldWriteInLambda.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/ControlFlowAnalyzer.java index b0e057e4d2a2..5d0f505b8c58 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/java/ControlFlowAnalyzer.java @@ -806,6 +806,9 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { if (descriptor != null) { descriptors.add(descriptor); } + if (JavaDfaValueFactory.getQualifierOrThisValue(myFactory, expression) instanceof DfaVariableValue dfaVar) { + descriptors.add(dfaVar.getDescriptor()); + } } @Override diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FieldWriteInLambda.java b/java/java-tests/testData/inspection/dataFlow/fixture/FieldWriteInLambda.java new file mode 100644 index 000000000000..1ef8e9c2365e --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FieldWriteInLambda.java @@ -0,0 +1,22 @@ +import java.util.function.BooleanSupplier; + +class FieldWriteInLambda { + private String myField; + + FieldWriteInLambda(boolean b) { + BooleanSupplier r = () -> { + myField = Math.random() > 0.5 ? "foo" : null; + return myField != null; + }; + if (b) { + r.getAsBoolean(); + if (myField == null) { + + } + } else if (r.getAsBoolean()) { + if (myField == null) { + + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java index e20a236e7783..82c42d793890 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -379,4 +379,5 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { setupTypeUseAnnotations("typeUse", myFixture); doTest(); } + public void testFieldWriteInLambda() { doTest(); } } \ No newline at end of file