1010import io .jbock .simple .Inject ;
1111import io .jbock .simple .processor .SimpleComponentProcessor ;
1212import io .jbock .simple .processor .binding .Binding ;
13- import io .jbock .simple .processor .binding .BuilderElement ;
1413import io .jbock .simple .processor .binding .ComponentElement ;
1514import io .jbock .simple .processor .binding .DependencyRequest ;
16- import io .jbock .simple .processor .binding .FactoryElement ;
1715import io .jbock .simple .processor .binding .Key ;
18- import io .jbock .simple .processor .binding .ParameterBinding ;
1916
2017import javax .annotation .processing .Generated ;
21- import javax .lang .model .element .ExecutableElement ;
2218import javax .lang .model .element .Modifier ;
23- import javax .lang .model .type .TypeMirror ;
2419import java .util .ArrayList ;
2520import java .util .List ;
2621import java .util .Map ;
2722import java .util .function .Function ;
28- import java .util .stream .Collectors ;
2923
3024import static javax .lang .model .element .Modifier .FINAL ;
3125import static javax .lang .model .element .Modifier .PRIVATE ;
32- import static javax .lang .model .element .Modifier .PROTECTED ;
3326import static javax .lang .model .element .Modifier .PUBLIC ;
3427import static javax .lang .model .element .Modifier .STATIC ;
3528
@@ -44,19 +37,25 @@ public class ComponentImpl {
4437 private final Map <Key , NamedBinding > sorted ;
4538 private final Function <Key , ParameterSpec > names ;
4639 private final MockBuilder mockBuilder ;
40+ private final BuilderImpl builderImpl ;
41+ private final FactoryImpl factoryImpl ;
4742 private final Modifier [] modifiers ;
4843
4944 private ComponentImpl (
5045 ComponentElement component ,
5146 Map <Key , NamedBinding > sorted ,
5247 Function <Key , ParameterSpec > names ,
53- MockBuilder mockBuilder ) {
48+ MockBuilder mockBuilder ,
49+ BuilderImpl builderImpl ,
50+ FactoryImpl factoryImpl ) {
5451 this .component = component ;
5552 this .sorted = sorted ;
5653 this .names = names ;
5754 this .mockBuilder = mockBuilder ;
5855 this .modifiers = component .element ().getModifiers ().stream ()
5956 .filter (m -> m == PUBLIC ).toArray (Modifier []::new );
57+ this .builderImpl = builderImpl ;
58+ this .factoryImpl = factoryImpl ;
6059 }
6160
6261 TypeSpec generate () {
@@ -79,7 +78,7 @@ TypeSpec generate() {
7978 .returns (TypeName .get (factory .element ().asType ()))
8079 .addStatement ("return new $T()" , factory .generatedClass ())
8180 .build ());
82- spec .addType (createFactoryImpl (factory ));
81+ spec .addType (factoryImpl . generate (factory ));
8382 });
8483 component .builderElement ().ifPresent (builder -> {
8584 spec .addMethod (MethodSpec .methodBuilder (BUILDER_METHOD )
@@ -88,13 +87,15 @@ TypeSpec generate() {
8887 .returns (TypeName .get (builder .element ().asType ()))
8988 .addStatement ("return new $T()" , builder .generatedClass ())
9089 .build ());
91- spec .addType (createBuilderImpl (builder ));
90+ spec .addType (builderImpl . generate (builder ));
9291 });
9392 if (component .factoryElement ().isEmpty () && component .builderElement ().isEmpty ()) {
9493 spec .addMethod (generateCreateMethod ());
94+ if (!component .omitMockBuilder ()) {
95+ spec .addMethod (generateMockBuilderMethod ());
96+ }
9597 }
9698 if (!component .omitMockBuilder ()) {
97- spec .addMethod (generateMockBuilderMethod ());
9899 spec .addType (mockBuilder .generate ());
99100 }
100101 spec .addAnnotation (AnnotationSpec .builder (Generated .class )
@@ -168,85 +169,22 @@ private MethodSpec generateAllParametersConstructor() {
168169 return constructor .build ();
169170 }
170171
171- private TypeSpec createFactoryImpl (FactoryElement factory ) {
172- TypeSpec .Builder spec = TypeSpec .classBuilder (factory .generatedClass ());
173- spec .addModifiers (PRIVATE , STATIC , FINAL );
174- spec .addSuperinterface (factory .element ().asType ());
175- ExecutableElement abstractMethod = factory .singleAbstractMethod ();
176- MethodSpec .Builder method = MethodSpec .methodBuilder (abstractMethod .getSimpleName ().toString ());
177- method .addAnnotation (Override .class );
178- method .addModifiers (abstractMethod .getModifiers ().stream ()
179- .filter (m -> m == PUBLIC || m == PROTECTED ).collect (Collectors .toList ()));
180- method .returns (TypeName .get (component .element ().asType ()));
181- List <CodeBlock > constructorParameters = new ArrayList <>();
182- for (NamedBinding namedBinding : sorted .values ()) {
183- Binding b = namedBinding .binding ();
184- Key key = b .key ();
185- CodeBlock invocation = b .invocation (names );
186- ParameterSpec param = names .apply (key );
187- if (namedBinding .isComponentRequest ()) {
188- constructorParameters .add (CodeBlock .of ("$N" , names .apply (key )));
189- }
190- if (b instanceof ParameterBinding ) {
191- method .addParameter (names .apply (b .key ()));
192- } else {
193- method .addStatement ("$T $N = $L" , key .typeName (), param , invocation );
194- }
195- }
196- method .addStatement ("return new $T($L)" , component .generatedClass (), constructorParameters .stream ()
197- .collect (CodeBlock .joining (", " )));
198- spec .addMethod (method .build ());
199- return spec .build ();
200- }
201-
202- private TypeSpec createBuilderImpl (BuilderElement builder ) {
203- TypeMirror builderType = builder .element ().asType ();
204- TypeSpec .Builder spec = TypeSpec .classBuilder (builder .generatedClass ());
205- MethodSpec .Builder buildMethod = MethodSpec .methodBuilder (builder .buildMethod ().getSimpleName ().toString ());
206- List <CodeBlock > constructorParameters = new ArrayList <>();
207- for (NamedBinding namedBinding : sorted .values ()) {
208- Binding b = namedBinding .binding ();
209- Key key = b .key ();
210- CodeBlock invocation = b .invocation (names );
211- ParameterSpec param = names .apply (key );
212- if (namedBinding .isComponentRequest ()) {
213- constructorParameters .add (CodeBlock .of ("$N" , names .apply (key )));
214- }
215- if (b instanceof ParameterBinding ) {
216- spec .addField (FieldSpec .builder (b .key ().typeName (), names .apply (b .key ()).name ).build ());
217- MethodSpec .Builder setterMethod = MethodSpec .methodBuilder (b .element ().getSimpleName ().toString ());
218- setterMethod .addAnnotation (Override .class );
219- setterMethod .addParameter (names .apply (b .key ()));
220- setterMethod .addStatement ("this.$N = $N" , names .apply (b .key ()), names .apply (b .key ()));
221- setterMethod .addStatement ("return this" );
222- setterMethod .returns (TypeName .get (builderType ));
223- setterMethod .addModifiers (b .element ().getModifiers ().stream ()
224- .filter (m -> m == PUBLIC || m == PROTECTED ).collect (Collectors .toList ()));
225- spec .addMethod (setterMethod .build ());
226- } else {
227- buildMethod .addStatement ("$T $N = $L" , key .typeName (), param , invocation );
228- }
229- }
230- spec .addModifiers (PRIVATE , STATIC , FINAL );
231- spec .addSuperinterface (builderType );
232- buildMethod .addAnnotation (Override .class );
233- buildMethod .addModifiers (builder .buildMethod ().getModifiers ().stream ()
234- .filter (m -> m == PUBLIC || m == PROTECTED ).collect (Collectors .toList ()));
235- buildMethod .returns (TypeName .get (component .element ().asType ()));
236- buildMethod .addStatement ("return new $T($L)" , component .generatedClass (), constructorParameters .stream ()
237- .collect (CodeBlock .joining (", " )));
238- spec .addMethod (buildMethod .build ());
239- return spec .build ();
240- }
241-
242172 public static final class Factory {
243173 private final ComponentElement component ;
244174 private final MockBuilder .Factory mockBuilderFactory ;
175+ private final BuilderImpl .Factory builderImplFactory ;
176+ private final FactoryImpl .Factory factoryImplFactory ;
245177
246178 @ Inject
247- public Factory (ComponentElement component , MockBuilder .Factory mockBuilderFactory ) {
179+ public Factory (
180+ ComponentElement component ,
181+ MockBuilder .Factory mockBuilderFactory ,
182+ BuilderImpl .Factory builderImplFactory ,
183+ FactoryImpl .Factory factoryImplFactory ) {
248184 this .component = component ;
249185 this .mockBuilderFactory = mockBuilderFactory ;
186+ this .builderImplFactory = builderImplFactory ;
187+ this .factoryImplFactory = factoryImplFactory ;
250188 }
251189
252190 ComponentImpl create (
@@ -256,7 +194,9 @@ ComponentImpl create(
256194 component ,
257195 sorted ,
258196 names ,
259- mockBuilderFactory .create (sorted , names ));
197+ mockBuilderFactory .create (sorted , names ),
198+ builderImplFactory .create (sorted , names ),
199+ factoryImplFactory .create (sorted , names ));
260200 }
261201 }
262202}
0 commit comments