[Ahead-of-time Subcomponents] Use the subcomponent supermodel's
SubcomponentNames to generate the builder supertype when implementing the
builder for a nested implementation of a subcomponent.
Also, make SubcomponentNames a strict dependency of GeneratedComponentModel.
RELNOTES=n/a
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=214606745
diff --git a/java/dagger/internal/codegen/ComponentBindingExpressions.java b/java/dagger/internal/codegen/ComponentBindingExpressions.java
index 9a8ee1d..1a57151 100644
--- a/java/dagger/internal/codegen/ComponentBindingExpressions.java
+++ b/java/dagger/internal/codegen/ComponentBindingExpressions.java
@@ -61,7 +61,6 @@
private final Optional<ComponentBindingExpressions> parent;
private final BindingGraph graph;
private final GeneratedComponentModel generatedComponentModel;
- private final SubcomponentNames subcomponentNames;
private final ComponentRequirementFields componentRequirementFields;
private final ReferenceReleasingManagerFields referenceReleasingManagerFields;
private final OptionalFactories optionalFactories;
@@ -76,7 +75,6 @@
ComponentBindingExpressions(
BindingGraph graph,
GeneratedComponentModel generatedComponentModel,
- SubcomponentNames subcomponentNames,
ComponentRequirementFields componentRequirementFields,
OptionalFactories optionalFactories,
DaggerTypes types,
@@ -86,7 +84,6 @@
Optional.empty(),
graph,
generatedComponentModel,
- subcomponentNames,
componentRequirementFields,
new ReferenceReleasingManagerFields(graph, generatedComponentModel, compilerOptions),
new StaticSwitchingProviders(generatedComponentModel, types),
@@ -100,7 +97,6 @@
Optional<ComponentBindingExpressions> parent,
BindingGraph graph,
GeneratedComponentModel generatedComponentModel,
- SubcomponentNames subcomponentNames,
ComponentRequirementFields componentRequirementFields,
ReferenceReleasingManagerFields referenceReleasingManagerFields,
StaticSwitchingProviders staticSwitchingProviders,
@@ -111,7 +107,6 @@
this.parent = parent;
this.graph = graph;
this.generatedComponentModel = generatedComponentModel;
- this.subcomponentNames = checkNotNull(subcomponentNames);
this.componentRequirementFields = checkNotNull(componentRequirementFields);
this.referenceReleasingManagerFields = checkNotNull(referenceReleasingManagerFields);
this.optionalFactories = checkNotNull(optionalFactories);
@@ -136,7 +131,6 @@
Optional.of(this),
childGraph,
childComponentModel,
- subcomponentNames,
childComponentRequirementFields,
referenceReleasingManagerFields,
staticSwitchingProviders,
@@ -609,7 +603,7 @@
case SUBCOMPONENT_BUILDER:
return new SubcomponentBuilderProviderCreationExpression(
- binding.key().type(), subcomponentNames.get(binding.key()));
+ binding.key().type(), generatedComponentModel.getSubcomponentName(binding.key()));
case INJECTION:
case PROVISION:
@@ -818,7 +812,8 @@
case SUBCOMPONENT_BUILDER:
return Optional.of(
new SubcomponentBuilderBindingExpression(
- resolvedBindings, subcomponentNames.get(resolvedBindings.key())));
+ resolvedBindings,
+ generatedComponentModel.getSubcomponentName(resolvedBindings.key())));
case MULTIBOUND_SET:
return Optional.of(
diff --git a/java/dagger/internal/codegen/ComponentModelBuilder.java b/java/dagger/internal/codegen/ComponentModelBuilder.java
index ccabb6f..07627c4 100644
--- a/java/dagger/internal/codegen/ComponentModelBuilder.java
+++ b/java/dagger/internal/codegen/ComponentModelBuilder.java
@@ -64,12 +64,11 @@
ClassName name,
BindingGraph graph,
BindingGraphFactory bindingGraphFactory) {
- GeneratedComponentModel generatedComponentModel = GeneratedComponentModel.create(name, graph);
- SubcomponentNames subcomponentNames = new SubcomponentNames(graph, keyFactory);
+ GeneratedComponentModel generatedComponentModel =
+ GeneratedComponentModel.create(name, graph, keyFactory);
OptionalFactories optionalFactories = new OptionalFactories(generatedComponentModel);
Optional<GeneratedComponentBuilderModel> generatedComponentBuilderModel =
- GeneratedComponentBuilderModel.create(
- generatedComponentModel, graph, subcomponentNames, elements, types);
+ GeneratedComponentBuilderModel.create(generatedComponentModel, graph, elements, types);
ComponentRequirementFields componentRequirementFields =
new ComponentRequirementFields(
graph, generatedComponentModel, generatedComponentBuilderModel);
@@ -77,7 +76,6 @@
new ComponentBindingExpressions(
graph,
generatedComponentModel,
- subcomponentNames,
componentRequirementFields,
optionalFactories,
types,
@@ -95,7 +93,6 @@
keyFactory,
graph,
generatedComponentModel,
- subcomponentNames,
optionalFactories,
bindingExpressions,
componentRequirementFields,
@@ -110,7 +107,6 @@
keyFactory,
graph,
generatedComponentModel,
- subcomponentNames,
optionalFactories,
bindingExpressions,
componentRequirementFields,
@@ -125,7 +121,6 @@
private final DaggerTypes types;
private final KeyFactory keyFactory;
private final BindingGraph graph;
- private final SubcomponentNames subcomponentNames;
private final ComponentBindingExpressions bindingExpressions;
private final ComponentRequirementFields componentRequirementFields;
private final GeneratedComponentModel generatedComponentModel;
@@ -141,7 +136,6 @@
KeyFactory keyFactory,
BindingGraph graph,
GeneratedComponentModel generatedComponentModel,
- SubcomponentNames subcomponentNames,
OptionalFactories optionalFactories,
ComponentBindingExpressions bindingExpressions,
ComponentRequirementFields componentRequirementFields,
@@ -152,7 +146,6 @@
this.elements = elements;
this.keyFactory = keyFactory;
this.graph = graph;
- this.subcomponentNames = subcomponentNames;
this.generatedComponentModel = generatedComponentModel;
this.optionalFactories = optionalFactories;
this.bindingExpressions = bindingExpressions;
@@ -243,14 +236,16 @@
ClassName childName =
generatedComponentModel
.name()
- .nestedClass(subcomponentNames.get(childGraph.componentDescriptor()) + "Impl");
+ .nestedClass(
+ generatedComponentModel.getSubcomponentName(childGraph.componentDescriptor())
+ + "Impl");
GeneratedComponentModel supermodel =
getSubcomponentSupermodel(childGraph.componentDescriptor());
GeneratedComponentModel childModel =
- GeneratedComponentModel.forAbstractSubcomponent(childName, supermodel);
+ GeneratedComponentModel.forAbstractSubcomponent(
+ childName, supermodel, generatedComponentModel);
Optional<GeneratedComponentBuilderModel> childBuilderModel =
- GeneratedComponentBuilderModel.create(
- childModel, childGraph, subcomponentNames, elements, types);
+ GeneratedComponentBuilderModel.create(childModel, childGraph, elements, types);
ComponentRequirementFields childComponentRequirementFields =
componentRequirementFields.forChildComponent(childGraph, childModel, childBuilderModel);
ComponentBindingExpressions childBindingExpressions =
@@ -263,7 +258,6 @@
keyFactory,
childGraph,
childModel,
- subcomponentNames,
optionalFactories,
childBindingExpressions,
childComponentRequirementFields,
@@ -308,11 +302,12 @@
private GeneratedComponentModel buildSubcomponentModel(BindingGraph childGraph) {
ClassName parentName = generatedComponentModel.name();
ClassName childName =
- parentName.nestedClass(subcomponentNames.get(childGraph.componentDescriptor()) + "Impl");
- GeneratedComponentModel childModel = GeneratedComponentModel.forSubcomponent(childName);
+ parentName.nestedClass(
+ generatedComponentModel.getSubcomponentName(childGraph.componentDescriptor()) + "Impl");
+ GeneratedComponentModel childModel =
+ GeneratedComponentModel.forSubcomponent(childName, generatedComponentModel);
Optional<GeneratedComponentBuilderModel> childBuilderModel =
- GeneratedComponentBuilderModel.create(
- childModel, childGraph, subcomponentNames, elements, types);
+ GeneratedComponentBuilderModel.create(childModel, childGraph, elements, types);
ComponentRequirementFields childComponentRequirementFields =
componentRequirementFields.forChildComponent(childGraph, childModel, childBuilderModel);
ComponentBindingExpressions childBindingExpressions =
@@ -408,7 +403,6 @@
KeyFactory keyFactory,
BindingGraph graph,
GeneratedComponentModel generatedComponentModel,
- SubcomponentNames subcomponentNames,
OptionalFactories optionalFactories,
ComponentBindingExpressions bindingExpressions,
ComponentRequirementFields componentRequirementFields,
@@ -421,7 +415,6 @@
keyFactory,
graph,
generatedComponentModel,
- subcomponentNames,
optionalFactories,
bindingExpressions,
componentRequirementFields,
@@ -494,7 +487,6 @@
parent.keyFactory,
graph,
generatedComponentModel,
- parent.subcomponentNames,
parent.optionalFactories,
bindingExpressions,
componentRequirementFields,
@@ -548,7 +540,6 @@
KeyFactory keyFactory,
BindingGraph graph,
GeneratedComponentModel generatedComponentModel,
- SubcomponentNames subcomponentNames,
OptionalFactories optionalFactories,
ComponentBindingExpressions bindingExpressions,
ComponentRequirementFields componentRequirementFields,
@@ -561,7 +552,6 @@
keyFactory,
graph,
generatedComponentModel,
- subcomponentNames,
optionalFactories,
bindingExpressions,
componentRequirementFields,
diff --git a/java/dagger/internal/codegen/GeneratedComponentBuilderModel.java b/java/dagger/internal/codegen/GeneratedComponentBuilderModel.java
index f544f5b..75b4308 100644
--- a/java/dagger/internal/codegen/GeneratedComponentBuilderModel.java
+++ b/java/dagger/internal/codegen/GeneratedComponentBuilderModel.java
@@ -79,13 +79,10 @@
static Optional<GeneratedComponentBuilderModel> create(
GeneratedComponentModel generatedComponentModel,
BindingGraph graph,
- SubcomponentNames subcomponentNames,
Elements elements,
Types types) {
return hasBuilder(graph.componentDescriptor())
- ? Optional.of(
- new Creator(generatedComponentModel, graph, subcomponentNames, elements, types)
- .create())
+ ? Optional.of(new Creator(generatedComponentModel, graph, elements, types).create())
: Optional.empty();
}
@@ -101,14 +98,12 @@
private final TypeSpec.Builder builder;
private final GeneratedComponentModel generatedComponentModel;
private final ClassName builderName;
- private final SubcomponentNames subcomponentNames;
private final Elements elements;
private final Types types;
Creator(
GeneratedComponentModel generatedComponentModel,
BindingGraph graph,
- SubcomponentNames subcomponentNames,
Elements elements,
Types types) {
this.generatedComponentModel = generatedComponentModel;
@@ -118,11 +113,12 @@
builder = classBuilder(builderName).addModifiers(STATIC);
} else {
builderName =
- componentName.peerClass(subcomponentNames.get(graph.componentDescriptor()) + "Builder");
+ componentName.peerClass(
+ generatedComponentModel.getSubcomponentName(graph.componentDescriptor())
+ + "Builder");
builder = classBuilder(builderName);
}
this.graph = graph;
- this.subcomponentNames = subcomponentNames;
this.elements = elements;
this.types = types;
}
@@ -168,7 +164,9 @@
builder.superclass(
subcomponentSupermodel
.name()
- .peerClass(subcomponentNames.get(graph.componentDescriptor()) + "Builder"));
+ .peerClass(
+ subcomponentSupermodel.getSubcomponentName(graph.componentDescriptor())
+ + "Builder"));
} else {
// Otherwise we're extending the builder defined inside the subcomponent definition.
builder.superclass(subcomponentSupermodel.name().nestedClass("Builder"));
diff --git a/java/dagger/internal/codegen/GeneratedComponentModel.java b/java/dagger/internal/codegen/GeneratedComponentModel.java
index 3a57ec9..adae1f1 100644
--- a/java/dagger/internal/codegen/GeneratedComponentModel.java
+++ b/java/dagger/internal/codegen/GeneratedComponentModel.java
@@ -140,6 +140,7 @@
private final Optional<GeneratedComponentModel> supermodel;
private final Map<TypeElement, GeneratedComponentModel> subcomponentModels = new HashMap<>();
private final TypeSpec.Builder component;
+ private final SubcomponentNames subcomponentNames;
private final UniqueNameSet componentFieldNames = new UniqueNameSet();
private final UniqueNameSet componentMethodNames = new UniqueNameSet();
private final List<CodeBlock> initializations = new ArrayList<>();
@@ -158,6 +159,7 @@
ClassName name,
NestingKind nestingKind,
Optional<GeneratedComponentModel> supermodel,
+ SubcomponentNames subcomponentNames,
Modifier... modifiers) {
checkName(name, nestingKind);
this.name = name;
@@ -165,6 +167,7 @@
this.isAbstract = Arrays.asList(modifiers).contains(ABSTRACT);
this.supermodel = supermodel;
this.component = classBuilder(name).addModifiers(modifiers);
+ this.subcomponentNames = subcomponentNames;
}
private static void checkName(ClassName name, NestingKind nestingKind) {
@@ -185,11 +188,12 @@
}
/** Creates a model for a root component or top-level abstract subcomponent. */
- static GeneratedComponentModel create(ClassName name, BindingGraph graph) {
+ static GeneratedComponentModel create(ClassName name, BindingGraph graph, KeyFactory keyFactory) {
return new GeneratedComponentModel(
name,
NestingKind.TOP_LEVEL,
Optional.empty(), // supermodel
+ new SubcomponentNames(graph, keyFactory),
PUBLIC,
graph.componentDescriptor().kind().isTopLevel() ? FINAL : ABSTRACT);
}
@@ -198,9 +202,15 @@
* Create a model for a subcomponent. This is for concrete subcomponents implementations when not
* generating ahead-of-time subcomponents.
*/
- static GeneratedComponentModel forSubcomponent(ClassName name) {
+ static GeneratedComponentModel forSubcomponent(
+ ClassName name, GeneratedComponentModel parentModel) {
return new GeneratedComponentModel(
- name, NestingKind.MEMBER, Optional.empty(), /* supermodel */ PRIVATE, FINAL);
+ name,
+ NestingKind.MEMBER,
+ Optional.empty(), // supermodel
+ parentModel.subcomponentNames,
+ PRIVATE,
+ FINAL);
}
/**
@@ -208,9 +218,14 @@
* generating ahead-of-time subcomponents.
*/
static GeneratedComponentModel forAbstractSubcomponent(
- ClassName name, GeneratedComponentModel supermodel) {
+ ClassName name, GeneratedComponentModel supermodel, GeneratedComponentModel parentModel) {
return new GeneratedComponentModel(
- name, NestingKind.MEMBER, Optional.of(supermodel), PUBLIC, ABSTRACT);
+ name,
+ NestingKind.MEMBER,
+ Optional.of(supermodel),
+ parentModel.subcomponentNames,
+ PUBLIC,
+ ABSTRACT);
}
/** Returns the name of the component. */
@@ -233,6 +248,16 @@
return supermodel;
}
+ /** Returns the simple subcomponent name for the given {@link ComponentDescriptor}. */
+ String getSubcomponentName(ComponentDescriptor componentDescriptor) {
+ return subcomponentNames.get(componentDescriptor);
+ }
+
+ /** Returns the simple subcomponent name for the given subcomponent builder {@link Key}. */
+ String getSubcomponentName(Key key) {
+ return subcomponentNames.get(key);
+ }
+
/** Returns the model of the child subcomponent. */
Optional<GeneratedComponentModel> subcomponentModel(ComponentDescriptor subcomponent) {
return Optional.ofNullable(subcomponentModels.get(subcomponent.componentDefinitionType()));