aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-24 14:23:15 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-24 14:23:15 +0100
commit06580f553ec7a715d2a924c9edecdebda52f940a (patch)
tree9b17b9838f319a29bdded87fe684f712b6896d99
parent772c5b3688533b622563e66a087dd3c543cff4e6 (diff)
Java: read annotations on methods
-rw-r--r--src/main/java/org/zwobble/couscous/ast/AnnotationNode.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java8
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java1
-rw-r--r--src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java4
-rw-r--r--src/test/java/org/zwobble/couscous/tests/frontends/java/JavaReaderTests.java12
5 files changed, 33 insertions, 0 deletions
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<MethodNode>(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<T> {
private final Function<MethodBuilder<?>, T> build;
+ private final ImmutableList.Builder<AnnotationNode> annotations;
private final ImmutableList.Builder<FormalArgumentNode> arguments;
private final ImmutableList.Builder<StatementNode> statements;
public MethodBuilder(Function<MethodBuilder<?>, T> build) {
this.build = build;
+ this.annotations = ImmutableList.builder();
this.arguments = ImmutableList.builder();
this.statements = ImmutableList.builder();
}
+ public MethodBuilder<T> 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<AnnotationNode> 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 <T> MethodBuilder<T> buildMethod(
MethodDeclaration method,
MethodBuilder<T> 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 =