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; |
- } |
-} |