diff --git a/src/main/java/spoon/support/visitor/SignaturePrinter.java b/src/main/java/spoon/support/visitor/SignaturePrinter.java index 67e6f39f807..0330f3aa2e8 100644 --- a/src/main/java/spoon/support/visitor/SignaturePrinter.java +++ b/src/main/java/spoon/support/visitor/SignaturePrinter.java @@ -16,6 +16,7 @@ */ package spoon.support.visitor; +import spoon.reflect.declaration.CtAnnotationMethod; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; @@ -119,6 +120,11 @@ public void visitCtConstructor(CtConstructor c) { write(")"); } + @Override + public void visitCtAnnotationMethod(CtAnnotationMethod annotationMethod) { + visitCtMethod(annotationMethod); + } + /** * For methods, this implementation of signature contains the return type, which corresponds * to what the Java compile and virtual machine call a "descriptor". diff --git a/src/test/java/spoon/test/annotation/AnnotationTest.java b/src/test/java/spoon/test/annotation/AnnotationTest.java index cabb3242033..cde52249ce1 100644 --- a/src/test/java/spoon/test/annotation/AnnotationTest.java +++ b/src/test/java/spoon/test/annotation/AnnotationTest.java @@ -56,6 +56,7 @@ import spoon.test.annotation.testclasses.SuperAnnotation; import spoon.test.annotation.testclasses.TestInterface; import spoon.test.annotation.testclasses.TypeAnnotation; +import spoon.test.annotation.testclasses.PortRange; import java.io.File; import java.lang.annotation.Annotation; @@ -829,6 +830,25 @@ public void testFieldAndMethodInAnnotation() throws Exception { assertEquals(2, aTypeAnnotation.getMethods().size()); } + @Test + public void testAnnotationInterfacePreserveMethods() throws Exception { + final CtAnnotationType ctAnnotationType = (CtAnnotationType) this.factory.Type().get(PortRange.class); + List> ctMethodMin = ctAnnotationType.getMethodsByName("min"); + assertEquals("Method min is preserved after transformation", 1, ctMethodMin.size()); + + List> ctMethodMax = ctAnnotationType.getMethodsByName("max"); + assertEquals("Method max is preserved after transformation", 1, ctMethodMax.size()); + + List> ctMethodMessage = ctAnnotationType.getMethodsByName("message"); + assertEquals("Method message is preserved after transformation", 1, ctMethodMessage.size()); + + List> ctMethodGroups = ctAnnotationType.getMethodsByName("groups"); + assertEquals("Method groups is preserved after transformation", 1, ctMethodGroups.size()); + + List> ctMethodPayload = ctAnnotationType.getMethodsByName("payload"); + assertEquals("Method payload is preserved after transformation", 1, ctMethodPayload.size()); + } + abstract class AbstractElementsProcessor extends AbstractAnnotationProcessor { final List elements = new ArrayList<>(); diff --git a/src/test/java/spoon/test/annotation/testclasses/PortRange.java b/src/test/java/spoon/test/annotation/testclasses/PortRange.java new file mode 100644 index 00000000000..40a2195a96f --- /dev/null +++ b/src/test/java/spoon/test/annotation/testclasses/PortRange.java @@ -0,0 +1,26 @@ +package spoon.test.annotation.testclasses; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Target({ METHOD, FIELD, ANNOTATION_TYPE, TYPE_USE }) +@Retention(RUNTIME) +@Documented +public @interface PortRange { + int min() default 1; + + int max() default 65535; + + String message() default "{org.hibernate.validator.constraints.Range.message}"; + + Class[] groups() default {}; + + Class[] payload() default {}; +} \ No newline at end of file diff --git a/src/test/java/spoon/test/generics/GenericsTest.java b/src/test/java/spoon/test/generics/GenericsTest.java index 9e845233c20..fb5ca8a3b42 100644 --- a/src/test/java/spoon/test/generics/GenericsTest.java +++ b/src/test/java/spoon/test/generics/GenericsTest.java @@ -312,26 +312,26 @@ public void testConstructorCallGenerics() throws Exception { final CtMethod m = aTacos.getMethodsByName("m").get(0); final CtElement local1 = m.getBody().getStatement(0).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); - final CtTypeReference leftSideLocal1 = (CtTypeReference) local1.getReferences(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); + final CtTypeReference leftSideLocal1 = (CtTypeReference) local1.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); final CtConstructorCall rightSideLocal1 = (CtConstructorCall) local1.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0); assertEquals(1, leftSideLocal1.getActualTypeArguments().size()); assertEquals(1, rightSideLocal1.getType().getActualTypeArguments().size()); assertEquals("java.util.List l = new java.util.ArrayList<>()", local1.toString()); final CtElement local2 = m.getBody().getStatement(1).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); - final CtTypeReference leftSideLocal2 = (CtTypeReference) local2.getReferences(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); + final CtTypeReference leftSideLocal2 = (CtTypeReference) local2.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); assertEquals(0, leftSideLocal2.getActualTypeArguments().size()); assertEquals("java.util.List l2", local2.toString()); final CtElement local3 = m.getBody().getStatement(2).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); - final CtTypeReference leftSideLocal3 = (CtTypeReference) local3.getReferences(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); + final CtTypeReference leftSideLocal3 = (CtTypeReference) local3.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); final CtConstructorCall rightSideLocal3 = (CtConstructorCall) local3.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0); assertEquals(2, leftSideLocal3.getActualTypeArguments().size()); assertEquals(2, rightSideLocal3.getType().getActualTypeArguments().size()); assertEquals("spoon.test.generics.testclasses.IBurritos burritos = new Burritos<>()", local3.toString()); final CtElement local4 = m.getBody().getStatement(3).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0); - final CtTypeReference leftSideLocal4 = (CtTypeReference) local4.getReferences(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); + final CtTypeReference leftSideLocal4 = (CtTypeReference) local4.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0); final CtConstructorCall rightSideLocal4 = (CtConstructorCall) local4.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0); assertEquals(1, leftSideLocal4.getActualTypeArguments().size()); assertEquals(1, rightSideLocal4.getType().getActualTypeArguments().size()); diff --git a/src/test/java/spoon/test/parent/ParentTest.java b/src/test/java/spoon/test/parent/ParentTest.java index 6259cd0adeb..38c07371420 100644 --- a/src/test/java/spoon/test/parent/ParentTest.java +++ b/src/test/java/spoon/test/parent/ParentTest.java @@ -144,7 +144,7 @@ public void testParentOfCtPackageReference() throws Exception { // so the root packages are not deeply equals assertNotEquals(pack1, topLevelParent); - final CtTypeReference burritos = panini.getReferences(new ReferenceTypeFilter>(CtTypeReference.class) { + final CtTypeReference burritos = panini.getElements(new ReferenceTypeFilter>(CtTypeReference.class) { @Override public boolean matches(CtTypeReference reference) { return "Burritos".equals(reference.getSimpleName()) && super.matches(reference); @@ -187,7 +187,7 @@ public void testParentOfCtExecutableReference() throws Exception { public void testParentOfGenericInTypeReference() throws Exception { // contract: parent of a generic in a type reference is the type reference. final Factory factory = build(Tacos.class); - final CtTypeReference referenceWithGeneric = Query.getReferences(factory, new ReferenceTypeFilter(CtTypeReference.class) { + final CtTypeReference referenceWithGeneric = Query.getElements(factory, new ReferenceTypeFilter(CtTypeReference.class) { @Override public boolean matches(CtTypeReference reference) { return reference.getActualTypeArguments().size() > 0 && super.matches(reference); diff --git a/src/test/java/spoon/test/refactoring/RefactoringTest.java b/src/test/java/spoon/test/refactoring/RefactoringTest.java index d6e6c559b11..690c3652566 100644 --- a/src/test/java/spoon/test/refactoring/RefactoringTest.java +++ b/src/test/java/spoon/test/refactoring/RefactoringTest.java @@ -44,7 +44,7 @@ public void testRefactoringClassChangeAllCtTypeReferenceAssociatedWithClassConce final CtClass aClassX = launcher.getFactory().Class().get("spoon.test.refactoring.testclasses.AClassX"); assertNotNull(aClassX); - final List> references = Query.getReferences(aClassX.getFactory(), new AbstractReferenceFilter>(CtTypeReference.class) { + final List> references = Query.getElements(aClassX.getFactory(), new AbstractReferenceFilter>(CtTypeReference.class) { @Override public boolean matches(CtTypeReference reference) { return aClassX.getQualifiedName().equals(reference.getQualifiedName()); diff --git a/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java b/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java index 94e955bc7df..f8730bb818e 100644 --- a/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java +++ b/src/test/java/spoon/test/reference/ExecutableReferenceGenericTest.java @@ -215,7 +215,7 @@ public void testExecutableReferences() throws Exception { CtClass classMyClass = Query.getElements(factory, new NameFilter("MyClass")).get(0); assertEquals("MyClass", classMyClass.getSimpleName()); - List> refsExecutableClass1 = Query.getReferences(classMyClass, + List> refsExecutableClass1 = Query.getElements(classMyClass, new AbstractReferenceFilter>(CtExecutableReference.class) { public boolean matches(CtExecutableReference reference) { return true; @@ -224,7 +224,7 @@ public boolean matches(CtExecutableReference reference) { CtClass classMyClass2 = Query.getElements(factory, new NameFilter("MyClass2")).get(0); assertEquals("MyClass2", classMyClass2.getSimpleName()); - List> refsExecutableClass2 = Query.getReferences(classMyClass2, + List> refsExecutableClass2 = Query.getElements(classMyClass2, new AbstractReferenceFilter>(CtExecutableReference.class) { public boolean matches(CtExecutableReference reference) { return true; @@ -277,7 +277,7 @@ public boolean matches(CtExecutableReference reference) { } private List> getCtConstructorsReferencedInCtConstructor(CtConstructor aConstructor) { - return aConstructor.getReferences(new AbstractReferenceFilter>(CtExecutableReference.class) { + return aConstructor.getElements(new AbstractReferenceFilter>(CtExecutableReference.class) { @Override public boolean matches(CtExecutableReference reference) { return reference.isConstructor(); @@ -295,7 +295,7 @@ public boolean matches(CtClass element) { } private List> getReferencesOfAMethod(CtMethod method1) { - return method1.getReferences(new ReferenceTypeFilter>(CtExecutableReference.class)); + return method1.getElements(new ReferenceTypeFilter>(CtExecutableReference.class)); } private CtMethod getCtMethodByNameFromCtClass(CtClass clazz, String nameMethod5) { diff --git a/src/test/java/spoon/test/reference/TypeReferenceTest.java b/src/test/java/spoon/test/reference/TypeReferenceTest.java index 39fedb27937..6fe4fe2b4bb 100644 --- a/src/test/java/spoon/test/reference/TypeReferenceTest.java +++ b/src/test/java/spoon/test/reference/TypeReferenceTest.java @@ -108,7 +108,7 @@ public void loadReferencedClassFromClasspath() throws Exception { // now we retrieve the reference to ReferencedClass CtTypeReference referencedType = null; ReferenceTypeFilter referenceTypeFilter = new ReferenceTypeFilter(CtTypeReference.class); - List elements = Query.getReferences(theClass, referenceTypeFilter); + List elements = Query.getElements(theClass, referenceTypeFilter); for (CtTypeReference reference : elements) { if (reference.getQualifiedName().equals(referencedQualifiedName)) { referencedType = reference; diff --git a/src/test/java/spoon/test/reference/VariableAccessTest.java b/src/test/java/spoon/test/reference/VariableAccessTest.java index aa43b4658a5..82e5c54fe5e 100644 --- a/src/test/java/spoon/test/reference/VariableAccessTest.java +++ b/src/test/java/spoon/test/reference/VariableAccessTest.java @@ -39,7 +39,7 @@ public void testVariableAccessDeclarationInAnonymousClass() throws Exception { CtClass type = build("spoon.test.reference", "FooBar"); assertEquals("FooBar", type.getSimpleName()); - final CtParameterReference ref = type.getReferences(new AbstractReferenceFilter>(CtParameterReference.class) { + final CtParameterReference ref = type.getElements(new AbstractReferenceFilter>(CtParameterReference.class) { @Override public boolean matches(CtParameterReference reference) { return "myArg".equals(reference.getSimpleName()); diff --git a/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java b/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java index dbadff5ea6a..be8bd6a58ab 100644 --- a/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java +++ b/src/test/java/spoon/test/reflect/visitor/ReferenceQueryTest.java @@ -16,7 +16,7 @@ public class ReferenceQueryTest { @Test public void getAllTypeReferencesInEnum() throws Exception { CtEnum testEnum = build("spoon.test.reflect.visitor", "ReferenceQueryTestEnum"); - List< CtTypeReference > enumTypeRefs = Query.getReferences(testEnum, new ReferenceTypeFilter< CtTypeReference >(CtTypeReference.class)); + List< CtTypeReference > enumTypeRefs = Query.getElements(testEnum, new ReferenceTypeFilter< CtTypeReference >(CtTypeReference.class)); TypeFactory typeFactory = testEnum.getFactory().Type(); for (Class c : new Class[]{Integer.class, Long.class, Boolean.class, Number.class, String.class, Void.class}) { Assert.assertTrue("the reference query on the enum should return all the types defined in the enum declaration", enumTypeRefs.contains(typeFactory.createReference(c))); diff --git a/src/test/java/spoon/test/replace/ReplaceTest.java b/src/test/java/spoon/test/replace/ReplaceTest.java index 953e9f0fa79..5b97ef62a28 100644 --- a/src/test/java/spoon/test/replace/ReplaceTest.java +++ b/src/test/java/spoon/test/replace/ReplaceTest.java @@ -252,7 +252,7 @@ public void testReplaceIntegerReference() throws Exception { public void testReplaceAllTypeRefenceWithGenerics() throws Exception { // contract: replace all type references with a generic to the same type reference without generics. final Factory factory = build(Tacos.class); - final List references = Query.getReferences(factory, new ReferenceTypeFilter(CtTypeReference.class) { + final List references = Query.getElements(factory, new ReferenceTypeFilter(CtTypeReference.class) { @Override public boolean matches(CtTypeReference reference) { return reference.getActualTypeArguments().size() > 0 && super.matches(reference); @@ -280,7 +280,7 @@ public void testReplaceAPackageReferenceByAnotherOne() throws Exception { final CtType panini = launcher.getFactory().Type().get("Panini"); - final CtTypeReference burritos = panini.getReferences(new ReferenceTypeFilter>(CtTypeReference.class) { + final CtTypeReference burritos = panini.getElements(new ReferenceTypeFilter>(CtTypeReference.class) { @Override public boolean matches(CtTypeReference reference) { return "Burritos".equals(reference.getSimpleName()) && super.matches(reference); diff --git a/src/test/java/spoon/test/signature/SignatureTest.java b/src/test/java/spoon/test/signature/SignatureTest.java index 76bac0a70ab..208ccae8452 100644 --- a/src/test/java/spoon/test/signature/SignatureTest.java +++ b/src/test/java/spoon/test/signature/SignatureTest.java @@ -297,7 +297,7 @@ public void testArgumentNotNullForExecutableReference() throws Exception { launcher.getEnvironment().setNoClasspath(true); launcher.run(); - final List references = Query.getReferences(launcher.getFactory(), new ReferenceTypeFilter(CtExecutableReference.class) { + final List references = Query.getElements(launcher.getFactory(), new ReferenceTypeFilter(CtExecutableReference.class) { @Override public boolean matches(CtExecutableReference reference) { return "addField".equals(reference.getSimpleName()) && super.matches(reference); diff --git a/src/test/java/spoon/test/visibility/VisibilityTest.java b/src/test/java/spoon/test/visibility/VisibilityTest.java index 50113855236..4d61f657774 100644 --- a/src/test/java/spoon/test/visibility/VisibilityTest.java +++ b/src/test/java/spoon/test/visibility/VisibilityTest.java @@ -124,7 +124,7 @@ public void testName() throws Exception { "-o", "./target/spooned/visibility" }); - final List> references = Query.getReferences(launcher.getFactory(), new AbstractReferenceFilter>(CtFieldReference.class) { + final List> references = Query.getElements(launcher.getFactory(), new AbstractReferenceFilter>(CtFieldReference.class) { @Override public boolean matches(CtFieldReference reference) { return "x".equals(reference.getSimpleName());