Skip to content

Commit 1487e8d

Browse files
authored
ISSUES-4 mockbuilder instance in builder (#13)
1 parent 727158b commit 1487e8d

File tree

5 files changed

+40
-33
lines changed

5 files changed

+40
-33
lines changed

compiler/src/main/java/io/jbock/simple/processor/writing/BuilderImpl.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,18 @@ private BuilderImpl(
4141
this.names = names;
4242
}
4343

44-
TypeSpec generate(BuilderElement builder) {
44+
TypeSpec generate(BuilderElement builder, MockBuilder mockBuilder) {
4545
TypeMirror builderType = builder.element().asType();
4646
TypeSpec.Builder spec = TypeSpec.classBuilder(builder.generatedClass());
47+
if (!component.omitMockBuilder()) {
48+
FieldSpec field = FieldSpec.builder(mockBuilder.getClassName(), "mockBuilder", FINAL).build();
49+
spec.addField(field);
50+
ParameterSpec param = ParameterSpec.builder(mockBuilder.getClassName(), "mockBuilder").build();
51+
spec.addMethod(MethodSpec.constructorBuilder()
52+
.addParameter(param)
53+
.addStatement("this.$N = $N", field, param)
54+
.build());
55+
}
4756
MethodSpec.Builder buildMethod = MethodSpec.methodBuilder(builder.buildMethod().getSimpleName().toString());
4857
List<CodeBlock> constructorParameters = new ArrayList<>();
4958
for (NamedBinding namedBinding : sorted.values()) {

compiler/src/main/java/io/jbock/simple/processor/writing/ComponentImpl.java

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
import io.jbock.simple.Inject;
1111
import io.jbock.simple.processor.SimpleComponentProcessor;
1212
import io.jbock.simple.processor.binding.Binding;
13+
import io.jbock.simple.processor.binding.BuilderElement;
1314
import io.jbock.simple.processor.binding.ComponentElement;
1415
import io.jbock.simple.processor.binding.DependencyRequest;
16+
import io.jbock.simple.processor.binding.FactoryElement;
1517
import io.jbock.simple.processor.binding.Key;
1618

1719
import javax.annotation.processing.Generated;
@@ -61,6 +63,7 @@ private ComponentImpl(
6163
TypeSpec generate() {
6264
TypeSpec.Builder spec = TypeSpec.classBuilder(component.generatedClass())
6365
.addModifiers(modifiers)
66+
.addModifiers(FINAL)
6467
.addSuperinterface(component.element().asType());
6568
spec.addFields(getFields());
6669
for (DependencyRequest r : component.requests()) {
@@ -72,42 +75,46 @@ TypeSpec generate() {
7275
spec.addMethod(method.build());
7376
}
7477
component.factoryElement().ifPresent(factory -> {
75-
spec.addMethod(MethodSpec.methodBuilder(FACTORY_METHOD)
76-
.addModifiers(STATIC)
77-
.addModifiers(modifiers)
78-
.returns(TypeName.get(factory.element().asType()))
79-
.addStatement("return new $T()", factory.generatedClass())
80-
.build());
78+
spec.addMethod(generateFactoryMethod(factory));
8179
spec.addType(factoryImpl.generate(factory));
8280
});
8381
component.builderElement().ifPresent(builder -> {
84-
spec.addMethod(MethodSpec.methodBuilder(BUILDER_METHOD)
85-
.addModifiers(STATIC)
86-
.addModifiers(modifiers)
87-
.returns(TypeName.get(builder.element().asType()))
88-
.addStatement("return new $T()", builder.generatedClass())
89-
.build());
90-
spec.addType(builderImpl.generate(builder));
82+
spec.addMethod(generateBuilderMethod(builder));
83+
spec.addType(builderImpl.generate(builder, mockBuilder));
9184
});
9285
if (component.factoryElement().isEmpty() && component.builderElement().isEmpty()) {
9386
spec.addMethod(generateCreateMethod());
94-
if (!component.omitMockBuilder()) {
95-
spec.addMethod(generateMockBuilderMethod());
96-
}
9787
}
9888
if (!component.omitMockBuilder()) {
89+
spec.addMethod(generateMockBuilderMethod());
9990
spec.addType(mockBuilder.generate());
10091
}
10192
spec.addAnnotation(AnnotationSpec.builder(Generated.class)
10293
.addMember("value", CodeBlock.of("$S", SimpleComponentProcessor.class.getCanonicalName()))
10394
.addMember("comments", CodeBlock.of("$S", "https://github.com/jbock-java/simple-component"))
10495
.build());
105-
spec.addModifiers(FINAL);
10696
spec.addMethod(generateAllParametersConstructor());
10797
spec.addOriginatingElement(component.element());
10898
return spec.build();
10999
}
110100

101+
private MethodSpec generateFactoryMethod(FactoryElement factory) {
102+
return MethodSpec.methodBuilder(FACTORY_METHOD)
103+
.addModifiers(STATIC)
104+
.addModifiers(modifiers)
105+
.returns(TypeName.get(factory.element().asType()))
106+
.addStatement("return new $T()", factory.generatedClass())
107+
.build();
108+
}
109+
110+
private MethodSpec generateBuilderMethod(BuilderElement builder) {
111+
return MethodSpec.methodBuilder(BUILDER_METHOD)
112+
.addModifiers(STATIC)
113+
.addModifiers(modifiers)
114+
.addStatement("return new $T(null)", builder.generatedClass())
115+
.returns(TypeName.get(builder.element().asType())).build();
116+
}
117+
111118
private MethodSpec generateCreateMethod() {
112119
List<CodeBlock> constructorParameters = new ArrayList<>();
113120
MethodSpec.Builder method = MethodSpec.methodBuilder(CREATE_METHOD);

compiler/src/main/java/io/jbock/simple/processor/writing/Generator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public TypeSpec generate(List<Binding> bindings) {
3535

3636
private Map<Key, NamedBinding> addNames(List<Binding> bindings) {
3737
UniqueNameSet uniqueNameSet = new UniqueNameSet();
38+
uniqueNameSet.claim("mockBuilder");
3839
uniqueNameSet.claim("build");
3940
Map<Key, NamedBinding> result = new LinkedHashMap<>();
4041
for (Binding b : bindings) {

compiler/src/main/java/io/jbock/simple/processor/writing/MockBuilder.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,7 @@ TypeSpec generate() {
5454
}
5555

5656
private MethodSpec generateConstructor() {
57-
MethodSpec.Builder constructor = MethodSpec.constructorBuilder().addModifiers(PRIVATE);
58-
for (NamedBinding namedBinding : sorted.values()) {
59-
if (!(namedBinding.binding() instanceof ParameterBinding)) {
60-
continue;
61-
}
62-
ParameterSpec param = names.apply(namedBinding.binding().key());
63-
constructor.addParameter(param);
64-
constructor.addStatement("this.$1N = $1N", param);
65-
}
66-
return constructor.build();
57+
return MethodSpec.constructorBuilder().addModifiers(PRIVATE).build();
6758
}
6859

6960
ClassName getClassName() {
@@ -102,11 +93,10 @@ private MethodSpec buildMethod() {
10293
private List<FieldSpec> getFields() {
10394
List<FieldSpec> fields = new ArrayList<>();
10495
for (NamedBinding namedBinding : sorted.values()) {
105-
TypeName type = namedBinding.binding().key().typeName();
10696
if (namedBinding.binding() instanceof ParameterBinding) {
107-
fields.add(FieldSpec.builder(type, namedBinding.name(), PRIVATE, FINAL).build());
10897
continue;
10998
}
99+
TypeName type = namedBinding.binding().key().typeName();
110100
FieldSpec field = FieldSpec.builder(type, namedBinding.name(), PRIVATE).build();
111101
fields.add(field);
112102
if (namedBinding.binding().key().typeName().isPrimitive()) {

compiler/src/test/java/io/jbock/simple/processor/BuilderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ void noParameters() {
5454
" }",
5555
"",
5656
" static TestClass.AComponent.Builder builder() {",
57-
" return new Builder_Impl();",
57+
" return new Builder_Impl(null);",
5858
" }",
5959
"",
6060
" private static final class Builder_Impl implements TestClass.AComponent.Builder {",
@@ -107,7 +107,7 @@ void builderParameterIdentity() {
107107
" }",
108108
"",
109109
" public static TestClass.AComponent.Builder builder() {",
110-
" return new Builder_Impl();",
110+
" return new Builder_Impl(null);",
111111
" }",
112112
"",
113113
" private static final class Builder_Impl implements TestClass.AComponent.Builder {",
@@ -172,7 +172,7 @@ void builderParameter() {
172172
" }",
173173
"",
174174
" public static TestClass.AComponent.Builder builder() {",
175-
" return new Builder_Impl();",
175+
" return new Builder_Impl(null);",
176176
" }",
177177
"",
178178
" private static final class Builder_Impl implements TestClass.AComponent.Builder {",

0 commit comments

Comments
 (0)