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

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

Issue 2814453005: Merge CommonElements and BackendHelpers! (Closed)
Patch Set: comments and re-merge, take two Created 3 years, 8 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/common/names.dart ('k') | pkg/compiler/lib/src/compiler.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/common_elements.dart
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index b5af19e42c4fb506617193350b41d71ff6cef49a..b5f615169f6ade11b40ae177d6ab2eade2fd0d0a 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -5,206 +5,1058 @@
// TODO(sigmund): rename and move to common/elements.dart
library dart2js.type_system;
-import 'common/names.dart' show Uris;
+import 'common/names.dart' show Identifiers, Uris;
+import 'js_backend/constant_system_javascript.dart';
import 'elements/types.dart';
+import 'elements/elements.dart' show PublicName;
import 'elements/entities.dart';
+import 'js_backend/backend.dart' show JavaScriptBackend;
+import 'universe/call_structure.dart' show CallStructure;
+import 'universe/selector.dart' show Selector;
import 'universe/call_structure.dart';
/// The common elements and types in Dart.
-abstract class CommonElements {
+class CommonElements {
+ final ElementEnvironment _env;
+
+ CommonElements(this._env);
+
/// The `Object` class defined in 'dart:core'.
- ClassEntity get objectClass;
+ ClassEntity _objectClass;
+ ClassEntity get objectClass =>
+ _objectClass ??= _findClass(coreLibrary, 'Object');
/// The `bool` class defined in 'dart:core'.
- ClassEntity get boolClass;
+ ClassEntity _boolClass;
+ ClassEntity get boolClass => _boolClass ??= _findClass(coreLibrary, 'bool');
/// The `num` class defined in 'dart:core'.
- ClassEntity get numClass;
+ ClassEntity _numClass;
+ ClassEntity get numClass => _numClass ??= _findClass(coreLibrary, 'num');
/// The `int` class defined in 'dart:core'.
- ClassEntity get intClass;
+ ClassEntity _intClass;
+ ClassEntity get intClass => _intClass ??= _findClass(coreLibrary, 'int');
/// The `double` class defined in 'dart:core'.
- ClassEntity get doubleClass;
-
- /// The `Resource` class defined in 'dart:core'.
- ClassEntity get resourceClass;
+ ClassEntity _doubleClass;
+ ClassEntity get doubleClass =>
+ _doubleClass ??= _findClass(coreLibrary, 'double');
/// The `String` class defined in 'dart:core'.
- ClassEntity get stringClass;
-
- /// The `Symbol` class defined in 'dart:core'.
- ClassEntity get symbolClass;
+ ClassEntity _stringClass;
+ ClassEntity get stringClass =>
+ _stringClass ??= _findClass(coreLibrary, 'String');
/// The `Function` class defined in 'dart:core'.
- ClassEntity get functionClass;
+ ClassEntity _functionClass;
+ ClassEntity get functionClass =>
+ _functionClass ??= _findClass(coreLibrary, 'Function');
+
+ /// The `Resource` class defined in 'dart:core'.
+ ClassEntity _resourceClass;
+ ClassEntity get resourceClass =>
+ _resourceClass ??= _findClass(coreLibrary, 'Resource');
+
+ /// The `Symbol` class defined in 'dart:core'.
+ ClassEntity _symbolClass;
+ ClassEntity get symbolClass =>
+ _symbolClass ??= _findClass(coreLibrary, 'Symbol');
/// The `Null` class defined in 'dart:core'.
- ClassEntity get nullClass;
+ ClassEntity _nullClass;
+ ClassEntity get nullClass => _nullClass ??= _findClass(coreLibrary, 'Null');
/// The `Type` class defined in 'dart:core'.
- ClassEntity get typeClass;
+ ClassEntity _typeClass;
+ ClassEntity get typeClass => _typeClass ??= _findClass(coreLibrary, 'Type');
/// The `StackTrace` class defined in 'dart:core';
- ClassEntity get stackTraceClass;
+ ClassEntity _stackTraceClass;
+ ClassEntity get stackTraceClass =>
+ _stackTraceClass ??= _findClass(coreLibrary, 'StackTrace');
/// The `List` class defined in 'dart:core';
- ClassEntity get listClass;
+ ClassEntity _listClass;
+ ClassEntity get listClass => _listClass ??= _findClass(coreLibrary, 'List');
/// The `Map` class defined in 'dart:core';
- ClassEntity get mapClass;
+ ClassEntity _mapClass;
+ ClassEntity get mapClass => _mapClass ??= _findClass(coreLibrary, 'Map');
/// The `Iterable` class defined in 'dart:core';
- ClassEntity get iterableClass;
+ ClassEntity _iterableClass;
+ ClassEntity get iterableClass =>
+ _iterableClass ??= _findClass(coreLibrary, 'Iterable');
/// The `Future` class defined in 'async';.
- ClassEntity get futureClass;
+ ClassEntity _futureClass;
+ ClassEntity get futureClass =>
+ _futureClass ??= _findClass(asyncLibrary, 'Future');
/// The `Stream` class defined in 'async';
- ClassEntity get streamClass;
+ ClassEntity _streamClass;
+ ClassEntity get streamClass =>
+ _streamClass ??= _findClass(asyncLibrary, 'Stream');
/// The dart:core library.
- LibraryEntity get coreLibrary;
+ LibraryEntity _coreLibrary;
+ LibraryEntity get coreLibrary =>
+ _coreLibrary ??= _env.lookupLibrary(Uris.dart_core, required: true);
/// The dart:async library.
- LibraryEntity get asyncLibrary;
+ LibraryEntity _asyncLibrary;
+ LibraryEntity get asyncLibrary =>
+ _asyncLibrary ??= _env.lookupLibrary(Uris.dart_async);
/// The dart:mirrors library. Null if the program doesn't access dart:mirrors.
- LibraryEntity get mirrorsLibrary;
+ LibraryEntity _mirrorsLibrary;
+ LibraryEntity get mirrorsLibrary =>
+ _mirrorsLibrary ??= _env.lookupLibrary(Uris.dart_mirrors);
/// The dart:typed_data library.
- LibraryEntity get typedDataLibrary;
+ LibraryEntity _typedDataLibrary;
+ LibraryEntity get typedDataLibrary =>
+ _typedDataLibrary ??= _env.lookupLibrary(Uris.dart__native_typed_data);
+
+ LibraryEntity _jsHelperLibrary;
+ LibraryEntity get jsHelperLibrary =>
+ _jsHelperLibrary ??= _env.lookupLibrary(Uris.dart__js_helper);
+
+ LibraryEntity _interceptorsLibrary;
+ LibraryEntity get interceptorsLibrary =>
+ _interceptorsLibrary ??= _env.lookupLibrary(Uris.dart__interceptors);
+
+ LibraryEntity _foreignLibrary;
+ LibraryEntity get foreignLibrary =>
+ _foreignLibrary ??= _env.lookupLibrary(Uris.dart__foreign_helper);
+
+ LibraryEntity _isolateHelperLibrary;
+ LibraryEntity get isolateHelperLibrary =>
+ _isolateHelperLibrary ??= _env.lookupLibrary(Uris.dart__isolate_helper);
+
+ /// Reference to the internal library to lookup functions to always inline.
+ LibraryEntity _internalLibrary;
+ LibraryEntity get internalLibrary =>
+ _internalLibrary ??= _env.lookupLibrary(Uris.dart__internal);
/// The `NativeTypedData` class from dart:typed_data.
- ClassEntity get typedDataClass;
+ ClassEntity _typedDataClass;
+ ClassEntity get typedDataClass =>
+ _typedDataClass ??= _findClass(typedDataLibrary, 'NativeTypedData');
/// Constructor of the `Symbol` class. This getter will ensure that `Symbol`
/// is resolved and lookup the constructor on demand.
- ConstructorEntity get symbolConstructor;
+ ConstructorEntity _symbolConstructor;
+ ConstructorEntity get symbolConstructor =>
+ // TODO(johnniwinther): Kernel does not include redirecting factories
+ // so this cannot be found in kernel. Find a consistent way to handle
+ // this and similar cases.
+ _symbolConstructor ??= _findConstructor(symbolClass, '', required: false);
/// 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);
+ bool isSymbolConstructor(Entity e) => e == symbolConstructor;
/// The `MirrorSystem` class in dart:mirrors.
- ClassEntity get mirrorSystemClass;
+ ClassEntity _mirrorSystemClass;
+ ClassEntity get mirrorSystemClass => _mirrorSystemClass ??=
+ _findClass(mirrorsLibrary, 'MirrorSystem', required: false);
/// Whether [element] is `MirrorClass.getName`. Used to check for the use of
/// that static method without forcing the resolution of the `MirrorSystem`
/// class until it is necessary.
- bool isMirrorSystemGetNameFunction(MemberEntity element);
+ 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;
+ }
/// The `MirrorsUsed` annotation in dart:mirrors.
- ClassEntity get mirrorsUsedClass;
+ ClassEntity _mirrorsUsedClass;
+ ClassEntity get mirrorsUsedClass => _mirrorsUsedClass ??=
+ _findClass(mirrorsLibrary, 'MirrorsUsed', required: false);
/// Whether [element] is the constructor of the `MirrorsUsed` class. Used to
/// check for the constructor without forcing the resolution of the
/// `MirrorsUsed` class until it is necessary.
- bool isMirrorsUsedConstructor(ConstructorEntity element);
+ bool isMirrorsUsedConstructor(ConstructorEntity element) =>
+ mirrorsLibrary != null && mirrorsUsedClass == element.enclosingClass;
/// The `DeferredLibrary` annotation in dart:async that was used before the
/// deferred import syntax was introduced.
// TODO(sigmund): drop support for this old syntax?
- ClassEntity get deferredLibraryClass;
+ ClassEntity _deferredLibraryClass;
+ ClassEntity get deferredLibraryClass =>
+ _deferredLibraryClass ??= _findClass(asyncLibrary, "DeferredLibrary");
/// The function `identical` in dart:core.
- FunctionEntity get identicalFunction;
+ FunctionEntity _identicalFunction;
+ FunctionEntity get identicalFunction =>
+ _identicalFunction ??= _findLibraryMember(coreLibrary, 'identical');
/// The method `Function.apply`.
- FunctionEntity get functionApplyMethod;
+ FunctionEntity _functionApplyMethod;
+ FunctionEntity get functionApplyMethod =>
+ _functionApplyMethod ??= _findClassMember(functionClass, 'apply');
/// Whether [element] is the same as [functionApplyMethod]. This will not
/// resolve the apply method if it hasn't been seen yet during compilation.
- bool isFunctionApplyMethod(MemberEntity element);
+ bool isFunctionApplyMethod(MemberEntity element) =>
+ element.name == 'apply' && element.enclosingClass == functionClass;
/// Returns `true` if [element] is the unnamed constructor of `List`. This
/// will not resolve the constructor if it hasn't been seen yet during
/// compilation.
- bool isUnnamedListConstructor(ConstructorEntity element);
+ bool isUnnamedListConstructor(ConstructorEntity element) =>
+ element.name == '' && element.enclosingClass == listClass;
/// Returns `true` if [element] is the 'filled' constructor of `List`. This
/// will not resolve the constructor if it hasn't been seen yet during
/// compilation.
- bool isFilledListConstructor(ConstructorEntity element);
+ bool isFilledListConstructor(ConstructorEntity element) =>
+ element.name == 'filled' && element.enclosingClass == listClass;
/// The `dynamic` type.
- DynamicType get dynamicType;
+ DynamicType get dynamicType => _env.dynamicType;
/// The `Object` type defined in 'dart:core'.
- InterfaceType get objectType;
+ InterfaceType get objectType => _getRawType(objectClass);
/// The `bool` type defined in 'dart:core'.
- InterfaceType get boolType;
+ InterfaceType get boolType => _getRawType(boolClass);
/// The `num` type defined in 'dart:core'.
- InterfaceType get numType;
+ InterfaceType get numType => _getRawType(numClass);
/// The `int` type defined in 'dart:core'.
- InterfaceType get intType;
+ InterfaceType get intType => _getRawType(intClass);
/// The `double` type defined in 'dart:core'.
- InterfaceType get doubleType;
+ InterfaceType get doubleType => _getRawType(doubleClass);
/// The `Resource` type defined in 'dart:core'.
- InterfaceType get resourceType;
+ InterfaceType get resourceType => _getRawType(resourceClass);
/// The `String` type defined in 'dart:core'.
- InterfaceType get stringType;
+ InterfaceType get stringType => _getRawType(stringClass);
/// The `Symbol` type defined in 'dart:core'.
- InterfaceType get symbolType;
+ InterfaceType get symbolType => _getRawType(symbolClass);
/// The `Function` type defined in 'dart:core'.
- InterfaceType get functionType;
+ InterfaceType get functionType => _getRawType(functionClass);
/// The `Null` type defined in 'dart:core'.
- InterfaceType get nullType;
+ InterfaceType get nullType => _getRawType(nullClass);
/// The `Type` type defined in 'dart:core'.
- InterfaceType get typeType;
+ InterfaceType get typeType => _getRawType(typeClass);
/// The `StackTrace` type defined in 'dart:core';
- InterfaceType get stackTraceType;
+ InterfaceType get stackTraceType => _getRawType(stackTraceClass);
/// Returns an instance of the `List` type defined in 'dart:core' with
/// [elementType] as its type argument.
///
/// If no type argument is provided, the canonical raw type is returned.
- InterfaceType listType([DartType elementType]);
+ InterfaceType listType([DartType elementType]) {
+ if (elementType == null) {
+ return _getRawType(listClass);
+ }
+ return _createInterfaceType(listClass, [elementType]);
+ }
/// Returns an instance of the `Map` type defined in 'dart:core' with
/// [keyType] and [valueType] as its type arguments.
///
/// If no type arguments are provided, the canonical raw type is returned.
- InterfaceType mapType([DartType keyType, DartType valueType]);
+ 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]);
+ }
/// Returns an instance of the `Iterable` type defined in 'dart:core' with
/// [elementType] as its type argument.
///
/// If no type argument is provided, the canonical raw type is returned.
- InterfaceType iterableType([DartType elementType]);
+ InterfaceType iterableType([DartType elementType]) {
+ if (elementType == null) {
+ return _getRawType(iterableClass);
+ }
+ return _createInterfaceType(iterableClass, [elementType]);
+ }
/// Returns an instance of the `Future` type defined in 'dart:async' with
/// [elementType] as its type argument.
///
/// If no type argument is provided, the canonical raw type is returned.
- InterfaceType futureType([DartType elementType]);
+ InterfaceType futureType([DartType elementType]) {
+ if (elementType == null) {
+ return _getRawType(futureClass);
+ }
+ return _createInterfaceType(futureClass, [elementType]);
+ }
/// Returns an instance of the `Stream` type defined in 'dart:async' with
/// [elementType] as its type argument.
///
/// If no type argument is provided, the canonical raw type is returned.
- InterfaceType streamType([DartType elementType]);
+ InterfaceType streamType([DartType elementType]) {
+ if (elementType == null) {
+ return _getRawType(streamClass);
+ }
+ return _createInterfaceType(streamClass, [elementType]);
+ }
/// Returns `true` if [element] is a superclass of `String` or `num`.
- bool isNumberOrStringSupertype(ClassEntity element);
+ // 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);
+ }
/// Returns `true` if [element] is a superclass of `String`.
- bool isStringOnlySupertype(ClassEntity element);
+ // TODO(johnniwinther): Change types to `ClassEntity` when these are not
+ // called with unrelated elements.
+ bool isStringOnlySupertype(/*Class*/ Entity element) {
+ return element == _findClass(coreLibrary, 'Pattern', required: false);
+ }
/// Returns `true` if [element] is a superclass of `List`.
- bool isListSupertype(ClassEntity element);
+ bool isListSupertype(ClassEntity element) => element == iterableClass;
+
+ ClassEntity _findClass(LibraryEntity library, String name,
+ {bool required: true}) {
+ if (library == null) return null;
+ return _env.lookupClass(library, name, required: required);
+ }
+
+ MemberEntity _findLibraryMember(LibraryEntity library, String name,
+ {bool setter: false, bool required: true}) {
+ if (library == null) return null;
+ return _env.lookupLibraryMember(library, name,
+ setter: setter, required: required);
+ }
+
+ MemberEntity _findClassMember(ClassEntity cls, String name,
+ {bool setter: false, bool required: true}) {
+ return _env.lookupClassMember(cls, name,
+ setter: setter, required: required);
+ }
+
+ ConstructorEntity _findConstructor(ClassEntity cls, String name,
+ {bool required: true}) {
+ return _env.lookupConstructor(cls, name, required: required);
+ }
+
+ /// Return the raw type of [cls].
+ InterfaceType _getRawType(ClassEntity cls) {
+ return _env.getRawType(cls);
+ }
+
+ /// Create the instantiation of [cls] with the given [typeArguments].
+ InterfaceType _createInterfaceType(
+ ClassEntity cls, List<DartType> typeArguments) {
+ return _env.createInterfaceType(cls, typeArguments);
+ }
+
+ // From dart:core
+ FunctionEntity get malformedTypeError =>
+ _cachedCoreHelper('_malformedTypeError');
+ FunctionEntity get genericNoSuchMethod =>
+ _cachedCoreHelper('_genericNoSuchMethod');
+ FunctionEntity get unresolvedConstructorError =>
+ _cachedCoreHelper('_unresolvedConstructorError');
+ FunctionEntity get unresolvedStaticGetterError =>
+ _cachedCoreHelper('_unresolvedStaticGetterError');
+ FunctionEntity get unresolvedStaticSetterError =>
+ _cachedCoreHelper('_unresolvedStaticSetterError');
+ FunctionEntity get unresolvedStaticMethodError =>
+ _cachedCoreHelper('_unresolvedStaticMethodError');
+ FunctionEntity get unresolvedTopLevelGetterError =>
+ _cachedCoreHelper('_unresolvedTopLevelGetterError');
+ FunctionEntity get unresolvedTopLevelSetterError =>
+ _cachedCoreHelper('_unresolvedTopLevelSetterError');
+ FunctionEntity get unresolvedTopLevelMethodError =>
+ _cachedCoreHelper('_unresolvedTopLevelMethodError');
+
+ Map<String, FunctionEntity> _cachedCoreHelpers = <String, FunctionEntity>{};
+ FunctionEntity _cachedCoreHelper(String name) => _cachedCoreHelpers[name] ??=
+ _env.lookupLibraryMember(coreLibrary, name, required: true);
+
+ FunctionEntity _objectEquals;
+ FunctionEntity get objectEquals =>
+ _objectEquals ??= _findClassMember(objectClass, '==');
+
+ ClassEntity _mapLiteralClass;
+ ClassEntity get mapLiteralClass {
+ if (_mapLiteralClass == null) {
+ _mapLiteralClass = _env.lookupClass(coreLibrary, 'LinkedHashMap');
+ if (_mapLiteralClass == null) {
+ _mapLiteralClass = _findClass(
+ _env.lookupLibrary(Uris.dart_collection), 'LinkedHashMap');
+ }
+ }
+ return _mapLiteralClass;
+ }
+
+ ConstructorEntity _mapLiteralConstructor;
+ ConstructorEntity _mapLiteralConstructorEmpty;
+ FunctionEntity _mapLiteralUntypedMaker;
+ FunctionEntity _mapLiteralUntypedEmptyMaker;
+ void _ensureMapLiteralHelpers() {
+ if (_mapLiteralConstructor != null) return;
+
+ _mapLiteralConstructor =
+ _env.lookupConstructor(mapLiteralClass, '_literal');
+ _mapLiteralConstructorEmpty =
+ _env.lookupConstructor(mapLiteralClass, '_empty');
+ _mapLiteralUntypedMaker =
+ _env.lookupClassMember(mapLiteralClass, '_makeLiteral');
+ _mapLiteralUntypedEmptyMaker =
+ _env.lookupClassMember(mapLiteralClass, '_makeEmpty');
+ }
+
+ ConstructorEntity get mapLiteralConstructor {
+ _ensureMapLiteralHelpers();
+ return _mapLiteralConstructor;
+ }
+
+ ConstructorEntity get mapLiteralConstructorEmpty {
+ _ensureMapLiteralHelpers();
+ return _mapLiteralConstructorEmpty;
+ }
+
+ FunctionEntity get mapLiteralUntypedMaker {
+ _ensureMapLiteralHelpers();
+ return _mapLiteralUntypedMaker;
+ }
+
+ FunctionEntity get mapLiteralUntypedEmptyMaker {
+ _ensureMapLiteralHelpers();
+ return _mapLiteralUntypedEmptyMaker;
+ }
+
+ FunctionEntity _objectNoSuchMethod;
+ FunctionEntity get objectNoSuchMethod {
+ return _objectNoSuchMethod ??=
+ _env.lookupClassMember(objectClass, Identifiers.noSuchMethod_);
+ }
+
+ bool isDefaultNoSuchMethodImplementation(FunctionEntity element) {
+ ClassEntity classElement = element.enclosingClass;
+ return classElement == objectClass ||
+ classElement == jsInterceptorClass ||
+ classElement == jsNullClass;
+ }
+
+ // From dart:async
+ ClassEntity _findAsyncHelperClass(String name) =>
+ _findClass(asyncLibrary, name);
+
+ FunctionEntity _findAsyncHelperFunction(String name) =>
+ _findLibraryMember(asyncLibrary, name);
+
+ FunctionEntity get asyncHelper => _findAsyncHelperFunction("_asyncHelper");
+
+ FunctionEntity get wrapBody =>
+ _findAsyncHelperFunction("_wrapJsFunctionForAsync");
+
+ FunctionEntity get yieldStar => _env.lookupClassMember(
+ _findAsyncHelperClass("_IterationMarker"), "yieldStar");
+
+ FunctionEntity get yieldSingle => _env.lookupClassMember(
+ _findAsyncHelperClass("_IterationMarker"), "yieldSingle");
+
+ FunctionEntity get syncStarUncaughtError => _env.lookupClassMember(
+ _findAsyncHelperClass("_IterationMarker"), "uncaughtError");
+
+ FunctionEntity get asyncStarHelper =>
+ _findAsyncHelperFunction("_asyncStarHelper");
+
+ FunctionEntity get streamOfController =>
+ _findAsyncHelperFunction("_streamOfController");
+
+ FunctionEntity get endOfIteration => _env.lookupClassMember(
+ _findAsyncHelperClass("_IterationMarker"), "endOfIteration");
+
+ ClassEntity get syncStarIterable =>
+ _findAsyncHelperClass("_SyncStarIterable");
+
+ ClassEntity get futureImplementation => _findAsyncHelperClass('_Future');
+
+ ClassEntity get controllerStream =>
+ _findAsyncHelperClass("_ControllerStream");
+
+ ConstructorEntity get syncStarIterableConstructor =>
+ _env.lookupConstructor(syncStarIterable, "");
+
+ ConstructorEntity get syncCompleterConstructor =>
+ _env.lookupConstructor(_findAsyncHelperClass("Completer"), "sync");
+
+ ClassEntity get asyncStarController =>
+ _findAsyncHelperClass("_AsyncStarStreamController");
+
+ ConstructorEntity get asyncStarControllerConstructor =>
+ _env.lookupConstructor(asyncStarController, "", required: true);
+
+ ConstructorEntity get streamIteratorConstructor =>
+ _env.lookupConstructor(_findAsyncHelperClass("StreamIterator"), "");
+
+ // From dart:mirrors
+ FunctionEntity _findMirrorsFunction(String name) {
+ LibraryEntity library = _env.lookupLibrary(Uris.dart__js_mirrors);
+ if (library == null) return null;
+ return _env.lookupLibraryMember(library, name, required: true);
+ }
+
+ /// Holds the method "disableTreeShaking" in js_mirrors when
+ /// dart:mirrors has been loaded.
+ FunctionEntity _disableTreeShakingMarker;
+ FunctionEntity get disableTreeShakingMarker =>
+ _disableTreeShakingMarker ??= _findMirrorsFunction('disableTreeShaking');
+
+ /// Holds the method "preserveNames" in js_mirrors when
+ /// dart:mirrors has been loaded.
+ FunctionEntity _preserveNamesMarker;
+ FunctionEntity get preserveNamesMarker {
+ if (_preserveNamesMarker == null) {
+ LibraryEntity library = _env.lookupLibrary(Uris.dart__js_names);
+ if (library != null) {
+ _preserveNamesMarker = _findLibraryMember(library, 'preserveNames');
+ }
+ }
+ return _preserveNamesMarker;
+ }
+
+ /// Holds the method "preserveMetadata" in js_mirrors when
+ /// dart:mirrors has been loaded.
+ FunctionEntity _preserveMetadataMarker;
+ FunctionEntity get preserveMetadataMarker =>
+ _preserveMetadataMarker ??= _findMirrorsFunction('preserveMetadata');
+
+ /// Holds the method "preserveUris" in js_mirrors when
+ /// dart:mirrors has been loaded.
+ FunctionEntity _preserveUrisMarker;
+ FunctionEntity get preserveUrisMarker =>
+ _preserveUrisMarker ??= _findMirrorsFunction('preserveUris');
+
+ /// Holds the method "preserveLibraryNames" in js_mirrors when
+ /// dart:mirrors has been loaded.
+ FunctionEntity _preserveLibraryNamesMarker;
+ FunctionEntity get preserveLibraryNamesMarker =>
+ _preserveLibraryNamesMarker ??=
+ _findMirrorsFunction('preserveLibraryNames');
+
+ // From dart:_interceptors
+ ClassEntity _findInterceptorsClass(String name) =>
+ _findClass(interceptorsLibrary, name);
+
+ FunctionEntity _findInterceptorsFunction(String name) =>
+ _findLibraryMember(interceptorsLibrary, name);
+
+ ClassEntity _jsInterceptorClass;
+ ClassEntity get jsInterceptorClass =>
+ _jsInterceptorClass ??= _findInterceptorsClass('Interceptor');
+
+ ClassEntity _jsStringClass;
+ ClassEntity get jsStringClass =>
+ _jsStringClass ??= _findInterceptorsClass('JSString');
+
+ ClassEntity _jsArrayClass;
+ ClassEntity get jsArrayClass =>
+ _jsArrayClass ??= _findInterceptorsClass('JSArray');
+
+ ClassEntity _jsNumberClass;
+ ClassEntity get jsNumberClass =>
+ _jsNumberClass ??= _findInterceptorsClass('JSNumber');
+
+ ClassEntity _jsIntClass;
+ ClassEntity get jsIntClass => _jsIntClass ??= _findInterceptorsClass('JSInt');
+
+ ClassEntity _jsDoubleClass;
+ ClassEntity get jsDoubleClass =>
+ _jsDoubleClass ??= _findInterceptorsClass('JSDouble');
+
+ ClassEntity _jsNullClass;
+ ClassEntity get jsNullClass =>
+ _jsNullClass ??= _findInterceptorsClass('JSNull');
+
+ ClassEntity _jsBoolClass;
+ ClassEntity get jsBoolClass =>
+ _jsBoolClass ??= _findInterceptorsClass('JSBool');
+
+ ClassEntity _jsPlainJavaScriptObjectClass;
+ ClassEntity get jsPlainJavaScriptObjectClass =>
+ _jsPlainJavaScriptObjectClass ??=
+ _findInterceptorsClass('PlainJavaScriptObject');
+
+ ClassEntity _jsUnknownJavaScriptObjectClass;
+ ClassEntity get jsUnknownJavaScriptObjectClass =>
+ _jsUnknownJavaScriptObjectClass ??=
+ _findInterceptorsClass('UnknownJavaScriptObject');
+
+ ClassEntity _jsJavaScriptFunctionClass;
+ ClassEntity get jsJavaScriptFunctionClass => _jsJavaScriptFunctionClass ??=
+ _findInterceptorsClass('JavaScriptFunction');
+
+ ClassEntity _jsJavaScriptObjectClass;
+ ClassEntity get jsJavaScriptObjectClass =>
+ _jsJavaScriptObjectClass ??= _findInterceptorsClass('JavaScriptObject');
+
+ ClassEntity _jsIndexableClass;
+ ClassEntity get jsIndexableClass =>
+ _jsIndexableClass ??= _findInterceptorsClass('JSIndexable');
+
+ ClassEntity _jsMutableIndexableClass;
+ ClassEntity get jsMutableIndexableClass =>
+ _jsMutableIndexableClass ??= _findInterceptorsClass('JSMutableIndexable');
+
+ ClassEntity _jsMutableArrayClass;
+ ClassEntity get jsMutableArrayClass =>
+ _jsMutableArrayClass ??= _findInterceptorsClass('JSMutableArray');
+
+ ClassEntity _jsFixedArrayClass;
+ ClassEntity get jsFixedArrayClass =>
+ _jsFixedArrayClass ??= _findInterceptorsClass('JSFixedArray');
+
+ ClassEntity _jsExtendableArrayClass;
+ ClassEntity get jsExtendableArrayClass =>
+ _jsExtendableArrayClass ??= _findInterceptorsClass('JSExtendableArray');
+
+ ClassEntity _jsUnmodifiableArrayClass;
+ ClassEntity get jsUnmodifiableArrayClass => _jsUnmodifiableArrayClass ??=
+ _findInterceptorsClass('JSUnmodifiableArray');
+
+ ClassEntity _jsPositiveIntClass;
+ ClassEntity get jsPositiveIntClass =>
+ _jsPositiveIntClass ??= _findInterceptorsClass('JSPositiveInt');
+
+ ClassEntity _jsUInt32Class;
+ ClassEntity get jsUInt32Class =>
+ _jsUInt32Class ??= _findInterceptorsClass('JSUInt32');
+
+ ClassEntity _jsUInt31Class;
+ ClassEntity get jsUInt31Class =>
+ _jsUInt31Class ??= _findInterceptorsClass('JSUInt31');
+
+ FunctionEntity _findIndexForNativeSubclassType;
+ FunctionEntity get findIndexForNativeSubclassType =>
+ _findIndexForNativeSubclassType ??= _findLibraryMember(
+ interceptorsLibrary, 'findIndexForNativeSubclassType');
+
+ FunctionEntity _getInterceptorMethod;
+ FunctionEntity get getInterceptorMethod =>
+ _getInterceptorMethod ??= _findInterceptorsFunction('getInterceptor');
+
+ FunctionEntity _getNativeInterceptorMethod;
+ FunctionEntity get getNativeInterceptorMethod =>
+ _getNativeInterceptorMethod ??=
+ _findInterceptorsFunction('getNativeInterceptor');
+
+ MemberEntity _jsIndexableLength;
+ MemberEntity get jsIndexableLength =>
+ _jsIndexableLength ??= _findClassMember(jsIndexableClass, 'length');
+
+ ConstructorEntity _jsArrayTypedConstructor;
+ ConstructorEntity get jsArrayTypedConstructor =>
+ _jsArrayTypedConstructor ??= _findConstructor(jsArrayClass, 'typed');
+
+ FunctionEntity _jsArrayRemoveLast;
+ FunctionEntity get jsArrayRemoveLast =>
+ _jsArrayRemoveLast ??= _findClassMember(jsArrayClass, 'removeLast');
+
+ FunctionEntity _jsArrayAdd;
+ FunctionEntity get jsArrayAdd =>
+ _jsArrayAdd ??= _findClassMember(jsArrayClass, 'add');
+
+ FunctionEntity _jsStringSplit;
+ FunctionEntity get jsStringSplit =>
+ _jsStringSplit ??= _findClassMember(jsStringClass, 'split');
+
+ FunctionEntity _jsStringToString;
+ FunctionEntity get jsStringToString =>
+ _jsStringToString ??= _findClassMember(jsStringClass, 'toString');
+
+ FunctionEntity _jsStringOperatorAdd;
+ FunctionEntity get jsStringOperatorAdd =>
+ _jsStringOperatorAdd ??= _findClassMember(jsStringClass, '+');
+
+ // From package:js
+ ClassEntity _jsAnnotationClass;
+ ClassEntity get jsAnnotationClass {
+ if (_jsAnnotationClass == null) {
+ LibraryEntity library = _env.lookupLibrary(Uris.package_js);
+ if (library == null) return null;
+ _jsAnnotationClass = _findClass(library, 'JS');
+ }
+ return _jsAnnotationClass;
+ }
+
+ ClassEntity _jsAnonymousClass;
+ ClassEntity get jsAnonymousClass {
+ if (_jsAnonymousClass == null) {
+ LibraryEntity library = _env.lookupLibrary(Uris.package_js);
+ if (library == null) return null;
+ _jsAnonymousClass = _findClass(library, '_Anonymous');
+ }
+ return _jsAnonymousClass;
+ }
+
+ // From dart:_js_helper
+ // TODO(johnniwinther): Avoid the need for this (from [CheckedModeHelper]).
+ FunctionEntity findHelperFunction(String name) => _findHelperFunction(name);
+
+ FunctionEntity _findHelperFunction(String name) =>
+ _findLibraryMember(jsHelperLibrary, name);
+
+ ClassEntity _findHelperClass(String name) =>
+ _findClass(jsHelperLibrary, name);
+
+ ClassEntity _closureClass;
+ ClassEntity get closureClass => _closureClass ??= _findHelperClass('Closure');
+
+ ClassEntity _boundClosureClass;
+ ClassEntity get boundClosureClass =>
+ _boundClosureClass ??= _findHelperClass('BoundClosure');
+
+ ClassEntity _typeLiteralClass;
+ ClassEntity get typeLiteralClass =>
+ _typeLiteralClass ??= _findHelperClass('TypeImpl');
+
+ ClassEntity _constMapLiteralClass;
+ ClassEntity get constMapLiteralClass =>
+ _constMapLiteralClass ??= _findHelperClass('ConstantMap');
+
+ ClassEntity _typeVariableClass;
+ ClassEntity get typeVariableClass =>
+ _typeVariableClass ??= _findHelperClass('TypeVariable');
+
+ ClassEntity _noSideEffectsClass;
+ ClassEntity get noSideEffectsClass =>
+ _noSideEffectsClass ??= _findHelperClass('NoSideEffects');
+
+ ClassEntity _noThrowsClass;
+ ClassEntity get noThrowsClass =>
+ _noThrowsClass ??= _findHelperClass('NoThrows');
+
+ ClassEntity _noInlineClass;
+ ClassEntity get noInlineClass =>
+ _noInlineClass ??= _findHelperClass('NoInline');
+
+ ClassEntity _forceInlineClass;
+ ClassEntity get forceInlineClass =>
+ _forceInlineClass ??= _findHelperClass('ForceInline');
+
+ ClassEntity _irRepresentationClass;
+ ClassEntity get irRepresentationClass =>
+ _irRepresentationClass ??= _findHelperClass('IrRepresentation');
+
+ ClassEntity _jsInvocationMirrorClass;
+ ClassEntity get jsInvocationMirrorClass =>
+ _jsInvocationMirrorClass ??= _findHelperClass('JSInvocationMirror');
+
+ /// Interface used to determine if an object has the JavaScript
+ /// indexing behavior. The interface is only visible to specific libraries.
+ ClassEntity _jsIndexingBehaviorInterface;
+ ClassEntity get jsIndexingBehaviorInterface =>
+ _jsIndexingBehaviorInterface ??=
+ _findHelperClass('JavaScriptIndexingBehavior');
+
+ ClassEntity get VoidRuntimeType => _findHelperClass('VoidRuntimeType');
+
+ ClassEntity get stackTraceHelperClass => _findHelperClass('_StackTrace');
+
+ ClassEntity get constantMapClass =>
+ _findHelperClass(JavaScriptMapConstant.DART_CLASS);
+ ClassEntity get constantStringMapClass =>
+ _findHelperClass(JavaScriptMapConstant.DART_STRING_CLASS);
+ ClassEntity get constantProtoMapClass =>
+ _findHelperClass(JavaScriptMapConstant.DART_PROTO_CLASS);
+ ClassEntity get generalConstantMapClass =>
+ _findHelperClass(JavaScriptMapConstant.DART_GENERAL_CLASS);
+
+ ClassEntity get annotationCreatesClass => _findHelperClass('Creates');
+
+ ClassEntity get annotationReturnsClass => _findHelperClass('Returns');
+
+ ClassEntity get annotationJSNameClass => _findHelperClass('JSName');
+
+ /// The class for patch annotations defined in dart:_js_helper.
+ ClassEntity _patchAnnotationClass;
+ ClassEntity get patchAnnotationClass =>
+ _patchAnnotationClass ??= _findHelperClass('_Patch');
+
+ /// The class for native annotations defined in dart:_js_helper.
+ ClassEntity _nativeAnnotationClass;
+ ClassEntity get nativeAnnotationClass =>
+ _nativeAnnotationClass ??= _findHelperClass('Native');
+
+ ConstructorEntity _typeVariableConstructor;
+ ConstructorEntity get typeVariableConstructor => _typeVariableConstructor ??=
+ _env.lookupConstructor(typeVariableClass, '');
+
+ FunctionEntity _invokeOnMethod;
+ FunctionEntity get invokeOnMethod => _invokeOnMethod ??=
+ _env.lookupClassMember(jsInvocationMirrorClass, '_getCachedInvocation');
+
+ FunctionEntity _assertTest;
+ FunctionEntity get assertTest =>
+ _assertTest ??= _findHelperFunction('assertTest');
+
+ FunctionEntity _assertThrow;
+ FunctionEntity get assertThrow =>
+ _assertThrow ??= _findHelperFunction('assertThrow');
+
+ FunctionEntity _assertHelper;
+ FunctionEntity get assertHelper =>
+ _assertHelper ??= _findHelperFunction('assertHelper');
+
+ FunctionEntity _assertUnreachableMethod;
+ FunctionEntity get assertUnreachableMethod =>
+ _assertUnreachableMethod ??= _findHelperFunction('assertUnreachable');
+
+ /// Holds the method "getIsolateAffinityTag" when dart:_js_helper has been
+ /// loaded.
+ FunctionEntity _getIsolateAffinityTagMarker;
+ FunctionEntity get getIsolateAffinityTagMarker =>
+ _getIsolateAffinityTagMarker ??=
+ _findHelperFunction('getIsolateAffinityTag');
+
+ /// Holds the method "requiresPreamble" in _js_helper.
+ FunctionEntity _requiresPreambleMarker;
+ FunctionEntity get requiresPreambleMarker =>
+ _requiresPreambleMarker ??= _findHelperFunction('requiresPreamble');
+
+ FunctionEntity get badMain => _findHelperFunction('badMain');
+
+ FunctionEntity get missingMain => _findHelperFunction('missingMain');
+
+ FunctionEntity get mainHasTooManyParameters =>
+ _findHelperFunction('mainHasTooManyParameters');
+
+ FunctionEntity get loadLibraryWrapper =>
+ _findHelperFunction("_loadLibraryWrapper");
+
+ FunctionEntity get boolConversionCheck =>
+ _findHelperFunction('boolConversionCheck');
+
+ FunctionEntity get _consoleTraceHelper =>
+ _findHelperFunction('consoleTraceHelper');
+
+ FunctionEntity get _postTraceHelper => _findHelperFunction('postTraceHelper');
+
+ FunctionEntity _traceHelper;
+ FunctionEntity get traceHelper {
+ return _traceHelper ??= JavaScriptBackend.TRACE_METHOD == 'console'
+ ? _consoleTraceHelper
+ : _postTraceHelper;
+ }
+
+ FunctionEntity get closureFromTearOff =>
+ _findHelperFunction('closureFromTearOff');
+
+ FunctionEntity get isJsIndexable => _findHelperFunction('isJsIndexable');
+
+ FunctionEntity get throwIllegalArgumentException =>
+ _findHelperFunction('iae');
+
+ FunctionEntity get throwIndexOutOfRangeException =>
+ _findHelperFunction('ioore');
+
+ FunctionEntity get exceptionUnwrapper =>
+ _findHelperFunction('unwrapException');
+
+ FunctionEntity get throwRuntimeError =>
+ _findHelperFunction('throwRuntimeError');
+
+ FunctionEntity get throwTypeError => _findHelperFunction('throwTypeError');
+
+ FunctionEntity get throwAbstractClassInstantiationError =>
+ _findHelperFunction('throwAbstractClassInstantiationError');
+
+ FunctionEntity _cachedCheckConcurrentModificationError;
+ FunctionEntity get checkConcurrentModificationError =>
+ _cachedCheckConcurrentModificationError ??=
+ _findHelperFunction('checkConcurrentModificationError');
+
+ FunctionEntity get throwConcurrentModificationError =>
+ _findHelperFunction('throwConcurrentModificationError');
+
+ FunctionEntity _checkInt;
+ FunctionEntity get checkInt => _checkInt ??= _findHelperFunction('checkInt');
+
+ FunctionEntity _checkNum;
+ FunctionEntity get checkNum => _checkNum ??= _findHelperFunction('checkNum');
+
+ FunctionEntity _checkString;
+ FunctionEntity get checkString =>
+ _checkString ??= _findHelperFunction('checkString');
+
+ FunctionEntity get stringInterpolationHelper => _findHelperFunction('S');
+
+ FunctionEntity get wrapExceptionHelper =>
+ _findHelperFunction('wrapException');
+
+ FunctionEntity get throwExpressionHelper =>
+ _findHelperFunction('throwExpression');
+
+ FunctionEntity get closureConverter =>
+ _findHelperFunction('convertDartClosureToJS');
+
+ FunctionEntity get traceFromException =>
+ _findHelperFunction('getTraceFromException');
+
+ FunctionEntity get setRuntimeTypeInfo =>
+ _findHelperFunction('setRuntimeTypeInfo');
+
+ FunctionEntity get getRuntimeTypeInfo =>
+ _findHelperFunction('getRuntimeTypeInfo');
+
+ FunctionEntity get getTypeArgumentByIndex =>
+ _findHelperFunction('getTypeArgumentByIndex');
+
+ FunctionEntity get computeSignature =>
+ _findHelperFunction('computeSignature');
+
+ FunctionEntity get getRuntimeTypeArguments =>
+ _findHelperFunction('getRuntimeTypeArguments');
+
+ FunctionEntity get getRuntimeTypeArgument =>
+ _findHelperFunction('getRuntimeTypeArgument');
+
+ FunctionEntity get runtimeTypeToString =>
+ _findHelperFunction('runtimeTypeToString');
+
+ FunctionEntity get assertIsSubtype => _findHelperFunction('assertIsSubtype');
+
+ FunctionEntity get checkSubtype => _findHelperFunction('checkSubtype');
+
+ FunctionEntity get assertSubtype => _findHelperFunction('assertSubtype');
+
+ FunctionEntity get subtypeCast => _findHelperFunction('subtypeCast');
+
+ FunctionEntity get functionTypeTest =>
+ _findHelperFunction('functionTypeTest');
+
+ FunctionEntity get checkSubtypeOfRuntimeType =>
+ _findHelperFunction('checkSubtypeOfRuntimeType');
+
+ FunctionEntity get assertSubtypeOfRuntimeType =>
+ _findHelperFunction('assertSubtypeOfRuntimeType');
+
+ FunctionEntity get subtypeOfRuntimeTypeCast =>
+ _findHelperFunction('subtypeOfRuntimeTypeCast');
+
+ FunctionEntity get checkDeferredIsLoaded =>
+ _findHelperFunction('checkDeferredIsLoaded');
+
+ FunctionEntity get throwNoSuchMethod =>
+ _findHelperFunction('throwNoSuchMethod');
+
+ FunctionEntity get createRuntimeType =>
+ _findHelperFunction('createRuntimeType');
+
+ FunctionEntity get fallThroughError =>
+ _findHelperFunction("getFallThroughError");
+
+ FunctionEntity get createInvocationMirror =>
+ _findHelperFunction('createInvocationMirror');
+
+ FunctionEntity get cyclicThrowHelper =>
+ _findHelperFunction("throwCyclicInit");
+
+ FunctionEntity get defineProperty => _findHelperFunction('defineProperty');
+
+ FunctionEntity get convertRtiToRuntimeType =>
+ _findHelperFunction('convertRtiToRuntimeType');
+
+ FunctionEntity get toStringForNativeObject =>
+ _findHelperFunction('toStringForNativeObject');
+
+ FunctionEntity get hashCodeForNativeObject =>
+ _findHelperFunction('hashCodeForNativeObject');
+
+ // From dart:_internal
+
+ ClassEntity _symbolImplementationClass;
+ ClassEntity get symbolImplementationClass =>
+ _symbolImplementationClass ??= _findClass(internalLibrary, 'Symbol');
+
+ final Selector symbolValidatedConstructorSelector =
+ new Selector.call(const PublicName('validated'), CallStructure.ONE_ARG);
+
+ ConstructorEntity get symbolValidatedConstructor =>
+ _symbolValidatedConstructor ??= _findConstructor(
+ symbolImplementationClass, symbolValidatedConstructorSelector.name);
+
+ /// Returns the field that holds the internal name in the implementation class
+ /// for `Symbol`.
+ FieldEntity _symbolImplementationField;
+ FieldEntity get symbolImplementationField => _symbolImplementationField ??=
+ _env.lookupClassMember(symbolImplementationClass, '_name',
+ required: true);
+
+ ConstructorEntity _symbolValidatedConstructor;
+ bool isSymbolValidatedConstructor(ConstructorEntity element) {
+ if (_symbolValidatedConstructor != null) {
+ return element == _symbolValidatedConstructor;
+ }
+ return false;
+ }
+
+ // From dart:_native_typed_data
+
+ ClassEntity _typedArrayClass;
+ ClassEntity get typedArrayClass => _typedArrayClass ??= _findClass(
+ _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
+ 'NativeTypedArray');
+
+ ClassEntity _typedArrayOfIntClass;
+ ClassEntity get typedArrayOfIntClass => _typedArrayOfIntClass ??= _findClass(
+ _env.lookupLibrary(Uris.dart__native_typed_data, required: true),
+ 'NativeTypedArrayOfInt');
+
+ // From dart:_js_embedded_names
+
+ /// Holds the class for the [JsGetName] enum.
+ ClassEntity _jsGetNameEnum;
+ ClassEntity get jsGetNameEnum => _jsGetNameEnum ??= _findClass(
+ _env.lookupLibrary(Uris.dart__js_embedded_names, required: true),
+ 'JsGetName');
+
+ /// Holds the class for the [JsBuiltins] enum.
+ ClassEntity _jsBuiltinEnum;
+ ClassEntity get jsBuiltinEnum => _jsBuiltinEnum ??= _findClass(
+ _env.lookupLibrary(Uris.dart__js_embedded_names, required: true),
+ 'JsBuiltin');
+
+ // From dart:_isolate_helper
+
+ FunctionEntity get startRootIsolate =>
+ _findLibraryMember(isolateHelperLibrary, 'startRootIsolate');
+
+ FunctionEntity get currentIsolate =>
+ _findLibraryMember(isolateHelperLibrary, '_currentIsolate');
+
+ FunctionEntity get callInIsolate =>
+ _findLibraryMember(isolateHelperLibrary, '_callInIsolate');
}
/// Interface for accessing libraries, classes and members.
@@ -318,282 +1170,3 @@ abstract class ElementEnvironment {
/// on deferred libraries.
bool isDeferredLoadLibraryGetter(MemberEntity member);
}
-
-class CommonElementsImpl implements CommonElements {
- final ElementEnvironment _env;
-
- CommonElementsImpl(this._env);
-
- ClassEntity findClass(LibraryEntity library, String name,
- {bool required: true}) {
- if (library == null) return null;
- return _env.lookupClass(library, name, required: required);
- }
-
- MemberEntity findLibraryMember(LibraryEntity library, String name,
- {bool setter: false, bool required: true}) {
- if (library == null) return null;
- return _env.lookupLibraryMember(library, name,
- setter: setter, required: required);
- }
-
- MemberEntity findClassMember(ClassEntity cls, String name,
- {bool setter: false, bool required: true}) {
- return _env.lookupClassMember(cls, name,
- setter: setter, required: required);
- }
-
- ConstructorEntity findConstructor(ClassEntity cls, String name,
- {bool required: true}) {
- return _env.lookupConstructor(cls, name, required: required);
- }
-
- DartType get dynamicType => _env.dynamicType;
-
- /// Return the raw type of [cls].
- InterfaceType getRawType(ClassEntity cls) {
- return _env.getRawType(cls);
- }
-
- /// Create the instantiation of [cls] with the given [typeArguments].
- InterfaceType createInterfaceType(
- ClassEntity cls, List<DartType> typeArguments) {
- return _env.createInterfaceType(cls, typeArguments);
- }
-
- LibraryEntity _coreLibrary;
- LibraryEntity get coreLibrary =>
- _coreLibrary ??= _env.lookupLibrary(Uris.dart_core, required: true);
-
- LibraryEntity _typedDataLibrary;
- LibraryEntity get typedDataLibrary =>
- _typedDataLibrary ??= _env.lookupLibrary(Uris.dart__native_typed_data);
-
- LibraryEntity _mirrorsLibrary;
- LibraryEntity get mirrorsLibrary =>
- _mirrorsLibrary ??= _env.lookupLibrary(Uris.dart_mirrors);
-
- LibraryEntity _asyncLibrary;
- LibraryEntity get asyncLibrary =>
- _asyncLibrary ??= _env.lookupLibrary(Uris.dart_async);
-
- // 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');
-
- ConstructorEntity _symbolConstructor;
- ConstructorEntity get symbolConstructor =>
- // TODO(johnniwinther): Kernel does not include redirecting factories
- // so this cannot be found in kernel. Find a consistent way to handle
- // this and similar cases.
- _symbolConstructor ??= findConstructor(symbolClass, '', required: false);
-
- 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(ConstructorEntity element) =>
- mirrorsLibrary != null && mirrorsUsedClass == element.enclosingClass;
-
- // From dart:typed_data
-
- ClassEntity _typedDataClass;
- ClassEntity get typedDataClass =>
- _typedDataClass ??= findClass(typedDataLibrary, 'NativeTypedData');
-
- bool isUnnamedListConstructor(ConstructorEntity element) =>
- element.name == '' && element.enclosingClass == listClass;
-
- bool isFilledListConstructor(ConstructorEntity element) =>
- element.name == 'filled' && element.enclosingClass == listClass;
-
- // 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/common/names.dart ('k') | pkg/compiler/lib/src/compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698