bazel docgen: also search net/starlark/java for classes

(in anticipation of the big rename).

Also, factor.

PiperOrigin-RevId: 331604741
diff --git a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
index b39d33b..e81710b 100644
--- a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
+++ b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationCollector.java
@@ -14,12 +14,16 @@
 package com.google.devtools.build.docgen;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 import com.google.devtools.build.docgen.starlark.StarlarkBuiltinDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkConstructorMethodDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkJavaMethodDoc;
 import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
+import com.google.devtools.build.lib.util.Classpath;
+import com.google.devtools.build.lib.util.Classpath.ClassPathException;
 import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.TreeMap;
@@ -46,11 +50,26 @@
     return TopLevelModule.class.getAnnotation(StarlarkBuiltin.class);
   }
 
+  private static ImmutableMap<String, StarlarkBuiltinDoc> all;
+
+  /** Applies {@link #collectModules} to all Bazel and Starlark classes. */
+  static synchronized ImmutableMap<String, StarlarkBuiltinDoc> getAllModules()
+      throws ClassPathException {
+    if (all == null) {
+      all =
+          collectModules(
+              Iterables.concat(
+                  Classpath.findClasses("com/google/devtools/build"), // Bazel
+                  Classpath.findClasses("net/starlark/java"))); // Starlark
+    }
+    return all;
+  }
+
   /**
    * Collects the documentation for all Starlark modules comprised of the given classes and returns
-   * a map that maps Starlark module name to the module documentation.
+   * a map from the name of each Starlark module to its documentation.
    */
-  public static Map<String, StarlarkBuiltinDoc> collectModules(Iterable<Class<?>> classes) {
+  static ImmutableMap<String, StarlarkBuiltinDoc> collectModules(Iterable<Class<?>> classes) {
     // Force class loading of com.google.devtools.build.lib.syntax.Starlark before we do any of our
     // own processing. Otherwise, we're in trouble since com.google.devtools.build.lib.syntax.Dict
     // happens to be the first class on our classpath that we proccess via #collectModuleMethods,
@@ -93,7 +112,7 @@
       }
     }
 
-    return modules;
+    return ImmutableMap.copyOf(modules);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationProcessor.java b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationProcessor.java
index 84e34f4..6b44636 100644
--- a/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationProcessor.java
+++ b/src/main/java/com/google/devtools/build/docgen/StarlarkDocumentationProcessor.java
@@ -13,12 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.docgen.starlark.StarlarkBuiltinDoc;
 import com.google.devtools.build.docgen.starlark.StarlarkDocUtils;
 import com.google.devtools.build.docgen.starlark.StarlarkMethodDoc;
-import com.google.devtools.build.lib.util.Classpath;
 import com.google.devtools.build.lib.util.Classpath.ClassPathException;
 import java.io.File;
 import java.io.IOException;
@@ -29,6 +27,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TreeMap;
 import net.starlark.java.annot.StarlarkDocumentationCategory;
 
 /** A class to assemble documentation for Starlark. */
@@ -38,9 +37,6 @@
       ImmutableList.<StarlarkDocumentationCategory>of(
           StarlarkDocumentationCategory.NONE, StarlarkDocumentationCategory.TOP_LEVEL_TYPE);
 
-  // Common prefix of packages that may contain Starlark modules.
-  @VisibleForTesting static final String MODULES_PACKAGE_PREFIX = "com/google/devtools/build";
-
   private StarlarkDocumentationProcessor() {}
 
   /** Generates the Starlark documentation to the given output directory. */
@@ -49,8 +45,7 @@
     parseOptions(args);
 
     Map<String, StarlarkBuiltinDoc> modules =
-        StarlarkDocumentationCollector.collectModules(
-            Classpath.findClasses(MODULES_PACKAGE_PREFIX));
+        new TreeMap<>(StarlarkDocumentationCollector.getAllModules());
 
     // Generate the top level module first in the doc
     StarlarkBuiltinDoc topLevelModule =
diff --git a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
index d428bcc..ad89034 100644
--- a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
+++ b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.stubs.StarlarkAspectStub;
 import com.google.devtools.build.lib.starlarkbuildapi.test.TestingBootstrap;
 import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.util.Classpath;
 import com.google.devtools.build.lib.util.Classpath.ClassPathException;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeActionsInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeBuildApiGlobals;
@@ -103,9 +102,6 @@
  * builtin types.
  */
 public class SymbolFamilies {
-  // Common prefix of packages that may contain Starlark modules.
-  private static final String MODULES_PACKAGE_PREFIX = "com/google/devtools/build";
-
   private final ImmutableList<RuleDocumentation> nativeRules;
   private final ImmutableMap<String, StarlarkBuiltinDoc> types;
 
@@ -122,7 +118,7 @@
         ImmutableList.copyOf(collectNativeRules(productName, provider, inputDirs, blackList));
     this.globals = Starlark.UNIVERSE;
     this.bzlGlobals = ImmutableMap.copyOf(collectBzlGlobals());
-    this.types = ImmutableMap.copyOf(collectTypes());
+    this.types = StarlarkDocumentationCollector.getAllModules();
   }
 
   /*
@@ -154,15 +150,6 @@
   }
 
   /*
-   * Collects a mapping between type names and module/type documentation that are available both
-   * in BZL and BUILD files.
-   */
-  private Map<String, StarlarkBuiltinDoc> collectTypes() throws ClassPathException {
-    return StarlarkDocumentationCollector.collectModules(
-        Classpath.findClasses(MODULES_PACKAGE_PREFIX));
-  }
-
-  /*
    * Collects a list of native rules that are available in BUILD files as top level functions
    * and in BZL files as methods of the native package.
    */
diff --git a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
index ca087d1..f50eae4 100644
--- a/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/StarlarkDocumentationTest.java
@@ -29,12 +29,12 @@
 import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 import com.google.devtools.build.lib.syntax.Tuple;
-import com.google.devtools.build.lib.util.Classpath;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.stream.Collectors;
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkBuiltin;
@@ -63,8 +63,7 @@
       throws Exception {
     Map<String, String> docMap = new HashMap<>();
     Map<String, StarlarkBuiltinDoc> modules =
-        StarlarkDocumentationCollector.collectModules(
-            Classpath.findClasses(StarlarkDocumentationProcessor.MODULES_PACKAGE_PREFIX));
+        new TreeMap<>(StarlarkDocumentationCollector.getAllModules());
     StarlarkBuiltinDoc topLevel =
         modules.remove(StarlarkDocumentationCollector.getTopLevelModule().name());
     for (StarlarkMethodDoc method : topLevel.getMethods()) {
@@ -390,11 +389,9 @@
 
   @Test
   public void testStarlarkGlobalLibraryCallable() throws Exception {
-    Map<String, StarlarkBuiltinDoc> modules =
-        StarlarkDocumentationCollector.collectModules(
-            Classpath.findClasses(StarlarkDocumentationProcessor.MODULES_PACKAGE_PREFIX));
     StarlarkBuiltinDoc topLevel =
-        modules.remove(StarlarkDocumentationCollector.getTopLevelModule().name());
+        StarlarkDocumentationCollector.getAllModules()
+            .get(StarlarkDocumentationCollector.getTopLevelModule().name());
 
     boolean foundGlobalLibrary = false;
     for (StarlarkMethodDoc methodDoc : topLevel.getMethods()) {