diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:50:05 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-06 16:50:05 +0100 |
| commit | cea11f17222914ad65da19405f5a812be0c74d43 (patch) | |
| tree | cda2a3726282320ac8630b9cfc4c427afaa9040d /src/main/java/org | |
| parent | 1352b8d81c5bc7a36f32908ad9c15fcbf081e57e (diff) | |
Remove duplication in builders
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java | 75 |
1 files changed, 28 insertions, 47 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index 65d2fda..ce8c9a0 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -23,65 +23,50 @@ public class ClassNodeBuilder { return this; } - public ClassNodeBuilder constructor(Function<ConstructorBuilder, ConstructorBuilder> build) { - this.constructor = Optional.of(build.apply(new ConstructorBuilder()).build()); + public ClassNodeBuilder constructor(Function<MethodBuilder<ConstructorNode>, MethodBuilder<ConstructorNode>> build) { + this.constructor = Optional.of(build.apply(constructorBuilder()).build()); return this; } + + private MethodBuilder<ConstructorNode> constructorBuilder() { + return new MethodBuilder<ConstructorNode>(builder -> + ConstructorNode.constructor( + builder.arguments.build(), + builder.statements.build())); + } 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()); + public ClassNodeBuilder method(String name, Function<MethodBuilder<MethodNode>, MethodBuilder<MethodNode>> build) { + this.methods.add(build.apply(methodBuilder(name)).build()); return this; } + + private MethodBuilder<MethodNode> methodBuilder(String name) { + return new MethodBuilder<MethodNode>(builder -> MethodNode.builder() + .name(name) + .arguments(builder.arguments.build()) + .body(builder.statements.build()) + .build()); + } public ClassNode build() { return new ClassNode( name, - constructor.orElse(new ConstructorBuilder().build()), + constructor.orElse(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; + public class MethodBuilder<T> { + private final Function<MethodBuilder<?>, T> build; private final ImmutableList.Builder<FormalArgumentNode> arguments; private final ImmutableList.Builder<StatementNode> statements; - public MethodBuilder(String name) { - this.methodName = name; + public MethodBuilder(Function<MethodBuilder<?>, T> build) { + this.build = build; this.arguments = ImmutableList.builder(); this.statements = ImmutableList.builder(); } @@ -90,22 +75,18 @@ public class ClassNodeBuilder { return ThisReferenceNode.thisReference(name); } - public MethodBuilder argument(FormalArgumentNode argument) { + public MethodBuilder<T> argument(FormalArgumentNode argument) { arguments.add(argument); return this; } - public MethodBuilder statement(StatementNode statement) { + public MethodBuilder<T> statement(StatementNode statement) { statements.add(statement); return this; } - public MethodNode build() { - return MethodNode.builder() - .name(methodName) - .arguments(arguments.build()) - .body(statements.build()) - .build(); + public T build() { + return this.build.apply(this); } } }
\ No newline at end of file |
