2121import javax .lang .model .element .ExecutableElement ;
2222import javax .lang .model .element .Modifier ;
2323import javax .lang .model .type .TypeMirror ;
24+ import java .util .ArrayList ;
2425import java .util .Collection ;
26+ import java .util .List ;
2527import java .util .Map ;
2628import java .util .function .Function ;
2729import 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 ());
0 commit comments