[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()));