From 14aeb881db35ef1f0a70481b480103740e421938 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 18 Jun 2016 09:20:01 +0200 Subject: [PATCH] don't iterate over all groovy class supers each time when querying its members --- .../lang/resolve/CollectClassMembersUtil.java | 26 ++++++++++++------- .../transformations/TransformationUtil.kt | 2 ++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java index fa51cb5ca1e0..b5dfcfc729cc 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/CollectClassMembersUtil.java @@ -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 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 visited = ContainerUtil.newHashSet(); Queue 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 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> 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 allFields = ContainerUtil.newLinkedHashMap(); LinkedHashMap> allMethods = ContainerUtil.newLinkedHashMap(); LinkedHashMap allInnerClasses = ContainerUtil.newLinkedHashMap(); @@ -135,6 +137,10 @@ public class CollectClassMembersUtil { }, false); } + private static Key> getMemberCacheKey(boolean includeSynthetic) { + return includeSynthetic ? CACHED_MEMBERS_INCLUDING_SYNTHETIC : CACHED_MEMBERS; + } + private static void processClass(@NotNull PsiClass aClass, @NotNull Map allFields, @NotNull Map> allMethods, diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationUtil.kt b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationUtil.kt index 277dc9056ff7..18d55c2edfaf 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationUtil.kt +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/transformations/TransformationUtil.kt @@ -59,3 +59,5 @@ fun isUnderTransformation(clazz: PsiClass?): Boolean { false } } + +fun isUnderAnyTransformation() = ourTransformationContext.get().isNotEmpty() \ No newline at end of file