Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(841)

Unified Diff: pkg/compiler/lib/src/core_types.dart

Issue 2654293002: Extract reusable parts of _CompilerCommonElements in a CommonElementsMixin (Closed)
Patch Set: Cleanup Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/compiler.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/core_types.dart
diff --git a/pkg/compiler/lib/src/core_types.dart b/pkg/compiler/lib/src/core_types.dart
index 3108c1a77b238840376e2f91003c4326522cd84c..aa59936be8b6c1f50439f20e38faf5b2234d3e06 100644
--- a/pkg/compiler/lib/src/core_types.dart
+++ b/pkg/compiler/lib/src/core_types.dart
@@ -90,6 +90,7 @@ abstract class CommonElements {
/// Whether [element] is the same as [symbolConstructor]. Used to check
/// for the constructor without computing it until it is likely to be seen.
+ // TODO(johnniwinther): Change type of [e] to [MemberEntity].
bool isSymbolConstructor(Entity e);
/// The `MirrorSystem` class in dart:mirrors.
@@ -207,3 +208,263 @@ abstract class CommonElements {
/// Returns `true` if [element] is a superclass of `List`.
bool isListSupertype(ClassEntity element);
}
+
+abstract class CommonElementsMixin implements CommonElements {
+ /// Lookup the class [name] in [library], fail if the class is missing and
+ /// [required].
+ ClassEntity findClass(LibraryEntity library, String name,
+ {bool required: true});
+
+ /// Lookup the member [name] in [library], fail if the class is missing and
+ /// [required].
+ MemberEntity findLibraryMember(LibraryEntity library, String name,
+ {bool required: true});
+
+ /// Lookup the member [name] in [cls], fail if the class is missing and
+ /// [required].
+ MemberEntity findClassMember(ClassEntity cls, String name,
+ {bool required: true});
+
+ /// Lookup the constructor [name] in [cls], fail if the class is missing and
+ /// [required].
+ FunctionEntity findConstructor(ClassEntity cls, String name,
+ {bool required: true});
+
+ /// Return the raw type of [cls].
+ InterfaceType getRawType(ClassEntity cls);
+
+ /// Create the instantiation of [cls] with the given [typeArguments].
+ InterfaceType createInterfaceType(
+ ClassEntity cls, List<DartType> typeArguments);
+
+ // From dart:core
+
+ ClassEntity _objectClass;
+ ClassEntity get objectClass =>
+ _objectClass ??= findClass(coreLibrary, 'Object');
+
+ ClassEntity _boolClass;
+ ClassEntity get boolClass => _boolClass ??= findClass(coreLibrary, 'bool');
+
+ ClassEntity _numClass;
+ ClassEntity get numClass => _numClass ??= findClass(coreLibrary, 'num');
+
+ ClassEntity _intClass;
+ ClassEntity get intClass => _intClass ??= findClass(coreLibrary, 'int');
+
+ ClassEntity _doubleClass;
+ ClassEntity get doubleClass =>
+ _doubleClass ??= findClass(coreLibrary, 'double');
+
+ ClassEntity _stringClass;
+ ClassEntity get stringClass =>
+ _stringClass ??= findClass(coreLibrary, 'String');
+
+ ClassEntity _functionClass;
+ ClassEntity get functionClass =>
+ _functionClass ??= findClass(coreLibrary, 'Function');
+
+ FunctionEntity _functionApplyMethod;
+ FunctionEntity get functionApplyMethod =>
+ _functionApplyMethod ??= findClassMember(functionClass, 'apply');
+
+ bool isFunctionApplyMethod(MemberEntity element) =>
+ element.name == 'apply' && element.enclosingClass == functionClass;
+
+ ClassEntity _nullClass;
+ ClassEntity get nullClass => _nullClass ??= findClass(coreLibrary, 'Null');
+
+ ClassEntity _listClass;
+ ClassEntity get listClass => _listClass ??= findClass(coreLibrary, 'List');
+
+ ClassEntity _typeClass;
+ ClassEntity get typeClass => _typeClass ??= findClass(coreLibrary, 'Type');
+
+ ClassEntity _mapClass;
+ ClassEntity get mapClass => _mapClass ??= findClass(coreLibrary, 'Map');
+
+ ClassEntity _symbolClass;
+ ClassEntity get symbolClass =>
+ _symbolClass ??= findClass(coreLibrary, 'Symbol');
+
+ FunctionEntity _symbolConstructor;
+ FunctionEntity get symbolConstructor =>
+ _symbolConstructor ??= findConstructor(symbolClass, '');
+
+ bool isSymbolConstructor(Entity e) => e == symbolConstructor;
+
+ ClassEntity _stackTraceClass;
+ ClassEntity get stackTraceClass =>
+ _stackTraceClass ??= findClass(coreLibrary, 'StackTrace');
+
+ ClassEntity _iterableClass;
+ ClassEntity get iterableClass =>
+ _iterableClass ??= findClass(coreLibrary, 'Iterable');
+
+ ClassEntity _resourceClass;
+ ClassEntity get resourceClass =>
+ _resourceClass ??= findClass(coreLibrary, 'Resource');
+
+ FunctionEntity _identicalFunction;
+ FunctionEntity get identicalFunction =>
+ _identicalFunction ??= findLibraryMember(coreLibrary, 'identical');
+
+ // From dart:async
+
+ ClassEntity _futureClass;
+ ClassEntity get futureClass =>
+ _futureClass ??= findClass(asyncLibrary, 'Future');
+
+ ClassEntity _streamClass;
+ ClassEntity get streamClass =>
+ _streamClass ??= findClass(asyncLibrary, 'Stream');
+
+ ClassEntity _deferredLibraryClass;
+ ClassEntity get deferredLibraryClass =>
+ _deferredLibraryClass ??= findClass(asyncLibrary, "DeferredLibrary");
+
+ // From dart:mirrors
+
+ ClassEntity _mirrorSystemClass;
+ ClassEntity get mirrorSystemClass => _mirrorSystemClass ??=
+ findClass(mirrorsLibrary, 'MirrorSystem', required: false);
+
+ FunctionEntity _mirrorSystemGetNameFunction;
+ bool isMirrorSystemGetNameFunction(MemberEntity element) {
+ if (_mirrorSystemGetNameFunction == null) {
+ if (!element.isFunction || mirrorsLibrary == null) return false;
+ ClassEntity cls = mirrorSystemClass;
+ if (element.enclosingClass != cls) return false;
+ if (cls != null) {
+ _mirrorSystemGetNameFunction =
+ findClassMember(cls, 'getName', required: false);
+ }
+ }
+ return element == _mirrorSystemGetNameFunction;
+ }
+
+ ClassEntity _mirrorsUsedClass;
+ ClassEntity get mirrorsUsedClass => _mirrorsUsedClass ??=
+ findClass(mirrorsLibrary, 'MirrorsUsed', required: false);
+
+ bool isMirrorsUsedConstructor(FunctionEntity element) =>
+ mirrorsLibrary != null && mirrorsUsedClass == element.enclosingClass;
+
+ FunctionEntity _mirrorsUsedConstructor;
+ @override
+ FunctionEntity get mirrorsUsedConstructor {
+ if (_mirrorsUsedConstructor == null) {
+ ClassEntity cls = mirrorsUsedClass;
+ if (cls != null) {
+ _mirrorsUsedConstructor = findConstructor(cls, '');
+ }
+ }
+ return _mirrorsUsedConstructor;
+ }
+
+ // From dart:typed_data
+
+ ClassEntity _typedDataClass;
+ ClassEntity get typedDataClass =>
+ _typedDataClass ??= findClass(typedDataLibrary, 'NativeTypedData');
+
+ FunctionEntity _unnamedListConstructor;
+ FunctionEntity get unnamedListConstructor =>
+ _unnamedListConstructor ??= findConstructor(listClass, '');
+
+ FunctionEntity _filledListConstructor;
+ FunctionEntity get filledListConstructor =>
+ _filledListConstructor ??= findConstructor(listClass, 'filled');
+
+ // TODO(johnniwinther): Change types to `ClassEntity` when these are not
+ // called with unrelated elements.
+ bool isNumberOrStringSupertype(/*Class*/ Entity element) {
+ return element == findClass(coreLibrary, 'Comparable', required: false);
+ }
+
+ bool isStringOnlySupertype(/*Class*/ Entity element) {
+ return element == findClass(coreLibrary, 'Pattern', required: false);
+ }
+
+ bool isListSupertype(/*Class*/ Entity element) => element == iterableClass;
+
+ @override
+ InterfaceType get objectType => getRawType(objectClass);
+
+ @override
+ InterfaceType get boolType => getRawType(boolClass);
+
+ @override
+ InterfaceType get doubleType => getRawType(doubleClass);
+
+ @override
+ InterfaceType get functionType => getRawType(functionClass);
+
+ @override
+ InterfaceType get intType => getRawType(intClass);
+
+ @override
+ InterfaceType get resourceType => getRawType(resourceClass);
+
+ @override
+ InterfaceType listType([DartType elementType]) {
+ if (elementType == null) {
+ return getRawType(listClass);
+ }
+ return createInterfaceType(listClass, [elementType]);
+ }
+
+ @override
+ InterfaceType mapType([DartType keyType, DartType valueType]) {
+ if (keyType == null && valueType == null) {
+ return getRawType(mapClass);
+ } else if (keyType == null) {
+ keyType = dynamicType;
+ } else if (valueType == null) {
+ valueType = dynamicType;
+ }
+ return createInterfaceType(mapClass, [keyType, valueType]);
+ }
+
+ @override
+ InterfaceType get nullType => getRawType(nullClass);
+
+ @override
+ InterfaceType get numType => getRawType(numClass);
+
+ @override
+ InterfaceType get stringType => getRawType(stringClass);
+
+ @override
+ InterfaceType get symbolType => getRawType(symbolClass);
+
+ @override
+ InterfaceType get typeType => getRawType(typeClass);
+
+ @override
+ InterfaceType get stackTraceType => getRawType(stackTraceClass);
+
+ @override
+ InterfaceType iterableType([DartType elementType]) {
+ if (elementType == null) {
+ return getRawType(iterableClass);
+ }
+ return createInterfaceType(iterableClass, [elementType]);
+ }
+
+ @override
+ InterfaceType futureType([DartType elementType]) {
+ if (elementType == null) {
+ return getRawType(futureClass);
+ }
+ return createInterfaceType(futureClass, [elementType]);
+ }
+
+ @override
+ InterfaceType streamType([DartType elementType]) {
+ if (elementType == null) {
+ return getRawType(streamClass);
+ }
+ return createInterfaceType(streamClass, [elementType]);
+ }
+}
« no previous file with comments | « pkg/compiler/lib/src/compiler.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698