Revert "[dart2js] Use library as key for some holder properties."

This reverts commit 889659e876aa93dfc5394d82401fe4fa6d83889a.

Reason for revert: This CL is too limiting.

Original change's description:
> [dart2js] Use library as key for some holder properties.
>
> Change-Id: I24d21dd6239191ab0242387d97d6b47cdf9582b5
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/203826
> Reviewed-by: Stephen Adams <sra@google.com>
> Commit-Queue: Joshua Litt <joshualitt@google.com>

# Not skipping CQ checks because original CL landed > 1 day ago.

Change-Id: Id4d3d401a5b96a1c8e42afd87513520e52b725d9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/204746
Reviewed-by: Joshua Litt <joshualitt@google.com>
Commit-Queue: Joshua Litt <joshualitt@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
index a181567..f076a8a 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -9,7 +9,7 @@
 import '../js/js.dart' as js;
 import '../serialization/serialization.dart';
 import '../util/util.dart';
-import '../js_emitter/model.dart';
+import '../js_emitter/model.dart' show Fragment;
 
 import 'namer.dart';
 
@@ -230,7 +230,7 @@
   // Each resource has a distinct name.
   String name;
   List<Fragment> fragments;
-  Map<Library, List<js.Property>> holderCode;
+  Map<Entity, List<js.Property>> holderCode;
   js.Statement _statement;
 
   @override
@@ -507,8 +507,8 @@
   void registerHolders() {
     // Register all holders used in all [DeferredHolderResource]s.
     for (var resource in holderResources) {
-      resource.holderCode.forEach((library, properties) {
-        String holderName = globalObjectNameForEntity(library.element);
+      resource.holderCode.forEach((entity, properties) {
+        String holderName = globalObjectNameForEntity(entity);
         registerHolderUseOrUpdate(resource.name, holderName,
             properties: properties);
       });
@@ -769,7 +769,7 @@
   final List<DeferredHolderResource> holderResources = [];
   final Set<String> _uniqueHolders = {};
   final List<String> _holders = [];
-  final Map<Library, String> _libraryMap = {};
+  final Map<Entity, String> _entityMap = {};
   final JCommonElements _commonElements;
 
   LegacyDeferredHolderExpressionFinalizerImpl(this._commonElements) {
@@ -844,9 +844,9 @@
   /// Registers an [Entity] with a specific [holder].
   void registerHolderUse(String holder, Object data) {
     if (_uniqueHolders.add(holder)) _holders.add(holder);
-    if (data != null && data is Library) {
-      assert(!_libraryMap.containsKey(data) || _libraryMap[data] == holder);
-      _libraryMap[data] = holder;
+    if (data != null && data is Entity) {
+      assert(!_entityMap.containsKey(data) || _entityMap[data] == holder);
+      _entityMap[data] = holder;
     }
   }
 
@@ -890,9 +890,9 @@
 
   /// Registers all of the holders used by a given [DeferredHolderResource].
   void registerHolders(DeferredHolderResource resource) {
-    for (var library in resource.holderCode.keys) {
-      var holder = globalObjectForLibrary(library.element);
-      registerHolderUse(holder, library);
+    for (var entity in resource.holderCode.keys) {
+      var holder = globalObjectForEntity(entity);
+      registerHolderUse(holder, entity);
     }
   }
 
@@ -917,9 +917,9 @@
     }
 
     final holderCode = resource.holderCode;
-    holderCode.forEach((library, properties) {
-      assert(_libraryMap.containsKey(library));
-      var holder = _libraryMap[library];
+    holderCode.forEach((entity, properties) {
+      assert(_entityMap.containsKey(entity));
+      var holder = _entityMap[entity];
       assert(codePerHolder.containsKey(holder));
       codePerHolder[holder].addAll(properties);
     });
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index bf57340..3cc03f9 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -827,7 +827,7 @@
 
   /// Adds code to a finalizer.
   void addCodeToFinalizer(void Function(js.Node) addCode, js.Node fragmentCode,
-      Map<Library, List<js.Property>> holderCode) {
+      Map<Entity, List<js.Property>> holderCode) {
     addCode(fragmentCode);
     for (var properties in holderCode.values) {
       for (var property in properties) {
@@ -839,7 +839,7 @@
   /// Finalizes the code for a fragment, and optionally finalizes holders.
   /// Finalizing holders must be the last step of the emitter.
   void finalizeCode(String resourceName, js.Node code,
-      Map<Library, List<js.Property>> holderCode,
+      Map<Entity, List<js.Property>> holderCode,
       {bool finalizeHolders: false}) {
     StringReferenceFinalizer stringFinalizer =
         StringReferenceFinalizerImpl(_options.enableMinification);
@@ -871,21 +871,23 @@
   /// into a map keyed by [Entity] because we don't yet know anything about the
   /// structure of the underlying holders and thus we cannot emit this code
   /// directly into the ast.
-  Map<Library, List<js.Property>> emitHolderCode(List<Library> libraries) {
-    Map<Library, List<js.Property>> holderCode = {};
+  Map<Entity, List<js.Property>> emitHolderCode(List<Library> libraries) {
+    Map<Entity, List<js.Property>> holderCode = {};
     for (Library library in libraries) {
       for (StaticMethod method in library.statics) {
         Map<js.Name, js.Expression> propertyMap = emitStaticMethod(method);
         propertyMap.forEach((js.Name key, js.Expression value) {
           var property = new js.Property(js.quoteName(key), value);
-          (holderCode[library] ??= []).add(property);
+          Entity holderKey =
+              method is StaticStubMethod ? method.library : method.element;
+          (holderCode[holderKey] ??= []).add(property);
           registerEntityAst(method.element, property, library: library.element);
         });
       }
       for (Class cls in library.classes) {
         js.Expression constructor = emitConstructor(cls);
         var property = new js.Property(js.quoteName(cls.name), constructor);
-        (holderCode[library] ??= []).add(property);
+        (holderCode[cls.element] ??= []).add(property);
         registerEntityAst(cls.element, property, library: library.element);
       }
     }