[groovy] abstract collection with consumer

This commit is contained in:
Daniil Ovchinnikov
2015-07-03 15:00:29 +03:00
parent 1a6b4ca813
commit 71314005dd
7 changed files with 49 additions and 37 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.RecursionManager;
import com.intellij.psi.PsiMethod;
import com.intellij.util.Consumer;
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;
@@ -32,13 +33,14 @@ import java.util.List;
* @author Max Medvedev
*/
public abstract class AstTransformContributor {
public static final ExtensionPointName<AstTransformContributor> EP_NAME = ExtensionPointName.create("org.intellij.groovy.astTransformContributor");
public static final ExtensionPointName<AstTransformContributor> EP_NAME =
ExtensionPointName.create("org.intellij.groovy.astTransformContributor");
public void collectMethods(@NotNull final GrTypeDefinition clazz, Collection<PsiMethod> collector) {
public void collectMethods(@NotNull final GrTypeDefinition clazz, Consumer<PsiMethod> collector) {
}
public void collectFields(@NotNull final GrTypeDefinition clazz, Collection<GrField> collector) {
public void collectFields(@NotNull final GrTypeDefinition clazz, Consumer<GrField> collector) {
}
@@ -47,9 +49,14 @@ public abstract class AstTransformContributor {
Collection<PsiMethod> result = RecursionManager.doPreventingRecursion(clazz, true, new Computable<Collection<PsiMethod>>() {
@Override
public Collection<PsiMethod> compute() {
Collection<PsiMethod> collector = new ArrayList<PsiMethod>();
final Collection<PsiMethod> collector = new ArrayList<PsiMethod>();
for (final AstTransformContributor contributor : EP_NAME.getExtensions()) {
contributor.collectMethods(clazz, collector);
contributor.collectMethods(clazz, new Consumer<PsiMethod>() {
@Override
public void consume(PsiMethod method) {
collector.add(method);
}
});
}
return collector;
}
@@ -62,9 +69,14 @@ public abstract class AstTransformContributor {
List<GrField> fields = RecursionManager.doPreventingRecursion(clazz, true, new Computable<List<GrField>>() {
@Override
public List<GrField> compute() {
List<GrField> collector = new ArrayList<GrField>();
final List<GrField> collector = new ArrayList<GrField>();
for (final AstTransformContributor contributor : EP_NAME.getExtensions()) {
contributor.collectFields(clazz, collector);
contributor.collectFields(clazz, new Consumer<GrField>() {
@Override
public void consume(GrField field) {
collector.add(field);
}
});
}
return collector;
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,20 +18,19 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import java.util.Collection;
/**
* @author Max Medvedev
*/
public class AutoCloneContributor extends AstTransformContributor {
@Override
public void collectMethods(@NotNull GrTypeDefinition clazz, @NotNull Collection<PsiMethod> collector) {
public void collectMethods(@NotNull GrTypeDefinition clazz, @NotNull Consumer<PsiMethod> collector) {
if (PsiImplUtil.getAnnotation(clazz, GroovyCommonClassNames.GROOVY_TRANSFORM_AUTO_CLONE) == null) return;
final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone");
@@ -39,6 +38,6 @@ public class AutoCloneContributor extends AstTransformContributor {
clone.setContainingClass(clazz);
clone.addException(CloneNotSupportedException.class.getName());
clone.setOriginInfo("created by @AutoClone");
collector.add(clone);
collector.consume(clone);
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
@@ -25,7 +26,6 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Collection;
/**
* @author Max Medvedev
@@ -33,7 +33,7 @@ import java.util.Collection;
public class AutoExternalizeContributor extends AstTransformContributor {
@Override
public void collectMethods(@NotNull GrTypeDefinition clazz, @NotNull Collection<PsiMethod> collector) {
public void collectMethods(@NotNull GrTypeDefinition clazz, @NotNull Consumer<PsiMethod> collector) {
if (!hasGeneratedImplementations(clazz)) return;
final LightMethodBuilder write = new LightMethodBuilder(clazz.getManager(), "writeExternal");
@@ -41,13 +41,13 @@ public class AutoExternalizeContributor extends AstTransformContributor {
write.addParameter("out", ObjectOutput.class.getName());
write.addException(IOException.class.getName());
write.setOriginInfo("created by @AutoExternalize");
collector.add(write);
collector.consume(write);
final LightMethodBuilder read = new LightMethodBuilder(clazz.getManager(), "readExternal");
read.setContainingClass(clazz);
read.addParameter("oin", ObjectInput.class.getName());
read.setOriginInfo("created by @AutoExternalize");
collector.add(read);
collector.consume(read);
}
private static boolean hasGeneratedImplementations(GrTypeDefinition clazz) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
@@ -30,7 +31,6 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.CollectClassMembersUtil;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -41,7 +41,7 @@ import java.util.Set;
public class ConstructorAnnotationsProcessor extends AstTransformContributor {
@Override
public void collectMethods(@NotNull GrTypeDefinition typeDefinition, @NotNull Collection<PsiMethod> collector) {
public void collectMethods(@NotNull GrTypeDefinition typeDefinition, @NotNull Consumer<PsiMethod> collector) {
if (typeDefinition.getName() == null) return;
PsiModifierList modifierList = typeDefinition.getModifierList();
@@ -63,8 +63,8 @@ public class ConstructorAnnotationsProcessor extends AstTransformContributor {
final GrLightMethodBuilder fieldsConstructor = generateFieldConstructor(typeDefinition, tupleConstructor, immutable, canonical);
final GrLightMethodBuilder mapConstructor = generateMapConstructor(typeDefinition);
collector.add(fieldsConstructor);
collector.add(mapConstructor);
collector.consume(fieldsConstructor);
collector.consume(mapConstructor);
}
@NotNull
@@ -154,7 +154,7 @@ public class ConstructorAnnotationsProcessor extends AstTransformContributor {
}
}
final Map<String,PsiMethod> properties = PropertyUtil.getAllProperties(true, false, methods);
final Map<String, PsiMethod> properties = PropertyUtil.getAllProperties(true, false, methods);
for (PsiField field : CollectClassMembersUtil.getFields(psiClass, false)) {
final String name = field.getName();
if (includeFields ||
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,6 +26,7 @@ import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.Consumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.hash.HashSet;
import gnu.trove.THashMap;
@@ -50,7 +51,7 @@ import java.util.*;
*/
public class DelegatedMethodsContributor extends AstTransformContributor {
@Override
public void collectMethods(@NotNull final GrTypeDefinition clazz, @NotNull Collection<PsiMethod> collector) {
public void collectMethods(@NotNull final GrTypeDefinition clazz, @NotNull Consumer<PsiMethod> collector) {
Set<PsiClass> processed = new HashSet<PsiClass>();
if (!checkForDelegate(clazz)) return;
@@ -66,7 +67,9 @@ public class DelegatedMethodsContributor extends AstTransformContributor {
addMethodChecked(signatures, method, PsiSubstitutor.EMPTY, result);
}
collector.addAll(result);
for (PsiMethod method : result) {
collector.consume(method);
}
}
private static boolean checkForDelegate(GrTypeDefinition clazz) {
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,21 +18,20 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.Consumer;
import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import java.util.Collection;
/**
* @author Maxim.Medvedev
*/
public class GrInheritConstructorContributor extends AstTransformContributor {
@Override
public void collectMethods(@NotNull GrTypeDefinition psiClass, @NotNull Collection<PsiMethod> collector) {
public void collectMethods(@NotNull GrTypeDefinition psiClass, @NotNull Consumer<PsiMethod> collector) {
if (psiClass.isAnonymous() || psiClass.isInterface() || psiClass.isEnum()) {
return;
}
@@ -59,7 +58,7 @@ public class GrInheritConstructorContributor extends AstTransformContributor {
inheritedConstructor.addParameter(name, type, false);
}
if (psiClass.findCodeMethodsBySignature(inheritedConstructor, false).length == 0) {
collector.add(inheritedConstructor);
collector.consume(inheritedConstructor);
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2000-2014 JetBrains s.r.o.
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.google.common.collect.ImmutableMap;
import com.intellij.psi.PsiModifier;
import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation;
@@ -25,8 +26,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefini
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightField;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import java.util.Collection;
/**
* @author peter
*/
@@ -39,7 +38,7 @@ public class LoggingContributor extends AstTransformContributor {
build();
@Override
public void collectFields(@NotNull GrTypeDefinition psiClass, @NotNull Collection<GrField> collector) {
public void collectFields(@NotNull GrTypeDefinition psiClass, @NotNull Consumer<GrField> collector) {
GrModifierList modifierList = psiClass.getModifierList();
if (modifierList == null) return;
@@ -52,7 +51,7 @@ public class LoggingContributor extends AstTransformContributor {
field.setNavigationElement(annotation);
field.getModifierList().setModifiers(PsiModifier.PRIVATE, PsiModifier.FINAL, PsiModifier.STATIC);
field.setOriginInfo("created by @" + annotation.getShortName());
collector.add(field);
collector.consume(field);
}
}
}