Fix the documentation generator to use rule definition instances instead of classes.

--
MOS_MIGRATED_REVID=120794657
diff --git a/src/main/java/com/google/devtools/build/docgen/BuildDocCollector.java b/src/main/java/com/google/devtools/build/docgen/BuildDocCollector.java
index 7bb4f71..870bf95 100644
--- a/src/main/java/com/google/devtools/build/docgen/BuildDocCollector.java
+++ b/src/main/java/com/google/devtools/build/docgen/BuildDocCollector.java
@@ -154,7 +154,7 @@
       if (ruleClass != null) {
         if (ruleClass.isDocumented()) {
           Class<? extends RuleDefinition> ruleDefinition =
-              ruleClassProvider.getRuleClassDefinition(ruleDoc.getRuleName());
+              ruleClassProvider.getRuleClassDefinition(ruleDoc.getRuleName()).getClass();
           for (Attribute attribute : ruleClass.getAttributes()) {
             String attrName = attribute.getName();
             List<RuleDocumentationAttribute> attributeDocList =
@@ -167,7 +167,9 @@
               int minLevel = Integer.MAX_VALUE;
               RuleDocumentationAttribute bestAttributeDoc = null;
               for (RuleDocumentationAttribute attributeDoc : attributeDocList) {
-                int level = attributeDoc.getDefinitionClassAncestryLevel(ruleDefinition);
+                int level = attributeDoc.getDefinitionClassAncestryLevel(
+                    ruleDefinition,
+                    ruleClassProvider);
                 if (level >= 0 && level < minLevel) {
                   bestAttributeDoc = attributeDoc;
                   minLevel = level;
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
index b1b60fb..2182269 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
@@ -16,6 +16,7 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute;
@@ -219,7 +220,8 @@
    * RuleDocumentationAttribute in the rule definition ancestry graph. Returns -1
    * if definitionClass is not the ancestor (transitively) of usingClass.
    */
-  int getDefinitionClassAncestryLevel(Class<? extends RuleDefinition> usingClass) {
+  int getDefinitionClassAncestryLevel(Class<? extends RuleDefinition> usingClass,
+      ConfiguredRuleClassProvider ruleClassProvider) {
     if (usingClass.equals(definitionClass)) {
       return 0;
     }
@@ -231,7 +233,7 @@
     // Searching the shortest path from usingClass to this.definitionClass using BFS
     do {
       Class<? extends RuleDefinition> ancestor = toVisit.removeFirst();
-      visitAncestor(ancestor, visited, toVisit);
+      visitAncestor(ancestor, visited, toVisit, ruleClassProvider);
       if (ancestor.equals(definitionClass)) {
         return visited.get(ancestor);
       }
@@ -242,13 +244,9 @@
   private void visitAncestor(
       Class<? extends RuleDefinition> usingClass,
       Map<Class<? extends RuleDefinition>, Integer> visited,
-      LinkedList<Class<? extends RuleDefinition>> toVisit) {
-    RuleDefinition instance;
-    try {
-      instance = usingClass.newInstance();
-    } catch (IllegalAccessException | InstantiationException e) {
-      throw new IllegalStateException(e);
-    }
+      LinkedList<Class<? extends RuleDefinition>> toVisit,
+      ConfiguredRuleClassProvider ruleClassProvider) {
+    RuleDefinition instance = getRuleDefinition(usingClass, ruleClassProvider);
     for (Class<? extends RuleDefinition> ancestor : instance.getMetadata().ancestors()) {
       if (!visited.containsKey(ancestor)) {
         toVisit.addLast(ancestor);
@@ -257,6 +255,18 @@
     }
   }
 
+  private RuleDefinition getRuleDefinition(Class<? extends RuleDefinition> usingClass,
+      ConfiguredRuleClassProvider ruleClassProvider) {
+    if (ruleClassProvider == null) {
+      try {
+        return usingClass.newInstance();
+      } catch (IllegalAccessException | InstantiationException e) {
+        throw new IllegalStateException(e);
+      }
+    }
+    return ruleClassProvider.getRuleClassDefinition(usingClass.getName());
+  }
+
   private int getAttributeOrderingPriority(RuleDocumentationAttribute attribute) {
     if (DocgenConsts.ATTRIBUTE_ORDERING.containsKey(attribute.attributeName)) {
       return DocgenConsts.ATTRIBUTE_ORDERING.get(attribute.attributeName);
diff --git a/src/main/java/com/google/devtools/build/docgen/SourceFileReader.java b/src/main/java/com/google/devtools/build/docgen/SourceFileReader.java
index 78f0b6d..433d396 100644
--- a/src/main/java/com/google/devtools/build/docgen/SourceFileReader.java
+++ b/src/main/java/com/google/devtools/build/docgen/SourceFileReader.java
@@ -213,7 +213,7 @@
           final ListMultimap<String, RuleDocumentationAttribute> docAttributes) {
         // End of a attribute, create RuleDocumentationAttribute object
         docAttributes.put(attributeName, RuleDocumentationAttribute.create(
-            ruleClassProvider.getRuleClassDefinition(ruleName),
+            ruleClassProvider.getRuleClassDefinition(ruleName).getClass(),
             attributeName, sb.toString(), startLineCnt, javaSourceFilePath, flags));
         sb = new StringBuilder();
         inBlazeAttributeDocs = false;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 56170ba..e4a4a2c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -92,13 +92,10 @@
     private final List<Class<? extends FragmentOptions>> configurationOptions = new ArrayList<>();
 
     private final Map<String, RuleClass> ruleClassMap = new HashMap<>();
-    private final  Map<String, Class<? extends RuleDefinition>> ruleDefinitionMap =
-        new HashMap<>();
+    private final Map<String, RuleDefinition> ruleDefinitionMap = new HashMap<>();
     private final Map<String, Class<? extends NativeAspectFactory>> aspectFactoryMap =
         new HashMap<>();
     private final Map<Class<? extends RuleDefinition>, RuleClass> ruleMap = new HashMap<>();
-    private final Map<Class<? extends RuleDefinition>, RuleDefinition> ruleDefinitionInstanceCache =
-        new HashMap<>();
     private final Digraph<Class<? extends RuleDefinition>> dependencyGraph =
         new Digraph<>();
     private ConfigurationCollectionFactory configurationCollectionFactory;
@@ -155,7 +152,7 @@
 
     public Builder addRuleDefinition(RuleDefinition ruleDefinition) {
       Class<? extends RuleDefinition> ruleDefinitionClass = ruleDefinition.getClass();
-      ruleDefinitionInstanceCache.put(ruleDefinitionClass, ruleDefinition);
+      ruleDefinitionMap.put(ruleDefinitionClass.getName(), ruleDefinition);
       dependencyGraph.createNode(ruleDefinitionClass);
       for (Class<? extends RuleDefinition> ancestor : ruleDefinition.getMetadata().ancestors()) {
         dependencyGraph.addEdge(ancestor, ruleDefinitionClass);
@@ -214,7 +211,7 @@
     }
 
     private RuleClass commitRuleDefinition(Class<? extends RuleDefinition> definitionClass) {
-      RuleDefinition instance = checkNotNull(ruleDefinitionInstanceCache.get(definitionClass),
+      RuleDefinition instance = checkNotNull(ruleDefinitionMap.get(definitionClass.getName()),
           "addRuleDefinition(new %s()) should be called before build()", definitionClass.getName());
 
       RuleDefinition.Metadata metadata = instance.getMetadata();
@@ -250,7 +247,7 @@
       RuleClass ruleClass = instance.build(builder, this);
       ruleMap.put(definitionClass, ruleClass);
       ruleClassMap.put(ruleClass.getName(), ruleClass);
-      ruleDefinitionMap.put(ruleClass.getName(), definitionClass);
+      ruleDefinitionMap.put(ruleClass.getName(), instance);
 
       return ruleClass;
     }
@@ -340,9 +337,9 @@
   private final ImmutableMap<String, RuleClass> ruleClassMap;
 
   /**
-   * Maps rule class name to the rule definition metaclasses.
+   * Maps rule class name to the rule definition objects.
    */
-  private final ImmutableMap<String, Class<? extends RuleDefinition>> ruleDefinitionMap;
+  private final ImmutableMap<String, RuleDefinition> ruleDefinitionMap;
 
   /**
    * Maps aspect name to the aspect factory meta class.
@@ -383,7 +380,7 @@
       String runfilesPrefix,
       String toolsRepository,
       ImmutableMap<String, RuleClass> ruleClassMap,
-      ImmutableMap<String, Class<? extends RuleDefinition>> ruleDefinitionMap,
+      ImmutableMap<String, RuleDefinition> ruleDefinitionMap,
       ImmutableMap<String, Class<? extends NativeAspectFactory>> aspectFactoryMap,
       String defaultWorkspaceFilePrefix,
       String defaultWorkspaceFileSuffix,
@@ -467,7 +464,7 @@
   /**
    * Returns the definition of the rule class definition with the specified name.
    */
-  public Class<? extends RuleDefinition> getRuleClassDefinition(String ruleClassName) {
+  public RuleDefinition getRuleClassDefinition(String ruleClassName) {
     return ruleDefinitionMap.get(ruleClassName);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1ExtensionRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1ExtensionRule.java
index 04bf382..4adb8e9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1ExtensionRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleWatch1ExtensionRule.java
@@ -60,7 +60,7 @@
             .mandatory()
             .direct_compile_time_input()
             .cfg(AppleWatch1Extension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION))
-        /* <!-- #BLAZE_RULE($apple_watch1_extension).ATTRIBUTE(deps) -->
+        /* <!-- #BLAZE_RULE(apple_watch1_extension).ATTRIBUTE(app_deps) -->
         The list of targets whose resources files are bundled together to form final watch
         application bundle.
         <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
@@ -73,7 +73,6 @@
   }
 
   @Override
-
   public Metadata getMetadata() {
     return RuleDefinition.Metadata.builder()
         .name("apple_watch1_extension")