diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:24:37 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:24:37 +0100 |
| commit | e6f463257720bee91a1b4954d97684dbb3398cbf (patch) | |
| tree | c8d1f04dfe8928d33361108aefee7e7572dae1c7 /src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java | |
| parent | 9685c8fb7fa14d5b75d828f8443dd948715ac4af (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.java | 103 |
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 |
