Skip to content

Commit d60729d

Browse files
Chang-EricDagger Team
authored andcommitted
Change Dagger-genenerated factories to have an additional create method that takes in dagger.internal.Provider types. Since the components already pass in dagger.internal.Provider types, this will automatically make those components use the new method even though the component code hasn't change.
`javax.inject.Provider` methods are left to solve linking errors across Dagger versions. These methods will be removed in the future though. RELNOTES=Make factory classes use `dagger.internal.Provider`. PiperOrigin-RevId: 707611594
1 parent 6ee6092 commit d60729d

File tree

78 files changed

+670
-100
lines changed

Some content is hidden

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

78 files changed

+670
-100
lines changed

java/dagger/internal/Providers.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424
public final class Providers {
2525

2626
/** Converts a javax provider to a Dagger internal provider. */
27+
@SuppressWarnings("unchecked")
2728
public static <T extends @Nullable Object> Provider<T> asDaggerProvider(
2829
final javax.inject.Provider<T> provider) {
2930
checkNotNull(provider);
31+
if (provider instanceof Provider) {
32+
return (Provider) provider;
33+
}
3034
return new Provider<T>() {
3135
@Override public T get() {
3236
return provider.get();

java/dagger/internal/codegen/binding/SourceFiles.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
import dagger.internal.codegen.javapoet.TypeNames;
6666
import dagger.internal.codegen.model.DependencyRequest;
6767
import dagger.internal.codegen.model.RequestKind;
68-
import dagger.internal.codegen.xprocessing.XTypeNames;
6968
import javax.inject.Inject;
7069
import javax.lang.model.SourceVersion;
7170

@@ -100,14 +99,6 @@ public final class SourceFiles {
10099
dependency -> {
101100
XClassName frameworkClassName =
102101
frameworkTypeMapper.getFrameworkType(dependency.kind()).frameworkClassName();
103-
// Remap factory fields back to javax.inject.Provider to maintain backwards compatibility
104-
// for now. In a future release, we should change this to Dagger Provider. This will still
105-
// be a breaking change, but keeping compatibility for a while should reduce the
106-
// likelihood of breakages as it would require components built at much older versions
107-
// using factories built at newer versions to break.
108-
if (frameworkClassName.equals(XTypeNames.DAGGER_PROVIDER)) {
109-
frameworkClassName = XTypeNames.PROVIDER;
110-
}
111102
return FrameworkField.create(
112103
DependencyVariableNamer.name(dependency),
113104
frameworkClassName,
Binary file not shown.

java/dagger/internal/codegen/javapoet/TypeNames.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public final class TypeNames {
8888
public static final ClassName MEMBERS_INJECTORS =
8989
ClassName.get("dagger.internal", "MembersInjectors");
9090
public static final ClassName PROVIDER = ClassName.get("javax.inject", "Provider");
91+
public static final ClassName JAKARTA_PROVIDER = ClassName.get("jakarta.inject", "Provider");
9192
public static final ClassName DAGGER_PROVIDER = ClassName.get("dagger.internal", "Provider");
9293
public static final ClassName DAGGER_PROVIDERS = ClassName.get("dagger.internal", "Providers");
9394
public static final ClassName PROVIDER_OF_LAZY =

java/dagger/internal/codegen/writing/FactoryGenerator.java

Lines changed: 81 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import static dagger.internal.codegen.javapoet.AnnotationSpecs.Suppression.RAWTYPES;
3434
import static dagger.internal.codegen.javapoet.AnnotationSpecs.Suppression.UNCHECKED;
3535
import static dagger.internal.codegen.javapoet.AnnotationSpecs.suppressWarnings;
36+
import static dagger.internal.codegen.javapoet.CodeBlocks.makeParametersCodeBlock;
3637
import static dagger.internal.codegen.javapoet.CodeBlocks.parameterNames;
3738
import static dagger.internal.codegen.javapoet.TypeNames.factoryOf;
3839
import static dagger.internal.codegen.model.BindingKind.INJECTION;
@@ -61,12 +62,14 @@
6162
import com.google.common.collect.ImmutableList;
6263
import com.google.common.collect.ImmutableMap;
6364
import com.google.common.collect.ImmutableSet;
65+
import com.google.common.collect.Lists;
6466
import com.squareup.javapoet.AnnotationSpec;
6567
import com.squareup.javapoet.ClassName;
6668
import com.squareup.javapoet.CodeBlock;
6769
import com.squareup.javapoet.FieldSpec;
6870
import com.squareup.javapoet.MethodSpec;
6971
import com.squareup.javapoet.ParameterSpec;
72+
import com.squareup.javapoet.ParameterizedTypeName;
7073
import com.squareup.javapoet.TypeName;
7174
import com.squareup.javapoet.TypeSpec;
7275
import dagger.internal.Preconditions;
@@ -88,6 +91,7 @@
8891
import dagger.internal.codegen.writing.InjectionMethods.InjectionSiteMethod;
8992
import dagger.internal.codegen.writing.InjectionMethods.ProvisionMethod;
9093
import dagger.internal.codegen.xprocessing.Nullability;
94+
import java.util.List;
9195
import java.util.Optional;
9296
import java.util.stream.Stream;
9397
import javax.inject.Inject;
@@ -150,7 +154,7 @@ private TypeSpec.Builder factoryBuilder(ContributionBinding binding) {
150154

151155
return factoryBuilder
152156
.addMethod(getMethod(binding, factoryFields))
153-
.addMethod(staticCreateMethod(binding, factoryFields))
157+
.addMethods(staticCreateMethod(binding, factoryFields))
154158
.addMethod(staticProxyMethod(binding));
155159
}
156160

@@ -208,10 +212,12 @@ private MethodSpec constructorMethod(FactoryFields factoryFields) {
208212
// Provider<Baz> bazProvider) {
209213
// return new FooModule_ProvidesFooFactory(module, barProvider, bazProvider);
210214
// }
211-
private MethodSpec staticCreateMethod(ContributionBinding binding, FactoryFields factoryFields) {
215+
private ImmutableList<MethodSpec> staticCreateMethod(
216+
ContributionBinding binding, FactoryFields factoryFields) {
212217
// We use a static create method so that generated components can avoid having to refer to the
213218
// generic types of the factory. (Otherwise they may have visibility problems referring to the
214219
// types.)
220+
ImmutableList.Builder<MethodSpec> methodsBuilder = ImmutableList.builder();
215221
MethodSpec.Builder createMethodBuilder =
216222
methodBuilder("create")
217223
.addModifiers(PUBLIC, STATIC)
@@ -234,8 +240,32 @@ private MethodSpec staticCreateMethod(ContributionBinding binding, FactoryFields
234240
"return new $T($L)",
235241
parameterizedGeneratedTypeNameForBinding(binding),
236242
parameterNames(parameters));
243+
// If any of the parameters take a Dagger Provider type, we also need to make a
244+
// Javax Provider type for backwards compatibility with components generated at
245+
// an older version.
246+
// Eventually, we will need to remove this and break backwards compatibility
247+
// in order to fully cut the Javax dependency.
248+
if (hasDaggerProviderParams(parameters)) {
249+
methodsBuilder.add(javaxCreateMethod(binding, parameters));
250+
}
237251
}
238-
return createMethodBuilder.build();
252+
methodsBuilder.add(createMethodBuilder.build());
253+
return methodsBuilder.build();
254+
}
255+
256+
private MethodSpec javaxCreateMethod(
257+
ContributionBinding binding, ImmutableList<ParameterSpec> parameters) {
258+
ImmutableList<ParameterSpec> remappedParams = remapParamsToJavaxProvider(parameters);
259+
return methodBuilder("create")
260+
.addModifiers(PUBLIC, STATIC)
261+
.returns(parameterizedGeneratedTypeNameForBinding(binding))
262+
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
263+
.addParameters(remappedParams)
264+
.addStatement(
265+
"return new $T($L)",
266+
parameterizedGeneratedTypeNameForBinding(binding),
267+
wrappedParametersCodeBlock(remappedParams))
268+
.build();
239269
}
240270

241271
// Example 1: Provision binding.
@@ -478,6 +508,54 @@ private static Optional<TypeName> factoryTypeName(ContributionBinding binding) {
478508
: Optional.of(factoryOf(providedTypeName(binding)));
479509
}
480510

511+
// Open for sharing with ProducerFactoryGenerator and MembersInjectorGenerator
512+
static boolean hasDaggerProviderParams(List<ParameterSpec> params) {
513+
return params.stream().anyMatch(param -> isDaggerProviderType(param.type));
514+
}
515+
516+
// Open for sharing with ProducerFactoryGenerator and MembersInjectorGenerator
517+
// Returns a code block that represents a parameter list where any javax Provider
518+
// types are wrapped in an asDaggerProvider call
519+
static CodeBlock wrappedParametersCodeBlock(List<ParameterSpec> params) {
520+
return makeParametersCodeBlock(
521+
Lists.transform(
522+
params,
523+
input ->
524+
isProviderType(input.type)
525+
? CodeBlock.of(
526+
"$T.asDaggerProvider($N)", TypeNames.DAGGER_PROVIDERS, input)
527+
: CodeBlock.of("$N", input)));
528+
}
529+
530+
// Open for sharing with ProducerFactoryGenerator and MembersInjectorGenerator
531+
static ImmutableList<ParameterSpec> remapParamsToJavaxProvider(List<ParameterSpec> params) {
532+
return params.stream()
533+
.map(param -> ParameterSpec.builder(
534+
remapDaggerProviderToProvider(param.type), param.name).build())
535+
.collect(toImmutableList());
536+
}
537+
538+
private static boolean isDaggerProviderType(TypeName type) {
539+
return type instanceof ParameterizedTypeName
540+
&& ((ParameterizedTypeName) type).rawType.equals(TypeNames.DAGGER_PROVIDER);
541+
}
542+
543+
private static boolean isProviderType(TypeName type) {
544+
return type instanceof ParameterizedTypeName
545+
&& ((ParameterizedTypeName) type).rawType.equals(TypeNames.PROVIDER);
546+
}
547+
548+
private static TypeName remapDaggerProviderToProvider(TypeName type) {
549+
if (type instanceof ParameterizedTypeName) {
550+
ParameterizedTypeName parameterizedTypeName = (ParameterizedTypeName) type;
551+
if (parameterizedTypeName.rawType.equals(TypeNames.DAGGER_PROVIDER)) {
552+
return ParameterizedTypeName.get(
553+
TypeNames.PROVIDER, parameterizedTypeName.typeArguments.toArray(new TypeName[0]));
554+
}
555+
}
556+
return type;
557+
}
558+
481559
/** Represents the available fields in the generated factory class. */
482560
private static final class FactoryFields {
483561
static FactoryFields create(ContributionBinding binding) {

java/dagger/internal/codegen/writing/MembersInjectorGenerator.java

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
import static dagger.internal.codegen.javapoet.TypeNames.membersInjectorOf;
3838
import static dagger.internal.codegen.langmodel.Accessibility.isRawTypePubliclyAccessible;
3939
import static dagger.internal.codegen.langmodel.Accessibility.isTypeAccessibleFrom;
40+
import static dagger.internal.codegen.writing.FactoryGenerator.hasDaggerProviderParams;
41+
import static dagger.internal.codegen.writing.FactoryGenerator.remapParamsToJavaxProvider;
42+
import static dagger.internal.codegen.writing.FactoryGenerator.wrappedParametersCodeBlock;
4043
import static dagger.internal.codegen.writing.GwtCompatibility.gwtIncompatibleAnnotation;
4144
import static dagger.internal.codegen.writing.InjectionMethods.copyParameter;
4245
import static dagger.internal.codegen.writing.InjectionMethods.copyParameters;
@@ -83,6 +86,7 @@
8386
import dagger.internal.codegen.writing.InjectionMethods.InjectionSiteMethod;
8487
import dagger.internal.codegen.xprocessing.Nullability;
8588
import dagger.internal.codegen.xprocessing.XAnnotations;
89+
import java.util.List;
8690
import java.util.Optional;
8791
import javax.inject.Inject;
8892

@@ -126,7 +130,7 @@ public ImmutableList<TypeSpec.Builder> topLevelTypes(MembersInjectionBinding bin
126130
.addSuperinterface(membersInjectorOf(binding.key().type().xprocessing().getTypeName()))
127131
.addFields(frameworkFields.values())
128132
.addMethod(constructor(frameworkFields))
129-
.addMethod(createMethod(binding, frameworkFields))
133+
.addMethods(createMethod(binding, frameworkFields))
130134
.addMethod(injectMembersMethod(binding, frameworkFields))
131135
.addMethods(
132136
binding.injectionSites().stream()
@@ -260,22 +264,42 @@ private MethodSpec constructor(ImmutableMap<DependencyRequest, FieldSpec> framew
260264
// @SuppressWarnings("RAW_TYPE") Provider dep3Provider) {
261265
// return new MyClass_MembersInjector(dep1Provider, dep2Provider, dep3Provider);
262266
// }
263-
private MethodSpec createMethod(
267+
private ImmutableList<MethodSpec> createMethod(
264268
MembersInjectionBinding binding,
265269
ImmutableMap<DependencyRequest, FieldSpec> frameworkFields) {
266-
MethodSpec constructor = constructor(frameworkFields);
270+
ImmutableList.Builder<MethodSpec> methodsBuilder = ImmutableList.builder();
271+
List<ParameterSpec> params = constructor(frameworkFields).parameters;
267272
// We use a static create method so that generated components can avoid having
268273
// to refer to the generic types of the factory.
269274
// (Otherwise they may have visibility problems referring to the types.)
275+
methodsBuilder.add(methodBuilder("create")
276+
.addModifiers(PUBLIC, STATIC)
277+
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
278+
.returns(membersInjectorOf(binding.key().type().xprocessing().getTypeName()))
279+
.addParameters(params)
280+
.addStatement(
281+
"return new $T($L)",
282+
parameterizedGeneratedTypeNameForBinding(binding),
283+
parameterNames(params))
284+
.build());
285+
if (hasDaggerProviderParams(params)) {
286+
methodsBuilder.add(javaxCreateMethod(binding, params));
287+
}
288+
return methodsBuilder.build();
289+
}
290+
291+
private MethodSpec javaxCreateMethod(
292+
MembersInjectionBinding binding, List<ParameterSpec> params) {
293+
ImmutableList<ParameterSpec> remappedParams = remapParamsToJavaxProvider(params);
270294
return methodBuilder("create")
271295
.addModifiers(PUBLIC, STATIC)
272296
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
273297
.returns(membersInjectorOf(binding.key().type().xprocessing().getTypeName()))
274-
.addParameters(constructor.parameters)
298+
.addParameters(remappedParams)
275299
.addStatement(
276300
"return new $T($L)",
277301
parameterizedGeneratedTypeNameForBinding(binding),
278-
parameterNames(constructor.parameters))
302+
wrappedParametersCodeBlock(remappedParams))
279303
.build();
280304
}
281305

java/dagger/internal/codegen/writing/ProducerFactoryGenerator.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
import static dagger.internal.codegen.javapoet.TypeNames.listOf;
4141
import static dagger.internal.codegen.javapoet.TypeNames.listenableFutureOf;
4242
import static dagger.internal.codegen.javapoet.TypeNames.producedOf;
43+
import static dagger.internal.codegen.writing.FactoryGenerator.hasDaggerProviderParams;
44+
import static dagger.internal.codegen.writing.FactoryGenerator.remapParamsToJavaxProvider;
45+
import static dagger.internal.codegen.writing.FactoryGenerator.wrappedParametersCodeBlock;
4346
import static dagger.internal.codegen.writing.GwtCompatibility.gwtIncompatibleAnnotation;
4447
import static dagger.internal.codegen.xprocessing.XElements.asMethod;
4548
import static dagger.internal.codegen.xprocessing.XElements.getSimpleName;
@@ -77,6 +80,7 @@
7780
import dagger.internal.codegen.javapoet.TypeNames;
7881
import dagger.internal.codegen.model.DependencyRequest;
7982
import dagger.internal.codegen.model.RequestKind;
83+
import java.util.List;
8084
import java.util.Optional;
8185
import javax.inject.Inject;
8286

@@ -126,7 +130,7 @@ public ImmutableList<TypeSpec.Builder> topLevelTypes(ProductionBinding binding)
126130
.filter(field -> !field.equals(factoryFields.monitorField))
127131
.collect(toImmutableList()))
128132
.addMethod(constructorMethod(binding, factoryFields))
129-
.addMethod(staticCreateMethod(binding, factoryFields))
133+
.addMethods(staticCreateMethod(binding, factoryFields))
130134
.addMethod(collectDependenciesMethod(binding, factoryFields))
131135
.addMethod(callProducesMethod(binding, factoryFields));
132136

@@ -186,17 +190,42 @@ private MethodSpec constructorMethod(ProductionBinding binding, FactoryFields fa
186190
// return new FooModule_ProducesFooFactory(
187191
// module, executorProvider, productionComponentMonitorProvider, fooProducer, barProducer);
188192
// }
189-
private MethodSpec staticCreateMethod(ProductionBinding binding, FactoryFields factoryFields) {
190-
MethodSpec constructor = constructorMethod(binding, factoryFields);
193+
private ImmutableList<MethodSpec> staticCreateMethod(
194+
ProductionBinding binding, FactoryFields factoryFields) {
195+
ImmutableList.Builder<MethodSpec> methodsBuilder = ImmutableList.builder();
196+
List<ParameterSpec> params = constructorMethod(binding, factoryFields).parameters;
197+
methodsBuilder.add(MethodSpec.methodBuilder("create")
198+
.addModifiers(PUBLIC, STATIC)
199+
.returns(parameterizedGeneratedTypeNameForBinding(binding))
200+
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
201+
.addParameters(params)
202+
.addStatement(
203+
"return new $T($L)",
204+
parameterizedGeneratedTypeNameForBinding(binding),
205+
parameterNames(params))
206+
.build());
207+
// If any of the parameters take a Dagger Provider type, we also need to make a
208+
// Javax Provider type for backwards compatibility with components generated at
209+
// an older version.
210+
// Eventually, we will need to remove this and break backwards compatibility
211+
// in order to fully cut the Javax dependency.
212+
if (hasDaggerProviderParams(params)) {
213+
methodsBuilder.add(javaxCreateMethod(binding, params));
214+
}
215+
return methodsBuilder.build();
216+
}
217+
218+
private MethodSpec javaxCreateMethod(ProductionBinding binding, List<ParameterSpec> params) {
219+
ImmutableList<ParameterSpec> remappedParams = remapParamsToJavaxProvider(params);
191220
return MethodSpec.methodBuilder("create")
192221
.addModifiers(PUBLIC, STATIC)
193222
.returns(parameterizedGeneratedTypeNameForBinding(binding))
194223
.addTypeVariables(bindingTypeElementTypeVariableNames(binding))
195-
.addParameters(constructor.parameters)
224+
.addParameters(remappedParams)
196225
.addStatement(
197226
"return new $T($L)",
198227
parameterizedGeneratedTypeNameForBinding(binding),
199-
parameterNames(constructor.parameters))
228+
wrappedParametersCodeBlock(remappedParams))
200229
.build();
201230
}
202231

javatests/dagger/internal/codegen/goldens/AssistedFactoryTest_testFactoryGeneratorDuplicatedParamNames_DEFAULT_MODE_test.Foo_Factory

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package test;
22

33
import dagger.internal.DaggerGenerated;
4+
import dagger.internal.Provider;
5+
import dagger.internal.Providers;
46
import dagger.internal.QualifierMetadata;
57
import dagger.internal.ScopeMetadata;
68
import javax.annotation.processing.Generated;
7-
import javax.inject.Provider;
89

910
@ScopeMetadata
1011
@QualifierMetadata
@@ -33,6 +34,10 @@ public final class Foo_Factory {
3334
return newInstance(argProvider.get(), argProvider2);
3435
}
3536

37+
public static Foo_Factory create(javax.inject.Provider<Bar> argProvider) {
38+
return new Foo_Factory(Providers.asDaggerProvider(argProvider));
39+
}
40+
3641
public static Foo_Factory create(Provider<Bar> argProvider) {
3742
return new Foo_Factory(argProvider);
3843
}

javatests/dagger/internal/codegen/goldens/AssistedFactoryTest_testFactoryGeneratorDuplicatedParamNames_FAST_INIT_MODE_test.Foo_Factory

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package test;
22

33
import dagger.internal.DaggerGenerated;
4+
import dagger.internal.Provider;
5+
import dagger.internal.Providers;
46
import dagger.internal.QualifierMetadata;
57
import dagger.internal.ScopeMetadata;
68
import javax.annotation.processing.Generated;
7-
import javax.inject.Provider;
89

910
@ScopeMetadata
1011
@QualifierMetadata
@@ -33,6 +34,10 @@ public final class Foo_Factory {
3334
return newInstance(argProvider.get(), argProvider2);
3435
}
3536

37+
public static Foo_Factory create(javax.inject.Provider<Bar> argProvider) {
38+
return new Foo_Factory(Providers.asDaggerProvider(argProvider));
39+
}
40+
3641
public static Foo_Factory create(Provider<Bar> argProvider) {
3742
return new Foo_Factory(argProvider);
3843
}

0 commit comments

Comments
 (0)