diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java index b336d42c2759..5960f87b6933 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/value/DfaExpressionFactory.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInspection.dataFlow.value; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInspection.dataFlow.DfaPsiUtil; import com.intellij.codeInspection.dataFlow.Nullness; import com.intellij.openapi.diagnostic.Logger; @@ -173,6 +174,9 @@ public class DfaExpressionFactory { return method; } } + if (AnnotationUtil.findAnnotation(method.getContainingClass(), "javax.annotation.concurrent.Immutable") != null) { + return method; + } } return null; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ImmutableClassNonGetterMethod.java b/java/java-tests/testData/inspection/dataFlow/fixture/ImmutableClassNonGetterMethod.java new file mode 100644 index 000000000000..d0e1032a4c66 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ImmutableClassNonGetterMethod.java @@ -0,0 +1,13 @@ +@javax.annotation.concurrent.Immutable +interface Intf { + @org.jetbrains.annotations.Nullable String foo(); +} + +class Usage { + void bar(Intf i) { + if (i.foo() != null) { + System.out.println(i.foo().length()); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 5da2b3f67dc5..26ac64e5957d 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -260,6 +260,11 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { public void testFinalGetter() { doTest(); } public void testGetterResultsNotSame() { doTest(); } + public void testImmutableClassNonGetterMethod() { + myFixture.addClass("package javax.annotation.concurrent; public @interface Immutable {}"); + doTest(); + } + public void testByteBufferGetter() { myFixture.addClass("package java.nio; public class MappedByteBuffer { public int getInt() {} }"); doTest();