Index: pkg/compiler/lib/src/js_model/elements.dart |
diff --git a/pkg/compiler/lib/src/js_model/elements.dart b/pkg/compiler/lib/src/js_model/elements.dart |
index 30244c06d019de9266f6598c5c4acf1970b08180..44d1f2aa62a1425866cd6596117f002a633787ad 100644 |
--- a/pkg/compiler/lib/src/js_model/elements.dart |
+++ b/pkg/compiler/lib/src/js_model/elements.dart |
@@ -4,23 +4,13 @@ |
library dart2js.js_model.elements; |
-import '../common_elements.dart'; |
-import '../constants/constant_system.dart'; |
-import '../elements/elements.dart'; |
import '../elements/entities.dart'; |
import '../elements/names.dart'; |
import '../elements/types.dart'; |
-import '../js_backend/backend_usage.dart'; |
-import '../js_backend/interceptor_data.dart'; |
-import '../js_backend/native_data.dart'; |
-import '../js_backend/runtime_types.dart'; |
import '../kernel/elements.dart'; |
import '../kernel/element_map_impl.dart'; |
-import '../native/behavior.dart'; |
-import '../universe/class_set.dart'; |
-import '../world.dart'; |
-/// Bidirectional map between 'frontend' and 'backend' elements. |
+/// Map from 'frontend' to 'backend' elements. |
/// |
/// Frontend elements are what we read in, these typically represents concepts |
/// in Dart. Backend elements are what we generate, these may include elements |
@@ -30,23 +20,63 @@ import '../world.dart'; |
/// exception. |
class JsToFrontendMap { |
LibraryEntity toBackendLibrary(LibraryEntity library) => library; |
- LibraryEntity toFrontendLibrary(LibraryEntity library) => library; |
ClassEntity toBackendClass(ClassEntity cls) => cls; |
- ClassEntity toFrontendClass(ClassEntity cls) => cls; |
MemberEntity toBackendMember(MemberEntity member) => member; |
- MemberEntity toFrontendMember(MemberEntity member) => member; |
DartType toBackendType(DartType type) => type; |
- DartType toFrontendType(DartType type) => type; |
+ |
+ Set<LibraryEntity> toBackendLibrarySet(Iterable<LibraryEntity> set) { |
+ return set.map(toBackendLibrary).toSet(); |
+ } |
+ |
+ Set<ClassEntity> toBackendClassSet(Iterable<ClassEntity> set) { |
+ return set.map(toBackendClass).toSet(); |
+ } |
+ |
+ Set<MemberEntity> toBackendMemberSet(Iterable<MemberEntity> set) { |
+ return set.map(toBackendMember).toSet(); |
+ } |
+ |
+ Set<FunctionEntity> toBackendFunctionSet(Iterable<FunctionEntity> set) { |
+ Set<FunctionEntity> newSet = new Set<FunctionEntity>(); |
+ for (FunctionEntity element in set) { |
+ newSet.add(toBackendMember(element)); |
+ } |
+ return newSet; |
+ } |
+ |
+ Map<LibraryEntity, V> toBackendLibraryMap<V>( |
+ Map<LibraryEntity, V> map, V convert(V value)) { |
+ return convertMap(map, toBackendLibrary, convert); |
+ } |
+ |
+ Map<ClassEntity, V> toBackendClassMap<V>( |
+ Map<ClassEntity, V> map, V convert(V value)) { |
+ return convertMap(map, toBackendClass, convert); |
+ } |
+ |
+ Map<MemberEntity, V> toBackendMemberMap<V>( |
+ Map<MemberEntity, V> map, V convert(V value)) { |
+ return convertMap(map, toBackendMember, convert); |
+ } |
} |
-abstract class JsToFrontendMapBase implements JsToFrontendMap { |
+E identity<E>(E element) => element; |
+ |
+Map<K, V> convertMap<K, V>( |
+ Map<K, V> map, K convertKey(K key), V convertValue(V value)) { |
+ Map<K, V> newMap = <K, V>{}; |
+ map.forEach((K key, V value) { |
+ newMap[convertKey(key)] = convertValue(value); |
+ }); |
+ return newMap; |
+} |
+ |
+abstract class JsToFrontendMapBase extends JsToFrontendMap { |
DartType toBackendType(DartType type) => |
const TypeConverter().visit(type, _toBackendEntity); |
- DartType toFrontendType(DartType type) => |
- const TypeConverter().visit(type, _toFrontendEntity); |
Entity _toBackendEntity(Entity entity) { |
if (entity is ClassEntity) return toBackendClass(entity); |
@@ -54,16 +84,7 @@ abstract class JsToFrontendMapBase implements JsToFrontendMap { |
return toBackendTypeVariable(entity); |
} |
- Entity _toFrontendEntity(Entity entity) { |
- if (entity is ClassEntity) return toFrontendClass(entity); |
- assert(entity is TypeVariableEntity); |
- TypeVariableEntity typeVariable = toFrontendTypeVariable(entity); |
- assert(typeVariable != null, "No front end type variable for $entity"); |
- return typeVariable; |
- } |
- |
TypeVariableEntity toBackendTypeVariable(TypeVariableEntity typeVariable); |
- TypeVariableEntity toFrontendTypeVariable(TypeVariableEntity typeVariable); |
} |
// TODO(johnniwinther): Merge this with [JsKernelToElementMap]. |
@@ -534,218 +555,3 @@ class JLocalFunction implements Local { |
String toString() => '${jsElementPrefix}local_function' |
'(${memberContext.name}.${name ?? '<anonymous>'})'; |
} |
- |
-class JsClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin { |
- final JsKernelToElementMap elementMap; |
- final RuntimeTypesNeed rtiNeed; |
- |
- JsClosedWorld(this.elementMap, |
- {ElementEnvironment elementEnvironment, |
- DartTypes dartTypes, |
- CommonElements commonElements, |
- ConstantSystem constantSystem, |
- NativeData nativeData, |
- InterceptorData interceptorData, |
- BackendUsage backendUsage, |
- this.rtiNeed, |
- Set<ClassEntity> implementedClasses, |
- Iterable<ClassEntity> liveNativeClasses, |
- Iterable<MemberEntity> liveInstanceMembers, |
- Iterable<MemberEntity> assignedInstanceMembers, |
- Set<TypedefElement> allTypedefs, |
- Map<ClassEntity, Set<ClassEntity>> mixinUses, |
- Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, |
- Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
- Map<ClassEntity, ClassSet> classSets}) |
- : super( |
- elementEnvironment, |
- dartTypes, |
- commonElements, |
- constantSystem, |
- nativeData, |
- interceptorData, |
- backendUsage, |
- implementedClasses, |
- liveNativeClasses, |
- liveInstanceMembers, |
- assignedInstanceMembers, |
- allTypedefs, |
- mixinUses, |
- typesImplementedBySubclasses, |
- classHierarchyNodes, |
- classSets); |
- |
- @override |
- void registerClosureClass(ClassElement cls) { |
- throw new UnimplementedError('JsClosedWorld.registerClosureClass'); |
- } |
-} |
- |
-class JsNativeData implements NativeData { |
- final JsToFrontendMap _map; |
- final NativeData _nativeData; |
- |
- JsNativeData(this._map, this._nativeData); |
- |
- @override |
- bool isNativeClass(ClassEntity element) { |
- return _nativeData.isNativeClass(_map.toFrontendClass(element)); |
- } |
- |
- @override |
- String computeUnescapedJSInteropName(String name) { |
- return _nativeData.computeUnescapedJSInteropName(name); |
- } |
- |
- @override |
- String getJsInteropMemberName(MemberEntity element) { |
- return _nativeData.getJsInteropMemberName(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- String getJsInteropClassName(ClassEntity element) { |
- return _nativeData.getJsInteropClassName(_map.toFrontendClass(element)); |
- } |
- |
- @override |
- bool isAnonymousJsInteropClass(ClassEntity element) { |
- return _nativeData.isAnonymousJsInteropClass(_map.toFrontendClass(element)); |
- } |
- |
- @override |
- String getJsInteropLibraryName(LibraryEntity element) { |
- return _nativeData.getJsInteropLibraryName(_map.toFrontendLibrary(element)); |
- } |
- |
- @override |
- bool isJsInteropMember(MemberEntity element) { |
- return _nativeData.isJsInteropMember(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- String getFixedBackendMethodPath(FunctionEntity element) { |
- return _nativeData |
- .getFixedBackendMethodPath(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- String getFixedBackendName(MemberEntity element) { |
- return _nativeData.getFixedBackendName(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- bool hasFixedBackendName(MemberEntity element) { |
- return _nativeData.hasFixedBackendName(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- NativeBehavior getNativeFieldStoreBehavior(FieldEntity field) { |
- return _nativeData |
- .getNativeFieldStoreBehavior(_map.toFrontendMember(field)); |
- } |
- |
- @override |
- NativeBehavior getNativeFieldLoadBehavior(FieldEntity field) { |
- return _nativeData.getNativeFieldLoadBehavior(_map.toFrontendMember(field)); |
- } |
- |
- @override |
- NativeBehavior getNativeMethodBehavior(FunctionEntity method) { |
- return _nativeData.getNativeMethodBehavior(_map.toFrontendMember(method)); |
- } |
- |
- @override |
- bool isNativeMember(MemberEntity element) { |
- return _nativeData.isNativeMember(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- bool isJsInteropClass(ClassEntity element) { |
- return _nativeData.isJsInteropClass(_map.toFrontendClass(element)); |
- } |
- |
- @override |
- bool isJsInteropLibrary(LibraryEntity element) { |
- return _nativeData.isJsInteropLibrary(_map.toFrontendLibrary(element)); |
- } |
- |
- @override |
- bool get isJsInteropUsed { |
- return _nativeData.isJsInteropUsed; |
- } |
- |
- @override |
- bool isNativeOrExtendsNative(ClassEntity element) { |
- return _nativeData.isNativeOrExtendsNative(_map.toFrontendClass(element)); |
- } |
- |
- @override |
- bool hasNativeTagsForcedNonLeaf(ClassEntity cls) { |
- return _nativeData.hasNativeTagsForcedNonLeaf(_map.toFrontendClass(cls)); |
- } |
- |
- @override |
- List<String> getNativeTagsOfClass(ClassEntity cls) { |
- return _nativeData.getNativeTagsOfClass(_map.toFrontendClass(cls)); |
- } |
-} |
- |
-class JsBackendUsage implements BackendUsage { |
- final JsToFrontendMap _map; |
- final BackendUsage _backendUsage; |
- |
- @override |
- bool needToInitializeIsolateAffinityTag; |
- @override |
- bool needToInitializeDispatchProperty; |
- |
- JsBackendUsage(this._map, this._backendUsage) { |
- needToInitializeIsolateAffinityTag = |
- _backendUsage.needToInitializeIsolateAffinityTag; |
- needToInitializeDispatchProperty = |
- _backendUsage.needToInitializeDispatchProperty; |
- } |
- |
- @override |
- bool isFunctionUsedByBackend(FunctionEntity element) { |
- return _backendUsage |
- .isFunctionUsedByBackend(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- bool isFieldUsedByBackend(FieldEntity element) { |
- return _backendUsage.isFieldUsedByBackend(_map.toFrontendMember(element)); |
- } |
- |
- @override |
- Iterable<FunctionEntity> get globalFunctionDependencies { |
- FunctionEntity f(FunctionEntity e) => _map.toBackendMember(e); |
- return _backendUsage.globalFunctionDependencies.map(f); |
- } |
- |
- @override |
- Iterable<ClassEntity> get globalClassDependencies { |
- return _backendUsage.globalClassDependencies.map(_map.toBackendClass); |
- } |
- |
- @override |
- bool get requiresPreamble => _backendUsage.requiresPreamble; |
- |
- @override |
- bool get isInvokeOnUsed => _backendUsage.isInvokeOnUsed; |
- |
- @override |
- bool get isRuntimeTypeUsed => _backendUsage.isRuntimeTypeUsed; |
- |
- @override |
- bool get isIsolateInUse => _backendUsage.isIsolateInUse; |
- |
- @override |
- bool get isFunctionApplyUsed => _backendUsage.isFunctionApplyUsed; |
- |
- @override |
- bool get isMirrorsUsed => _backendUsage.isMirrorsUsed; |
- |
- @override |
- bool get isNoSuchMethodUsed => _backendUsage.isNoSuchMethodUsed; |
-} |