use cached parent class names for faster gdsl applicability filtering

This commit is contained in:
peter
2011-10-10 13:28:02 +02:00
parent c1ac72a417
commit 031b5ae03e
3 changed files with 20 additions and 11 deletions
@@ -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);
@@ -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;
}
@@ -40,7 +40,7 @@ import java.util.*;
public abstract class NonCodeMembersContributor {
private static final ExtensionPointName<NonCodeMembersContributor> EP_NAME = ExtensionPointName.create("org.intellij.groovy.membersContributor");
private static final LightCacheKey<String[]> KEY = LightCacheKey.create();
private static final LightCacheKey<Set<String>> KEY = LightCacheKey.create();
private static volatile MultiMap<String, NonCodeMembersContributor> 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<String> getParentClassNames(@NotNull PsiClass aClass) {
Set<String> superClassNames = KEY.getCachedValue(aClass);
if (superClassNames == null) {
Set<PsiClass> superClasses = new HashSet<PsiClass>();
superClasses.add(aClass);
InheritanceUtil.getSuperClasses(aClass, superClasses, true);
superClassNames = new String[superClasses.size()];
int i = 0;
superClassNames = new HashSet<String>();
for (PsiClass superClass : superClasses) {
superClassNames[i++] = superClass.getQualifiedName();
superClassNames.add(superClass.getQualifiedName());
}
superClassNames = KEY.putCachedValue(aClass, superClassNames);