Skip to content

Commit 580a6ec

Browse files
bcorsoDagger Team
authored andcommitted
[XPoet Migration]: Migrate CodeBlock usages to XCodeBlock.
Note: XPoet adds a parenthesis around all of the casted codeblocks (since there's not a general way to determine if it's needed). Since Dagger keeps track of whether the parenthesis are needed, we could add an input parameter to control this in `XCodeBlock#ofCast()`; however, there doesn't seem to be much harm in adding the parenthesis anyway. RELNOTES=N/A PiperOrigin-RevId: 739976457
1 parent a5398f7 commit 580a6ec

File tree

53 files changed

+586
-296
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+586
-296
lines changed

dagger-compiler/main/java/dagger/internal/codegen/binding/SourceFiles.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package dagger.internal.codegen.binding;
1818

19-
import static androidx.room.compiler.codegen.XTypeNameKt.toJavaPoet;
2019
import static androidx.room.compiler.processing.XElementKt.isConstructor;
2120
import static com.google.common.base.CaseFormat.LOWER_CAMEL;
2221
import static com.google.common.base.CaseFormat.UPPER_CAMEL;
@@ -32,6 +31,8 @@
3231
import static javax.lang.model.SourceVersion.isName;
3332

3433
import androidx.room.compiler.codegen.XClassName;
34+
import androidx.room.compiler.codegen.XCodeBlock;
35+
import androidx.room.compiler.codegen.XPropertySpec;
3536
import androidx.room.compiler.codegen.XTypeName;
3637
import androidx.room.compiler.processing.XExecutableElement;
3738
import androidx.room.compiler.processing.XFieldElement;
@@ -43,8 +44,6 @@
4344
import com.google.common.collect.ImmutableSet;
4445
import com.google.common.collect.Iterables;
4546
import com.google.common.collect.Maps;
46-
import com.squareup.javapoet.CodeBlock;
47-
import com.squareup.javapoet.FieldSpec;
4847
import dagger.internal.codegen.base.MapType;
4948
import dagger.internal.codegen.base.SetType;
5049
import dagger.internal.codegen.binding.MembersInjectionBinding.InjectionSite;
@@ -92,38 +91,38 @@ public final class SourceFiles {
9291
});
9392
}
9493

95-
public CodeBlock frameworkTypeUsageStatement(
96-
CodeBlock frameworkTypeMemberSelect, RequestKind dependencyKind) {
94+
public XCodeBlock frameworkTypeUsageStatement(
95+
XCodeBlock frameworkTypeMemberSelect, RequestKind dependencyKind) {
9796
switch (dependencyKind) {
9897
case LAZY:
99-
return CodeBlock.of(
100-
"$T.lazy($L)",
101-
toJavaPoet(XTypeNames.DOUBLE_CHECK),
98+
return XCodeBlock.of(
99+
"%T.lazy(%L)",
100+
XTypeNames.DOUBLE_CHECK,
102101
frameworkTypeMemberSelect);
103102
case INSTANCE:
104103
case FUTURE:
105-
return CodeBlock.of("$L.get()", frameworkTypeMemberSelect);
104+
return XCodeBlock.of("%L.get()", frameworkTypeMemberSelect);
106105
case PROVIDER:
107106
case PRODUCER:
108107
return frameworkTypeMemberSelect;
109108
case PROVIDER_OF_LAZY:
110-
return CodeBlock.of(
111-
"$T.create($L)", toJavaPoet(XTypeNames.PROVIDER_OF_LAZY), frameworkTypeMemberSelect);
109+
return XCodeBlock.of(
110+
"%T.create(%L)", XTypeNames.PROVIDER_OF_LAZY, frameworkTypeMemberSelect);
112111
default: // including PRODUCED
113112
throw new AssertionError(dependencyKind);
114113
}
115114
}
116115

117116
/**
118-
* Returns a mapping of {@link DependencyRequest}s to {@link CodeBlock}s that {@linkplain
119-
* #frameworkTypeUsageStatement(CodeBlock, RequestKind) use them}.
117+
* Returns a mapping of {@link DependencyRequest}s to {@link XCodeBlock}s that {@linkplain
118+
* #frameworkTypeUsageStatement(XCodeBlock, RequestKind) use them}.
120119
*/
121-
public ImmutableMap<DependencyRequest, CodeBlock> frameworkFieldUsages(
120+
public ImmutableMap<DependencyRequest, XCodeBlock> frameworkFieldUsages(
122121
ImmutableSet<DependencyRequest> dependencies,
123-
ImmutableMap<DependencyRequest, FieldSpec> fields) {
122+
ImmutableMap<DependencyRequest, XPropertySpec> fields) {
124123
return Maps.toMap(
125124
dependencies,
126-
dep -> frameworkTypeUsageStatement(CodeBlock.of("$N", fields.get(dep)), dep.kind()));
125+
dep -> frameworkTypeUsageStatement(XCodeBlock.of("%N", fields.get(dep)), dep.kind()));
127126
}
128127

129128
public static String generatedProxyMethodName(ContributionBinding binding) {

dagger-compiler/main/java/dagger/internal/codegen/writing/FactoryGenerator.java

Lines changed: 81 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package 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;
2121
import static androidx.room.compiler.codegen.compat.XConverters.toXPoet;
2222
import static com.google.common.base.Preconditions.checkArgument;
2323
import static com.squareup.javapoet.MethodSpec.constructorBuilder;
@@ -51,6 +51,9 @@
5151
import static javax.lang.model.element.Modifier.PUBLIC;
5252
import 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;
5457
import androidx.room.compiler.codegen.XTypeName;
5558
import androidx.room.compiler.codegen.compat.XConverters;
5659
import androidx.room.compiler.processing.XAnnotation;
@@ -68,7 +71,6 @@
6871
import com.google.common.collect.ImmutableSet;
6972
import com.squareup.javapoet.AnnotationSpec;
7073
import com.squareup.javapoet.ClassName;
71-
import com.squareup.javapoet.CodeBlock;
7274
import com.squareup.javapoet.FieldSpec;
7375
import com.squareup.javapoet.MethodSpec;
7476
import 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

Comments
 (0)