[dart2js] Cleanup old holders code.

Change-Id: I5eafeb06cf2d6e32e9fdd1abee19ea18e1091ace
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/221991
Reviewed-by: Stephen Adams <sra@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 8b46bb4..e961fd2 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -882,307 +882,3 @@
   final js.Statement statement;
   HolderInitCode(this.allHolders, this.activeHolders, this.statement);
 }
-
-/// All of the code below this point is legacy code.
-
-/// [DeferredHolderExpressionFinalizerImpl] finalizes
-/// [DeferredHolderExpression]s, [DeferredHolderParameter]s,
-/// [DeferredHolderResource]s, [DeferredHolderResourceExpression]s.
-class LegacyDeferredHolderExpressionFinalizerImpl
-    implements DeferredHolderExpressionFinalizer {
-  _DeferredHolderExpressionCollectorVisitor _visitor;
-  final List<DeferredHolderExpression> holderReferences = [];
-  final List<DeferredHolderParameter> holderParameters = [];
-  final List<DeferredHolderResource> holderResources = [];
-  final Set<String> _uniqueHolders = {};
-  final List<String> _holders = [];
-  final Map<Entity, String> _entityMap = {};
-  final JCommonElements _commonElements;
-
-  LegacyDeferredHolderExpressionFinalizerImpl(this._commonElements) {
-    _visitor = _DeferredHolderExpressionCollectorVisitor(this);
-  }
-
-  @override
-  void addCode(String resourceName, js.Node code) {
-    _visitor.setResourceNameAndVisit(resourceName, code);
-  }
-
-  final List<String> userGlobalObjects =
-      List.from(Namer.reservedGlobalObjectNames)
-        ..remove('C')
-        ..remove('H')
-        ..remove('J')
-        ..remove('P')
-        ..remove('W');
-
-  /// Returns the [reservedGlobalObjectNames] for [library].
-  String globalObjectForLibrary(LibraryEntity library) {
-    if (library == _commonElements.interceptorsLibrary) return 'J';
-    Uri uri = library.canonicalUri;
-    if (uri.scheme == 'dart') {
-      if (uri.path == 'html') return 'W';
-      if (uri.path.startsWith('_')) return 'H';
-      return 'P';
-    }
-    return userGlobalObjects[library.name.hashCode % userGlobalObjects.length];
-  }
-
-  /// Returns true if [element] is stored in the static state holder
-  /// ([staticStateHolder]).  We intend to store only mutable static state
-  /// there, whereas constants are stored in 'C'. Functions, accessors,
-  /// classes, etc. are stored in one of the other objects in
-  /// [reservedGlobalObjectNames].
-  bool _isPropertyOfStaticStateHolder(MemberEntity element) {
-    // TODO(ahe): Make sure this method's documentation is always true and
-    // remove the word "intend".
-    return element.isField;
-  }
-
-  String globalObjectForMember(MemberEntity entity) {
-    if (_isPropertyOfStaticStateHolder(entity)) {
-      return globalObjectForStaticState();
-    } else {
-      return globalObjectForLibrary(entity.library);
-    }
-  }
-
-  String globalObjectForClass(ClassEntity entity) {
-    return globalObjectForLibrary(entity.library);
-  }
-
-  String globalObjectForInterceptors() => 'J';
-
-  String globalObjectForStaticState() => r'$';
-
-  String globalObjectForConstants() => 'C';
-
-  String globalObjectForEntity(Entity entity) {
-    if (entity is MemberEntity) {
-      return globalObjectForMember(entity);
-    } else if (entity is ClassEntity) {
-      return globalObjectForLibrary(entity.library);
-    } else {
-      assert(entity is LibraryEntity);
-      return globalObjectForLibrary(entity);
-    }
-  }
-
-  /// 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 Entity) {
-      assert(!_entityMap.containsKey(data) || _entityMap[data] == holder);
-      _entityMap[data] = holder;
-    }
-  }
-
-  /// Returns a global object for a given [Object] based on the
-  /// [DeferredHolderExpressionKind].
-  String kindToHolder(DeferredHolderExpressionKind kind, Object data) {
-    switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForInterceptors:
-        return globalObjectForInterceptors();
-      case DeferredHolderExpressionKind.globalObjectForClass:
-        return globalObjectForClass(data);
-      case DeferredHolderExpressionKind.globalObjectForMember:
-        return globalObjectForMember(data);
-      case DeferredHolderExpressionKind.globalObjectForConstant:
-        return globalObjectForConstants();
-      case DeferredHolderExpressionKind.globalObjectForStaticState:
-        return globalObjectForStaticState();
-    }
-    throw UnsupportedError("Unreachable");
-  }
-
-  /// Finalizes [DeferredHolderExpression]s [DeferredHolderParameter]s.
-  void finalizeReferences() {
-    // Finalize [DeferredHolderExpression]s and registers holder usage.
-    for (var reference in holderReferences) {
-      if (reference.isFinalized) continue;
-      Object data = reference.data;
-      String holder = kindToHolder(reference.kind, data);
-      js.Expression value = js.VariableUse(holder);
-      registerHolderUse(holder, data);
-      reference.value =
-          value.withSourceInformation(reference.sourceInformation);
-    }
-
-    // Finalize [DeferredHolderParameter]s.
-    for (var parameter in holderParameters) {
-      if (parameter.isFinalized) continue;
-      parameter.name = globalObjectForStaticState();
-    }
-  }
-
-  /// Registers all of the holders used by a given [DeferredHolderResource].
-  void registerHolders(DeferredHolderResource resource) {
-    for (var entity in resource.holderCode.keys) {
-      var holder = globalObjectForEntity(entity);
-      registerHolderUse(holder, entity);
-    }
-  }
-
-  /// Returns a [List<String>] containing all of the holders except the static
-  /// state holder.
-  List<String> get nonStaticStateHolders {
-    return _holders
-        .where((holder) => holder != globalObjectForStaticState())
-        .toList(growable: false);
-  }
-
-  /// Generates code to declare holders.
-  LegacyHolderCode declareHolders(DeferredHolderResource resource) {
-    // Collect all holders except the static state holder. Then, create a map of
-    // holder to list of properties which are associated with that holder, but
-    // only with respect to a given [DeferredHolderResource]. Each fragment will
-    // have its own [DeferredHolderResource] and associated code.
-    Map<String, List<js.Property>> codePerHolder = {};
-    final holders = nonStaticStateHolders;
-    for (var holder in holders) {
-      codePerHolder[holder] = [];
-    }
-
-    final holderCode = resource.holderCode;
-    holderCode.forEach((entity, properties) {
-      assert(_entityMap.containsKey(entity));
-      var holder = _entityMap[entity];
-      assert(codePerHolder.containsKey(holder));
-      codePerHolder[holder].addAll(properties);
-    });
-
-    // Create holder initialization code based on the [codePerHolder]. If there
-    // are no properties associated with a given holder in this specific
-    // [DeferredHolderResource] then it will be omitted. However, in some cases,
-    // i.e. the main output unit, we still want to declare the holder with an
-    // empty object literal which will be filled in later by another
-    // [DeferredHolderResource], i.e. in a specific deferred fragment.
-    // The generated code looks like this:
-    //
-    //    {
-    //      var H = {...}, ..., G = {...};
-    //      var holders = [ H, ..., G ]; // Main unit only.
-    //    }
-
-    List<String> activeHolders = [];
-    List<js.VariableInitialization> holderInitializations = [];
-    for (var holder in holders) {
-      List<js.Property> properties = codePerHolder[holder];
-      if (properties.isEmpty) {
-        holderInitializations.add(js.VariableInitialization(
-            js.VariableDeclaration(holder, allowRename: false),
-            resource.isMainFragment ? js.ObjectInitializer(properties) : null));
-      } else {
-        activeHolders.add(holder);
-        holderInitializations.add(js.VariableInitialization(
-            js.VariableDeclaration(holder, allowRename: false),
-            js.ObjectInitializer(properties)));
-      }
-    }
-
-    List<js.Statement> statements = [];
-    statements.add(js.ExpressionStatement(js.VariableDeclarationList(
-        holderInitializations,
-        indentSplits: false)));
-    if (resource.isMainFragment) {
-      statements.add(js.js.statement(
-          'var holders = #',
-          js.ArrayInitializer(holders
-              .map((holder) => js.VariableUse(holder))
-              .toList(growable: false))));
-    }
-    return LegacyHolderCode(activeHolders, statements);
-  }
-
-  /// Finalizes [resource] to code that updates holders. [resource] must be in
-  /// the AST of a deferred fragment.
-  void updateHolders(DeferredHolderResource resource) {
-    // Declare holders.
-    final holderCode = declareHolders(resource);
-
-    // Set names if necessary on deferred holders list.
-    js.Expression deferredHoldersList = js.ArrayInitializer(holderCode
-        .activeHolders
-        .map((holder) => js.js("#", holder))
-        .toList(growable: false));
-    js.Statement setNames = js.js.statement(
-        'hunkHelpers.setFunctionNamesIfNecessary(#deferredHoldersList)',
-        {'deferredHoldersList': deferredHoldersList});
-
-    // Update holder assignments.
-    final holders = nonStaticStateHolders;
-    List<js.Statement> updateHolderAssignments = [setNames];
-    for (int i = 0; i < holders.length; i++) {
-      var holder = holders[i];
-      if (holderCode.activeHolders.contains(holder)) {
-        updateHolderAssignments.add(js.js.statement(
-            '#holder = hunkHelpers.updateHolder(holdersList[#index], #holder)',
-            {'index': js.number(i), 'holder': js.VariableUse(holder)}));
-      } else {
-        // TODO(sra): Change declaration followed by assignments to declarations
-        // with initialization.
-        updateHolderAssignments.add(js.js.statement(
-            '#holder = holdersList[#index]',
-            {'index': js.number(i), 'holder': js.VariableUse(holder)}));
-      }
-    }
-
-    // Create a single block of all statements.
-    List<js.Statement> statements = holderCode.statements
-        .followedBy(updateHolderAssignments)
-        .toList(growable: false);
-    resource.statement = js.Block(statements);
-  }
-
-  /// Allocates all [DeferredHolderResource]s and
-  /// [DeferredHolderResourceExpression]s.
-  void allocateResources() {
-    // First ensure all holders used in all [DeferredHolderResource]s have been
-    // allocated.
-    for (var resource in holderResources) {
-      registerHolders(resource);
-    }
-    _holders.sort();
-
-    // Next finalize all [DeferredHolderResource]s.
-    for (var resource in holderResources) {
-      switch (resource.kind) {
-        case DeferredHolderResourceKind.mainFragment:
-          var holderCode = declareHolders(resource);
-          resource.statement = js.Block(holderCode.statements);
-          break;
-        case DeferredHolderResourceKind.deferredFragment:
-          updateHolders(resource);
-          break;
-      }
-    }
-  }
-
-  @override
-  void finalize() {
-    finalizeReferences();
-    allocateResources();
-  }
-
-  @override
-  void registerDeferredHolderExpression(
-      String resourceName, DeferredHolderExpression node) {
-    holderReferences.add(node);
-  }
-
-  @override
-  void registerDeferredHolderResource(DeferredHolderResource node) {
-    holderResources.add(node);
-  }
-
-  @override
-  void registerDeferredHolderParameter(DeferredHolderParameter node) {
-    holderParameters.add(node);
-  }
-}
-
-class LegacyHolderCode {
-  final List<String> activeHolders;
-  final List<js.Statement> statements;
-  LegacyHolderCode(this.activeHolders, this.statements);
-}
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 5e67e37..e07ef90 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
@@ -640,10 +640,8 @@
       this._nativeEmitter,
       this._closedWorld,
       this._codegenWorld)
