| Index: sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
 | 
| diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
 | 
| deleted file mode 100644
 | 
| index 60bf70fdc6c404500e619b743467f09c5efed378..0000000000000000000000000000000000000000
 | 
| --- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
 | 
| +++ /dev/null
 | 
| @@ -1,180 +0,0 @@
 | 
| -// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
 | 
| -// for details. All rights reserved. Use of this source code is governed by a
 | 
| -// BSD-style license that can be found in the LICENSE file.
 | 
| -
 | 
| -part of js_backend;
 | 
| -
 | 
| -/**
 | 
| - * Handles construction of TypeVariable constants needed at runtime.
 | 
| - */
 | 
| -class TypeVariableHandler {
 | 
| -  JavaScriptBackend backend;
 | 
| -  FunctionElement typeVariableConstructor;
 | 
| -  CompileTimeConstantEvaluator evaluator;
 | 
| -
 | 
| -  /**
 | 
| -   * Contains all instantiated classes that have type variables and are needed
 | 
| -   * for reflection.
 | 
| -   */
 | 
| -  List<ClassElement> typeVariableClasses = new List<ClassElement>();
 | 
| -
 | 
| -  /**
 | 
| -   *  Maps a class element to a list with indices that point to type variables
 | 
| -   *  constants for each of the class' type variables.
 | 
| -   */
 | 
| -  Map<ClassElement, List<int>> typeVariables =
 | 
| -      new Map<ClassElement, List<int>>();
 | 
| -
 | 
| -  /**
 | 
| -   *  Maps a TypeVariableType to the index pointing to the constant representing
 | 
| -   *  the corresponding type variable at runtime.
 | 
| -   */
 | 
| -  Map<TypeVariableElement, int> typeVariableConstants =
 | 
| -      new Map<TypeVariableElement, int>();
 | 
| -
 | 
| -  TypeVariableHandler(this.backend);
 | 
| -
 | 
| -  ClassElement get typeVariableClass => backend.typeVariableClass;
 | 
| -  CodeEmitterTask get task => backend.emitter;
 | 
| -  MetadataEmitter get emitter => task.oldEmitter.metadataEmitter;
 | 
| -  Compiler get compiler => backend.compiler;
 | 
| -
 | 
| -  void registerClassWithTypeVariables(ClassElement cls) {
 | 
| -    if (typeVariableClasses != null) {
 | 
| -      typeVariableClasses.add(cls);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  void processTypeVariablesOf(ClassElement cls) {
 | 
| -    //TODO(zarah): Running through all the members is suboptimal. Change this
 | 
| -    // as part of marking elements for reflection.
 | 
| -    bool hasMemberNeededForReflection(ClassElement cls) {
 | 
| -      bool result = false;
 | 
| -      cls.implementation.forEachMember((ClassElement cls, Element member) {
 | 
| -        result = result || backend.referencedFromMirrorSystem(member);
 | 
| -      });
 | 
| -      return result;
 | 
| -    }
 | 
| -
 | 
| -    if (!backend.referencedFromMirrorSystem(cls) &&
 | 
| -        !hasMemberNeededForReflection(cls)) {
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    InterfaceType typeVariableType = typeVariableClass.thisType;
 | 
| -    List<int> constants = <int>[];
 | 
| -
 | 
| -    for (TypeVariableType currentTypeVariable in cls.typeVariables) {
 | 
| -      TypeVariableElement typeVariableElement = currentTypeVariable.element;
 | 
| -
 | 
| -      AstConstant wrapConstant(ConstantExpression constant) {
 | 
| -        return new AstConstant(typeVariableElement,
 | 
| -                                     typeVariableElement.node,
 | 
| -                                     constant);
 | 
| -      }
 | 
| -
 | 
| -      ConstantExpression name = new PrimitiveConstantExpression(
 | 
| -          backend.constantSystem.createString(
 | 
| -              new DartString.literal(currentTypeVariable.name)));
 | 
| -      ConstantExpression bound = new PrimitiveConstantExpression(
 | 
| -          backend.constantSystem.createInt(
 | 
| -              emitter.reifyType(typeVariableElement.bound)));
 | 
| -      ConstantExpression type = backend.constants.createTypeConstant(cls);
 | 
| -      List<AstConstant> arguments =
 | 
| -          [wrapConstant(type), wrapConstant(name), wrapConstant(bound)];
 | 
| -
 | 
| -      // TODO(johnniwinther): Support a less front-end specific creation of
 | 
| -      // constructed constants.
 | 
| -      AstConstant constant =
 | 
| -          CompileTimeConstantEvaluator.makeConstructedConstant(
 | 
| -              compiler,
 | 
| -              backend.constants,
 | 
| -              typeVariableElement,
 | 
| -              typeVariableElement.node,
 | 
| -              typeVariableType,
 | 
| -              typeVariableConstructor,
 | 
| -              new Selector.callConstructor('', null, 3),
 | 
| -              arguments,
 | 
| -              arguments);
 | 
| -      ConstantValue value = constant.value;
 | 
| -      backend.registerCompileTimeConstant(value, compiler.globalDependencies);
 | 
| -      backend.constants.addCompileTimeConstantForEmission(value);
 | 
| -      constants.add(
 | 
| -          reifyTypeVariableConstant(value, currentTypeVariable.element));
 | 
| -    }
 | 
| -    typeVariables[cls] = constants;
 | 
| -  }
 | 
| -
 | 
| -  void onTreeShakingDisabled(Enqueuer enqueuer) {
 | 
| -    if (enqueuer.isResolutionQueue) {
 | 
| -      backend.enqueueClass(
 | 
| -            enqueuer, typeVariableClass, compiler.globalDependencies);
 | 
| -      typeVariableClass.ensureResolved(compiler);
 | 
| -      Link constructors = typeVariableClass.constructors;
 | 
| -      if (constructors.isEmpty && constructors.tail.isEmpty) {
 | 
| -        compiler.internalError(typeVariableClass,
 | 
| -            "Class '$typeVariableClass' should only have one constructor");
 | 
| -      }
 | 
| -      typeVariableConstructor = typeVariableClass.constructors.head;
 | 
| -      backend.enqueueInResolution(typeVariableConstructor,
 | 
| -          compiler.globalDependencies);
 | 
| -      enqueuer.registerInstantiatedType(typeVariableClass.rawType,
 | 
| -          compiler.globalDependencies);
 | 
| -      enqueuer.registerStaticUse(backend.getCreateRuntimeType());
 | 
| -    } else if (typeVariableClasses != null) {
 | 
| -      List<ClassElement> worklist = typeVariableClasses;
 | 
| -      typeVariableClasses = null;
 | 
| -      worklist.forEach((cls) => processTypeVariablesOf(cls));
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  /**
 | 
| -   * Adds [c] to [emitter.globalMetadata] and returns the index pointing to
 | 
| -   * the entry.
 | 
| -   *
 | 
| -   * If the corresponding type variable has already been encountered an
 | 
| -   * entry in the list has already been reserved and the constant is added
 | 
| -   * there, otherwise a new entry for [c] is created.
 | 
| -   */
 | 
| -  int reifyTypeVariableConstant(ConstantValue c, TypeVariableElement variable) {
 | 
| -    String name = jsAst.prettyPrint(task.constantReference(c),
 | 
| -                                    compiler).getText();
 | 
| -    int index;
 | 
| -    if (typeVariableConstants.containsKey(variable)) {
 | 
| -      index = typeVariableConstants[variable];
 | 
| -      emitter.globalMetadata[index] = name;
 | 
| -    } else {
 | 
| -      index = emitter.addGlobalMetadata(name);
 | 
| -      typeVariableConstants[variable] = index;
 | 
| -    }
 | 
| -    return index;
 | 
| -  }
 | 
| -
 | 
| -  /**
 | 
| -   * Returns the index pointing to the constant in [emitter.globalMetadata]
 | 
| -   * representing this type variable.
 | 
| -   *
 | 
| -   * If the constant has not yet been constructed, an entry is  allocated in
 | 
| -   * the global metadata list and the index pointing to this entry is returned.
 | 
| -   * When the corresponding constant is constructed later,
 | 
| -   * [reifyTypeVariableConstant] will be called and the constant will be added
 | 
| -   * on the allocated entry.
 | 
| -   */
 | 
| -  int reifyTypeVariable(TypeVariableElement variable) {
 | 
| -    if (typeVariableConstants.containsKey(variable)) {
 | 
| -      return typeVariableConstants[variable];
 | 
| -    }
 | 
| -
 | 
| -    // TODO(15613): Remove quotes.
 | 
| -    emitter.globalMetadata.add('"Placeholder for ${variable}"');
 | 
| -    return typeVariableConstants[variable] = emitter.globalMetadata.length - 1;
 | 
| -  }
 | 
| -
 | 
| -  List<int> typeVariablesOf(ClassElement classElement) {
 | 
| -    List<int> result = typeVariables[classElement];
 | 
| -    if (result == null) {
 | 
| -      result = const <int>[];
 | 
| -    }
 | 
| -    return result;
 | 
| -  }
 | 
| -}
 | 
| 
 |