Skip to content

Commit ffddc47

Browse files
bcorsoDagger Team
authored andcommitted
Internal changes
RELNOTES=N/A PiperOrigin-RevId: 790922629
1 parent f5f30d4 commit ffddc47

67 files changed

Lines changed: 524 additions & 161 deletions

File tree

Some content is hidden

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

dagger-compiler/main/java/dagger/internal/codegen/bindinggraphvalidation/BUILD

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,12 @@ java_library(
2828
"//dagger-compiler/main/java/dagger/internal/codegen/base",
2929
"//dagger-compiler/main/java/dagger/internal/codegen/binding",
3030
"//dagger-compiler/main/java/dagger/internal/codegen/compileroption",
31-
"//dagger-compiler/main/java/dagger/internal/codegen/kotlin",
3231
"//dagger-compiler/main/java/dagger/internal/codegen/model",
3332
"//dagger-compiler/main/java/dagger/internal/codegen/validation",
3433
"//dagger-compiler/main/java/dagger/internal/codegen/xprocessing",
34+
"//dagger-compiler/main/java/dagger/internal/codegen/xprocessing:xpoet",
3535
"//dagger-runtime/main/java/dagger:core",
3636
"//dagger-spi",
37-
"//third_party/java/auto:common",
3837
"//third_party/java/auto:value",
3938
"//third_party/java/error_prone:annotations",
4039
"//third_party/java/guava/base",

dagger-compiler/main/java/dagger/internal/codegen/bindinggraphvalidation/BindingGraphValidationModule.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,24 @@ static ImmutableSet<ValidationBindingGraphPlugin> providePlugins(
4545
InvalidProductionBindingScopeValidator validation10,
4646
SetMultibindingValidator validation11,
4747
SubcomponentFactoryMethodValidator validation12) {
48-
ImmutableSet<ValidationBindingGraphPlugin> plugins =
49-
ImmutableSet.of(
50-
validation1,
51-
validation2,
52-
validation3,
53-
validation4,
54-
validation5,
55-
validation6,
56-
validation7,
57-
validation8,
58-
validation9,
59-
validation10,
60-
validation11,
61-
validation12);
48+
ImmutableSet.Builder<ValidationBindingGraphPlugin> builder =
49+
ImmutableSet.<ValidationBindingGraphPlugin>builder()
50+
.add(validation1)
51+
.add(validation2)
52+
.add(validation3)
53+
.add(validation4)
54+
.add(validation5)
55+
.add(validation6)
56+
.add(validation7)
57+
.add(validation8)
58+
.add(validation9)
59+
.add(validation10)
60+
.add(validation11)
61+
.add(validation12);
6262
if (compilerOptions.experimentalDaggerErrorMessages()) {
63-
return ImmutableSet.of(factory.create(plugins));
63+
return ImmutableSet.of(factory.create(builder.build()));
6464
} else {
65-
return plugins;
65+
return builder.build();
6666
}
6767
}
6868
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,28 +318,27 @@ private XFunSpec getMethod(ContributionBinding binding, FactoryFields factoryFie
318318
factoryFields.moduleField.map(module -> XCodeBlock.of("%N", module)),
319319
compilerOptions);
320320

321-
if (binding.kind().equals(PROVISION)) {
322-
getMethod
323-
.addAnnotationNames(binding.nullability().nonTypeUseNullableAnnotations())
324-
.addStatement("return %L", invokeNewInstance);
325-
} else if (!injectionSites(binding).isEmpty()) {
321+
if (!injectionSites(binding).isEmpty()) {
326322
XCodeBlock instance = XCodeBlock.of("instance");
327323
XCodeBlock invokeInjectionSites =
328324
InjectionSiteMethod.invokeAll(
329-
injectionSites(binding),
325+
binding,
330326
generatedClassNameForBinding(binding),
331327
instance,
332328
binding.key().type().xprocessing(),
333329
sourceFiles.frameworkFieldUsages(
334330
binding.dependencies(), factoryFields.frameworkFields)
335-
::get);
331+
::get,
332+
compilerOptions);
336333
getMethod
337334
.addStatement("%T %L = %L", providedTypeName(binding), instance, invokeNewInstance)
338335
.addCode(invokeInjectionSites)
339336
.addStatement("return %L", instance);
340337

341338
} else {
342-
getMethod.addStatement("return %L", invokeNewInstance);
339+
getMethod
340+
.addAnnotationNames(binding.nullability().nonTypeUseNullableAnnotations())
341+
.addStatement("return %L", invokeNewInstance);
343342
}
344343
return getMethod.build();
345344
}

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

