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 0ae723c63e8c..1860ea35d7fb 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 @@ -79,6 +79,7 @@ public final class DfaCallArguments { // We assume that even pure call may modify private fields (e.g., to cache something) state.flushVariables(v -> v.getQualifier() == qualifier && v.getPsiVariable() instanceof PsiMember member && + member != method && member.hasModifierProperty(PsiModifier.PRIVATE)); } return; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AssertJAssert.java b/java/java-tests/testData/inspection/dataFlow/fixture/AssertJAssert.java index 5f7f87982baa..6bafa2b9db91 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/AssertJAssert.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/AssertJAssert.java @@ -1,6 +1,6 @@ package org.assertj.core.api; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.*; import java.util.Optional; import java.util.stream.*; @@ -37,6 +37,10 @@ class Sample { Assertions.assertThat(stream).isEmpty(); } + // All methods inside the org.assertj.core.api package are hardcoded to be pure by default + // See com.intellij.codeInsight.DefaultInferredAnnotationProvider.getHardcodedContractAnnotation + // We override this, otherwise it spoils the tests, as it's assumed that the same value is always returned + @Contract(pure = false) private native Optional getOptional(); public void testAs() { diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/FieldLocalNoAliasing.java b/java/java-tests/testData/inspection/dataFlow/fixture/FieldLocalNoAliasing.java new file mode 100644 index 000000000000..11660d7848a8 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/FieldLocalNoAliasing.java @@ -0,0 +1,22 @@ +import org.jetbrains.annotations.*; + +public class FieldLocalNoAliasing { + static class X { + int a = 1; + } + + void noAliasingPossible(X b) { + X x = getX(); + x.a = 1; + b.a = 211; + if (x.a == 1) { + System.out.println("1"); + } + } + + @Contract(value="->new", pure=true) + private X getX(){ + X x = new X(); + return x; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index 0c8d06e4f95d..3ffe43a36c2e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -762,5 +762,6 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testAssignAndReturnVolatile() { doTest(); } public void testQualifiedValueFromConstant() { doTest();} public void testFieldAliasing() { doTest();} + public void testFieldLocalNoAliasing() { doTest();} public void testIoContracts() { doTest(); } }