1616
1717package dagger .internal .codegen .writing ;
1818
19- import static androidx .room .compiler .codegen .XTypeNameKt .toJavaPoet ;
20- import static androidx .room .compiler .codegen .XTypeNameKt .toKotlinPoet ;
19+ import static androidx .room .compiler .codegen .compat . XConverters .toJavaPoet ;
20+ import static androidx .room .compiler .codegen .compat . XConverters .toKotlinPoet ;
2121import static androidx .room .compiler .codegen .compat .XConverters .toXPoet ;
2222import static com .google .common .base .Preconditions .checkArgument ;
2323import static com .squareup .javapoet .MethodSpec .constructorBuilder ;
5151import static javax .lang .model .element .Modifier .PUBLIC ;
5252import static javax .lang .model .element .Modifier .STATIC ;
5353
54+ import androidx .room .compiler .codegen .VisibilityModifier ;
55+ import androidx .room .compiler .codegen .XCodeBlock ;
56+ import androidx .room .compiler .codegen .XPropertySpec ;
5457import androidx .room .compiler .codegen .XTypeName ;
5558import androidx .room .compiler .codegen .compat .XConverters ;
5659import androidx .room .compiler .processing .XAnnotation ;
6871import com .google .common .collect .ImmutableSet ;
6972import com .squareup .javapoet .AnnotationSpec ;
7073import com .squareup .javapoet .ClassName ;
71- import com .squareup .javapoet .CodeBlock ;
7274import com .squareup .javapoet .FieldSpec ;
7375import com .squareup .javapoet .MethodSpec ;
7476import com .squareup .javapoet .ParameterSpec ;
@@ -153,7 +155,10 @@ private TypeSpec.Builder factoryBuilder(ContributionBinding binding) {
153155 factoryBuilder .addType (staticInstanceHolderType (binding ));
154156 } else {
155157 factoryBuilder
156- .addFields (factoryFields .getAll ())
158+ .addFields (
159+ factoryFields .getAll ().stream ()
160+ .map (XConverters ::toJavaPoet )
161+ .collect (toImmutableList ()))
157162 .addMethod (constructorMethod (factoryFields ));
158163 }
159164 gwtIncompatibleAnnotation (binding ).ifPresent (factoryBuilder ::addAnnotation );
@@ -198,11 +203,14 @@ private static ClassName instanceHolderClassName(ContributionBinding binding) {
198203 private MethodSpec constructorMethod (FactoryFields factoryFields ) {
199204 // TODO(bcorso): Make the constructor private?
200205 MethodSpec .Builder constructor = constructorBuilder ().addModifiers (PUBLIC );
201- factoryFields .getAll ().forEach (
202- field ->
203- constructor
204- .addParameter (field .type , field .name )
205- .addStatement ("this.$1N = $1N" , field ));
206+ factoryFields
207+ .getAll ()
208+ .forEach (
209+ field ->
210+ constructor
211+ .addParameter (
212+ toJavaPoet (field .getType ()), field .getName ()) // SUPPRESS_GET_NAME_CHECK
213+ .addStatement ("this.$1N = $1N" , toJavaPoet (field )));
206214 return constructor .build ();
207215 }
208216
@@ -240,7 +248,12 @@ private MethodSpec staticCreateMethod(
240248 } else {
241249 ImmutableList <ParameterSpec > parameters =
242250 factoryFields .getAll ().stream ()
243- .map (field -> ParameterSpec .builder (field .type , field .name ).build ())
251+ .map (
252+ field ->
253+ ParameterSpec .builder (
254+ toJavaPoet (field .getType ()),
255+ field .getName ()) // SUPPRESS_GET_NAME_CHECK
256+ .build ())
244257 .collect (toImmutableList ());
245258 createMethodBuilder
246259 .addParameters (parameters )
@@ -267,7 +280,9 @@ private MethodSpec staticCreateMethod(
267280 // }
268281 private MethodSpec getMethod (ContributionBinding binding , FactoryFields factoryFields ) {
269282 UniqueNameSet uniqueFieldNames = new UniqueNameSet ();
270- factoryFields .getAll ().forEach (field -> uniqueFieldNames .claim (field .name ));
283+ factoryFields
284+ .getAll ()
285+ .forEach (field -> uniqueFieldNames .claim (field .getName ())); // SUPPRESS_GET_NAME_CHECK
271286 ImmutableMap <XExecutableParameterElement , ParameterSpec > assistedParameters =
272287 assistedParameters (binding ).stream ()
273288 .collect (
@@ -287,47 +302,49 @@ private MethodSpec getMethod(ContributionBinding binding, FactoryFields factoryF
287302 if (factoryTypeName (binding ).isPresent ()) {
288303 getMethod .addAnnotation (Override .class );
289304 }
290- CodeBlock invokeNewInstance =
305+ XCodeBlock invokeNewInstance =
291306 ProvisionMethod .invoke (
292307 binding ,
293308 request ->
294309 sourceFiles .frameworkTypeUsageStatement (
295- CodeBlock .of ("$ N" , factoryFields .get (request )), request .kind ()),
310+ XCodeBlock .of ("% N" , factoryFields .get (request )), request .kind ()),
296311 param -> assistedParameters .get (param ).name ,
297312 generatedClassNameForBinding (binding ),
298- factoryFields .moduleField .map (module -> CodeBlock .of ("$ N" , module )),
313+ factoryFields .moduleField .map (module -> XCodeBlock .of ("% N" , module )),
299314 compilerOptions );
300315
301316 if (binding .kind ().equals (PROVISION )) {
302317 binding .nullability ().nonTypeUseNullableAnnotations ().stream ()
303318 .map (XConverters ::toJavaPoet )
304319 .forEach (getMethod ::addAnnotation );
305320 getMethod
306- .addStatement ("return $L" , invokeNewInstance )
321+ .addStatement ("return $L" , toJavaPoet ( invokeNewInstance ) )
307322 .returns (toJavaPoet (providedTypeName ));
308323 } else if (!injectionSites (binding ).isEmpty ()) {
309- CodeBlock instance = CodeBlock .of ("instance" );
324+ XCodeBlock instance = XCodeBlock .of ("instance" );
325+ XCodeBlock invokeInjectionSites =
326+ InjectionSiteMethod .invokeAll (
327+ injectionSites (binding ),
328+ generatedClassNameForBinding (binding ),
329+ instance ,
330+ binding .key ().type ().xprocessing (),
331+ sourceFiles .frameworkFieldUsages (
332+ binding .dependencies (), factoryFields .frameworkFields )
333+ ::get );
310334 getMethod
311335 .returns (toJavaPoet (providedTypeName ))
312336 .addStatement (
313337 "$T $L = $L" ,
314338 toJavaPoet (providedTypeName ),
315- instance ,
316- invokeNewInstance )
317- .addCode (
318- InjectionSiteMethod .invokeAll (
319- injectionSites (binding ),
320- generatedClassNameForBinding (binding ),
321- instance ,
322- binding .key ().type ().xprocessing (),
323- sourceFiles .frameworkFieldUsages (
324- binding .dependencies (), factoryFields .frameworkFields )::get ))
325- .addStatement ("return $L" , instance );
339+ toJavaPoet (instance ),
340+ toJavaPoet (invokeNewInstance ))
341+ .addCode (toJavaPoet (invokeInjectionSites ))
342+ .addStatement ("return $L" , toJavaPoet (instance ));
326343
327344 } else {
328345 getMethod
329346 .returns (toJavaPoet (providedTypeName ))
330- .addStatement ("return $L" , invokeNewInstance );
347+ .addStatement ("return $L" , toJavaPoet ( invokeNewInstance ) );
331348 }
332349 return getMethod .build ();
333350 }
@@ -365,9 +382,13 @@ private static MethodSpec staticProxyMethodForInjection(ContributionBinding bind
365382 getThrownTypes (constructor ).stream ()
366383 .map (XConverters ::toJavaPoet )
367384 .collect (toImmutableList ()));
368- CodeBlock arguments = copyParameters (builder , new UniqueNameSet (), constructor .getParameters ());
385+ XCodeBlock arguments =
386+ copyParameters (builder , new UniqueNameSet (), constructor .getParameters ());
369387 return builder
370- .addStatement ("return new $T($L)" , enclosingType .getType ().getTypeName (), arguments )
388+ .addStatement (
389+ "return new $T($L)" ,
390+ toJavaPoet (enclosingType .getType ().asTypeName ()),
391+ toJavaPoet (arguments ))
371392 .build ();
372393 }
373394
@@ -389,46 +410,48 @@ private MethodSpec staticProxyMethodForProvision(ProvisionBinding binding) {
389410
390411 XTypeElement enclosingType = asTypeElement (method .getEnclosingElement ());
391412 UniqueNameSet parameterNameSet = new UniqueNameSet ();
392- CodeBlock module ;
413+ XCodeBlock module ;
393414 if (method .isStatic () || enclosingType .isCompanionObject ()) {
394- module = CodeBlock .of ("$ T" , enclosingType .getClassName ());
415+ module = XCodeBlock .of ("% T" , enclosingType .asClassName ());
395416 } else if (enclosingType .isKotlinObject ()) {
396417 // Call through the singleton instance.
397418 // See: https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#static-methods
398- module = CodeBlock .of ("$ T.INSTANCE" , enclosingType .getClassName ());
419+ module = XCodeBlock .of ("% T.INSTANCE" , enclosingType .asClassName ());
399420 } else {
400421 builder .addTypeVariables (
401422 typeVariableNames (enclosingType ).stream ()
402423 .map (typeName -> (TypeVariableName ) toJavaPoet (typeName ))
403424 .collect (toImmutableList ()));
404425 module = copyInstance (builder , parameterNameSet , enclosingType .getType ());
405426 }
406- CodeBlock arguments = copyParameters (builder , parameterNameSet , method .getParameters ());
407- CodeBlock invocation = CodeBlock .of ("$L.$L($ L)" , module , method .getJvmName (), arguments );
427+ XCodeBlock arguments = copyParameters (builder , parameterNameSet , method .getParameters ());
428+ XCodeBlock invocation = XCodeBlock .of ("%L.%L(% L)" , module , method .getJvmName (), arguments );
408429
409430 Nullability nullability = Nullability .of (method );
410431 nullability .nonTypeUseNullableAnnotations ().stream ()
411432 .map (XConverters ::toJavaPoet )
412433 .forEach (builder ::addAnnotation );
413434 return builder
414435 .returns (
415- method .getReturnType ().getTypeName ()
436+ method
437+ .getReturnType ()
438+ .getTypeName ()
416439 .annotated (
417440 nullability .typeUseNullableAnnotations ().stream ()
418441 .map (XConverters ::toJavaPoet )
419442 .map (annotation -> AnnotationSpec .builder (annotation ).build ())
420443 .collect (toImmutableList ())))
421- .addStatement ("return $L" , maybeWrapInCheckForNull (binding , invocation ))
444+ .addStatement ("return $L" , toJavaPoet ( maybeWrapInCheckForNull (binding , invocation ) ))
422445 .build ();
423446 }
424447
425- private CodeBlock maybeWrapInCheckForNull (ProvisionBinding binding , CodeBlock codeBlock ) {
448+ private XCodeBlock maybeWrapInCheckForNull (ProvisionBinding binding , XCodeBlock codeBlock ) {
426449 return binding .shouldCheckForNull (compilerOptions )
427- ? CodeBlock .of ("$ T.checkNotNullFromProvides($ L)" , Preconditions .class , codeBlock )
450+ ? XCodeBlock .of ("% T.checkNotNullFromProvides(% L)" , Preconditions .class , codeBlock )
428451 : codeBlock ;
429452 }
430453
431- private static CodeBlock copyInstance (
454+ private static XCodeBlock copyInstance (
432455 MethodSpec .Builder methodBuilder , UniqueNameSet parameterNameSet , XType type ) {
433456 return copyParameter (
434457 methodBuilder ,
@@ -518,15 +541,16 @@ private static final class FactoryFields {
518541 static FactoryFields create (ContributionBinding binding ) {
519542 UniqueNameSet nameSet = new UniqueNameSet ();
520543 // TODO(bcorso, dpb): Add a test for the case when a Factory parameter is named "module".
521- Optional <FieldSpec > moduleField =
544+ Optional <XPropertySpec > moduleField =
522545 binding .requiresModuleInstance ()
523546 ? Optional .of (
524547 createField (
525548 binding .bindingTypeElement ().get ().getType ().asTypeName (),
526549 nameSet .getUniqueName ("module" )))
527550 : Optional .empty ();
528551
529- ImmutableMap .Builder <DependencyRequest , FieldSpec > frameworkFields = ImmutableMap .builder ();
552+ ImmutableMap .Builder <DependencyRequest , XPropertySpec > frameworkFields =
553+ ImmutableMap .builder ();
530554 generateBindingFieldsForDependencies (binding ).forEach (
531555 (dependency , field ) ->
532556 frameworkFields .put (
@@ -536,27 +560,33 @@ static FactoryFields create(ContributionBinding binding) {
536560 return new FactoryFields (moduleField , frameworkFields .buildOrThrow ());
537561 }
538562
539- private static FieldSpec createField (XTypeName type , String name ) {
540- return FieldSpec .builder (toJavaPoet (type ), name , PRIVATE , FINAL ).build ();
563+ private static XPropertySpec createField (XTypeName typeName , String name ) {
564+ return XPropertySpec .builder (
565+ /* name= */ name ,
566+ /* typeName= */ typeName ,
567+ /* visibility= */ VisibilityModifier .PRIVATE ,
568+ /* isMutable= */ false ,
569+ /* addJavaNullabilityAnnotation= */ false )
570+ .build ();
541571 }
542572
543- private final Optional <FieldSpec > moduleField ;
544- private final ImmutableMap <DependencyRequest , FieldSpec > frameworkFields ;
573+ private final Optional <XPropertySpec > moduleField ;
574+ private final ImmutableMap <DependencyRequest , XPropertySpec > frameworkFields ;
545575
546576 private FactoryFields (
547- Optional <FieldSpec > moduleField ,
548- ImmutableMap <DependencyRequest , FieldSpec > frameworkFields ) {
577+ Optional <XPropertySpec > moduleField ,
578+ ImmutableMap <DependencyRequest , XPropertySpec > frameworkFields ) {
549579 this .moduleField = moduleField ;
550580 this .frameworkFields = frameworkFields ;
551581 }
552582
553- FieldSpec get (DependencyRequest request ) {
583+ XPropertySpec get (DependencyRequest request ) {
554584 return frameworkFields .get (request );
555585 }
556586
557- ImmutableList <FieldSpec > getAll () {
587+ ImmutableList <XPropertySpec > getAll () {
558588 return moduleField .isPresent ()
559- ? ImmutableList .<FieldSpec >builder ()
589+ ? ImmutableList .<XPropertySpec >builder ()
560590 .add (moduleField .get ())
561591 .addAll (frameworkFields .values ())
562592 .build ()
0 commit comments