Skip to content

Commit 11d8135

Browse files
bcorsoDagger Team
authored andcommitted
Internal changes
RELNOTES=N/A PiperOrigin-RevId: 828493399
1 parent 1cf9dfc commit 11d8135

16 files changed

Lines changed: 114 additions & 85 deletions

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

Lines changed: 51 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static dagger.internal.codegen.writing.InjectionMethods.copyFrameworkParameter;
2828
import static dagger.internal.codegen.writing.InjectionMethods.copyParameter;
2929
import static dagger.internal.codegen.xprocessing.Accessibility.isTypeAccessibleFromPublicApi;
30+
import static dagger.internal.codegen.xprocessing.NullableTypeNames.asNullableTypeName;
3031
import static dagger.internal.codegen.xprocessing.XAnnotationSpecs.Suppression.FUTURE_RETURN_VALUE_IGNORED;
3132
import static dagger.internal.codegen.xprocessing.XAnnotationSpecs.Suppression.UNCHECKED;
3233
import static dagger.internal.codegen.xprocessing.XAnnotationSpecs.suppressWarnings;
@@ -113,7 +114,7 @@ public ImmutableList<XTypeSpec> topLevelTypes(ProductionBinding binding) {
113114
.superclass(
114115
XTypeNames.ABSTRACT_PRODUCES_METHOD_PRODUCER.parametrizedBy(
115116
callProducesMethodParameter(binding).getType(),
116-
binding.contributedType().asTypeName()))
117+
contributedTypeName(binding)))
117118
.addModifiers(PUBLIC, FINAL)
118119
.addTypeVariableNames(bindingTypeElementTypeVariableNames(binding))
119120
.addProperties(
@@ -152,11 +153,12 @@ private XFunSpec constructorMethod(ProductionBinding binding, FactoryFields fact
152153
constructorBuilder()
153154
.addModifiers(PRIVATE)
154155
.addParameters(constructorParameters(binding, factoryFields));
155-
constructorBuilder.addStatement(
156-
"super(%N, %L, %N)",
157-
factoryFields.monitorField,
158-
producerTokenConstruction(generatedClassNameForBinding(binding), binding),
159-
factoryFields.executorField);
156+
constructorBuilder
157+
.callSuperConstructor(
158+
"%N, %L, %N",
159+
factoryFields.monitorField,
160+
producerTokenConstruction(generatedClassNameForBinding(binding), binding),
161+
factoryFields.executorField);
160162
factoryFields.getAll().stream()
161163
// The executor and monitor fields belong to the super class so they don't need a field
162164
// assignment here.
@@ -260,24 +262,24 @@ private XFunSpec staticCreateMethod(ProductionBinding binding, FactoryFields fac
260262
// }
261263
public XFunSpec collectDependenciesMethod(
262264
ProductionBinding binding, FactoryFields factoryFields) {
265+
XTypeName returnTypeName = listenableFutureOf(callProducesMethodParameter(binding).getType());
263266
XFunSpecs.Builder methodBuilder =
264-
methodBuilder("collectDependencies").isOverride(true).addModifiers(PROTECTED);
267+
methodBuilder("collectDependencies")
268+
.isOverride(true)
269+
.addModifiers(PROTECTED)
270+
.returns(returnTypeName);
265271
ImmutableList<DependencyRequest> asyncDependencies = asyncDependencies(binding);
266272
switch (asyncDependencies.size()) {
267273
case 0:
268274
return methodBuilder
269-
.returns(listenableFutureOf(XTypeNames.UNIT_VOID_CLASS))
270-
.addStatement(
271-
"return %T.<%T>immediateFuture(null)",
272-
XTypeNames.FUTURES, XTypeNames.UNIT_VOID_CLASS)
275+
.addStatement("return %T.immediateFuture(null)", XTypeNames.FUTURES)
273276
.build();
274277
case 1: {
275278
DependencyRequest asyncDependency = getOnlyElement(asyncDependencies);
276-
XPropertySpec asyncDependencyField = factoryFields.get(asyncDependency);
277-
return methodBuilder
278-
.returns(listenableFutureOf(asyncDependencyType(asyncDependency)))
279-
.addStatement("return %L", producedCodeBlock(asyncDependency, asyncDependencyField))
280-
.build();
279+
XPropertySpec asyncDependencyField = factoryFields.get(asyncDependency);
280+
XCodeBlock returnCodeBlock =
281+
XCodeBlock.of("%L", producedCodeBlock(asyncDependency, asyncDependencyField));
282+
return methodBuilder.addStatement("return %L", returnCodeBlock).build();
281283
}
282284
default:
283285
XCodeBlock.Builder argAssignments = XCodeBlock.builder();
@@ -292,11 +294,11 @@ public XFunSpec collectDependenciesMethod(
292294
/* assignExprArgs...= */ producedCodeBlock(asyncDependency, asyncDependencyField));
293295
}
294296
return methodBuilder
295-
.returns(listenableFutureOf(listOf(XTypeName.ANY_OBJECT)))
296297
.addCode(argAssignments.build())
297298
.addStatement(
298-
"return %T.<%T>allAsList(%L)",
299-
XTypeNames.FUTURES, XTypeName.ANY_OBJECT, makeParametersCodeBlock(argNames.build()))
299+
"return %T.allAsList(%L)",
300+
XTypeNames.FUTURES,
301+
makeParametersCodeBlock(argNames.build()))
300302
.build();
301303
}
302304
}
@@ -326,11 +328,12 @@ private XCodeBlock producedCodeBlock(DependencyRequest request, XPropertySpec fi
326328
// return module.producesFoo((Bar) args.get(0), (Baz) args.get(1));
327329
// }
328330
private XFunSpec callProducesMethod(ProductionBinding binding, FactoryFields factoryFields) {
329-
XTypeName contributedTypeName = binding.contributedType().asTypeName();
331+
XTypeName contributedTypeName = contributedTypeName(binding);
332+
XTypeName returnTypeName = listenableFutureOf(contributedTypeName);
330333
XParameterSpec parameter = callProducesMethodParameter(binding);
331334
XFunSpecs.Builder methodBuilder =
332335
methodBuilder("callProducesMethod")
333-
.returns(listenableFutureOf(contributedTypeName))
336+
.returns(returnTypeName)
334337
.isOverride(true)
335338
.addModifiers(PUBLIC)
336339
.addExceptions(asMethod(binding.bindingElement().get()).getThrownTypes())
@@ -339,17 +342,15 @@ private XFunSpec callProducesMethod(ProductionBinding binding, FactoryFields fac
339342
ImmutableList.Builder<XCodeBlock> parameterCodeBlocks = ImmutableList.builder();
340343
for (DependencyRequest dependency : binding.explicitDependencies()) {
341344
if (isAsyncDependency(dependency)) {
345+
String parameterName = parameter.getName(); // SUPPRESS_GET_NAME_CHECK
346+
XTypeName dependencyType = asyncDependencyType(dependency);
342347
if (asyncDependencies.size() > 1) {
343-
XTypeName dependencyType = asyncDependencyType(dependency);
344348
int argIndex = asyncDependencies.indexOf(dependency);
345-
parameterCodeBlocks.add(
346-
XCodeBlock.ofCast(
347-
dependencyType,
348-
XCodeBlock.of(
349-
"%N.get(%L)", parameter.getName(), argIndex))); // SUPPRESS_GET_NAME_CHECK
349+
XCodeBlock dependencyCodeBlock = XCodeBlock.of("%N.get(%L)", parameterName, argIndex);
350+
parameterCodeBlocks.add(XCodeBlock.ofCast(dependencyType, dependencyCodeBlock));
350351
} else {
351-
parameterCodeBlocks.add(
352-
XCodeBlock.of("%N", parameter.getName())); // SUPPRESS_GET_NAME_CHECK
352+
XCodeBlock dependencyCodeBlock = XCodeBlock.of("%N", parameterName);
353+
parameterCodeBlocks.add(dependencyCodeBlock);
353354
}
354355
} else {
355356
parameterCodeBlocks.add(
@@ -370,33 +371,34 @@ private XFunSpec callProducesMethod(ProductionBinding binding, FactoryFields fac
370371
getSimpleName(binding.bindingElement().get()),
371372
makeParametersCodeBlock(parameterCodeBlocks.build()));
372373

374+
XCodeBlock returnCodeBlock;
373375
switch (ProductionKind.fromProducesMethod(asMethod(binding.bindingElement().get()))) {
374376
case IMMEDIATE:
375-
methodBuilder.addStatement(
376-
"return %T.<%T>immediateFuture(%L)",
377-
XTypeNames.FUTURES, contributedTypeName, moduleCodeBlock);
377+
returnCodeBlock = XCodeBlock.of("%T.immediateFuture(%L)", XTypeNames.FUTURES, moduleCodeBlock);
378378
break;
379379
case FUTURE:
380-
methodBuilder.addStatement("return %L", moduleCodeBlock);
380+
returnCodeBlock = XCodeBlock.of("%L", moduleCodeBlock);
381381
break;
382382
case SET_OF_FUTURE:
383-
methodBuilder.addStatement("return %T.allAsSet(%L)", XTypeNames.PRODUCERS, moduleCodeBlock);
383+
returnCodeBlock = XCodeBlock.of("%T.allAsSet(%L)", XTypeNames.PRODUCERS, moduleCodeBlock);
384384
break;
385+
default:
386+
throw new AssertionError();
385387
}
386-
return methodBuilder.build();
388+
return methodBuilder.addStatement("return %L", returnCodeBlock).build();
387389
}
388390

389391
private XParameterSpec callProducesMethodParameter(ProductionBinding binding) {
390392
ImmutableList<DependencyRequest> asyncDependencies = asyncDependencies(binding);
391393
switch (asyncDependencies.size()) {
392394
case 0:
393-
return XParameterSpecs.of("ignoredVoidArg", XTypeNames.UNIT_VOID_CLASS);
395+
return XParameterSpecs.of(
396+
"ignoredVoidArg", XTypeNames.UNIT_VOID_CLASS.copy(/* nullable= */ true));
394397
case 1:
395398
DependencyRequest asyncDependency = getOnlyElement(asyncDependencies);
396399
String argName = getSimpleName(asyncDependency.requestElement().get().xprocessing());
397-
return XParameterSpecs.of(
398-
argName.equals("module") ? "moduleArg" : argName,
399-
asyncDependencyType(asyncDependency));
400+
XTypeName parameterType = asyncDependencyType(asyncDependency);
401+
return XParameterSpecs.of(argName.equals("module") ? "moduleArg" : argName, parameterType);
400402
default:
401403
return XParameterSpecs.of("args", listOf(XTypeName.ANY_OBJECT));
402404
}
@@ -418,7 +420,7 @@ private XCodeBlock producerTokenConstruction(
418420
"%s#%s",
419421
binding.bindingTypeElement().get().getClassName(),
420422
getSimpleName(binding.bindingElement().get())))
421-
: XCodeBlock.of("%T.class", generatedTypeName);
423+
: XCodeBlock.ofJavaClassLiteral(generatedTypeName);
422424
return XCodeBlock.of("%T.create(%L)", XTypeNames.PRODUCER_TOKEN, producerTokenArgs);
423425
}
424426

@@ -449,6 +451,15 @@ private static XTypeName asyncDependencyType(DependencyRequest dependency) {
449451
}
450452
}
451453

454+
455+
private XTypeName contributedTypeName(ProductionBinding binding) {
456+
XTypeName typeName =
457+
isTypeAccessibleFromPublicApi(binding.contributedType(), compilerOptions)
458+
? binding.contributedType().asTypeName()
459+
: XTypeName.ANY_OBJECT.copy(/* nullable= */ true);
460+
return asNullableTypeName(typeName, binding.nullability(), compilerOptions);
461+
}
462+
452463
/** Represents the available fields in the generated factory class. */
453464
private static final class FactoryFields {
454465
static FactoryFields create(ProductionBinding binding, CompilerOptions compilerOptions) {

dagger-compiler/main/java/dagger/internal/codegen/xprocessing/XFunSpecs.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ private static enum Kind {
100100
}
101101

102102
private final Kind kind;
103+
private final List<XCodeBlock> javadocs = new ArrayList<>();
104+
private final List<XParameterSpec> parameters = new ArrayList<>();
105+
private final List<XAnnotationSpec> annotations = new ArrayList<>();
106+
private final List<XTypeName> typeVariableNames = new ArrayList<>();
107+
private final List<XTypeName> exceptionNames = new ArrayList<>();
103108
private final XCodeBlock.Builder bodyBuilder = XCodeBlock.builder();
104109
private String name;
105110
private VisibilityModifier visibility = null;
@@ -109,11 +114,7 @@ private static enum Kind {
109114
private boolean isOverride = false;
110115
private boolean isVarArgs = false;
111116
private XTypeName returnType = null;
112-
private final List<XCodeBlock> javadocs = new ArrayList<>();
113-
private final List<XParameterSpec> parameters = new ArrayList<>();
114-
private final List<XAnnotationSpec> annotations = new ArrayList<>();
115-
private final List<XTypeName> typeVariableNames = new ArrayList<>();
116-
private final List<XTypeName> exceptionNames = new ArrayList<>();
117+
private XCodeBlock superConstructorParametersCodeBlock = null;
117118

118119
Builder(Kind kind) {
119120
this.kind = kind;
@@ -358,6 +359,17 @@ public Builder addCode(XCodeBlock codeBlock) {
358359
return this;
359360
}
360361

362+
@CanIgnoreReturnValue
363+
public Builder callSuperConstructor(XCodeBlock superConstructorParametersCodeBlock) {
364+
this.superConstructorParametersCodeBlock = superConstructorParametersCodeBlock;
365+
return this;
366+
}
367+
368+
@CanIgnoreReturnValue
369+
public Builder callSuperConstructor(String format, Object... args) {
370+
return callSuperConstructor(XCodeBlock.of(format, args));
371+
}
372+
361373
/** Begins a control flow block. */
362374
@CanIgnoreReturnValue
363375
public Builder beginControlFlow(String controlFlow, Object... args) {
@@ -458,6 +470,12 @@ public XFunSpec build() {
458470
toJavaPoet(builder).addJavadoc(toJavaPoet(javadoc));
459471
}
460472

473+
if (superConstructorParametersCodeBlock != null) {
474+
toJavaPoet(builder).addStatement("super($L)", toJavaPoet(superConstructorParametersCodeBlock));
475+
toKotlinPoet(builder)
476+
.callSuperConstructor(toKotlinPoet(superConstructorParametersCodeBlock));
477+
}
478+
461479
XCodeBlock body = bodyBuilder.build();
462480
if (!XCodeBlocks.isEmpty(body)) {
463481
builder.addCode(body);

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodMultipleArgsFuture/test.TestModule_ProduceStringFactory_DEFAULT_MODE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
4848
protected ListenableFuture<List<Object>> collectDependencies() {
4949
final ListenableFuture<Integer> iFuture = iProducer.get();
5050
final ListenableFuture<Long> lFuture = lProducer.get();
51-
return Futures.<Object>allAsList(iFuture, lFuture);
51+
return Futures.allAsList(iFuture, lFuture);
5252
}
5353

5454
@Override

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodMultipleArgsFuture/test.TestModule_ProduceStringFactory_FAST_INIT_MODE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
4848
protected ListenableFuture<List<Object>> collectDependencies() {
4949
final ListenableFuture<Integer> iFuture = iProducer.get();
5050
final ListenableFuture<Long> lFuture = lProducer.get();
51-
return Futures.<Object>allAsList(iFuture, lFuture);
51+
return Futures.allAsList(iFuture, lFuture);
5252
}
5353

5454
@Override

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodMultipleArgsFuture/test.TestModule_ProduceStringFactory_KT_DEFAULT_MODE

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import javax.annotation.processing.Generated;
2828
"deprecation",
2929
"nullness:initialization.field.uninitialized"
3030
})
31-
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<List<Object>, String> {
31+
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<List<Object>, Object> {
3232
private final TestModule module;
3333

3434
private final Producer<Integer> iProducer;
@@ -48,13 +48,13 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
4848
protected ListenableFuture<List<Object>> collectDependencies() {
4949
final ListenableFuture<Integer> iFuture = iProducer.get();
5050
final ListenableFuture<Long> lFuture = lProducer.get();
51-
return Futures.<Object>allAsList(iFuture, lFuture);
51+
return Futures.allAsList(iFuture, lFuture);
5252
}
5353

5454
@Override
5555
@SuppressWarnings("unchecked")
56-
public ListenableFuture<String> callProducesMethod(List<Object> args) {
57-
return module.produceString((Integer) (args.get(0)), (Long) (args.get(1)));
56+
public ListenableFuture<Object> callProducesMethod(List<Object> args) {
57+
return (ListenableFuture<Object>) ((Object) (module.produceString((Integer) (args.get(0)), (Long) (args.get(1)))));
5858
}
5959

6060
public static TestModule_ProduceStringFactory create(Object module, Provider<?> executorProvider,

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodMultipleArgsFuture/test.TestModule_ProduceStringFactory_KT_FAST_INIT_MODE

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import javax.annotation.processing.Generated;
2828
"deprecation",
2929
"nullness:initialization.field.uninitialized"
3030
})
31-
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<List<Object>, String> {
31+
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<List<Object>, Object> {
3232
private final TestModule module;
3333

3434
private final Producer<Integer> iProducer;
@@ -48,13 +48,13 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
4848
protected ListenableFuture<List<Object>> collectDependencies() {
4949
final ListenableFuture<Integer> iFuture = iProducer.get();
5050
final ListenableFuture<Long> lFuture = lProducer.get();
51-
return Futures.<Object>allAsList(iFuture, lFuture);
51+
return Futures.allAsList(iFuture, lFuture);
5252
}
5353

5454
@Override
5555
@SuppressWarnings("unchecked")
56-
public ListenableFuture<String> callProducesMethod(List<Object> args) {
57-
return module.produceString((Integer) (args.get(0)), (Long) (args.get(1)));
56+
public ListenableFuture<Object> callProducesMethod(List<Object> args) {
57+
return (ListenableFuture<Object>) ((Object) (module.produceString((Integer) (args.get(0)), (Long) (args.get(1)))));
5858
}
5959

6060
public static TestModule_ProduceStringFactory create(Object module, Provider<?> executorProvider,

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodNoArgsFuture/test.TestModule_ProduceStringFactory_DEFAULT_MODE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
3636

3737
@Override
3838
protected ListenableFuture<Void> collectDependencies() {
39-
return Futures.<Void>immediateFuture(null);
39+
return Futures.immediateFuture(null);
4040
}
4141

4242
@Override

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodNoArgsFuture/test.TestModule_ProduceStringFactory_FAST_INIT_MODE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
3636

3737
@Override
3838
protected ListenableFuture<Void> collectDependencies() {
39-
return Futures.<Void>immediateFuture(null);
39+
return Futures.immediateFuture(null);
4040
}
4141

4242
@Override

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodNoArgsFuture/test.TestModule_ProduceStringFactory_KT_DEFAULT_MODE

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import javax.annotation.processing.Generated;
2525
"deprecation",
2626
"nullness:initialization.field.uninitialized"
2727
})
28-
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<Void, String> {
28+
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<Void, Object> {
2929
private final TestModule module;
3030

3131
private TestModule_ProduceStringFactory(TestModule module, Provider<Executor> executorProvider,
@@ -36,12 +36,12 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
3636

3737
@Override
3838
protected ListenableFuture<Void> collectDependencies() {
39-
return Futures.<Void>immediateFuture(null);
39+
return Futures.immediateFuture(null);
4040
}
4141

4242
@Override
43-
public ListenableFuture<String> callProducesMethod(Void ignoredVoidArg) {
44-
return module.produceString();
43+
public ListenableFuture<Object> callProducesMethod(Void ignoredVoidArg) {
44+
return (ListenableFuture<Object>) ((Object) (module.produceString()));
4545
}
4646

4747
public static TestModule_ProduceStringFactory create(Object module, Provider<?> executorProvider,

javatests/dagger/internal/codegen/goldens/ProducerModuleFactoryGeneratorTest/singleProducesMethodNoArgsFuture/test.TestModule_ProduceStringFactory_KT_FAST_INIT_MODE

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import javax.annotation.processing.Generated;
2525
"deprecation",
2626
"nullness:initialization.field.uninitialized"
2727
})
28-
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<Void, String> {
28+
public final class TestModule_ProduceStringFactory extends AbstractProducesMethodProducer<Void, Object> {
2929
private final TestModule module;
3030

3131
private TestModule_ProduceStringFactory(TestModule module, Provider<Executor> executorProvider,
@@ -36,12 +36,12 @@ public final class TestModule_ProduceStringFactory extends AbstractProducesMetho
3636

3737
@Override
3838
protected ListenableFuture<Void> collectDependencies() {
39-
return Futures.<Void>immediateFuture(null);
39+
return Futures.immediateFuture(null);
4040
}
4141

4242
@Override
43-
public ListenableFuture<String> callProducesMethod(Void ignoredVoidArg) {
44-
return module.produceString();
43+
public ListenableFuture<Object> callProducesMethod(Void ignoredVoidArg) {
44+
return (ListenableFuture<Object>) ((Object) (module.produceString()));
4545
}
4646

4747
public static TestModule_ProduceStringFactory create(Object module, Provider<?> executorProvider,

0 commit comments

Comments
 (0)