when inferring purity, honor class initializers (IDEA-CR-15144)
authorpeter <peter@jetbrains.com>
Thu, 3 Nov 2016 13:08:45 +0000 (14:08 +0100)
committerpeter <peter@jetbrains.com>
Thu, 3 Nov 2016 13:46:40 +0000 (14:46 +0100)
java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractInferenceIndex.kt
java/java-tests/testSrc/com/intellij/codeInspection/PurityInferenceFromSourceTest.groovy

index c4b2b3db1d69902d5f6d830c22dbfe98c308ee32..8701952d1b17f2f80ecb7856c3ba96c35473cd43 100644 (file)
@@ -97,7 +97,7 @@ private fun walkMethodBody(tree: LighterAST, root: LighterASTNode, processor: (L
   object : RecursiveLighterASTNodeWalkingVisitor(tree) {
     override fun visitNode(element: LighterASTNode) {
       val type = element.tokenType
-      if (type === CLASS || type === ANONYMOUS_CLASS || type === LAMBDA_EXPRESSION) return
+      if (type === CLASS || type === FIELD || type == METHOD || type == ANNOTATION_METHOD || type === LAMBDA_EXPRESSION) return
 
       processor(element)
       super.visitNode(element)
index 7d5846021f31918bae95e4d72921a6c8d690bc96..6c56a5b59ba175196f423df3509897df5fc46b33 100644 (file)
@@ -163,6 +163,55 @@ public Foo() {
     """
   }
 
+  void "test anonymous class initializer"() {
+    assertPure false, """
+    Object smth() {
+        return new I(){{ created++; }};
+    }
+
+    private static int created = 0;
+    
+    interface I {}
+    """
+  }
+
+  void "test simple anonymous class creation"() {
+    assertPure true, """
+    Object smth() {
+        return new I(){};
+    }
+    
+    interface I {}
+    """
+  }
+
+  void "test anonymous class with arguments"() {
+    assertPure false, """
+    Object smth() {
+        return new I(unknown()){};
+    }
+    
+    class I {
+      I(int a) {}
+    }
+    """
+  }
+
+  void "test class with impure initializer creation"() {
+    assertPure false, """
+    Object smth() {
+        return new I(42);
+    }
+    
+    class I {
+      I(int answer) {}
+      {
+        launchMissiles();
+      }
+    }
+    """
+  }
+
   private void assertPure(boolean expected, String classBody) {
     def clazz = myFixture.addClass("final class Foo { $classBody }")
     assert !((PsiFileImpl) clazz.containingFile).contentsLoaded