diff --git a/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java b/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java index 0013b15ca99..a5409b31af2 100644 --- a/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java +++ b/src/main/java/spoon/reflect/ModelElementContainerDefaultCapacities.java @@ -37,6 +37,9 @@ public final class ModelElementContainerDefaultCapacities { * than ArrayList's default of 10. */ + // JDK 7 average is 1.467 + public static final int CONSTRUCTORS_DEFAULT_CAPACITY = 2; + // JDK 7 average is 1.063 (methods), 1.207 (constructors) public static final int PARAMETERS_CONTAINER_DEFAULT_CAPACITY = 2; diff --git a/src/main/java/spoon/reflect/declaration/CtClass.java b/src/main/java/spoon/reflect/declaration/CtClass.java index 17e6a0fc4ff..c490c384fae 100644 --- a/src/main/java/spoon/reflect/declaration/CtClass.java +++ b/src/main/java/spoon/reflect/declaration/CtClass.java @@ -48,7 +48,7 @@ public interface CtClass extends CtType, CtStatement { * Returns the constructors of this class. This includes the default * constructor if this class has no constructors explicitly declared. */ - Set> getConstructors(); + List> getConstructors(); /** * Sets the anonymous blocks of this class. @@ -74,7 +74,7 @@ public interface CtClass extends CtType, CtStatement { /** * Sets the constructors for this class. */ - > C setConstructors(Set> constructors); + > C setConstructors(List> constructors); /** * Adds a constructor to this class. diff --git a/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java b/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java index cad1124aca3..50f2433c34c 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtClassImpl.java @@ -34,10 +34,9 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Set; -import java.util.TreeSet; import static spoon.reflect.ModelElementContainerDefaultCapacities.ANONYMOUS_EXECUTABLES_CONTAINER_DEFAULT_CAPACITY; +import static spoon.reflect.ModelElementContainerDefaultCapacities.CONSTRUCTORS_DEFAULT_CAPACITY; /** * The implementation for {@link spoon.reflect.declaration.CtClass}. @@ -49,7 +48,7 @@ public class CtClassImpl extends CtTypeImpl implements CtCl List anonymousExecutables = emptyList(); - Set> constructors = emptySet(); + List> constructors = emptyList(); CtTypeReference superClass; @@ -80,7 +79,7 @@ public CtConstructor getConstructor(CtTypeReference... parameterTypes) { } @Override - public Set> getConstructors() { + public List> getConstructors() { return constructors; } @@ -120,9 +119,9 @@ public > C setAnonymousExecutables(List> C setConstructors(Set> constructors) { - if (this.constructors == CtElementImpl.>emptySet()) { - this.constructors = new TreeSet>(); + public > C setConstructors(List> constructors) { + if (this.constructors == CtElementImpl.>emptyList()) { + this.constructors = new ArrayList>(constructors.size()); } this.constructors.clear(); for (CtConstructor constructor : constructors) { @@ -133,12 +132,9 @@ public > C setConstructors(Set> constructo @Override public > C addConstructor(CtConstructor constructor) { - if (constructors == CtElementImpl.>emptySet()) { - constructors = new TreeSet>(); + if (constructors == CtElementImpl.>emptyList()) { + constructors = new ArrayList>(CONSTRUCTORS_DEFAULT_CAPACITY); } - // this needs to be done because of the set that needs the constructor's - // signature : we should use lists!!! - // TODO: CHANGE SETS TO LIST TO AVOID HAVING TO DO THIS constructor.setParent(this); constructors.add(constructor); return (C) this; @@ -149,7 +145,7 @@ public void removeConstructor(CtConstructor constructor) { if (!constructors.isEmpty()) { if (constructors.size() == 1) { if (constructors.contains(constructor)) { - constructors = CtElementImpl.>emptySet(); + constructors = CtElementImpl.>emptyList(); } } else { constructors.remove(constructor); diff --git a/src/main/java/spoon/support/template/SubstitutionVisitor.java b/src/main/java/spoon/support/template/SubstitutionVisitor.java index cf8768a3c1d..3dedd0752d5 100644 --- a/src/main/java/spoon/support/template/SubstitutionVisitor.java +++ b/src/main/java/spoon/support/template/SubstitutionVisitor.java @@ -64,6 +64,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Iterator; import java.util.TreeSet; class SkipException extends SpoonException { @@ -186,9 +187,10 @@ public void visitCtClass(CtClass ctClass) { ctClass.removeMethod(m); } } - for (CtConstructor c : new TreeSet>(ctClass.getConstructors())) { + for (Iterator> it = ctClass.getConstructors().iterator(); it.hasNext();) { + CtConstructor c = it.next(); if (c.getAnnotation(Local.class) != null) { - ctClass.getConstructors().remove(c); + it.remove(); } } for (CtField field : new TreeSet>(ctClass.getFields())) { diff --git a/src/main/java/spoon/support/visitor/replace/ReplacementVisitor.java b/src/main/java/spoon/support/visitor/replace/ReplacementVisitor.java index 97dd3559a1d..c895626a254 100644 --- a/src/main/java/spoon/support/visitor/replace/ReplacementVisitor.java +++ b/src/main/java/spoon/support/visitor/replace/ReplacementVisitor.java @@ -233,7 +233,7 @@ public void set(java.util.List replace) { } } - class CtClassConstructorsReplaceListener implements spoon.generating.replace.ReplaceSetListener { + class CtClassConstructorsReplaceListener implements spoon.generating.replace.ReplaceListListener { private spoon.reflect.declaration.CtClass element; CtClassConstructorsReplaceListener(spoon.reflect.declaration.CtClass element) { @@ -241,7 +241,7 @@ class CtClassConstructorsReplaceListener implements spoon.generating.replace.Rep } @java.lang.Override - public void set(java.util.Set replace) { + public void set(java.util.List replace) { this.element.setConstructors(replace); } } @@ -1295,7 +1295,7 @@ public void visitCtClass(final spoon.reflect.declaration.CtClass ctClass) replaceInListIfExist(ctClass.getAnonymousExecutables(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassAnonymousExecutablesReplaceListener(ctClass)); replaceInSetIfExist(ctClass.getNestedTypes(), new spoon.support.visitor.replace.ReplacementVisitor.CtTypeNestedTypesReplaceListener(ctClass)); replaceInListIfExist(ctClass.getFields(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassFieldsReplaceListener(ctClass)); - replaceInSetIfExist(ctClass.getConstructors(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassConstructorsReplaceListener(ctClass)); + replaceInListIfExist(ctClass.getConstructors(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassConstructorsReplaceListener(ctClass)); replaceInSetIfExist(ctClass.getMethods(), new spoon.support.visitor.replace.ReplacementVisitor.CtTypeMethodsReplaceListener(ctClass)); replaceInListIfExist(ctClass.getComments(), new spoon.support.visitor.replace.ReplacementVisitor.CtElementCommentsReplaceListener(ctClass)); } @@ -1334,7 +1334,7 @@ public > void visitCtEnum(final spoon.reflect.declar replaceInListIfExist(ctEnum.getAnnotations(), new spoon.support.visitor.replace.ReplacementVisitor.CtElementAnnotationsReplaceListener(ctEnum)); replaceInSetIfExist(ctEnum.getSuperInterfaces(), new spoon.support.visitor.replace.ReplacementVisitor.CtTypeInformationSuperInterfacesReplaceListener(ctEnum)); replaceInListIfExist(ctEnum.getFields(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassFieldsReplaceListener(ctEnum)); - replaceInSetIfExist(ctEnum.getConstructors(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassConstructorsReplaceListener(ctEnum)); + replaceInListIfExist(ctEnum.getConstructors(), new spoon.support.visitor.replace.ReplacementVisitor.CtClassConstructorsReplaceListener(ctEnum)); replaceInSetIfExist(ctEnum.getMethods(), new spoon.support.visitor.replace.ReplacementVisitor.CtTypeMethodsReplaceListener(ctEnum)); replaceInSetIfExist(ctEnum.getNestedTypes(), new spoon.support.visitor.replace.ReplacementVisitor.CtTypeNestedTypesReplaceListener(ctEnum)); replaceInListIfExist(ctEnum.getComments(), new spoon.support.visitor.replace.ReplacementVisitor.CtElementCommentsReplaceListener(ctEnum)); diff --git a/src/test/java/spoon/test/annotation/AnnotationTest.java b/src/test/java/spoon/test/annotation/AnnotationTest.java index d888bdfe9ae..1abd2075234 100644 --- a/src/test/java/spoon/test/annotation/AnnotationTest.java +++ b/src/test/java/spoon/test/annotation/AnnotationTest.java @@ -260,7 +260,7 @@ public void testAnnotatedElementTypes() throws Exception { assertEquals(CtAnnotatedElementType.PARAMETER, annotations.get(0).getAnnotatedElementType()); // load constructor of the clazz and check annotated element type of the constructor annotation - Set> constructors = clazz.getConstructors(); + List> constructors = clazz.getConstructors(); assertEquals(1, constructors.size()); CtConstructor constructor = constructors.iterator().next(); diff --git a/src/test/java/spoon/test/ctClass/CtClassTest.java b/src/test/java/spoon/test/ctClass/CtClassTest.java index ab36eb329bb..e613e04ec64 100644 --- a/src/test/java/spoon/test/ctClass/CtClassTest.java +++ b/src/test/java/spoon/test/ctClass/CtClassTest.java @@ -11,6 +11,7 @@ import spoon.test.ctClass.testclasses.Foo; import spoon.test.ctClass.testclasses.Pozole; +import java.util.List; import java.util.Set; import static org.junit.Assert.assertEquals; @@ -98,7 +99,7 @@ public void testAllTypeReferencesToALocalTypeShouldNotStartWithNumber() throws E assertEquals("1Cook", cook.getSimpleName()); assertEquals("spoon.test.ctClass.testclasses.Pozole$1Cook", cook.getQualifiedName()); - final Set> constructors = cook.getConstructors(); + final List> constructors = cook.getConstructors(); final String expectedConstructor = "public Cook() {" + System.lineSeparator() + "}"; assertEquals(expectedConstructor, constructors.toArray(new CtConstructor[constructors.size()])[0].toString()); assertEquals("final java.lang.Class cookClass = Cook.class", cook.getMethod("m").getBody().getStatement(0).toString());