From 06580f553ec7a715d2a924c9edecdebda52f940a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 24 Oct 2015 14:23:15 +0100 Subject: Java: read annotations on methods --- src/main/java/org/zwobble/couscous/ast/AnnotationNode.java | 8 ++++++++ src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java | 8 ++++++++ src/main/java/org/zwobble/couscous/ast/MethodNode.java | 1 + .../java/org/zwobble/couscous/frontends/java/JavaReader.java | 4 ++++ .../couscous/tests/frontends/java/JavaReaderTests.java | 12 ++++++++++++ 5 files changed, 33 insertions(+) create mode 100644 src/main/java/org/zwobble/couscous/ast/AnnotationNode.java diff --git a/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java b/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java new file mode 100644 index 0000000..1f34126 --- /dev/null +++ b/src/main/java/org/zwobble/couscous/ast/AnnotationNode.java @@ -0,0 +1,8 @@ +package org.zwobble.couscous.ast; + +import lombok.Value; + +@Value(staticConstructor="annotation") +public class AnnotationNode { + TypeName type; +} diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 7466f07..1b8aea3 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -60,6 +60,7 @@ public class ClassNodeBuilder { return new MethodBuilder(builder -> MethodNode.builder() .isStatic(isStatic) .name(name) + .annotations(builder.annotations.build()) .arguments(builder.arguments.build()) .body(builder.statements.build()) .build()); @@ -75,15 +76,22 @@ public class ClassNodeBuilder { public class MethodBuilder { private final Function, T> build; + private final ImmutableList.Builder annotations; private final ImmutableList.Builder arguments; private final ImmutableList.Builder statements; public MethodBuilder(Function, T> build) { this.build = build; + this.annotations = ImmutableList.builder(); this.arguments = ImmutableList.builder(); this.statements = ImmutableList.builder(); } + public MethodBuilder annotation(TypeName type) { + annotations.add(AnnotationNode.annotation(type)); + return this; + } + public ThisReferenceNode thisReference() { return ThisReferenceNode.thisReference(name); } diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java index 0bdad59..644b57b 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -15,6 +15,7 @@ public class MethodNode implements CallableNode { return builder().isStatic(true).name(name); } + List annotations; boolean isStatic; String name; @Singular diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 62aa75a..9b680be 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -13,6 +13,7 @@ import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.ExpressionStatement; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; +import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; @@ -114,6 +115,9 @@ public class JavaReader { private static MethodBuilder buildMethod( MethodDeclaration method, MethodBuilder builder) { + for (IAnnotationBinding annotation : method.resolveBinding().getAnnotations()) { + builder.annotation(typeOf(annotation.getAnnotationType())); + } for (Object parameterObject : method.parameters()) { val parameter = (SingleVariableDeclaration)parameterObject; builder.argument( diff --git a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java index a9465cd..74dec1a 100644 --- a/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java +++ b/src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java @@ -20,6 +20,7 @@ import org.zwobble.couscous.values.StringValue; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; +import static org.zwobble.couscous.ast.AnnotationNode.annotation; import static org.zwobble.couscous.ast.AssignmentNode.assign; import static org.zwobble.couscous.ast.AssignmentNode.assignStatement; import static org.zwobble.couscous.ast.ConstructorCallNode.constructorCall; @@ -230,6 +231,17 @@ public class JavaReaderTests { literal("Flaws"))), constructor.getBody()); } + + @Test + public void canDeclareStaticMethodWithAnnotation() { + val classNode = readClass( + "@Deprecated public void doNothing() {}"); + + val method = classNode.getMethods().get(0); + assertEquals( + asList(annotation(TypeName.of("java.lang.Deprecated"))), + method.getAnnotations()); + } private ExpressionNode readExpressionInInstanceMethod(String expressionSource) { val javaClass = -- cgit v1.2.3