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/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);