From 5d05780b15984cab626d840554e65495a0bcfe3b Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Sat, 29 Aug 2015 17:03:48 +0300 Subject: [PATCH] [groovy] collect contributed class members separately of each other --- .../typedef/GrTypeDefinitionMembersCache.java | 6 +- .../groovy/lang/psi/util/GrClassImplUtil.java | 2 +- .../resolve/ast/AstTransformContributor.java | 80 ++++++++++++++----- .../ast/DelegatedMethodsContributor.java | 13 +-- .../DefaultBuilderStrategySupport.java | 13 ++- .../ExternalBuilderStrategySupport.java | 9 ++- .../InitializerBuilderStrategySupport.java | 13 ++- .../SimpleBuilderStrategySupport.java | 9 ++- 8 files changed, 105 insertions(+), 40 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionMembersCache.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionMembersCache.java index fd97d501e0b2..88f0162218db 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionMembersCache.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/typedef/GrTypeDefinitionMembersCache.java @@ -123,7 +123,7 @@ public class GrTypeDefinitionMembersCache { final List result = ContainerUtil.newArrayList(); final GrTypeDefinitionBody body = myDefinition.getBody(); if (body != null) ContainerUtil.addAll(result, body.getInnerClasses()); - result.addAll(AstTransformContributor.runContributors(myDefinition).getClasses()); + result.addAll(AstTransformContributor.runContributorsForClasses(myDefinition)); return Result.create(result.toArray(new PsiClass[result.size()]), myTreeChangeTracker); } }); @@ -153,7 +153,7 @@ public class GrTypeDefinitionMembersCache { @Nullable @Override public Result> compute() { - return Result.create(AstTransformContributor.runContributors(myDefinition).getFields(), myTreeChangeTracker, + return Result.create(AstTransformContributor.runContributorsForFields(myDefinition), myTreeChangeTracker, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); } }); @@ -167,7 +167,7 @@ public class GrTypeDefinitionMembersCache { GrClassImplUtil.collectMethodsFromBody(myDefinition, result); result.addAll(new TraitCollector().collectMethods(result)); - for (PsiMethod method : AstTransformContributor.runContributors(myDefinition).getMethods()) { + for (PsiMethod method : AstTransformContributor.runContributorsForMethods(myDefinition)) { GrClassImplUtil.addExpandingReflectedMethods(result, method); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java index 1777eaf686c1..2805108b6496 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/util/GrClassImplUtil.java @@ -141,7 +141,7 @@ public class GrClassImplUtil { final PsiClassType[] implementsTypes = getReferenceListTypes(grType.getImplementsClause()); final PsiClassType[] extendsTypes = getReferenceListTypes(grType.getExtendsClause()); result.addAll(Arrays.asList(implementsTypes)); - result.addAll(AstTransformContributor.runContributors(grType).getImplementsTypes()); + result.addAll(AstTransformContributor.runContributorsForImplementsTypes(grType)); if (!grType.isInterface() && !ContainerUtil.or(implementsTypes, IS_GROOVY_OBJECT) && !ContainerUtil.or(extendsTypes, IS_GROOVY_OBJECT)) { result.add(getGroovyObjectType(grType)); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AstTransformContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AstTransformContributor.java index 73d985a36920..0bc0435d202d 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AstTransformContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/AstTransformContributor.java @@ -18,12 +18,17 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.RecursionManager; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiClassType; import com.intellij.psi.PsiMethod; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; /** * @author Max Medvedev @@ -32,40 +37,71 @@ public abstract class AstTransformContributor { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("org.intellij.groovy.astTransformContributor"); - @Deprecated public void collectMethods(@NotNull final GrTypeDefinition clazz, Collection collector) { - } - @Deprecated public void collectFields(@NotNull final GrTypeDefinition clazz, Collection collector) { - } - /** - * Subclasses should override this method. - */ - @NotNull - @SuppressWarnings("deprecation") - public Members collect(@NotNull final GrTypeDefinition clazz) { - final Members members = Members.create(); - collectMethods(clazz, members.getMethods()); - collectFields(clazz, members.getFields()); - return members; + public void collectClasses(@NotNull final GrTypeDefinition clazz, Collection collector) { } - @NotNull - public static Members runContributors(@NotNull final GrTypeDefinition clazz) { - Members result = RecursionManager.doPreventingRecursion(clazz, true, new Computable() { + public void collectImplementsTypes(GrTypeDefinition clazz, Collection collector) { + } + + public static Collection runContributorsForMethods(final GrTypeDefinition clazz) { + Collection result = RecursionManager.doPreventingRecursion(clazz, true, new Computable>() { @Override - public Members compute() { - Members members = Members.create(); + public Collection compute() { + final ArrayList result = ContainerUtil.newArrayList(); for (final AstTransformContributor contributor : EP_NAME.getExtensions()) { - members.addFrom(contributor.collect(clazz)); + contributor.collectMethods(clazz, result); } - return members; + return result; } }); - return result == null ? Members.EMPTY : result; + return result == null ? Collections.emptyList() : result; + } + + public static Collection runContributorsForFields(final GrTypeDefinition clazz) { + Collection result = RecursionManager.doPreventingRecursion(clazz, true, new Computable>() { + @Override + public Collection compute() { + final ArrayList result = ContainerUtil.newArrayList(); + for (final AstTransformContributor contributor : EP_NAME.getExtensions()) { + contributor.collectFields(clazz, result); + } + return result; + } + }); + return result == null ? Collections.emptyList() : result; + } + + public static Collection runContributorsForClasses(final GrTypeDefinition clazz) { + Collection result = RecursionManager.doPreventingRecursion(clazz, true, new Computable>() { + @Override + public Collection compute() { + final ArrayList result = ContainerUtil.newArrayList(); + for (final AstTransformContributor contributor : EP_NAME.getExtensions()) { + contributor.collectClasses(clazz, result); + } + return result; + } + }); + return result == null ? Collections.emptyList() : result; + } + + public static Collection runContributorsForImplementsTypes(final GrTypeDefinition clazz) { + Collection result = RecursionManager.doPreventingRecursion(clazz, true, new Computable>() { + @Override + public Collection compute() { + final ArrayList result = ContainerUtil.newArrayList(); + for (final AstTransformContributor contributor : EP_NAME.getExtensions()) { + contributor.collectImplementsTypes(clazz, result); + } + return result; + } + }); + return result == null ? Collections.emptyList() : result; } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java index 0fd1a84f65b1..4054456082e8 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/DelegatedMethodsContributor.java @@ -50,16 +50,8 @@ import java.util.*; */ public class DelegatedMethodsContributor extends AstTransformContributor { - @NotNull @Override - public Members collect(@NotNull GrTypeDefinition clazz) { - final Members result = Members.create(); - doCollectMethods(clazz, result.getMethods()); - doCollectImplementsTypes(clazz, result.getImplementsTypes()); - return result; - } - - private static void doCollectMethods(@NotNull final GrTypeDefinition clazz, @NotNull Collection collector) { + public void collectMethods(@NotNull final GrTypeDefinition clazz, @NotNull Collection collector) { Set processed = new HashSet(); if (!checkForDelegate(clazz)) return; @@ -344,7 +336,8 @@ public class DelegatedMethodsContributor extends AstTransformContributor { private static final Set OBJECT_METHODS = ContainerUtil.newHashSet("equals", "hashCode", "getClass", "clone", "toString", "notify", "notifyAll", "wait", "finalize"); private static final Set GROOVY_OBJECT_METHODS = ContainerUtil.newHashSet("invokeMethod", "getProperty", "setProperty", "getMetaClass", "setMetaClass"); - private static void doCollectImplementsTypes(GrTypeDefinition grType, Collection result) { + @Override + public void collectImplementsTypes(GrTypeDefinition grType, Collection result) { final GrField[] fields = grType.getCodeFields(); for (GrField field : fields) { final PsiAnnotation delegate = PsiImplUtil.getAnnotation(field, GroovyCommonClassNames.GROOVY_LANG_DELEGATE); diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java index 76ac329629c5..0b1369c87a75 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/DefaultBuilderStrategySupport.java @@ -30,12 +30,23 @@ import org.jetbrains.plugins.groovy.lang.resolve.ast.Members; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderHelperLightPsiClass; +import java.util.Collection; + public class DefaultBuilderStrategySupport extends BuilderAnnotationContributor { public static final String DEFAULT_STRATEGY_NAME = "DefaultStrategy"; - @NotNull @Override + public void collectClasses(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getClasses()); + } + + @Override + public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getMethods()); + } + + @NotNull public Members collect(@NotNull final GrTypeDefinition typeDefinition) { return new DefaultBuilderStrategyHandler(typeDefinition).doProcess(); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java index f001f78b8417..b1a094ace7e1 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/ExternalBuilderStrategySupport.java @@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; @@ -25,6 +26,8 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.resolve.ast.Members; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor; +import java.util.Collection; + import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.createBuildMethod; import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.createFieldSetter; @@ -32,8 +35,12 @@ public class ExternalBuilderStrategySupport extends BuilderAnnotationContributor public static final String EXTERNAL_STRATEGY_NAME = "ExternalStrategy"; - @NotNull @Override + public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getMethods()); + } + + @NotNull public Members collect(@NotNull GrTypeDefinition builderClass) { Pair definitionPair = getConstructedClass(builderClass); if (definitionPair == null) return Members.EMPTY; diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java index 39651af4c165..de675370a364 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/InitializerBuilderStrategySupport.java @@ -30,6 +30,8 @@ import org.jetbrains.plugins.groovy.lang.resolve.ast.Members; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderHelperLightPsiClass; +import java.util.Collection; + import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.getBuilderClassName; import static org.jetbrains.plugins.groovy.lang.resolve.ast.builder.strategy.DefaultBuilderStrategySupport.getFieldMethodName; @@ -39,8 +41,17 @@ public class InitializerBuilderStrategySupport extends BuilderAnnotationContribu public static final String SET_FQN = "groovy.transform.builder.InitializerStrategy.SET"; public static final String UNSET_FQN = "groovy.transform.builder.InitializerStrategy.UNSET"; - @NotNull @Override + public void collectClasses(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getClasses()); + } + + @Override + public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getMethods()); + } + + @NotNull public Members collect(@NotNull GrTypeDefinition clazz) { return new InitializerBuilderStrategyHandler(clazz).doProcess(); } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java index 107fbf9d4dfb..8783c7a039f6 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/resolve/ast/builder/strategy/SimpleBuilderStrategySupport.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; import com.intellij.psi.impl.light.LightMethodBuilder; import org.jetbrains.annotations.NotNull; @@ -29,12 +30,18 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil; import org.jetbrains.plugins.groovy.lang.resolve.ast.Members; import org.jetbrains.plugins.groovy.lang.resolve.ast.builder.BuilderAnnotationContributor; +import java.util.Collection; + public class SimpleBuilderStrategySupport extends BuilderAnnotationContributor { public static final String SIMPLE_STRATEGY_NAME = "SimpleStrategy"; - @NotNull @Override + public void collectMethods(@NotNull GrTypeDefinition clazz, Collection collector) { + collector.addAll(collect(clazz).getMethods()); + } + + @NotNull public Members collect(@NotNull GrTypeDefinition typeDefinition) { final PsiAnnotation annotation = PsiImplUtil.getAnnotation(typeDefinition, BUILDER_FQN); if (!isApplicable(annotation, SIMPLE_STRATEGY_NAME)) return Members.EMPTY;