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