| Index: pkg/dev_compiler/lib/src/compiler/extension_types.dart
|
| diff --git a/pkg/dev_compiler/lib/src/compiler/extension_types.dart b/pkg/dev_compiler/lib/src/compiler/extension_types.dart
|
| index 1e26fb46598c49dc8d9497d8dcc3cfd41001c060..c0c0764fd18a908ab9a03c5e7b8fa9998d38c706 100644
|
| --- a/pkg/dev_compiler/lib/src/compiler/extension_types.dart
|
| +++ b/pkg/dev_compiler/lib/src/compiler/extension_types.dart
|
| @@ -4,9 +4,9 @@
|
|
|
| import 'dart:collection';
|
| import 'package:analyzer/dart/element/element.dart'
|
| - show ClassElement, CompilationUnitElement, Element;
|
| + show ClassElement, CompilationUnitElement, Element, LibraryElement;
|
| import 'package:analyzer/dart/element/type.dart' show DartType, InterfaceType;
|
| -import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
|
| +import 'package:meta/meta.dart';
|
|
|
| /// Contains information about native JS types (those types provided by the
|
| /// implementation) that are also provided by the Dart SDK.
|
| @@ -26,17 +26,25 @@ import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
|
| /// This will provide the [Iterable.first] property, without needing to add
|
| /// `first` to the `Array.prototype`.
|
| class ExtensionTypeSet {
|
| - final AnalysisContext _context;
|
| -
|
| - // Abstract types that may be implemented by both native and non-native
|
| - // classes.
|
| + /// Abstract types that may be implemented by both native and non-native
|
| + /// classes.
|
| final _extensibleTypes = new HashSet<ClassElement>();
|
|
|
| - // Concrete native types.
|
| + /// Concrete native types.
|
| final _nativeTypes = new HashSet<ClassElement>();
|
| - final _pendingLibraries = new HashSet<String>();
|
|
|
| - ExtensionTypeSet(this._context) {
|
| + ExtensionTypeSet(
|
| + {@required LibraryElement coreLibrary,
|
| + @required LibraryElement collectionLibrary,
|
| + @required LibraryElement mathLibrary,
|
| + @required LibraryElement htmlLibrary,
|
| + @required LibraryElement indexedDbLibrary,
|
| + @required LibraryElement svgLibrary,
|
| + @required LibraryElement webAudioLibrary,
|
| + @required LibraryElement webGlLibrary,
|
| + @required LibraryElement webSqlLibrary,
|
| + @required LibraryElement interceptorsLibrary,
|
| + @required LibraryElement nativeTypedDataLibrary}) {
|
| // TODO(vsm): Eventually, we want to make this extensible - i.e., find
|
| // annotations in user code as well. It would need to be summarized in
|
| // the element model - not searched this way on every compile. To make this
|
| @@ -45,26 +53,25 @@ class ExtensionTypeSet {
|
| // First, core types:
|
| // TODO(vsm): If we're analyzing against the main SDK, those
|
| // types are not explicitly annotated.
|
| - var types = _context.typeProvider;
|
| - _addExtensionType(types.intType, true);
|
| - _addExtensionType(types.doubleType, true);
|
| - _addExtensionType(types.boolType, true);
|
| - _addExtensionType(types.stringType, true);
|
| - _addExtensionTypes('dart:_interceptors');
|
| - _addExtensionTypes('dart:_native_typed_data');
|
| + _addExtensionType(coreLibrary.getType('int').type, true);
|
| + _addExtensionType(coreLibrary.getType('double').type, true);
|
| + _addExtensionType(coreLibrary.getType('bool').type, true);
|
| + _addExtensionType(coreLibrary.getType('String').type, true);
|
| + _addExtensionTypes(interceptorsLibrary);
|
| + _addExtensionTypes(nativeTypedDataLibrary);
|
|
|
| // These are used natively by dart:html but also not annotated.
|
| - _addExtensionTypesForLibrary('dart:core', ['Comparable', 'Map']);
|
| - _addExtensionTypesForLibrary('dart:collection', ['ListMixin']);
|
| - _addExtensionTypesForLibrary('dart:math', ['Rectangle']);
|
| + _addExtensionTypesForLibrary(coreLibrary, ['Comparable', 'Map']);
|
| + _addExtensionTypesForLibrary(collectionLibrary, ['ListMixin']);
|
| + _addExtensionTypesForLibrary(mathLibrary, ['Rectangle']);
|
|
|
| // Second, html types - these are only searched if we use dart:html, etc.:
|
| - _addPendingExtensionTypes('dart:html');
|
| - _addPendingExtensionTypes('dart:indexed_db');
|
| - _addPendingExtensionTypes('dart:svg');
|
| - _addPendingExtensionTypes('dart:web_audio');
|
| - _addPendingExtensionTypes('dart:web_gl');
|
| - _addPendingExtensionTypes('dart:web_sql');
|
| + _addExtensionTypes(htmlLibrary);
|
| + _addExtensionTypes(indexedDbLibrary);
|
| + _addExtensionTypes(svgLibrary);
|
| + _addExtensionTypes(webAudioLibrary);
|
| + _addExtensionTypes(webGlLibrary);
|
| + _addExtensionTypes(webSqlLibrary);
|
| }
|
|
|
| void _visitCompilationUnit(CompilationUnitElement unit) {
|
| @@ -104,48 +111,21 @@ class ExtensionTypeSet {
|
| _addExtensionType(element.supertype);
|
| }
|
|
|
| - void _addExtensionTypesForLibrary(String libraryUri, List<String> typeNames) {
|
| - var sourceFactory = _context.sourceFactory.forUri(libraryUri);
|
| - var library = _context.computeLibraryElement(sourceFactory);
|
| + void _addExtensionTypesForLibrary(
|
| + LibraryElement library, List<String> typeNames) {
|
| for (var typeName in typeNames) {
|
| _addExtensionType(library.getType(typeName).type);
|
| }
|
| }
|
|
|
| - void _addExtensionTypes(String libraryUri) {
|
| - var sourceFactory = _context.sourceFactory.forUri(libraryUri);
|
| - var library = _context.computeLibraryElement(sourceFactory);
|
| + void _addExtensionTypes(LibraryElement library) {
|
| _visitCompilationUnit(library.definingCompilationUnit);
|
| library.parts.forEach(_visitCompilationUnit);
|
| }
|
|
|
| - void _addPendingExtensionTypes(String libraryUri) {
|
| - _pendingLibraries.add(libraryUri);
|
| - }
|
| -
|
| - bool _processPending(Element element) {
|
| - if (_pendingLibraries.isEmpty) return false;
|
| - if (element is ClassElement) {
|
| - var uri = element.library.source.uri.toString();
|
| - if (_pendingLibraries.contains(uri)) {
|
| - // Load all pending libraries
|
| - _pendingLibraries.forEach(_addExtensionTypes);
|
| - _pendingLibraries.clear();
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - bool _setContains(HashSet<ClassElement> set, Element element) {
|
| - return set.contains(element) ||
|
| - _processPending(element) && set.contains(element);
|
| - }
|
| -
|
| - bool isNativeClass(Element element) => _setContains(_nativeTypes, element);
|
| + bool isNativeClass(Element element) => _nativeTypes.contains(element);
|
|
|
| - bool isNativeInterface(Element element) =>
|
| - _setContains(_extensibleTypes, element);
|
| + bool isNativeInterface(Element element) => _extensibleTypes.contains(element);
|
|
|
| bool hasNativeSubtype(DartType type) =>
|
| isNativeInterface(type.element) || isNativeClass(type.element);
|
|
|