-      : _holderFinalizer = _options.features.newHolders.isEnabled
-            ? DeferredHolderExpressionFinalizerImpl(_closedWorld.commonElements)
-            : LegacyDeferredHolderExpressionFinalizerImpl(
-                _closedWorld.commonElements) {
+      : _holderFinalizer =
+            DeferredHolderExpressionFinalizerImpl(_closedWorld.commonElements) {
     _recipeEncoder = RecipeEncoderImpl(
         _closedWorld,
         _options.disableRtiOptimization
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index de9ddca..ea27263 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -64,7 +64,6 @@
         DeferredHolderParameter,
         DeferredHolderResource,
         DeferredHolderResourceKind,
-        LegacyDeferredHolderExpressionFinalizerImpl,
         mainResourceName;
 import '../../js_backend/type_reference.dart'
     show
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 088ef9c..b0be710 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -77,12 +77,13 @@
   FeatureOption useContentSecurityPolicy = FeatureOption('csp');
 
   /// [FeatureOption]s which are shipped and cannot be toggled.
-  late final List<FeatureOption> shipped = [];
+  late final List<FeatureOption> shipped = [
+    newHolders,
+  ];
 
   /// [FeatureOption]s which default to enabled.
   late final List<FeatureOption> shipping = [
     legacyJavaScript,
-    newHolders,
     useContentSecurityPolicy
   ];