don't iterate over all groovy class supers each time when querying its members

This commit is contained in:
peter
2016-06-18 09:20:01 +02:00
parent c710d16107
commit 14aeb881db
2 changed files with 18 additions and 10 deletions
@@ -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,
@@ -59,3 +59,5 @@ fun isUnderTransformation(clazz: PsiClass?): Boolean {
false
}
}
fun isUnderAnyTransformation() = ourTransformationContext.get().isNotEmpty()