Merge branch 'master' of git.labs.intellij.net:idea/community
authorMaxim Medvedev <maxim.medvedev@jetbrains.com>
Mon, 27 Dec 2010 10:42:37 +0000 (13:42 +0300)
committerMaxim Medvedev <maxim.medvedev@jetbrains.com>
Mon, 27 Dec 2010 10:42:37 +0000 (13:42 +0300)
plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java
plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolveClassTest.groovy
plugins/groovy/testdata/resolve/class/innerClassIsNotResolvedInAnonymous/A.groovy [new file with mode: 0644]
plugins/groovy/testdata/resolve/class/innerClassIsResolvedInAnonymous/A.groovy [new file with mode: 0644]

index f2e589e4c94048bf7a8802c09464abbbbf803d2f..b344b283ecc8b8e98d496a72ea082473c7064cb7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2010 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@ import com.intellij.util.containers.HashSet;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition;
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
 
 import java.util.ArrayList;
@@ -77,13 +78,13 @@ public class CollectClassMembersUtil {
         Map<String, List<CandidateInfo>> allMethods = new HashMap<String, List<CandidateInfo>>();
         Map<String, CandidateInfo> allInnerClasses = new HashMap<String, CandidateInfo>();
 
-        processClass(aClass, allFields, allMethods, allInnerClasses, new HashSet<PsiClass>(), PsiSubstitutor.EMPTY, includeSynthetic);
+        processClass(aClass, allFields, allMethods, allInnerClasses, new HashSet<PsiClass>(), PsiSubstitutor.EMPTY, includeSynthetic, true);
         return Result.create(Trinity.create(allFields, allMethods, allInnerClasses), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
       }
     }, false);
   }
 
-  private static void processClass(PsiClass aClass, Map<String, CandidateInfo> allFields, Map<String, List<CandidateInfo>> allMethods, Map<String, CandidateInfo> allInnerClasses, Set<PsiClass> visitedClasses, PsiSubstitutor substitutor, boolean includeSynthetic) {
+  private static void processClass(PsiClass aClass, Map<String, CandidateInfo> allFields, Map<String, List<CandidateInfo>> allMethods, Map<String, CandidateInfo> allInnerClasses, Set<PsiClass> visitedClasses, PsiSubstitutor substitutor, boolean includeSynthetic, boolean shouldProcessInnerClasses) {
     if (visitedClasses.contains(aClass)) return;
     visitedClasses.add(aClass);
 
@@ -107,10 +108,12 @@ public class CollectClassMembersUtil {
       addMethod(allMethods, method, substitutor);
     }
 
-    for (final PsiClass inner : aClass.getInnerClasses()) {
-      final String name = inner.getName();
-      if (name != null && !allInnerClasses.containsKey(name)) {
-        allInnerClasses.put(name, new CandidateInfo(inner, substitutor));
+    if (shouldProcessInnerClasses) {
+      for (final PsiClass inner : aClass.getInnerClasses()) {
+        final String name = inner.getName();
+        if (name != null && !allInnerClasses.containsKey(name)) {
+          allInnerClasses.put(name, new CandidateInfo(inner, substitutor));
+        }
       }
     }
 
@@ -118,7 +121,8 @@ public class CollectClassMembersUtil {
       PsiClass superClass = superType.resolve();
       if (superClass != null) {
         final PsiSubstitutor superSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, aClass, substitutor);
-        processClass(superClass, allFields, allMethods, allInnerClasses, visitedClasses, superSubstitutor, includeSynthetic);
+        processClass(superClass, allFields, allMethods, allInnerClasses, visitedClasses, superSubstitutor, includeSynthetic,
+                     shouldProcessInnerClasses && !(aClass instanceof GrAnonymousClassDefinition));
       }
     }
   }
index bd72f1f144a9f79c3a5f75db751415f62100e7c4..360c3ad494ab8f9811e6fcfaabc41bad19711e9c 100644 (file)
@@ -1,17 +1,17 @@
 /*
- *  Copyright 2000-2007 JetBrains s.r.o.
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ * Copyright 2000-2010 JetBrains s.r.o.
  *
- *  http://www.apache.org/licenses/LICENSE-2.0
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
+ * http://www.apache.org/licenses/LICENSE-2.0
  *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jetbrains.plugins.groovy.lang.resolve;
 
@@ -183,6 +183,32 @@ class X {
     doTest()
   }
 
+  public void testInnerClassIsNotResolvedInAnonymous() {
+    myFixture.addFileToProject "/p/Super.groovy", """
+package p
+
+interface Super {
+  class Inner {
+  }
+
+  def foo(Inner i);
+}"""
+    assertNull resolve("A.groovy");
+  }
+
+  public void testInnerClassIsResolvedInAnonymous() {
+    myFixture.addFileToProject "/p/Super.groovy", """
+package p
+
+interface Super {
+  class Inner {
+  }
+
+  def foo(Inner i);
+}"""
+    assertInstanceOf resolve("A.groovy"), PsiClass;
+  }
+
   private void doTest() {
     doTest(getTestName(true) + "/" + getTestName(false) + ".groovy");
   }
diff --git a/plugins/groovy/testdata/resolve/class/innerClassIsNotResolvedInAnonymous/A.groovy b/plugins/groovy/testdata/resolve/class/innerClassIsNotResolvedInAnonymous/A.groovy
new file mode 100644 (file)
index 0000000..7708be9
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import p.Super
+
+def an = new Super() {
+  def foo(Inn<ref>er i) {
+
+  }
+}
\ No newline at end of file
diff --git a/plugins/groovy/testdata/resolve/class/innerClassIsResolvedInAnonymous/A.groovy b/plugins/groovy/testdata/resolve/class/innerClassIsResolvedInAnonymous/A.groovy
new file mode 100644 (file)
index 0000000..b6b5865
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import p.Super
+import p.Super.Inner
+def an = new Super() {
+  def foo(Inn<ref>er i) {
+
+  }
+}
\ No newline at end of file