Lines changed: 121 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package dagger.internal.codegen.writing;
1818

19+
import static androidx.room.compiler.codegen.compat.XConverters.toJavaPoet;
20+
import static androidx.room.compiler.codegen.compat.XConverters.toKotlinPoet;
1921
import static androidx.room.compiler.codegen.compat.XConverters.toXPoet;
2022
import static androidx.room.compiler.processing.XElementKt.isMethodParameter;
2123
import static dagger.internal.codegen.binding.AssistedInjectionAnnotations.isAssistedParameter;
@@ -27,13 +29,16 @@
2729
import static dagger.internal.codegen.extension.DaggerStreams.toImmutableMap;
2830
import static dagger.internal.codegen.xprocessing.Accessibility.isRawTypeAccessible;
2931
import static dagger.internal.codegen.xprocessing.Accessibility.isRawTypePubliclyAccessible;
32+
import static dagger.internal.codegen.xprocessing.Accessibility.isTypePubliclyAccessible;
3033
import static dagger.internal.codegen.xprocessing.XCodeBlocks.makeParametersCodeBlock;
3134
import static dagger.internal.codegen.xprocessing.XCodeBlocks.toConcatenatedCodeBlock;
3235
import static dagger.internal.codegen.xprocessing.XCodeBlocks.toParametersCodeBlock;
3336
import static dagger.internal.codegen.xprocessing.XElements.asExecutable;
3437
import static dagger.internal.codegen.xprocessing.XElements.asMethodParameter;
3538
import static dagger.internal.codegen.xprocessing.XElements.getSimpleName;
3639
import static dagger.internal.codegen.xprocessing.XTypeNames.asClassName;
40+
import static dagger.internal.codegen.xprocessing.XTypeNames.replaceTypeVariablesWithBounds;
41+
import static dagger.internal.codegen.xprocessing.XTypes.asMemberOf;
3742
import static dagger.internal.codegen.xprocessing.XTypes.erasedTypeName;
3843

3944
import androidx.room.compiler.codegen.XClassName;
@@ -42,14 +47,18 @@
4247
import androidx.room.compiler.processing.XExecutableElement;
4348
import androidx.room.compiler.processing.XExecutableParameterElement;
4449
import androidx.room.compiler.processing.XType;
50+
import androidx.room.compiler.processing.XTypeElement;
4551
import androidx.room.compiler.processing.XVariableElement;
4652
import com.google.common.collect.ImmutableList;
4753
import com.google.common.collect.ImmutableMap;
4854
import com.google.common.collect.ImmutableSet;
55+
import com.google.common.collect.ImmutableSortedSet;
4956
import dagger.internal.codegen.base.UniqueNameSet;
5057
import dagger.internal.codegen.binding.AssistedInjectionBinding;
58+
import dagger.internal.codegen.binding.Binding;
5159
import dagger.internal.codegen.binding.ContributionBinding;
5260
import dagger.internal.codegen.binding.InjectionBinding;
61+
import dagger.internal.codegen.binding.MembersInjectionBinding;
5362
import dagger.internal.codegen.binding.MembersInjectionBinding.InjectionSite;
5463
import dagger.internal.codegen.binding.ProvisionBinding;
5564
import dagger.internal.codegen.compileroption.CompilerOptions;
@@ -110,7 +119,12 @@ static XCodeBlock invoke(
110119

111120
XClassName enclosingClass = generatedClassNameForBinding(binding);
112121
String methodName = generatedProxyMethodName(binding);
113-
return invokeMethod(methodName, arguments.build(), enclosingClass, requestingClass);
122+
return invokeMethod(
123+
methodName,
124+
methodTypeArguments(binding, compilerOptions),
125+
arguments.build(),
126+
enclosingClass,
127+
requestingClass);
114128
}
115129

