mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
don't iterate over all groovy class supers each time when querying its members
This commit is contained in:
+16
-10
@@ -81,14 +81,17 @@ public class CollectClassMembersUtil {
|
||||
|
||||
@NotNull
|
||||
private static ClassMembers getCachedMembers(@NotNull PsiClass aClass, boolean includeSynthetic) {
|
||||
PsiUtilCore.ensureValid(aClass);
|
||||
if (includeSynthetic && !checkClass(aClass)) {
|
||||
includeSynthetic = false;
|
||||
CachedValue<ClassMembers> cached = aClass.getUserData(getMemberCacheKey(includeSynthetic));
|
||||
if (cached != null && cached.hasUpToDateValue()) {
|
||||
return cached.getValue();
|
||||
}
|
||||
return buildCache(aClass, includeSynthetic);
|
||||
|
||||
return buildCache(aClass, includeSynthetic && !isAffectedByTransformation(aClass));
|
||||
}
|
||||
|
||||
private static boolean checkClass(PsiClass aClass) {
|
||||
private static boolean isAffectedByTransformation(PsiClass aClass) {
|
||||
if (!TransformationUtilKt.isUnderAnyTransformation()) return false;
|
||||
|
||||
Set<PsiClass> visited = ContainerUtil.newHashSet();
|
||||
Queue<PsiClass> queue = ContainerUtil.newLinkedList(aClass);
|
||||
|
||||
@@ -96,17 +99,17 @@ public class CollectClassMembersUtil {
|
||||
PsiClass current = queue.poll();
|
||||
if (current instanceof ClsClassImpl) continue;
|
||||
if (visited.add(current)) {
|
||||
if (TransformationUtilKt.isUnderTransformation(current)) return false;
|
||||
if (TransformationUtilKt.isUnderTransformation(current)) return true;
|
||||
for (PsiClass superClass : getSupers(current, true)) {
|
||||
queue.offer(superClass);
|
||||
}
|
||||
}
|
||||
else if (!current.isInterface() && !CommonClassNames.JAVA_LANG_OBJECT.equals(current.getQualifiedName())) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Map<String, CandidateInfo> getAllInnerClasses(@NotNull final PsiClass aClass, boolean includeSynthetic) {
|
||||
@@ -122,8 +125,7 @@ public class CollectClassMembersUtil {
|
||||
}
|
||||
|
||||
private static ClassMembers buildCache(@NotNull final PsiClass aClass, final boolean includeSynthetic) {
|
||||
Key<CachedValue<ClassMembers>> key = includeSynthetic ? CACHED_MEMBERS_INCLUDING_SYNTHETIC : CACHED_MEMBERS;
|
||||
return CachedValuesManager.getManager(aClass.getProject()).getCachedValue(aClass, key, () -> {
|
||||
return CachedValuesManager.getManager(aClass.getProject()).getCachedValue(aClass, getMemberCacheKey(includeSynthetic), () -> {
|
||||
LinkedHashMap<String, CandidateInfo> allFields = ContainerUtil.newLinkedHashMap();
|
||||
LinkedHashMap<String, List<CandidateInfo>> allMethods = ContainerUtil.newLinkedHashMap();
|
||||
LinkedHashMap<String, CandidateInfo> allInnerClasses = ContainerUtil.newLinkedHashMap();
|
||||
@@ -135,6 +137,10 @@ public class CollectClassMembersUtil {
|
||||
}, false);
|
||||
}
|
||||
|
||||
private static Key<CachedValue<ClassMembers>> getMemberCacheKey(boolean includeSynthetic) {
|
||||
return includeSynthetic ? CACHED_MEMBERS_INCLUDING_SYNTHETIC : CACHED_MEMBERS;
|
||||
}
|
||||
|
||||
private static void processClass(@NotNull PsiClass aClass,
|
||||
@NotNull Map<String, CandidateInfo> allFields,
|
||||
@NotNull Map<String, List<CandidateInfo>> allMethods,
|
||||
|
||||
+2
@@ -59,3 +59,5 @@ fun isUnderTransformation(clazz: PsiClass?): Boolean {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun isUnderAnyTransformation() = ourTransformationContext.get().isNotEmpty()
|
||||
Reference in New Issue
Block a user