[dart2wasm] Avoid O(n) scan to find module for a [Library].

Change-Id: I6e0a6813b8519b9432d4f7da18cfca1153d813c5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/464900
Reviewed-by: Ömer Ağacan <omersa@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
diff --git a/pkg/dart2wasm/lib/modules.dart b/pkg/dart2wasm/lib/modules.dart
index fdaefae..083ca68 100644
--- a/pkg/dart2wasm/lib/modules.dart
+++ b/pkg/dart2wasm/lib/modules.dart
@@ -72,13 +72,6 @@
   ModuleMetadata._(this.moduleImportName, this.moduleName,
       {this.skipEmit = false, this.isMain = false});
 
-  /// Whether or not the provided kernel [Reference] is included in this module.
-  bool containsReference(Reference reference) {
-    final enclosingLibrary = _enclosingLibraryForReference(reference);
-    if (enclosingLibrary == null) return false;
-    return libraries.contains(enclosingLibrary);
-  }
-
   @override
   String toString() => '$moduleImportName($libraries)';
 }
@@ -88,6 +81,12 @@
   /// All [ModuleMetadata]s generated for the program.
   final List<ModuleMetadata> modules;
 
+  /// Maps the [Library] to the corresponding [ModuleMetadata].
+  late final Map<Library, ModuleMetadata> _libraryToModuleMetadata = {
+    for (final metadata in modules)
+      for (final library in metadata.libraries) library: metadata,
+  };
+
   ModuleOutputData(this.modules) : assert(modules[0].isMain);
 
   ModuleMetadata get mainModule => modules[0];
@@ -96,8 +95,9 @@
   bool get hasMultipleModules => modules.length > 1;
 
   /// Returns the module that contains [reference].
-  ModuleMetadata moduleForReference(Reference reference) =>
-      modules.firstWhere((e) => e.containsReference(reference));
+  ModuleMetadata moduleForReference(Reference reference) {
+    return _libraryToModuleMetadata[_enclosingLibraryForReference(reference)]!;
+  }
 }
 
 /// Module strategy that puts all libraries into a single module.