dfa: consider methods in @Immutable classes referentially transparent (IDEA-167658)

This commit is contained in:
peter
2017-02-10 09:34:49 +01:00
parent 1cb1966489
commit 696cbf6b26
3 changed files with 22 additions and 0 deletions
@@ -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;
}
@@ -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());
}
}
}
@@ -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();