mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
use cached parent class names for faster gdsl applicability filtering
This commit is contained in:
+14
-4
@@ -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;
|
||||
}
|
||||
|
||||
+5
-6
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user