| Index: lib/src/compiler/extension_types.dart
 | 
| diff --git a/lib/src/compiler/extension_types.dart b/lib/src/compiler/extension_types.dart
 | 
| index 5960db68850c9a47e0b8e2ef79f62fe0250056ba..2a3826c19b04303adaa607f6c226f7884a721be5 100644
 | 
| --- a/lib/src/compiler/extension_types.dart
 | 
| +++ b/lib/src/compiler/extension_types.dart
 | 
| @@ -2,748 +2,173 @@
 | 
|  // for details. All rights reserved. Use of this source code is governed by a
 | 
|  // BSD-style license that can be found in the LICENSE file.
 | 
|  
 | 
| -import 'package:analyzer/dart/element/element.dart' show Element;
 | 
| -import 'package:analyzer/dart/element/visitor.dart'
 | 
| -    show GeneralizingElementVisitor;
 | 
| -import 'package:collection/collection.dart' show binarySearch;
 | 
| +import 'dart:collection';
 | 
| +import 'package:analyzer/dart/element/element.dart'
 | 
| +    show ClassElement, CompilationUnitElement, Element;
 | 
| +import 'package:analyzer/dart/element/type.dart' show DartType, InterfaceType;
 | 
| +import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 | 
|  
 | 
| -class ExtensionTypeSet extends GeneralizingElementVisitor {
 | 
| -  bool contains(Element element) {
 | 
| -    var library = element?.library;
 | 
| -    if (library == null) return false;
 | 
| +/// Contains information about native JS types (those types provided by the
 | 
| +/// implementation) that are also provided by the Dart SDK.
 | 
| +///
 | 
| +/// For types provided by JavaScript, it is important that we don't add methods
 | 
| +/// directly to those types. Instead, we must call through a special set of
 | 
| +/// JS Symbol names, that are used for the "Dart extensions". For example:
 | 
| +///
 | 
| +///     // Dart
 | 
| +///     Iterable iter = myList;
 | 
| +///     print(iter.first);
 | 
| +///
 | 
| +///     // JS
 | 
| +///     let iter =  myLib.myList;
 | 
| +///     core.print(iter[dartx.first]);
 | 
| +///
 | 
| +/// This will provide the [Iterable.first] property, without needing to add
 | 
| +/// `first` to the `Array.prototype`.
 | 
| +class ExtensionTypeSet {
 | 
| +  final AnalysisContext _context;
 | 
|  
 | 
| -    var source = library.source;
 | 
| -    if (source.isInSystemLibrary) {
 | 
| -      var types = _extensionTypes[source.uri.toString()];
 | 
| -      if (types != null) {
 | 
| -        int index = binarySearch(types, element.name);
 | 
| -        return index >= 0;
 | 
| +  // Abstract types that may be implemented by both native and non-native
 | 
| +  // classes.
 | 
| +  final _extensibleTypes = new HashSet<ClassElement>();
 | 
| +
 | 
| +  // Concrete native types.
 | 
| +  final _nativeTypes = new HashSet<ClassElement>();
 | 
| +  final _pendingLibraries = new HashSet<String>();
 | 
| +
 | 
| +  ExtensionTypeSet(this._context) {
 | 
| +    // 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
 | 
| +    // a little more efficient now, we do this in two phases.
 | 
| +
 | 
| +    // 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');
 | 
| +
 | 
| +    // These are used natively by dart:html but also not annotated.
 | 
| +    _addExtensionTypesForLibrary('dart:core', ['Comparable', 'Map']);
 | 
| +    _addExtensionTypesForLibrary('dart:collection', ['ListMixin']);
 | 
| +    _addExtensionTypesForLibrary('dart:math', ['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');
 | 
| +  }
 | 
| +
 | 
| +  void _visitCompilationUnit(CompilationUnitElement unit) {
 | 
| +    unit.types.forEach(_visitClass);
 | 
| +  }
 | 
| +
 | 
| +  void _visitClass(ClassElement element) {
 | 
| +    if (_isNative(element)) {
 | 
| +      _addExtensionType(element.type, true);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  bool _isNative(ClassElement element) {
 | 
| +    for (var metadata in element.metadata) {
 | 
| +      var e = metadata.element?.enclosingElement;
 | 
| +      if (e.name == 'Native' || e.name == 'JsPeerInterface') {
 | 
| +        if (e.source.isInSystemLibrary) return true;
 | 
| +      }
 | 
| +    }
 | 
| +    return false;
 | 
| +  }
 | 
| +
 | 
| +  void _addExtensionType(InterfaceType t, [bool mustBeNative = false]) {
 | 
| +    if (t.isObject) return;
 | 
| +    var element = t.element;
 | 
| +    if (_extensibleTypes.contains(element) || _nativeTypes.contains(element)) {
 | 
| +      return;
 | 
| +    }
 | 
| +    bool isNative = mustBeNative || _isNative(element);
 | 
| +    if (isNative) {
 | 
| +      _nativeTypes.add(element);
 | 
| +    } else {
 | 
| +      _extensibleTypes.add(element);
 | 
| +    }
 | 
| +    element.interfaces.forEach(_addExtensionType);
 | 
| +    element.mixins.forEach(_addExtensionType);
 | 
| +    _addExtensionType(element.supertype);
 | 
| +  }
 | 
| +
 | 
| +  void _addExtensionTypesForLibrary(String libraryUri, List<String> typeNames) {
 | 
| +    var sourceFactory = _context.sourceFactory.forUri(libraryUri);
 | 
| +    var library = _context.computeLibraryElement(sourceFactory);
 | 
| +    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);
 | 
| +    _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;
 | 
|    }
 | 
|  
 | 
| -  // 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
 | 
| -  // a little more efficient now, we do this in two phases.
 | 
| -  final _extensionTypes = {
 | 
| -    'dart:_interceptors': [
 | 
| -      'Interceptor',
 | 
| -      'JSArray',
 | 
| -      'JSBool',
 | 
| -      'JSIndexable',
 | 
| -      'JSMutableIndexable',
 | 
| -      'JSNumber',
 | 
| -      'JSString'
 | 
| -    ],
 | 
| -    'dart:_internal': ['FixedLengthListMixin'],
 | 
| -    'dart:_js_helper': ['JavaScriptIndexingBehavior'],
 | 
| -    'dart:_native_typed_data': [
 | 
| -      'NativeByteBuffer',
 | 
| -      'NativeByteData',
 | 
| -      'NativeFloat32List',
 | 
| -      'NativeFloat64List',
 | 
| -      'NativeInt16List',
 | 
| -      'NativeInt32List',
 | 
| -      'NativeInt8List',
 | 
| -      'NativeTypedArray',
 | 
| -      'NativeTypedArrayOfDouble',
 | 
| -      'NativeTypedArrayOfInt',
 | 
| -      'NativeTypedData',
 | 
| -      'NativeUint16List',
 | 
| -      'NativeUint32List',
 | 
| -      'NativeUint8ClampedList',
 | 
| -      'NativeUint8List'
 | 
| -    ],
 | 
| -    'dart:collection': ['ListMixin'],
 | 
| -    'dart:core': [
 | 
| -      'Comparable',
 | 
| -      'Iterable',
 | 
| -      'List',
 | 
| -      'Map',
 | 
| -      'Pattern',
 | 
| -      'String',
 | 
| -      'bool',
 | 
| -      'double',
 | 
| -      'int',
 | 
| -      'num'
 | 
| -    ],
 | 
| -    'dart:indexed_db': [
 | 
| -      'Cursor',
 | 
| -      'CursorWithValue',
 | 
| -      'Database',
 | 
| -      'IdbFactory',
 | 
| -      'Index',
 | 
| -      'KeyRange',
 | 
| -      'ObjectStore',
 | 
| -      'OpenDBRequest',
 | 
| -      'Request',
 | 
| -      'Transaction',
 | 
| -      'VersionChangeEvent'
 | 
| -    ],
 | 
| -    'dart:math': ['Rectangle', '_RectangleBase'],
 | 
| -    'dart:typed_data': [
 | 
| -      'ByteBuffer',
 | 
| -      'ByteData',
 | 
| -      'Float32List',
 | 
| -      'Float64List',
 | 
| -      'Int16List',
 | 
| -      'Int32List',
 | 
| -      'Int8List',
 | 
| -      'TypedData',
 | 
| -      'Uint16List',
 | 
| -      'Uint32List',
 | 
| -      'Uint8ClampedList',
 | 
| -      'Uint8List'
 | 
| -    ],
 | 
| -    'dart:html': [
 | 
| -      'AbstractWorker',
 | 
| -      'AnchorElement',
 | 
| -      'Animation',
 | 
| -      'AnimationEffect',
 | 
| -      'AnimationEvent',
 | 
| -      'AnimationNode',
 | 
| -      'AnimationPlayer',
 | 
| -      'AnimationPlayerEvent',
 | 
| -      'AnimationTimeline',
 | 
| -      'ApplicationCache',
 | 
| -      'ApplicationCacheErrorEvent',
 | 
| -      'AreaElement',
 | 
| -      'AudioElement',
 | 
| -      'AudioTrack',
 | 
| -      'AudioTrackList',
 | 
| -      'AutocompleteErrorEvent',
 | 
| -      'BRElement',
 | 
| -      'BarProp',
 | 
| -      'BaseElement',
 | 
| -      'BatteryManager',
 | 
| -      'BeforeUnloadEvent',
 | 
| -      'Blob',
 | 
| -      'Body',
 | 
| -      'BodyElement',
 | 
| -      'ButtonElement',
 | 
| -      'ButtonInputElement',
 | 
| -      'CDataSection',
 | 
| -      'CacheStorage',
 | 
| -      'Canvas2DContextAttributes',
 | 
| -      'CanvasElement',
 | 
| -      'CanvasGradient',
 | 
| -      'CanvasImageSource',
 | 
| -      'CanvasPattern',
 | 
| -      'CanvasRenderingContext',
 | 
| -      'CanvasRenderingContext2D',
 | 
| -      'CharacterData',
 | 
| -      'CheckboxInputElement',
 | 
| -      'ChildNode',
 | 
| -      'CircularGeofencingRegion',
 | 
| -      'CloseEvent',
 | 
| -      'Comment',
 | 
| -      'CompositionEvent',
 | 
| -      'ConsoleBase',
 | 
| -      'ContentElement',
 | 
| -      'Coordinates',
 | 
| -      'Credential',
 | 
| -      'CredentialsContainer',
 | 
| -      'Crypto',
 | 
| -      'CryptoKey',
 | 
| -      'Css',
 | 
| -      'CssCharsetRule',
 | 
| -      'CssFilterRule',
 | 
| -      'CssFontFaceRule',
 | 
| -      'CssImportRule',
 | 
| -      'CssKeyframeRule',
 | 
| -      'CssKeyframesRule',
 | 
| -      'CssMediaRule',
 | 
| -      'CssPageRule',
 | 
| -      'CssRule',
 | 
| -      'CssStyleDeclaration',
 | 
| -      'CssStyleDeclarationBase',
 | 
| -      'CssStyleRule',
 | 
| -      'CssStyleSheet',
 | 
| -      'CssSupportsRule',
 | 
| -      'CssViewportRule',
 | 
| -      'CustomEvent',
 | 
| -      'DListElement',
 | 
| -      'DataListElement',
 | 
| -      'DataTransfer',
 | 
| -      'DataTransferItem',
 | 
| -      'DataTransferItemList',
 | 
| -      'DateInputElement',
 | 
| -      'DedicatedWorkerGlobalScope',
 | 
| -      'DeprecatedStorageInfo',
 | 
| -      'DeprecatedStorageQuota',
 | 
| -      'DetailsElement',
 | 
| -      'DeviceAcceleration',
 | 
| -      'DeviceLightEvent',
 | 
| -      'DeviceMotionEvent',
 | 
| -      'DeviceOrientationEvent',
 | 
| -      'DeviceRotationRate',
 | 
| -      'DialogElement',
 | 
| -      'DirectoryEntry',
 | 
| -      'DirectoryReader',
 | 
| -      'DivElement',
 | 
| -      'Document',
 | 
| -      'DocumentFragment',
 | 
| -      'DomError',
 | 
| -      'DomException',
 | 
| -      'DomImplementation',
 | 
| -      'DomIterator',
 | 
| -      'DomMatrix',
 | 
| -      'DomMatrixReadOnly',
 | 
| -      'DomParser',
 | 
| -      'DomPoint',
 | 
| -      'DomPointReadOnly',
 | 
| -      'DomRectReadOnly',
 | 
| -      'DomSettableTokenList',
 | 
| -      'DomStringList',
 | 
| -      'DomTokenList',
 | 
| -      'Element',
 | 
| -      'EmailInputElement',
 | 
| -      'EmbedElement',
 | 
| -      'Entry',
 | 
| -      'ErrorEvent',
 | 
| -      'Event',
 | 
| -      'EventSource',
 | 
| -      'EventTarget',
 | 
| -      'ExtendableEvent',
 | 
| -      'FederatedCredential',
 | 
| -      'FetchEvent',
 | 
| -      'FieldSetElement',
 | 
| -      'File',
 | 
| -      'FileEntry',
 | 
| -      'FileError',
 | 
| -      'FileList',
 | 
| -      'FileReader',
 | 
| -      'FileStream',
 | 
| -      'FileSystem',
 | 
| -      'FileUploadInputElement',
 | 
| -      'FileWriter',
 | 
| -      'FocusEvent',
 | 
| -      'FontFace',
 | 
| -      'FontFaceSet',
 | 
| -      'FontFaceSetLoadEvent',
 | 
| -      'FormData',
 | 
| -      'FormElement',
 | 
| -      'Gamepad',
 | 
| -      'GamepadButton',
 | 
| -      'GamepadEvent',
 | 
| -      'Geofencing',
 | 
| -      'GeofencingRegion',
 | 
| -      'Geolocation',
 | 
| -      'Geoposition',
 | 
| -      'GlobalEventHandlers',
 | 
| -      'HRElement',
 | 
| -      'HashChangeEvent',
 | 
| -      'HeadElement',
 | 
| -      'Headers',
 | 
| -      'HeadingElement',
 | 
| -      'HiddenInputElement',
 | 
| -      'History',
 | 
| -      'HistoryBase',
 | 
| -      'HtmlCollection',
 | 
| -      'HtmlDocument',
 | 
| -      'HtmlElement',
 | 
| -      'HtmlFormControlsCollection',
 | 
| -      'HtmlHtmlElement',
 | 
| -      'HtmlOptionsCollection',
 | 
| -      'HttpRequest',
 | 
| -      'HttpRequestEventTarget',
 | 
| -      'HttpRequestUpload',
 | 
| -      'IFrameElement',
 | 
| -      'ImageBitmap',
 | 
| -      'ImageButtonInputElement',
 | 
| -      'ImageData',
 | 
| -      'ImageElement',
 | 
| -      'ImmutableListMixin',
 | 
| -      'InjectedScriptHost',
 | 
| -      'InputElement',
 | 
| -      'InputElementBase',
 | 
| -      'InputMethodContext',
 | 
| -      'InstallEvent',
 | 
| -      'KeyboardEvent',
 | 
| -      'KeygenElement',
 | 
| -      'LIElement',
 | 
| -      'LabelElement',
 | 
| -      'LegendElement',
 | 
| -      'LinkElement',
 | 
| -      'LocalCredential',
 | 
| -      'LocalDateTimeInputElement',
 | 
| -      'Location',
 | 
| -      'LocationBase',
 | 
| -      'MapElement',
 | 
| -      'MediaController',
 | 
| -      'MediaDeviceInfo',
 | 
| -      'MediaElement',
 | 
| -      'MediaError',
 | 
| -      'MediaKeyError',
 | 
| -      'MediaKeyEvent',
 | 
| -      'MediaKeyMessageEvent',
 | 
| -      'MediaKeyNeededEvent',
 | 
| -      'MediaKeySession',
 | 
| -      'MediaKeys',
 | 
| -      'MediaList',
 | 
| -      'MediaQueryList',
 | 
| -      'MediaQueryListEvent',
 | 
| -      'MediaSource',
 | 
| -      'MediaStream',
 | 
| -      'MediaStreamEvent',
 | 
| -      'MediaStreamTrack',
 | 
| -      'MediaStreamTrackEvent',
 | 
| -      'MemoryInfo',
 | 
| -      'MenuElement',
 | 
| -      'MenuItemElement',
 | 
| -      'MessageChannel',
 | 
| -      'MessageEvent',
 | 
| -      'MessagePort',
 | 
| -      'MetaElement',
 | 
| -      'Metadata',
 | 
| -      'MeterElement',
 | 
| -      'MidiAccess',
 | 
| -      'MidiConnectionEvent',
 | 
| -      'MidiInput',
 | 
| -      'MidiInputMap',
 | 
| -      'MidiMessageEvent',
 | 
| -      'MidiOutput',
 | 
| -      'MidiOutputMap',
 | 
| -      'MidiPort',
 | 
| -      'MimeType',
 | 
| -      'MimeTypeArray',
 | 
| -      'ModElement',
 | 
| -      'MonthInputElement',
 | 
| -      'MouseEvent',
 | 
| -      'MutationObserver',
 | 
| -      'MutationRecord',
 | 
| -      'Navigator',
 | 
| -      'NavigatorCpu',
 | 
| -      'NavigatorID',
 | 
| -      'NavigatorLanguage',
 | 
| -      'NavigatorOnLine',
 | 
| -      'NavigatorUserMediaError',
 | 
| -      'NetworkInformation',
 | 
| -      'Node',
 | 
| -      'NodeFilter',
 | 
| -      'NodeIterator',
 | 
| -      'NodeList',
 | 
| -      'Notification',
 | 
| -      'NumberInputElement',
 | 
| -      'OListElement',
 | 
| -      'ObjectElement',
 | 
| -      'OptGroupElement',
 | 
| -      'OptionElement',
 | 
| -      'OutputElement',
 | 
| -      'OverflowEvent',
 | 
| -      'PageTransitionEvent',
 | 
| -      'ParagraphElement',
 | 
| -      'ParamElement',
 | 
| -      'ParentNode',
 | 
| -      'PasswordInputElement',
 | 
| -      'Path2D',
 | 
| -      'Performance',
 | 
| -      'PerformanceEntry',
 | 
| -      'PerformanceMark',
 | 
| -      'PerformanceMeasure',
 | 
| -      'PerformanceNavigation',
 | 
| -      'PerformanceResourceTiming',
 | 
| -      'PerformanceTiming',
 | 
| -      'PictureElement',
 | 
| -      'Plugin',
 | 
| -      'PluginArray',
 | 
| -      'PluginPlaceholderElement',
 | 
| -      'PopStateEvent',
 | 
| -      'PositionError',
 | 
| -      'PreElement',
 | 
| -      'Presentation',
 | 
| -      'ProcessingInstruction',
 | 
| -      'ProgressElement',
 | 
| -      'ProgressEvent',
 | 
| -      'PushEvent',
 | 
| -      'PushManager',
 | 
| -      'PushRegistration',
 | 
| -      'QuoteElement',
 | 
| -      'RadioButtonInputElement',
 | 
| -      'Range',
 | 
| -      'RangeInputElement',
 | 
| -      'RangeInputElementBase',
 | 
| -      'ReadableStream',
 | 
| -      'RelatedEvent',
 | 
| -      'ResetButtonInputElement',
 | 
| -      'ResourceProgressEvent',
 | 
| -      'RtcDataChannel',
 | 
| -      'RtcDataChannelEvent',
 | 
| -      'RtcDtmfSender',
 | 
| -      'RtcDtmfToneChangeEvent',
 | 
| -      'RtcIceCandidate',
 | 
| -      'RtcIceCandidateEvent',
 | 
| -      'RtcPeerConnection',
 | 
| -      'RtcSessionDescription',
 | 
| -      'RtcStatsReport',
 | 
| -      'RtcStatsResponse',
 | 
| -      'Screen',
 | 
| -      'ScreenOrientation',
 | 
| -      'ScriptElement',
 | 
| -      'SearchInputElement',
 | 
| -      'SecurityPolicyViolationEvent',
 | 
| -      'SelectElement',
 | 
| -      'Selection',
 | 
| -      'ServiceWorkerClient',
 | 
| -      'ServiceWorkerClients',
 | 
| -      'ServiceWorkerContainer',
 | 
| -      'ServiceWorkerGlobalScope',
 | 
| -      'ServiceWorkerRegistration',
 | 
| -      'ShadowElement',
 | 
| -      'ShadowRoot',
 | 
| -      'SharedWorker',
 | 
| -      'SharedWorkerGlobalScope',
 | 
| -      'SourceBuffer',
 | 
| -      'SourceBufferList',
 | 
| -      'SourceElement',
 | 
| -      'SourceInfo',
 | 
| -      'SpanElement',
 | 
| -      'SpeechGrammar',
 | 
| -      'SpeechGrammarList',
 | 
| -      'SpeechRecognition',
 | 
| -      'SpeechRecognitionAlternative',
 | 
| -      'SpeechRecognitionError',
 | 
| -      'SpeechRecognitionEvent',
 | 
| -      'SpeechRecognitionResult',
 | 
| -      'SpeechSynthesis',
 | 
| -      'SpeechSynthesisEvent',
 | 
| -      'SpeechSynthesisUtterance',
 | 
| -      'SpeechSynthesisVoice',
 | 
| -      'Storage',
 | 
| -      'StorageEvent',
 | 
| -      'StorageInfo',
 | 
| -      'StorageQuota',
 | 
| -      'StyleElement',
 | 
| -      'StyleMedia',
 | 
| -      'StyleSheet',
 | 
| -      'SubmitButtonInputElement',
 | 
| -      'TableCaptionElement',
 | 
| -      'TableCellElement',
 | 
| -      'TableColElement',
 | 
| -      'TableElement',
 | 
| -      'TableRowElement',
 | 
| -      'TableSectionElement',
 | 
| -      'TelephoneInputElement',
 | 
| -      'TemplateElement',
 | 
| -      'Text',
 | 
| -      'TextAreaElement',
 | 
| -      'TextEvent',
 | 
| -      'TextInputElement',
 | 
| -      'TextInputElementBase',
 | 
| -      'TextMetrics',
 | 
| -      'TextTrack',
 | 
| -      'TextTrackCue',
 | 
| -      'TextTrackCueList',
 | 
| -      'TextTrackList',
 | 
| -      'TimeInputElement',
 | 
| -      'TimeRanges',
 | 
| -      'Timing',
 | 
| -      'TitleElement',
 | 
| -      'Touch',
 | 
| -      'TouchEvent',
 | 
| -      'TouchList',
 | 
| -      'TrackElement',
 | 
| -      'TrackEvent',
 | 
| -      'TransitionEvent',
 | 
| -      'TreeWalker',
 | 
| -      'UIEvent',
 | 
| -      'UListElement',
 | 
| -      'UnknownElement',
 | 
| -      'Url',
 | 
| -      'UrlInputElement',
 | 
| -      'UrlUtils',
 | 
| -      'UrlUtilsReadOnly',
 | 
| -      'ValidityState',
 | 
| -      'VideoElement',
 | 
| -      'VideoPlaybackQuality',
 | 
| -      'VideoTrack',
 | 
| -      'VideoTrackList',
 | 
| -      'VttCue',
 | 
| -      'VttRegion',
 | 
| -      'VttRegionList',
 | 
| -      'WebSocket',
 | 
| -      'WeekInputElement',
 | 
| -      'WheelEvent',
 | 
| -      'Window',
 | 
| -      'WindowBase',
 | 
| -      'WindowBase64',
 | 
| -      'WindowEventHandlers',
 | 
| -      'Worker',
 | 
| -      'WorkerConsole',
 | 
| -      'WorkerGlobalScope',
 | 
| -      'WorkerPerformance',
 | 
| -      'XPathEvaluator',
 | 
| -      'XPathExpression',
 | 
| -      'XPathNSResolver',
 | 
| -      'XPathResult',
 | 
| -      'XmlDocument',
 | 
| -      'XmlSerializer',
 | 
| -      'XsltProcessor',
 | 
| -      '_Attr',
 | 
| -      '_CSSPrimitiveValue',
 | 
| -      '_CSSUnknownRule',
 | 
| -      '_CSSValue',
 | 
| -      '_Cache',
 | 
| -      '_CanvasPathMethods',
 | 
| -      '_ClientRect',
 | 
| -      '_ClientRectList',
 | 
| -      '_Counter',
 | 
| -      '_CssRuleList',
 | 
| -      '_CssValueList',
 | 
| -      '_DOMFileSystemSync',
 | 
| -      '_DirectoryEntrySync',
 | 
| -      '_DirectoryReaderSync',
 | 
| -      '_DocumentType',
 | 
| -      '_DomRect',
 | 
| -      '_EntryArray',
 | 
| -      '_EntrySync',
 | 
| -      '_FileEntrySync',
 | 
| -      '_FileReaderSync',
 | 
| -      '_FileWriterSync',
 | 
| -      '_GamepadList',
 | 
| -      '_HTMLAllCollection',
 | 
| -      '_HTMLAppletElement',
 | 
| -      '_HTMLDirectoryElement',
 | 
| -      '_HTMLFontElement',
 | 
| -      '_HTMLFrameElement',
 | 
| -      '_HTMLFrameSetElement',
 | 
| -      '_HTMLMarqueeElement',
 | 
| -      '_MutationEvent',
 | 
| -      '_NamedNodeMap',
 | 
| -      '_PagePopupController',
 | 
| -      '_RGBColor',
 | 
| -      '_Rect',
 | 
| -      '_Request',
 | 
| -      '_Response',
 | 
| -      '_ServiceWorker',
 | 
| -      '_SpeechRecognitionResultList',
 | 
| -      '_StyleSheetList',
 | 
| -      '_SubtleCrypto',
 | 
| -      '_WebKitCSSFilterValue',
 | 
| -      '_WebKitCSSMatrix',
 | 
| -      '_WebKitCSSTransformValue',
 | 
| -      '_WindowTimers',
 | 
| -      '_WorkerLocation',
 | 
| -      '_WorkerNavigator',
 | 
| -      '_XMLHttpRequestProgressEvent'
 | 
| -    ],
 | 
| -    'dart:svg': [
 | 
| -      'AElement',
 | 
| -      'AltGlyphElement',
 | 
| -      'Angle',
 | 
| -      'AnimateElement',
 | 
| -      'AnimateMotionElement',
 | 
| -      'AnimateTransformElement',
 | 
| -      'AnimatedAngle',
 | 
| -      'AnimatedBoolean',
 | 
| -      'AnimatedEnumeration',
 | 
| -      'AnimatedInteger',
 | 
| -      'AnimatedLength',
 | 
| -      'AnimatedLengthList',
 | 
| -      'AnimatedNumber',
 | 
| -      'AnimatedNumberList',
 | 
| -      'AnimatedPreserveAspectRatio',
 | 
| -      'AnimatedRect',
 | 
| -      'AnimatedString',
 | 
| -      'AnimatedTransformList',
 | 
| -      'AnimationElement',
 | 
| -      'CircleElement',
 | 
| -      'ClipPathElement',
 | 
| -      'DefsElement',
 | 
| -      'DescElement',
 | 
| -      'DiscardElement',
 | 
| -      'EllipseElement',
 | 
| -      'FEBlendElement',
 | 
| -      'FEColorMatrixElement',
 | 
| -      'FEComponentTransferElement',
 | 
| -      'FECompositeElement',
 | 
| -      'FEConvolveMatrixElement',
 | 
| -      'FEDiffuseLightingElement',
 | 
| -      'FEDisplacementMapElement',
 | 
| -      'FEDistantLightElement',
 | 
| -      'FEFloodElement',
 | 
| -      'FEFuncAElement',
 | 
| -      'FEFuncBElement',
 | 
| -      'FEFuncGElement',
 | 
| -      'FEFuncRElement',
 | 
| -      'FEGaussianBlurElement',
 | 
| -      'FEImageElement',
 | 
| -      'FEMergeElement',
 | 
| -      'FEMergeNodeElement',
 | 
| -      'FEMorphologyElement',
 | 
| -      'FEOffsetElement',
 | 
| -      'FEPointLightElement',
 | 
| -      'FESpecularLightingElement',
 | 
| -      'FESpotLightElement',
 | 
| -      'FETileElement',
 | 
| -      'FETurbulenceElement',
 | 
| -      'FilterElement',
 | 
| -      'FilterPrimitiveStandardAttributes',
 | 
| -      'FitToViewBox',
 | 
| -      'ForeignObjectElement',
 | 
| -      'GElement',
 | 
| -      'GeometryElement',
 | 
| -      'GraphicsElement',
 | 
| -      'ImageElement',
 | 
| -      'Length',
 | 
| -      'LengthList',
 | 
| -      'LineElement',
 | 
| -      'LinearGradientElement',
 | 
| -      'MarkerElement',
 | 
| -      'MaskElement',
 | 
| -      'Matrix',
 | 
| -      'MetadataElement',
 | 
| -      'Number',
 | 
| -      'NumberList',
 | 
| -      'PathElement',
 | 
| -      'PathSeg',
 | 
| -      'PathSegArcAbs',
 | 
| -      'PathSegArcRel',
 | 
| -      'PathSegClosePath',
 | 
| -      'PathSegCurvetoCubicAbs',
 | 
| -      'PathSegCurvetoCubicRel',
 | 
| -      'PathSegCurvetoCubicSmoothAbs',
 | 
| -      'PathSegCurvetoCubicSmoothRel',
 | 
| -      'PathSegCurvetoQuadraticAbs',
 | 
| -      'PathSegCurvetoQuadraticRel',
 | 
| -      'PathSegCurvetoQuadraticSmoothAbs',
 | 
| -      'PathSegCurvetoQuadraticSmoothRel',
 | 
| -      'PathSegLinetoAbs',
 | 
| -      'PathSegLinetoHorizontalAbs',
 | 
| -      'PathSegLinetoHorizontalRel',
 | 
| -      'PathSegLinetoRel',
 | 
| -      'PathSegLinetoVerticalAbs',
 | 
| -      'PathSegLinetoVerticalRel',
 | 
| -      'PathSegList',
 | 
| -      'PathSegMovetoAbs',
 | 
| -      'PathSegMovetoRel',
 | 
| -      'PatternElement',
 | 
| -      'Point',
 | 
| -      'PointList',
 | 
| -      'PolygonElement',
 | 
| -      'PolylineElement',
 | 
| -      'PreserveAspectRatio',
 | 
| -      'RadialGradientElement',
 | 
| -      'Rect',
 | 
| -      'RectElement',
 | 
| -      'RenderingIntent',
 | 
| -      'ScriptElement',
 | 
| -      'SetElement',
 | 
| -      'StopElement',
 | 
| -      'StringList',
 | 
| -      'StyleElement',
 | 
| -      'SvgElement',
 | 
| -      'SvgSvgElement',
 | 
| -      'SwitchElement',
 | 
| -      'SymbolElement',
 | 
| -      'TSpanElement',
 | 
| -      'Tests',
 | 
| -      'TextContentElement',
 | 
| -      'TextElement',
 | 
| -      'TextPathElement',
 | 
| -      'TextPositioningElement',
 | 
| -      'TitleElement',
 | 
| -      'Transform',
 | 
| -      'TransformList',
 | 
| -      'UnitTypes',
 | 
| -      'UriReference',
 | 
| -      'UseElement',
 | 
| -      'ViewElement',
 | 
| -      'ViewSpec',
 | 
| -      'ZoomAndPan',
 | 
| -      'ZoomEvent',
 | 
| -      '_GradientElement',
 | 
| -      '_SVGAltGlyphDefElement',
 | 
| -      '_SVGAltGlyphItemElement',
 | 
| -      '_SVGComponentTransferFunctionElement',
 | 
| -      '_SVGCursorElement',
 | 
| -      '_SVGFEDropShadowElement',
 | 
| -      '_SVGFontElement',
 | 
| -      '_SVGFontFaceElement',
 | 
| -      '_SVGFontFaceFormatElement',
 | 
| -      '_SVGFontFaceNameElement',
 | 
| -      '_SVGFontFaceSrcElement',
 | 
| -      '_SVGFontFaceUriElement',
 | 
| -      '_SVGGlyphElement',
 | 
| -      '_SVGGlyphRefElement',
 | 
| -      '_SVGHKernElement',
 | 
| -      '_SVGMPathElement',
 | 
| -      '_SVGMissingGlyphElement',
 | 
| -      '_SVGVKernElement'
 | 
| -    ],
 | 
| -    'dart:web_audio': [
 | 
| -      'AnalyserNode',
 | 
| -      'AudioBuffer',
 | 
| -      'AudioBufferSourceNode',
 | 
| -      'AudioContext',
 | 
| -      'AudioDestinationNode',
 | 
| -      'AudioListener',
 | 
| -      'AudioNode',
 | 
| -      'AudioParam',
 | 
| -      'AudioProcessingEvent',
 | 
| -      'AudioSourceNode',
 | 
| -      'BiquadFilterNode',
 | 
| -      'ChannelMergerNode',
 | 
| -      'ChannelSplitterNode',
 | 
| -      'ConvolverNode',
 | 
| -      'DelayNode',
 | 
| -      'DynamicsCompressorNode',
 | 
| -      'GainNode',
 | 
| -      'MediaElementAudioSourceNode',
 | 
| -      'MediaStreamAudioDestinationNode',
 | 
| -      'MediaStreamAudioSourceNode',
 | 
| -      'OfflineAudioCompletionEvent',
 | 
| -      'OfflineAudioContext',
 | 
| -      'OscillatorNode',
 | 
| -      'PannerNode',
 | 
| -      'PeriodicWave',
 | 
| -      'ScriptProcessorNode',
 | 
| -      'WaveShaperNode'
 | 
| -    ],
 | 
| -    'dart:web_gl': [
 | 
| -      'ActiveInfo',
 | 
| -      'AngleInstancedArrays',
 | 
| -      'Buffer',
 | 
| -      'CompressedTextureAtc',
 | 
| -      'CompressedTextureETC1',
 | 
| -      'CompressedTexturePvrtc',
 | 
| -      'CompressedTextureS3TC',
 | 
| -      'ContextAttributes',
 | 
| -      'ContextEvent',
 | 
| -      'DebugRendererInfo',
 | 
| -      'DebugShaders',
 | 
| -      'DepthTexture',
 | 
| -      'DrawBuffers',
 | 
| -      'ExtBlendMinMax',
 | 
| -      'ExtFragDepth',
 | 
| -      'ExtShaderTextureLod',
 | 
| -      'ExtTextureFilterAnisotropic',
 | 
| -      'Framebuffer',
 | 
| -      'LoseContext',
 | 
| -      'OesElementIndexUint',
 | 
| -      'OesStandardDerivatives',
 | 
| -      'OesTextureFloat',
 | 
| -      'OesTextureFloatLinear',
 | 
| -      'OesTextureHalfFloat',
 | 
| -      'OesTextureHalfFloatLinear',
 | 
| -      'OesVertexArrayObject',
 | 
| -      'Program',
 | 
| -      'Renderbuffer',
 | 
| -      'RenderingContext',
 | 
| -      'Shader',
 | 
| -      'ShaderPrecisionFormat',
 | 
| -      'Texture',
 | 
| -      'UniformLocation',
 | 
| -      'VertexArrayObject'
 | 
| -    ],
 | 
| -    'dart:web_sql': [
 | 
| -      'SqlDatabase',
 | 
| -      'SqlError',
 | 
| -      'SqlResultSet',
 | 
| -      'SqlResultSetRowList',
 | 
| -      'SqlTransaction'
 | 
| -    ]
 | 
| -  };
 | 
| +  bool _setContains(HashSet<ClassElement> set, Element element) {
 | 
| +    return set.contains(element) ||
 | 
| +        _processPending(element) && set.contains(element);
 | 
| +  }
 | 
| +
 | 
| +  bool isNativeClass(Element element) => _setContains(_nativeTypes, element);
 | 
| +
 | 
| +  bool _isNativeInterface(Element element) =>
 | 
| +      _setContains(_extensibleTypes, element);
 | 
| +
 | 
| +  bool hasNativeSubtype(DartType type) =>
 | 
| +      _isNativeInterface(type.element) || isNativeClass(type.element);
 | 
| +
 | 
| +  /// Collects all supertypes that may themselves contain native subtypes,
 | 
| +  /// excluding [Object], for example `List` is implemented by several native
 | 
| +  /// types.
 | 
| +  LinkedHashSet<ClassElement> collectNativeInterfaces(ClassElement element) {
 | 
| +    var types = new LinkedHashSet<ClassElement>();
 | 
| +    _collectNativeInterfaces(element.type, types);
 | 
| +    return types;
 | 
| +  }
 | 
| +
 | 
| +  void _collectNativeInterfaces(InterfaceType type, Set<ClassElement> types) {
 | 
| +    if (type.isObject) return;
 | 
| +    var element = type.element;
 | 
| +    if (_isNativeInterface(element)) types.add(element);
 | 
| +    for (var m in element.mixins.reversed) {
 | 
| +      _collectNativeInterfaces(m, types);
 | 
| +    }
 | 
| +    for (var i in element.interfaces) {
 | 
| +      _collectNativeInterfaces(i, types);
 | 
| +    }
 | 
| +    _collectNativeInterfaces(element.supertype, types);
 | 
| +  }
 | 
|  }
 | 
| 
 |