From 8eda91c53e2df91b7b8022b80476513ac8116955 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 28 Feb 2016 11:53:28 +0000 Subject: Allow reading of methods without body --- .../java/org/zwobble/couscous/ast/MethodNode.java | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/ast/MethodNode.java') diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java index dd970c5..967b2b1 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -6,6 +6,7 @@ import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.values.UnitValue; import java.util.List; +import java.util.Optional; import java.util.function.Function; import static org.zwobble.couscous.util.ExtraLists.eagerMap; @@ -22,6 +23,7 @@ public class MethodNode implements CallableNode { private final ImmutableList.Builder annotations = ImmutableList.builder(); private boolean isStatic = false; + private boolean isAbstract = false; private final String name; private final ImmutableList.Builder arguments = ImmutableList.builder(); @@ -42,6 +44,11 @@ public class MethodNode implements CallableNode { this.isStatic = isStatic; return this; } + + public Builder isAbstract() { + this.isAbstract = true; + return this; + } public Builder argument(FormalArgumentNode argument) { arguments.add(argument); @@ -75,7 +82,7 @@ public class MethodNode implements CallableNode { name, arguments.build(), returnType, - body.build()); + isAbstract ? Optional.empty() : Optional.of(body.build())); } } @@ -85,7 +92,7 @@ public class MethodNode implements CallableNode { String name, List arguments, TypeName returnType, - List body) + Optional> body) { return new MethodNode(annotations, isStatic, name, arguments, returnType, body); } @@ -95,7 +102,7 @@ public class MethodNode implements CallableNode { private final String name; private final List arguments; private final TypeName returnType; - private final List body; + private final Optional> body; private MethodNode( List annotations, @@ -103,7 +110,7 @@ public class MethodNode implements CallableNode { String name, List arguments, TypeName returnType, - List body) + Optional> body) { this.annotations = annotations; this.isStatic = isStatic; @@ -134,7 +141,7 @@ public class MethodNode implements CallableNode { } public List getBody() { - return body; + return body.get(); } public MethodSignature signature() { @@ -145,7 +152,7 @@ public class MethodNode implements CallableNode { } public MethodNode mapBody(Function, List> function) { - return new MethodNode(annotations, isStatic, name, arguments, returnType, function.apply(body)); + return new MethodNode(annotations, isStatic, name, arguments, returnType, body.map(function)); } @Override @@ -160,7 +167,7 @@ public class MethodNode implements CallableNode { transformer.transformMethodName(signature()), transformer.transformFormalArguments(arguments), transformer.transform(returnType), - transformer.transformStatements(body)); + body.map(transformer::transformStatements)); } @Override -- cgit v1.2.3