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

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

Issue 1949163003: fix for #520, ListMixin should work again (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 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 | « lib/src/compiler/compiler.dart ('k') | lib/src/compiler/js_field_storage.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
}
« no previous file with comments | « lib/src/compiler/compiler.dart ('k') | lib/src/compiler/js_field_storage.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698