116130
static ImmutableList<XCodeBlock> invokeArguments(
@@ -180,12 +194,13 @@ static final class InjectionSiteMethod {
180194
* @param instanceType the type of the {@code instance} parameter
181195
*/
182196
static XCodeBlock invokeAll(
183-
ImmutableSet<InjectionSite> injectionSites,
197+
Binding binding,
184198
XClassName generatedTypeName,
185199
XCodeBlock instanceCodeBlock,
186200
XType instanceType,
187-
Function<DependencyRequest, XCodeBlock> dependencyUsage) {
188-
return injectionSites.stream()
201+
Function<DependencyRequest, XCodeBlock> dependencyUsage,
202+
CompilerOptions compilerOptions) {
203+
return injectionSites(binding).stream()
189204
.map(
190205
injectionSite -> {
191206
XType injectSiteType = injectionSite.enclosingTypeElement().getType();
@@ -204,7 +219,13 @@ && isRawTypeAccessible(
204219
: instanceCodeBlock;
205220
return XCodeBlock.of(
206221
"%L;",
207-
invoke(injectionSite, generatedTypeName, maybeCastedInstance, dependencyUsage));
222+
invoke(
223+
binding,
224+
injectionSite,
225+
generatedTypeName,
226+
maybeCastedInstance,
227+
dependencyUsage,
228+
compilerOptions));
208229
})
209230
.collect(toConcatenatedCodeBlock());
210231
}
@@ -214,10 +235,12 @@ && isRawTypeAccessible(
214235
* using the {@code dependencyUsage} function.
215236
*/
216237
private static XCodeBlock invoke(
238+
Binding binding,
217239
InjectionSite injectionSite,
218240
XClassName generatedTypeName,
219241
XCodeBlock instanceCodeBlock,
220-
Function<DependencyRequest, XCodeBlock> dependencyUsage) {
242+
Function<DependencyRequest, XCodeBlock> dependencyUsage,
243+
CompilerOptions compilerOptions) {
221244
ImmutableList<XCodeBlock> arguments =
222245
ImmutableList.<XCodeBlock>builder()
223246
.add(instanceCodeBlock)
@@ -226,21 +249,106 @@ private static XCodeBlock invoke(
226249
.map(dependencyUsage)
227250
.collect(toImmutableList()))
228251
.build();
229-
XClassName enclosingClass = membersInjectorNameForType(injectionSite.enclosingTypeElement());
252+
XTypeElement enclosingTypeElement = injectionSite.enclosingTypeElement();
253+
XClassName enclosingClass = membersInjectorNameForType(enclosingTypeElement);
230254
String methodName = membersInjectorMethodName(injectionSite);
231-
return invokeMethod(methodName, arguments, enclosingClass, generatedTypeName);
255+
return invokeMethod(
256+
methodName,
257+
methodTypeArguments(binding, injectionSite, compilerOptions),
258+
arguments,
259+
enclosingClass,
260+
generatedTypeName);
261+
}
262+
263+
private static ImmutableSortedSet<InjectionSite> injectionSites(Binding binding) {
264+
switch (binding.kind()) {
265+
case INJECTION:
266+
return ((InjectionBinding) binding).injectionSites();
267+
case ASSISTED_INJECTION:
268+
return ((AssistedInjectionBinding) binding).injectionSites();
269+
case MEMBERS_INJECTION:
270+
return ((MembersInjectionBinding) binding).injectionSites();
271+
default:
272+
throw new AssertionError("Unexpected binding kind: " + binding.kind());
273+
}
274+
}
275+
}
276+
277+
private static ImmutableList<XTypeName> methodTypeArguments(
278+
Binding binding, CompilerOptions compilerOptions) {
279+
return methodTypeArguments(binding, Optional.empty(), compilerOptions);
280+
}
281+
282+
private static ImmutableList<XTypeName> methodTypeArguments(
283+
Binding binding, InjectionSite injectionSite, CompilerOptions compilerOptions) {
284+
return methodTypeArguments(binding, Optional.of(injectionSite), compilerOptions);
285+
}
286+
287+
private static ImmutableList<XTypeName> methodTypeArguments(
288+
Binding binding, Optional<InjectionSite> injectionSite, CompilerOptions compilerOptions) {
289+
if (!requiresMethodTypeArguments(binding, compilerOptions)) {
290+
return ImmutableList.of();
291+
}
292+
XTypeElement enclosingTypeElement =
293+
injectionSite.map(InjectionSite::enclosingTypeElement)
294+
.orElse(binding.bindingTypeElement().get());
295+
if (enclosingTypeElement.getTypeParameters().isEmpty()) {
296+
return ImmutableList.of();
232297
}
298+
XType unresolvedType = enclosingTypeElement.getType();
299+
XType resolvedType =
300+
asMemberOf(
301+
enclosingTypeElement,
302+
binding.contributingModule().isPresent()
303+
? binding.contributingModule().get().getType()
304+
: binding.key().type().xprocessing());
305+
ImmutableList.Builder<XTypeName> builder = ImmutableList.builder();
306+
for (int i = 0; i < resolvedType.getTypeArguments().size(); i++) {
307+
XType typeArgument = resolvedType.getTypeArguments().get(i);
308+
// If the type argument is publicly accessible, we can use it directly. Otherwise, we try to
309+
// use the bounds of the type variables. If neither of these are possible, we should have
310+
// failed earlier during the binding graph validation stage.
311+
if (isTypePubliclyAccessible(typeArgument)) {
312+
builder.add(typeArgument.asTypeName());
313+
} else {
314+
XType unresolvedTypeArgument = unresolvedType.getTypeArguments().get(i);
315+
builder.add(replaceTypeVariablesWithBounds(unresolvedTypeArgument.asTypeName()));
316+
}
317+
}
318+
return builder.build();
319+
}
320+
321+
private static boolean requiresMethodTypeArguments(
322+
Binding binding, CompilerOptions compilerOptions) {
323+
return false;
233324
}
234325

235326
private static XCodeBlock invokeMethod(
236327
String methodName,
328+
ImmutableList<XTypeName> typeArguments,
237329
ImmutableList<XCodeBlock> parameters,
238330
XClassName enclosingClass,
239331
XClassName requestingClass) {
240-
XCodeBlock parameterBlock = makeParametersCodeBlock(parameters);
241-
return enclosingClass.equals(requestingClass)
242-
? XCodeBlock.of("%L(%L)", methodName, parameterBlock)
243-
: XCodeBlock.of("%T.%L(%L)", enclosingClass, methodName, parameterBlock);
332+
XCodeBlock.Builder builder = XCodeBlock.builder();
333+
if (!enclosingClass.equals(requestingClass)) {
334+
builder.add("%T.", enclosingClass);
335+
} else if (!typeArguments.isEmpty()) {
336+
// In Java, if the method requires type arguments we also need to add the enclosing class. For
337+
// example, "<Bar>create(bar)" is invalid but "Foo_Factory.<Bar>create(bar)" is valid.
338+
toJavaPoet(builder).add("$T.", toJavaPoet(enclosingClass));
339+
}
340+
if (typeArguments.isEmpty()) {
341+
builder.add("%N", methodName);
342+
} else {
343+
XCodeBlock typeParametersCodeBlock =
344+
typeArguments.stream()
345+
.map(typeParameter -> XCodeBlock.of("%T", typeParameter))
346+
.collect(toParametersCodeBlock());
347+
toJavaPoet(builder).add("<$L>$N", toJavaPoet(typeParametersCodeBlock), methodName);
348+
toKotlinPoet(builder).add("%N<%L>", methodName, toKotlinPoet(typeParametersCodeBlock));
349+
}
350+
builder.add("(%L)", makeParametersCodeBlock(parameters));
351+
return builder.build();
244352
}
245353

246354
static XCodeBlock copyParameters(
@@ -287,7 +395,7 @@ static XCodeBlock copyParameter(
287395
name,
288396
typeName,
289397
isTypeNameAccessible,
290-
XTypeName.ANY_OBJECT,
398+
XTypeName.ANY_OBJECT.copy(/* nullable= */ true),
291399
nullability,
292400
compilerOptions);
293401
}

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

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,8 @@
3030
import androidx.room.compiler.processing.XProcessingEnv;
3131
import androidx.room.compiler.processing.XType;
3232
import androidx.room.compiler.processing.XTypeElement;
33-
import com.google.common.collect.ImmutableSet;
34-
import dagger.internal.codegen.binding.AssistedInjectionBinding;
3533
import dagger.internal.codegen.binding.Binding;
3634
import dagger.internal.codegen.binding.BindingGraph;
37-
import dagger.internal.codegen.binding.InjectionBinding;
38-
import dagger.internal.codegen.binding.MembersInjectionBinding;
39-
import dagger.internal.codegen.binding.MembersInjectionBinding.InjectionSite;
4035
import dagger.internal.codegen.compileroption.CompilerOptions;
4136
import dagger.internal.codegen.model.Key;
4237
import dagger.internal.codegen.writing.ComponentImplementation.ShardImplementation;
@@ -125,31 +120,19 @@ private XExpression injectMethodExpression(Binding binding) {
125120
XCodeBlock instance = XCodeBlock.of("%N", instanceName);
126121
XCodeBlock invokeInjectionSites =
127122
InjectionSiteMethod.invokeAll(
128-
injectionSites(binding),
123+
binding,
129124
shardImplementation.name(),
130125
instance,
131126
membersInjectedType,
132127
request ->
133128
bindingExpressions
134129
.getDependencyArgumentExpression(request, shardImplementation.name())
135-
.codeBlock());
130+
.codeBlock(),
131+
compilerOptions);
136132
methodBuilder.addCode(invokeInjectionSites).addStatement("return %L", instance);
137133

138134
XFunSpec method = methodBuilder.build();
139135
shardImplementation.addMethod(MEMBERS_INJECTION_METHOD, method);
140136
return XExpression.create(membersInjectedType, XCodeBlock.of("%N", method));
141137
}
142-
143-
private static ImmutableSet<InjectionSite> injectionSites(Binding binding) {
144-
switch (binding.kind()) {
145-
case INJECTION:
146-
return ((InjectionBinding) binding).injectionSites();
147-
case ASSISTED_INJECTION:
148-
return ((AssistedInjectionBinding) binding).injectionSites();
149-
case MEMBERS_INJECTION:
150-
return ((MembersInjectionBinding) binding).injectionSites();
151-
default:
152-
throw new IllegalArgumentException("Unexpected binding kind: " + binding.kind());
153-
}
154-
}
155138
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,11 +319,12 @@ private XFunSpec injectMembersMethod(
319319
sourceFiles.frameworkFieldUsages(binding.dependencies(), frameworkFields);
320320
XCodeBlock invokeInjectionSites =
321321
InjectionSiteMethod.invokeAll(
322-
binding.injectionSites(),
322+
binding,
323323
membersInjectorNameForType(binding.membersInjectedType()),
324324
XCodeBlock.of("instance"),
325325
instanceType,
326-
dependencyCodeBlocks::get);
326+
dependencyCodeBlocks::get,
327+
compilerOptions);
327328
return methodBuilder("injectMembers")
328329
.addModifiers(PUBLIC)
329330
.isOverride(true)

0 commit comments

Comments
 (0)