diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/ClassContextFilter.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/ClassContextFilter.java index 4fbb04adaaa5..0cdcd2890473 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/ClassContextFilter.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/toplevel/ClassContextFilter.java @@ -4,15 +4,13 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.patterns.ElementPattern; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiClassType; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.util.ProcessingContext; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.dsl.GroovyClassDescriptor; import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil; +import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor; import java.util.Map; @@ -69,6 +67,18 @@ public class ClassContextFilter implements ContextFilter { } public static boolean isSubtype(PsiType checked, PsiFile placeFile, String typeText) { + final boolean isClassType = checked instanceof PsiClassType; + if (isClassType) { + final PsiClass psiClass = ((PsiClassType)checked).resolve(); + if (psiClass != null) { + final int i = typeText.indexOf("<"); + String rawName = i > 0 ? typeText.substring(0, i) : typeText; + if (!NonCodeMembersContributor.getParentClassNames(psiClass).contains(rawName)) { + return false; + } + } + } + PsiType myType = getCachedType(typeText, placeFile); if (checked == PsiType.NULL) return myType == PsiType.NULL; return TypesUtil.isAssignable(myType, checked, placeFile.getManager(), placeFile.getResolveScope(), false); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/GantMemberContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/GantMemberContributor.java index 486317ff2129..cf6e11289060 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/GantMemberContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/gant/GantMemberContributor.java @@ -44,7 +44,7 @@ public class GantMemberContributor extends NonCodeMembersContributor { PsiScopeProcessor processor, GroovyPsiElement place, ResolveState state) { - if (aClass != null && Arrays.asList(getParentClassNames(aClass)).contains("groovy.util.AntBuilder")) { + if (aClass != null && getParentClassNames(aClass).contains("groovy.util.AntBuilder")) { processAntTasks(processor, place, state); return; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java index ffe38b4b2ab1..749900275613 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/resolve/NonCodeMembersContributor.java @@ -40,7 +40,7 @@ import java.util.*; public abstract class NonCodeMembersContributor { private static final ExtensionPointName EP_NAME = ExtensionPointName.create("org.intellij.groovy.membersContributor"); - private static final LightCacheKey KEY = LightCacheKey.create(); + private static final LightCacheKey> KEY = LightCacheKey.create(); private static volatile MultiMap ourClassSpecifiedContributors; private static NonCodeMembersContributor[] ourAllTypeContributors; @@ -111,17 +111,16 @@ public abstract class NonCodeMembersContributor { return GroovyDslFileIndex.processExecutors(qualifierType, place, processor, state); } - protected static String[] getParentClassNames(@NotNull PsiClass aClass) { - String[] superClassNames = KEY.getCachedValue(aClass); + public static Set getParentClassNames(@NotNull PsiClass aClass) { + Set superClassNames = KEY.getCachedValue(aClass); if (superClassNames == null) { Set superClasses = new HashSet(); superClasses.add(aClass); InheritanceUtil.getSuperClasses(aClass, superClasses, true); - superClassNames = new String[superClasses.size()]; - int i = 0; + superClassNames = new HashSet(); for (PsiClass superClass : superClasses) { - superClassNames[i++] = superClass.getQualifiedName(); + superClassNames.add(superClass.getQualifiedName()); } superClassNames = KEY.putCachedValue(aClass, superClassNames);