aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-06 16:24:37 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-06 16:24:37 +0100
commite6f463257720bee91a1b4954d97684dbb3398cbf (patch)
treec8d1f04dfe8928d33361108aefee7e7572dae1c7 /src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
parent9685c8fb7fa14d5b75d828f8443dd948715ac4af (diff)
Add support for constructors and fields
Diffstat (limited to 'src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
new file mode 100644
index 0000000..cd324b9
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java
@@ -0,0 +1,103 @@
+package org.zwobble.couscous.ast;
+
+import java.util.Optional;
+import java.util.function.Function;
+
+import com.google.common.collect.ImmutableList;
+
+public class ClassNodeBuilder {
+ private final TypeName name;
+ private final ImmutableList.Builder<FieldDeclarationNode> fields;
+ private Optional<ConstructorNode> constructor;
+ private final ImmutableList.Builder<MethodNode> methods;
+
+ public ClassNodeBuilder(String name) {
+ this.name = TypeName.of(name);
+ this.fields = ImmutableList.builder();
+ this.constructor = Optional.empty();
+ this.methods = ImmutableList.builder();
+ }
+
+ public ClassNodeBuilder field(String name, TypeName type) {
+ this.fields.add(FieldDeclarationNode.field(name, type));
+ return this;
+ }
+
+ public ClassNodeBuilder constructor(Function<ConstructorBuilder, ConstructorBuilder> build) {
+ this.constructor = Optional.of(build.apply(new ConstructorBuilder()).build());
+ return this;
+ }
+
+ public ClassNodeBuilder method(MethodNode method) {
+ this.methods.add(method);
+ return this;
+ }
+
+ public ClassNodeBuilder method(String name, Function<MethodBuilder, MethodBuilder> build) {
+ this.methods.add(build.apply(new MethodBuilder(name)).build());
+ return this;
+ }
+
+ public ClassNode build() {
+ return new ClassNode(
+ name,
+ constructor.orElse(new ConstructorBuilder().build()),
+ methods.build());
+ }
+
+ public class ConstructorBuilder {
+ private final ImmutableList.Builder<FormalArgumentNode> arguments;
+ private final ImmutableList.Builder<StatementNode> statements;
+
+ public ConstructorBuilder() {
+ this.arguments = ImmutableList.builder();
+ this.statements = ImmutableList.builder();
+ }
+
+ public ThisReferenceNode thisReference() {
+ return ThisReferenceNode.thisReference(name);
+ }
+
+ public ConstructorBuilder argument(FormalArgumentNode argument) {
+ arguments.add(argument);
+ return this;
+ }
+
+ public ConstructorBuilder statement(StatementNode statement) {
+ statements.add(statement);
+ return this;
+ }
+
+ public ConstructorNode build() {
+ return ConstructorNode.constructor(
+ arguments.build(),
+ statements.build());
+ }
+ }
+
+ public class MethodBuilder {
+ private final String methodName;
+ private final ImmutableList.Builder<StatementNode> statements;
+
+ public MethodBuilder(String name) {
+ this.methodName = name;
+ this.statements = ImmutableList.builder();
+ }
+
+ public ThisReferenceNode thisReference() {
+ return ThisReferenceNode.thisReference(name);
+ }
+
+ public MethodBuilder statement(StatementNode statement) {
+ statements.add(statement);
+ return this;
+ }
+
+ public MethodNode build() {
+ return MethodNode.builder()
+ .name(methodName)
+ .body(statements.build())
+ .build();
+ }
+ }
+} \ No newline at end of file