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

Unified Diff: pkg/dev_compiler/lib/src/compiler/extension_types.dart

Issue 2757753002: Migrate DDC to the new analysis driver.
Patch Set: Rebase Created 3 years, 6 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
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);
« no previous file with comments | « pkg/dev_compiler/lib/src/compiler/error_helpers.dart ('k') | pkg/dev_compiler/lib/src/compiler/nullable_type_inference.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698