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 a9f31f5455f2..5354f650ddf0 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. */ package org.jetbrains.plugins.groovy.lang.resolve; @@ -23,48 +23,21 @@ import java.util.*; * @author ven */ public class CollectClassMembersUtil { + private static class ClassMembers { - private final Map myFields; - private final Map> myMethods; - private final Map myInnerClasses; - - private ClassMembers(@NotNull Map fields, - @NotNull Map> methods, - @NotNull Map innerClasses) { - myFields = fields; - myMethods = methods; - myInnerClasses = innerClasses; - } - - public static ClassMembers create(@NotNull LinkedHashMap first, - @NotNull LinkedHashMap> second, - @NotNull LinkedHashMap third) { - return new ClassMembers(first, second, third); - } - - private Map getFields() { - return myFields; - } - - private Map> getMethods() { - return myMethods; - } - - private Map getInnerClasses() { - return myInnerClasses; - } + private final Map fields = ContainerUtil.newLinkedHashMap(); + private final Map> methods = ContainerUtil.newLinkedHashMap(); + private final Map innerClasses = ContainerUtil.newLinkedHashMap(); } private static final Key> CACHED_MEMBERS = Key.create("CACHED_CLASS_MEMBERS"); - private static final Key> CACHED_MEMBERS_INCLUDING_SYNTHETIC = Key.create("CACHED_MEMBERS_INCLUDING_SYNTHETIC"); - private CollectClassMembersUtil() { - } + private CollectClassMembersUtil() {} - - public static Map> getAllMethods(final PsiClass aClass, boolean includeSynthetic) { - return getCachedMembers(aClass, includeSynthetic).getMethods(); + @NotNull + public static Map> getAllMethods(@NotNull PsiClass aClass, boolean includeSynthetic) { + return getCachedMembers(aClass, includeSynthetic).methods; } @NotNull @@ -77,12 +50,12 @@ public class CollectClassMembersUtil { return buildCache(aClass, includeSynthetic && checkClass(aClass)); } - private static boolean checkClass(PsiClass aClass) { + private static boolean checkClass(@NotNull PsiClass aClass) { Set visited = ContainerUtil.newHashSet(); Queue queue = ContainerUtil.newLinkedList(aClass); while (!queue.isEmpty()) { - PsiClass current = queue.poll(); + PsiClass current = queue.remove(); if (current instanceof ClsClassImpl) continue; if (visited.add(current)) { if (TransformationUtilKt.isUnderTransformation(current)) return false; @@ -98,31 +71,31 @@ public class CollectClassMembersUtil { return true; } + @NotNull public static Map getAllInnerClasses(@NotNull final PsiClass aClass, boolean includeSynthetic) { - return getCachedMembers(aClass, includeSynthetic).getInnerClasses(); + return getCachedMembers(aClass, includeSynthetic).innerClasses; } + @NotNull public static Map getAllFields(@NotNull final PsiClass aClass, boolean includeSynthetic) { - return getCachedMembers(aClass, includeSynthetic).getFields(); + return getCachedMembers(aClass, includeSynthetic).fields; } + @NotNull public static Map getAllFields(@NotNull final PsiClass aClass) { return getAllFields(aClass, true); } + @NotNull private static ClassMembers buildCache(@NotNull final PsiClass aClass, final boolean includeSynthetic) { return CachedValuesManager.getManager(aClass.getProject()).getCachedValue(aClass, getMemberCacheKey(includeSynthetic), () -> { - LinkedHashMap allFields = ContainerUtil.newLinkedHashMap(); - LinkedHashMap> allMethods = ContainerUtil.newLinkedHashMap(); - LinkedHashMap allInnerClasses = ContainerUtil.newLinkedHashMap(); - - processClass(aClass, allFields, allMethods, allInnerClasses, new HashSet<>(), PsiSubstitutor.EMPTY, includeSynthetic); - return CachedValueProvider.Result.create( - ClassMembers.create(allFields, allMethods, allInnerClasses), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT - ); + ClassMembers result = new ClassMembers(); + processClass(aClass, result.fields, result.methods, result.innerClasses, new HashSet<>(), PsiSubstitutor.EMPTY, includeSynthetic); + return CachedValueProvider.Result.create(result, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); }, false); } + @NotNull private static Key> getMemberCacheKey(boolean includeSynthetic) { return includeSynthetic ? CACHED_MEMBERS_INCLUDING_SYNTHETIC : CACHED_MEMBERS; } @@ -179,20 +152,24 @@ public class CollectClassMembersUtil { } } + @NotNull public static PsiField[] getFields(@NotNull PsiClass aClass, boolean includeSynthetic) { return includeSynthetic || !(aClass instanceof GrTypeDefinition) ? aClass.getFields() : ((GrTypeDefinition)aClass).getCodeFields(); } + @NotNull public static PsiMethod[] getMethods(@NotNull PsiClass aClass, boolean includeSynthetic) { return includeSynthetic || !(aClass instanceof GrTypeDefinition) ? aClass.getMethods() : ((GrTypeDefinition)aClass).getCodeMethods(); } + @NotNull public static PsiClass[] getInnerClasses(@NotNull PsiClass aClass, boolean includeSynthetic) { return includeSynthetic || !(aClass instanceof GrTypeDefinition) ? aClass.getInnerClasses() : ((GrTypeDefinition)aClass).getCodeInnerClasses(); } + @NotNull public static PsiClass[] getSupers(@NotNull PsiClass aClass, boolean includeSynthetic) { return aClass instanceof GrTypeDefinition ? ((GrTypeDefinition)aClass).getSupers(includeSynthetic)