Skip to content

Commit f818156

Browse files
authored
ISSUES-4 generate all parameters constructor (#6)
1 parent 0471110 commit f818156

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

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

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import javax.lang.model.element.ExecutableElement;
2222
import javax.lang.model.element.Modifier;
2323
import javax.lang.model.type.TypeMirror;
24+
import java.util.ArrayList;
2425
import java.util.Collection;
26+
import java.util.List;
2527
import java.util.Map;
2628
import java.util.function.Function;
2729
import java.util.stream.Collectors;
@@ -53,14 +55,7 @@ TypeSpec generate() {
5355
TypeSpec.Builder spec = TypeSpec.classBuilder(component.generatedClass())
5456
.addModifiers(modifiers)
5557
.addSuperinterface(component.element().asType());
56-
MethodSpec constructor = generateConstructor();
57-
for (NamedBinding namedBinding : sorted.values()) {
58-
if (!namedBinding.isComponentRequest()) {
59-
continue;
60-
}
61-
TypeName type = namedBinding.binding().key().typeName();
62-
spec.addField(FieldSpec.builder(type, namedBinding.name(), PRIVATE, FINAL).build());
63-
}
58+
spec.addFields(getFields());
6459
for (DependencyRequest r : component.requests()) {
6560
MethodSpec.Builder method = MethodSpec.methodBuilder(r.requestingElement().getSimpleName().toString());
6661
method.addStatement("return $L", sorted.get(r.key()).name());
@@ -100,7 +95,10 @@ TypeSpec generate() {
10095
.addMember("comments", CodeBlock.of("$S", "https://github.com/jbock-java/simple-component"))
10196
.build());
10297
spec.addModifiers(FINAL);
103-
spec.addMethod(constructor);
98+
spec.addMethod(generateConstructor());
99+
if (sorted.values().stream().anyMatch(binding -> !(binding.binding() instanceof ParameterBinding))) {
100+
spec.addMethod(generateAllParametersConstructor());
101+
}
104102
spec.addOriginatingElement(component.element());
105103
return spec.build();
106104
}
@@ -116,7 +114,7 @@ private MethodSpec generateConstructor() {
116114
constructor.addStatement("this.$N = $L", field, b.invocation(names));
117115
} else if (!(b instanceof ParameterBinding)) {
118116
ParameterSpec param = names.apply(key);
119-
constructor.addStatement("$T $N = $L", b.key().typeName(), param, b.invocation(names));
117+
constructor.addStatement("$T $N = $L", key.typeName(), param, b.invocation(names));
120118
}
121119
if (b instanceof ParameterBinding) {
122120
constructor.addParameter(names.apply(key));
@@ -125,6 +123,32 @@ private MethodSpec generateConstructor() {
125123
return constructor.build();
126124
}
127125

126+
private List<FieldSpec> getFields() {
127+
List<FieldSpec> fields = new ArrayList<>();
128+
for (NamedBinding namedBinding : sorted.values()) {
129+
if (!namedBinding.isComponentRequest()) {
130+
continue;
131+
}
132+
TypeName type = namedBinding.binding().key().typeName();
133+
FieldSpec field = FieldSpec.builder(type, namedBinding.name(), PRIVATE, FINAL).build();
134+
fields.add(field);
135+
}
136+
return fields;
137+
}
138+
139+
private MethodSpec generateAllParametersConstructor() {
140+
MethodSpec.Builder constructor = MethodSpec.constructorBuilder().addModifiers(PRIVATE);
141+
for (NamedBinding namedBinding : sorted.values()) {
142+
if (!namedBinding.isComponentRequest()) {
143+
continue;
144+
}
145+
ParameterSpec param = names.apply(namedBinding.binding().key());
146+
constructor.addParameter(param);
147+
constructor.addStatement("this.$1N = $1N", param);
148+
}
149+
return constructor.build();
150+
}
151+
128152
private TypeSpec createFactoryImpl(FactoryElement factory) {
129153
Collection<ParameterBinding> parameterBindings = component.parameterBindings();
130154
TypeSpec.Builder spec = TypeSpec.classBuilder(factory.generatedClass());

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ void dependencyDiamond() {
115115
" this.a = new TestClass.A(b, c);",
116116
" }",
117117
"",
118+
" private TestClass_AComponent_Impl(TestClass.A a) {",
119+
" this.a = a;",
120+
" }",
121+
"",
118122
" @Override",
119123
" public TestClass.A getA() {",
120124
" return a;",

0 commit comments

Comments
 (0)