Move grouping of extension jar files by module

Previously, `findExtensionSdkJarFiles(...)` would use `PatternNode` to
scan for extension jar files and group the results by module. This
moves the grouping into `addVersionedExtensionApis(...)` in preparation
for combining the scanning done by `findExtensionSdkJarFiles(...)` with
that done by `findAndroidJars(...)`.

Bug: 259115852
Test: ./gradlew
Change-Id: Idebb6822fcf6c4e2189eef4a466afc1e46d0f4c2
diff --git a/metalava/src/main/java/com/android/tools/metalava/ApiLevelsGenerationOptions.kt b/metalava/src/main/java/com/android/tools/metalava/ApiLevelsGenerationOptions.kt
index 2faff3c..ba57b9a 100644
--- a/metalava/src/main/java/com/android/tools/metalava/ApiLevelsGenerationOptions.kt
+++ b/metalava/src/main/java/com/android/tools/metalava/ApiLevelsGenerationOptions.kt
@@ -359,20 +359,20 @@
      *   any available jar in the `extensions/<version>/<any>` directories will be used. The latter
      *   is used in the Android build as it uses a sandbox to provide only those extension jars in
      *   the correct surface anyway.
-     * @return a mapping from SDK module name -> list of [MatchedPatternFile] objects, sorted from
-     *   earliest to last version.
+     * @return a list of [MatchedPatternFile] objects, sorted by module from earliest to last
+     *   version.
      */
     private fun findExtensionSdkJarFiles(
         root: File,
         surface: String?,
-    ): Map<String, List<MatchedPatternFile>> {
+    ): List<MatchedPatternFile> {
         val node =
             PatternNode.parsePatterns(
                 listOf(
                     "{version:extension}/${surface?:"*"}/{module}.jar",
                 )
             )
-        return node.scan(PatternNode.ScanConfig(dir = root)).groupBy({ it.module!! }) {
+        return node.scan(PatternNode.ScanConfig(dir = root)).map {
             it.copy(file = root.resolve(it.file).normalize())
         }
     }
@@ -457,15 +457,15 @@
                 // VersionedApis for SDK versions as their behavior depends on whether an API was
                 // defined in an SDK version.
                 if (sdkExtensionsArguments != null) {
-                    val extensionJarsByModule =
+                    val extensionJarFiles =
                         findExtensionSdkJarFiles(sdkExtensionsArguments.sdkExtJarRoot, apiSurface)
-                    require(extensionJarsByModule.isNotEmpty()) {
+                    require(extensionJarFiles.isNotEmpty()) {
                         "no extension sdk jar files found in $sdkJarRoot"
                     }
                     addVersionedExtensionApis(
                         this,
                         notFinalizedSdkVersion,
-                        extensionJarsByModule,
+                        extensionJarFiles,
                         sdkExtensionsArguments.sdkExtensionInfo,
                     )
                 }
@@ -493,23 +493,23 @@
         }
 
     /**
-     * Find the extension jars and versions for all modules, wrap in a [VersionedApi] and add them
-     * to [list].
+     * Add [VersionedApi] instances to [list] for each of the [extensionJarFiles].
      *
      * Some APIs only exist in extension SDKs and not in the Android SDK, but for backwards
      * compatibility with tools that expect the Android SDK to be the only SDK, metalava needs to
      * assign such APIs some Android SDK API version. This uses [versionNotInAndroidSdk].
      *
      * @param versionNotInAndroidSdk fallback API level for APIs not in the Android SDK
-     * @param extensionJarsByModule extension jars, grouped by module name.
+     * @param extensionJarFiles extension jar files.
      * @param sdkExtensionInfo the [SdkExtensionInfo] read from sdk-extension-info.xml file.
      */
     private fun addVersionedExtensionApis(
         list: MutableList<VersionedApi>,
         versionNotInAndroidSdk: ApiVersion,
-        extensionJarsByModule: Map<String, List<MatchedPatternFile>>,
+        extensionJarFiles: List<MatchedPatternFile>,
         sdkExtensionInfo: SdkExtensionInfo,
     ) {
+        val extensionJarsByModule = extensionJarFiles.groupBy({ it.module!! })
         // Iterate over the mainline modules and their different versions.
         for ((mainlineModule, value) in extensionJarsByModule) {
             // Get the extensions information for the mainline module. If no information exists for