Qualified exports and inheritance for Closure (fixes core.Object issue)
diff --git a/lib/runtime/dart/_interceptors.js b/lib/runtime/dart/_interceptors.js index 832fe83..bf94b7c 100644 --- a/lib/runtime/dart/_interceptors.js +++ b/lib/runtime/dart/_interceptors.js
@@ -476,6 +476,11 @@ return JSExtendableArray; }); let JSExtendableArray = JSExtendableArray$(); + let _isInt32 = Symbol('_isInt32'); + let _tdivSlow = Symbol('_tdivSlow'); + let _shlPositive = Symbol('_shlPositive'); + let _shrOtherPositive = Symbol('_shrOtherPositive'); + let _shrBothPositive = Symbol('_shrBothPositive'); class Interceptor extends core.Object { Interceptor() { } @@ -483,11 +488,6 @@ dart.setSignature(Interceptor, { constructors: () => ({Interceptor: [Interceptor, []]}) }); - let _isInt32 = Symbol('_isInt32'); - let _tdivSlow = Symbol('_tdivSlow'); - let _shlPositive = Symbol('_shlPositive'); - let _shrOtherPositive = Symbol('_shrOtherPositive'); - let _shrBothPositive = Symbol('_shrBothPositive'); dart.defineExtensionNames([ 'compareTo', 'isNegative',
diff --git a/lib/runtime/dart/_native_typed_data.js b/lib/runtime/dart/_native_typed_data.js index 96b08e7..d64a1b8 100644 --- a/lib/runtime/dart/_native_typed_data.js +++ b/lib/runtime/dart/_native_typed_data.js
@@ -1,14 +1,14 @@ dart_library.library('dart/_native_typed_data', null, /* Imports */[ "dart/_runtime", - 'dart/core', 'dart/typed_data', + 'dart/core', 'dart/_js_helper', 'dart/collection', 'dart/_internal', 'dart/_interceptors', 'dart/math' ], /* Lazy imports */[ -], function(exports, dart, core, typed_data, _js_helper, collection, _internal, _interceptors, math) { +], function(exports, dart, typed_data, core, _js_helper, collection, _internal, _interceptors, math) { 'use strict'; let dartx = dart.dartx; class NativeByteBuffer extends core.Object {
diff --git a/lib/runtime/dart/async.js b/lib/runtime/dart/async.js index 79f09ce..68192c2 100644 --- a/lib/runtime/dart/async.js +++ b/lib/runtime/dart/async.js
@@ -63,6 +63,10 @@ names: ['_getBestStackTrace'] }); let __CastType0 = dart.typedef('__CastType0', () => dart.functionType(dart.dynamic, [dart.dynamic])); + let _controller = Symbol('_controller'); + let _subscribe = Symbol('_subscribe'); + let _createSubscription = Symbol('_createSubscription'); + let _onListen = Symbol('_onListen'); let _add = Symbol('_add'); let _closeUnchecked = Symbol('_closeUnchecked'); let _addError = Symbol('_addError'); @@ -763,8 +767,6 @@ return Stream; }); let Stream = Stream$(); - let _createSubscription = Symbol('_createSubscription'); - let _onListen = Symbol('_onListen'); let _StreamImpl$ = dart.generic(function(T) { class _StreamImpl extends Stream$(T) { _StreamImpl() { @@ -798,8 +800,6 @@ return _StreamImpl; }); let _StreamImpl = _StreamImpl$(); - let _controller = Symbol('_controller'); - let _subscribe = Symbol('_subscribe'); let _ControllerStream$ = dart.generic(function(T) { class _ControllerStream extends _StreamImpl$(T) { _ControllerStream(controller) { @@ -855,6 +855,18 @@ this[_previous] = null; } } + let _eventState = Symbol('_eventState'); + let _expectsEvent = Symbol('_expectsEvent'); + let _toggleEventId = Symbol('_toggleEventId'); + let _isFiring = Symbol('_isFiring'); + let _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring'); + let _removeAfterFiring = Symbol('_removeAfterFiring'); + let _onPause = Symbol('_onPause'); + let _onResume = Symbol('_onResume'); + let _recordCancel = Symbol('_recordCancel'); + let _onCancel = Symbol('_onCancel'); + let _recordPause = Symbol('_recordPause'); + let _recordResume = Symbol('_recordResume'); let _zone = Symbol('_zone'); let _state = Symbol('_state'); let _onData = Symbol('_onData'); @@ -869,17 +881,14 @@ let _isInputPaused = Symbol('_isInputPaused'); let _inCallback = Symbol('_inCallback'); let _guardCallback = Symbol('_guardCallback'); - let _onPause = Symbol('_onPause'); let _decrementPauseCount = Symbol('_decrementPauseCount'); let _hasPending = Symbol('_hasPending'); let _mayResumeInput = Symbol('_mayResumeInput'); - let _onResume = Symbol('_onResume'); let _cancel = Symbol('_cancel'); let _isClosed = Symbol('_isClosed'); let _waitsForCancel = Symbol('_waitsForCancel'); let _canFire = Symbol('_canFire'); let _cancelOnError = Symbol('_cancelOnError'); - let _onCancel = Symbol('_onCancel'); let _incrementPauseCount = Symbol('_incrementPauseCount'); let _sendData = Symbol('_sendData'); let _addPending = Symbol('_addPending'); @@ -1220,9 +1229,6 @@ return _BufferingStreamSubscription; }); let _BufferingStreamSubscription = _BufferingStreamSubscription$(); - let _recordCancel = Symbol('_recordCancel'); - let _recordPause = Symbol('_recordPause'); - let _recordResume = Symbol('_recordResume'); let _ControllerSubscription$ = dart.generic(function(T) { class _ControllerSubscription extends _BufferingStreamSubscription$(T) { _ControllerSubscription(controller, onData, onError, onDone, cancelOnError) { @@ -1245,12 +1251,6 @@ return _ControllerSubscription; }); let _ControllerSubscription = _ControllerSubscription$(); - let _eventState = Symbol('_eventState'); - let _expectsEvent = Symbol('_expectsEvent'); - let _toggleEventId = Symbol('_toggleEventId'); - let _isFiring = Symbol('_isFiring'); - let _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring'); - let _removeAfterFiring = Symbol('_removeAfterFiring'); let _BroadcastSubscription$ = dart.generic(function(T) { class _BroadcastSubscription extends _ControllerSubscription$(T) { _BroadcastSubscription(controller, onData, onError, onDone, cancelOnError) { @@ -3543,6 +3543,7 @@ return _GeneratedStreamImpl; }); let _GeneratedStreamImpl = _GeneratedStreamImpl$(); + let _iterator = Symbol('_iterator'); let _eventScheduled = Symbol('_eventScheduled'); class _PendingEvents extends core.Object { _PendingEvents() { @@ -3583,7 +3584,6 @@ cancelSchedule: [dart.void, []] }) }); - let _iterator = Symbol('_iterator'); let _IterablePendingEvents$ = dart.generic(function(T) { class _IterablePendingEvents extends _PendingEvents { _IterablePendingEvents(data) { @@ -5133,18 +5133,6 @@ }), names: ['_enter', '_leave'] }); - class _Zone extends core.Object { - _Zone() { - } - inSameErrorZone(otherZone) { - return dart.notNull(core.identical(this, otherZone)) || dart.notNull(core.identical(this.errorZone, otherZone.errorZone)); - } - } - _Zone[dart.implements] = () => [Zone]; - dart.setSignature(_Zone, { - constructors: () => ({_Zone: [_Zone, []]}), - methods: () => ({inSameErrorZone: [core.bool, [Zone]]}) - }); let _run = Symbol('_run'); let _runUnary = Symbol('_runUnary'); let _runBinary = Symbol('_runBinary'); @@ -5160,6 +5148,18 @@ let _handleUncaughtError = Symbol('_handleUncaughtError'); let _map = Symbol('_map'); let _delegate = Symbol('_delegate'); + class _Zone extends core.Object { + _Zone() { + } + inSameErrorZone(otherZone) { + return dart.notNull(core.identical(this, otherZone)) || dart.notNull(core.identical(this.errorZone, otherZone.errorZone)); + } + } + _Zone[dart.implements] = () => [Zone]; + dart.setSignature(_Zone, { + constructors: () => ({_Zone: [_Zone, []]}), + methods: () => ({inSameErrorZone: [core.bool, [Zone]]}) + }); class _RootZone extends _Zone { _RootZone() { super._Zone();
diff --git a/lib/runtime/dart/collection.js b/lib/runtime/dart/collection.js index a10566c..c581df2 100644 --- a/lib/runtime/dart/collection.js +++ b/lib/runtime/dart/collection.js
@@ -113,11 +113,9 @@ return HashMap; }); let HashMap = HashMap$(); + let _newSet = Symbol('_newSet'); let SetMixin$ = dart.generic(function(E) { class SetMixin extends core.Object { - [Symbol.iterator]() { - return new dart.JsIterator(this.iterator); - } get isEmpty() { return this.length == 0; } @@ -381,6 +379,9 @@ } dart.throw(core.RangeError.index(index, this, "index", null, elementIndex)); } + [Symbol.iterator]() { + return new dart.JsIterator(this.iterator); + } } SetMixin[dart.implements] = () => [core.Set$(E)]; dart.setSignature(SetMixin, { @@ -456,7 +457,6 @@ return SetBase; }); let SetBase = SetBase$(); - let _newSet = Symbol('_newSet'); let _HashSetBase$ = dart.generic(function(E) { class _HashSetBase extends SetBase$(E) { difference(other) { @@ -1624,9 +1624,6 @@ get iterator() { return new (_internal.ListIterator$(E))(this); } - [Symbol.iterator]() { - return new dart.JsIterator(this.iterator); - } elementAt(index) { return this.get(index); } @@ -2101,6 +2098,9 @@ toString() { return IterableBase.iterableToFullString(this, '[', ']'); } + [Symbol.iterator]() { + return new dart.JsIterator(this.iterator); + } } ListMixin[dart.implements] = () => [core.List$(E)]; dart.setSignature(ListMixin, {
diff --git a/lib/runtime/dart/convert.js b/lib/runtime/dart/convert.js index b88f897..659e532 100644 --- a/lib/runtime/dart/convert.js +++ b/lib/runtime/dart/convert.js
@@ -9,6 +9,7 @@ ], function(exports, dart, core, async, typed_data, _internal, collection) { 'use strict'; let dartx = dart.dartx; + let _allowInvalid = Symbol('_allowInvalid'); let Codec$ = dart.generic(function(S, T) { class Codec extends core.Object { Codec() { @@ -63,7 +64,6 @@ statics: () => ({getByName: [Encoding, [core.String]]}), names: ['getByName'] }); - let _allowInvalid = Symbol('_allowInvalid'); class AsciiCodec extends Encoding { AsciiCodec(opts) { let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false; @@ -96,6 +96,7 @@ }); let ASCII = dart.const(new AsciiCodec()); let _ASCII_MASK = 127; + let _subsetMask = Symbol('_subsetMask'); let Converter$ = dart.generic(function(S, T) { class Converter extends core.Object { Converter() { @@ -125,7 +126,6 @@ return Converter; }); let Converter = Converter$(); - let _subsetMask = Symbol('_subsetMask'); class _UnicodeSubsetEncoder extends Converter$(core.String, core.List$(core.int)) { _UnicodeSubsetEncoder(subsetMask) { this[_subsetMask] = subsetMask; @@ -177,6 +177,7 @@ dart.setSignature(AsciiEncoder, { constructors: () => ({AsciiEncoder: [AsciiEncoder, []]}) }); + let _sink = Symbol('_sink'); class StringConversionSinkMixin extends core.Object { add(str) { return this.addSlice(str, 0, str[dartx.length], false); @@ -197,7 +198,6 @@ }) }); class StringConversionSinkBase extends StringConversionSinkMixin {} - let _sink = Symbol('_sink'); class _UnicodeSubsetEncoderSink extends StringConversionSinkBase { _UnicodeSubsetEncoderSink(subsetMask, sink) { this[_subsetMask] = subsetMask; @@ -300,6 +300,7 @@ constructors: () => ({AsciiDecoder: [AsciiDecoder, [], {allowInvalid: core.bool}]}), methods: () => ({startChunkedConversion: [ByteConversionSink, [core.Sink$(core.String)]]}) }); + let _utf8Sink = Symbol('_utf8Sink'); let ChunkedConversionSink$ = dart.generic(function(T) { class ChunkedConversionSink extends core.Object { ChunkedConversionSink() { @@ -349,7 +350,6 @@ dart.setSignature(ByteConversionSinkBase, { methods: () => ({addSlice: [dart.void, [core.List$(core.int), core.int, core.int, core.bool]]}) }); - let _utf8Sink = Symbol('_utf8Sink'); class _ErrorHandlingAsciiDecoderSink extends ByteConversionSinkBase { _ErrorHandlingAsciiDecoderSink(utf8Sink) { this[_utf8Sink] = utf8Sink;
diff --git a/lib/runtime/dart/core.js b/lib/runtime/dart/core.js index d46c142..b270b32 100644 --- a/lib/runtime/dart/core.js +++ b/lib/runtime/dart/core.js
@@ -1272,9 +1272,6 @@ return new (_internal.EmptyIterable$(E))(); return new (exports._GeneratorIterable$(E))(count, generator); } - [dart.JsSymbol.iterator]() { - return new dart.JsIterator(this[dartx.iterator]); - } [dartx.join](separator) { if (separator === void 0) separator = ""; @@ -1282,6 +1279,9 @@ buffer.writeAll(this, separator); return dart.toString(buffer); } + [dart.JsSymbol.iterator]() { + return new dart.JsIterator(this[dartx.iterator]); + } } dart.setSignature(Iterable, { constructors: () => ({
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart index 0c46fb0..34139dd 100644 --- a/lib/src/codegen/js_codegen.dart +++ b/lib/src/codegen/js_codegen.dart
@@ -50,6 +50,54 @@ const DCALL = 'dcall'; const DSEND = 'dsend'; +/// Type for builder of statements that need to refer to a companion class. +/// [classRef] will either be a simple identifier or a qualified one, depending +/// on the context in which the class is emitted (generics or not, exported or +/// not...). +typedef JS.Statement _ClassRefStatementBuilder(JS.Expression classRef); + +/// Helper class used to build class declarations. +class _ClassBuilder { + final _ClassInfo info; + + /// Statements that should appear before the class declaration. + final List<JS.Statement> prelude = []; + /// Members of the class declaration. + final List<JS.Method> body = []; + /// Builders for statements that should appear just after the class + /// declaration. These builders will get a local or qualified reference to the + /// class as argument so they can refer to it if they so wish. + /// + /// Note that these statements may be wrapped in generic or lazy classes + /// definitions, so they might not be top-level. + final List<_ClassRefStatementBuilder> statements = []; + /// Statements for extension classes are treated separately, as they need to + /// be at the top-level. + final List<JS.Statement> topLevelStatements = []; + + _ClassBuilder(this.info); +} + +/// Class info helper that provides member declarations. +class _ClassInfo { + final ClassElement element; + final ClassDeclaration declaration; + final String jsPeerName; + final List<ConstructorDeclaration> ctors = []; + final List<FieldDeclaration> instanceFields = []; + final List<MethodDeclaration> methods = []; + + _ClassInfo(this.element, [this.declaration, this.jsPeerName]) { + if (declaration != null) { + for (var m in declaration.members) { + if (m is ConstructorDeclaration) ctors.add(m); + else if (m is FieldDeclaration && !m.isStatic) instanceFields.add(m); + else if (m is MethodDeclaration) methods.add(m); + } + } + } +} + class JSCodegenVisitor extends GeneralizingAstVisitor with ClosureAnnotator { final AbstractCompiler compiler; final CodegenOptions options; @@ -87,8 +135,8 @@ /// The name for the library's exports inside itself. /// `exports` was chosen as the most similar to ES module patterns. + final _exportsVar = new JS.Identifier('exports'); final _dartxVar = new JS.Identifier('dartx'); - final _exportsVar = new JS.TemporaryId('exports'); final _runtimeLibVar = new JS.Identifier('dart'); final _namedArgTemp = new JS.TemporaryId('opts'); @@ -121,6 +169,17 @@ _objectMembers = getObjectMemberMap(types); } + /// Whether to always refer to current library's exported types as if they + /// were external types (i.e. within library 'foo', refer to local class 'Bar' + /// as 'foo.Bar'). This helps compile the 'core' library with Closure, as it + /// defines classes such as 'Object' or 'Error' that conflict with their JS + /// homonyms. + bool get _qualifyExports => options.closure; + + /// Whether class parent needs to be a qualified identifier + /// (as opposed to an expression such as `dart.mixin(...)`). + bool get _needsQualifiedHeritage => options.closure; + TypeProvider get types => rules.provider; JS.Program emitLibrary(LibraryUnit library) { @@ -365,15 +424,16 @@ var type = element.type; var name = element.name; - var fnType = annotateTypeDef( - js.statement('let # = dart.typedef(#, () => #);', [ - name, - js.string(name, "'"), - _emitTypeName(type, lowerTypedef: true) - ]), + return annotateTypeDef( + _finishType(type, ({bool isExportable}) { + return _emitDecl(name, + js.call('dart.typedef(#, () => #)', [ + js.string(name, "'"), + _emitTypeName(type, lowerTypedef: true) + ]), + isExportable: isExportable); + }), node.element); - - return _finishClassDef(type, fnType); } @override @@ -384,7 +444,7 @@ var element = node.element; // Forward all generative constructors from the base class. - var body = <JS.Method>[]; + var builder = new _ClassBuilder(new _ClassInfo(element)); var supertype = element.supertype; if (!supertype.isObject) { @@ -392,14 +452,11 @@ var parentCtor = supertype.lookUpConstructor(ctor.name, ctor.library); var fun = js.call('function() { super.#(...arguments); }', [_constructorName(parentCtor)]) as JS.Fun; - body.add(new JS.Method(_constructorName(ctor), fun)); + builder.body.add(new JS.Method(_constructorName(ctor), fun)); } } - var classDecl = new JS.ClassDeclaration(new JS.ClassExpression( - new JS.Identifier(element.name), _classHeritage(element), body)); - - return _finishClassDef(element.type, classDecl); + return _finishClass(builder); } JS.Statement _emitJsType(String dartClassName, DartObject jsName) { @@ -411,65 +468,118 @@ // `dom.InputElement` to actually be HTMLInputElement. // TODO(jmesserly): if we had the JsName on the Element, we could just // generate it correctly when we refer to it. - if (isPublic(dartClassName)) _addExport(dartClassName); - return js.statement('let # = #;', [dartClassName, jsTypeName]); + return _emitDecl(dartClassName, new JS.Identifier(jsTypeName)); } return null; } + /// Emit declaration, exporting it if [isExportable] and if the name is + /// public. + JS.Statement _emitDecl(String name, JS.Expression expr, + {bool isExportable: true}) { + var shouldExport = isExportable && isPublic(name); + if (shouldExport && _qualifyExports) { + return js.statement('#.# = #;', [_exportsVar, name, expr]); + } else { + if (shouldExport) _addExport(name); + + if (expr is JS.ClassExpression) { + return new JS.ClassDeclaration(expr); + } else { + return js.statement('let # = #;', [name, expr]); + } + } + } + @override JS.Statement visitClassDeclaration(ClassDeclaration node) { var classElem = node.element; - var type = classElem.type; + var classType = classElem.type; var jsName = findAnnotation(classElem, isJsNameAnnotation); - if (jsName != null) return _emitJsType(node.name.name, jsName); - var ctors = <ConstructorDeclaration>[]; - var fields = <FieldDeclaration>[]; - var methods = <MethodDeclaration>[]; + var info = new _ClassInfo(classElem, node, _getJsPeerName(classElem)); + var builder = new _ClassBuilder(info); + + _addClassJsPeerSetup(builder); + _addClassInterfaces(builder); + + // Iff no constructor is specified for a class C, it implicitly has a + // default constructor `C() : super() {}`, unless C is class Object. + if (info.ctors.isEmpty && !classType.isObject) { + builder.body.add(_emitImplicitConstructor(node, info.instanceFields)); + } + for (var member in node.members) { if (member is ConstructorDeclaration) { - ctors.add(member); + builder.body.add(_emitConstructor( + member, classType, info.instanceFields, classType.isObject)); + // Named constructors + if (member.name != null && member.factoryKeyword == null) { + builder.statements.add((classRef) => + js.statement('dart.defineNamedConstructor(#, #);', [ + classRef, + _emitMemberName(member.name.name, isStatic: true) + ])); + } } else if (member is FieldDeclaration && !member.isStatic) { - fields.add(member); + /// Instance fields, if they override getter/setter pairs + for (VariableDeclaration fieldDecl in member.fields.variables) { + var field = fieldDecl.element as FieldElement; + if (_fieldsNeedingStorage.contains(field)) { + builder.statements.add((classRef) => + js.statement('dart.virtualField(#, #)', + [classRef, _emitMemberName(field.name, type: classType)])); + } + } } else if (member is MethodDeclaration) { - methods.add(member); + builder.body.add(_emitMethodDeclaration(classType, member)); } } - var classExpr = new JS.ClassExpression(new JS.Identifier(type.name), - _classHeritage(classElem), _emitClassMethods(node, ctors, fields)); + _addClassExtensionNames(builder); + _addClassIterableSupport(builder); + _addClassMemberSignatures(builder); + _addClassMetadata(builder); - String jsPeerName; - var jsPeer = findAnnotation(classElem, isJsPeerInterface); - if (jsPeer != null) { - jsPeerName = - getConstantField(jsPeer, 'name', types.stringType)?.toStringValue(); + return _finishClass(builder); + } + + void _addClassExtensionNames(_ClassBuilder builder) { + var classElem = builder.info.element; + if (!_extensionTypes.contains(classElem)) return; + + var dartxNames = <JS.Expression>[]; + for (MethodDeclaration m in builder.info.methods) { + if (!m.isAbstract && !m.isStatic && m.element.isPublic) { + dartxNames.add(_elementMemberName(m.element, allowExtensions: false)); + } } - var body = _finishClassMembers(classElem, classExpr, ctors, fields, methods, - node.metadata, jsPeerName); - - var result = _finishClassDef(type, body); - - if (jsPeerName != null) { - // This class isn't allowed to be lazy, because we need to set up - // the native JS type eagerly at this point. - // If we wanted to support laziness, we could defer the hookup until - // the end of the Dart library cycle load. - assert(_loader.isLoaded(classElem)); - - // TODO(jmesserly): this copies the dynamic members. - // Probably fine for objects coming from JS, but not if we actually - // want to support construction of instances with generic types other - // than dynamic. See issue #154 for Array and List<E> related bug. - var copyMembers = js.statement( - 'dart.registerExtension(dart.global.#, #);', - [_propertyName(jsPeerName), classElem.name]); - return _statement([result, copyMembers]); + if (dartxNames.isNotEmpty) { + builder.prelude.add(js.statement('dart.defineExtensionNames(#)', + [new JS.ArrayInitializer(dartxNames, multiline: true)])); } - return result; + } + + void _addClassIterableSupport(_ClassBuilder builder) { + if (builder.info.jsPeerName != null) return; + + var classType = builder.info.element.type; + bool hasIteratorMethod = builder.info.methods + .any((m) => m.isGetter && m.name.name == 'iterator'); + + // If the type doesn't have an `iterator`, but claims to implement Iterable, + // we inject the adaptor method here, as it's less code size to put the + // helper on a parent class. This pattern is common in the core libraries + // (e.g. IterableMixin<E> and IterableBase<E>). + // + // (We could do this same optimization for any interface with an `iterator` + // method, but that's more expensive to check for, so it doesn't seem worth + // it. The above case for an explicit `iterator` method will catch those.) + if (hasIteratorMethod || _implementsIterable(classType)) { + builder.body.add(_emitIterable(classType)); + } } @override @@ -519,51 +629,95 @@ return _statement(result); } - /// Given a class element and body, complete the class declaration. - /// This handles generic type parameters, laziness (in library-cycle cases), - /// and ensuring dependencies are loaded first. - JS.Statement _finishClassDef(ParameterizedType type, JS.Statement body) { - var name = type.name; - var genericName = '$name\$'; + static bool _isQualifiedName(JS.Expression expr) => + expr is JS.Identifier + || (expr is JS.PropertyAccess + && expr.selector is JS.LiteralString + && _isQualifiedName(expr.receiver)); - JS.Statement genericDef = null; - if (type.typeParameters.isNotEmpty) { - genericDef = _emitGenericClassDef(type, body); + /// Builds the class. + JS.Statement _finishClass(_ClassBuilder builder) { + var element = builder.info.element; + var name = element.name; + + var heritage = _classHeritage(element); + /// Closure expects qualified identifiers for superclasses. + if (_needsQualifiedHeritage && !_isQualifiedName(heritage)) { + var alias = new JS.TemporaryId("$name\$super"); + builder.prelude.add(js.statement('let # = #', [alias, heritage])); + heritage = alias; } - // The base class and all mixins must be declared before this class. - if (!_loader.isLoaded(type.element)) { - // TODO(jmesserly): the lazy class def is a simple solution for now. - // We may want to consider other options in the future. + var classExpr = new JS.ClassExpression( + new JS.Identifier(name), + heritage, + builder.body.where((m) => m != null).toList(growable: false)); + var result = _finishType(element.type, ({bool isExportable}) { + var classRef = isExportable + ? _maybeQualifiedLocalType(element) + : new JS.Identifier(name); - if (genericDef != null) { - return js.statement( - '{ #; dart.defineLazyClassGeneric(#, #, { get: # }); }', - [genericDef, _exportsVar, _propertyName(name), genericName]); - } - - return js.statement( - 'dart.defineLazyClass(#, { get #() { #; return #; } });', - [_exportsVar, _propertyName(name), body, name]); - } - - if (isPublic(name)) _addExport(name); - - if (genericDef != null) { - var dynType = fillDynamicTypeArgs(type, types); - var genericInst = _emitTypeName(dynType, lowerGeneric: true); - return js.statement('{ #; let # = #; }', [genericDef, name, genericInst]); - } - return body; + return _statement([] + ..addAll(builder.prelude) + ..add(_emitDecl(name, classExpr, isExportable: isExportable)) + ..addAll(builder.statements.map((statementBuilder) { + return statementBuilder(classRef); + }))); + }); + return _statement([result]..addAll(builder.topLevelStatements)); } - JS.Statement _emitGenericClassDef(ParameterizedType type, JS.Statement body) { + /// Given a class definition statement factory, completes its declaration. + /// This handles generic type parameters, laziness (in library-cycle cases), + /// and ensuring dependencies are loaded first. + JS.Statement _finishType(ParameterizedType type, + JS.Statement getStatement({bool isExportable})) { + // The base class and all mixins must be declared before this class. + // TODO(jmesserly): the lazy class def is a simple solution for now. + // We may want to consider other options in the future. + bool isLoaded = _loader.isLoaded(type.element); var name = type.name; - var genericName = '$name\$'; - var typeParams = type.typeParameters.map((p) => p.name); - if (isPublic(name)) _exports.add(genericName); - return js.statement('let # = dart.generic(function(#) { #; return #; });', - [genericName, typeParams, body, name]); + + if (type.typeParameters.isEmpty) { + if (isLoaded) { + return getStatement(isExportable: true); + } else { + return js.statement( + 'dart.defineLazyClass(#, { get #() { #; return #; } });', [ + _exportsVar, + _propertyName(name), + getStatement(isExportable: false), + name + ]); + } + } else { + var genericName = '$name\$'; + var genericDef = _emitDecl( + genericName, + js.call('dart.generic(function(#) { #; return #; })', [ + type.typeParameters.map((p) => p.name), + getStatement(isExportable: false), + name + ]), + isExportable: true); + + if (isLoaded) { + var genericInst = _emitTypeName( + fillDynamicTypeArgs(type, types), lowerGeneric: true); + return js.statement('{ #; #; }', [ + genericDef, + _emitDecl(name, genericInst) + ]); + } else { + return js.statement( + '{ #; dart.defineLazyClassGeneric(#, #, { get: # }); }', [ + genericDef, + _exportsVar, + _propertyName(name), + _maybeQualifiedLocalType(type.element, genericName) + ]); + } + } } JS.Expression _classHeritage(ClassElement element) { @@ -584,50 +738,6 @@ return heritage; } - List<JS.Method> _emitClassMethods(ClassDeclaration node, - List<ConstructorDeclaration> ctors, List<FieldDeclaration> fields) { - var element = node.element; - var type = element.type; - var isObject = type.isObject; - - // Iff no constructor is specified for a class C, it implicitly has a - // default constructor `C() : super() {}`, unless C is class Object. - var jsMethods = <JS.Method>[]; - if (ctors.isEmpty && !isObject) { - jsMethods.add(_emitImplicitConstructor(node, fields)); - } - - bool hasJsPeer = findAnnotation(element, isJsPeerInterface) != null; - - bool hasIterator = false; - for (var m in node.members) { - if (m is ConstructorDeclaration) { - jsMethods.add(_emitConstructor(m, type, fields, isObject)); - } else if (m is MethodDeclaration) { - jsMethods.add(_emitMethodDeclaration(type, m)); - - if (!hasJsPeer && m.isGetter && m.name.name == 'iterator') { - hasIterator = true; - jsMethods.add(_emitIterable(type)); - } - } - } - - // If the type doesn't have an `iterator`, but claims to implement Iterable, - // we inject the adaptor method here, as it's less code size to put the - // helper on a parent class. This pattern is common in the core libraries - // (e.g. IterableMixin<E> and IterableBase<E>). - // - // (We could do this same optimization for any interface with an `iterator` - // method, but that's more expensive to check for, so it doesn't seem worth - // it. The above case for an explicit `iterator` method will catch those.) - if (!hasJsPeer && !hasIterator && _implementsIterable(type)) { - jsMethods.add(_emitIterable(type)); - } - - return jsMethods.where((m) => m != null).toList(growable: false); - } - bool _implementsIterable(InterfaceType t) => t.interfaces.any((i) => i.element.type == types.iterableType); @@ -666,67 +776,63 @@ } } - /// Emit class members that need to come after the class declaration, such - /// as static fields. See [_emitClassMethods] for things that are emitted - /// inside the ES6 `class { ... }` node. - JS.Statement _finishClassMembers( - ClassElement classElem, - JS.ClassExpression cls, - List<ConstructorDeclaration> ctors, - List<FieldDeclaration> fields, - List<MethodDeclaration> methods, - List<Annotation> metadata, - String jsPeerName) { - var name = classElem.name; - var body = <JS.Statement>[]; + String _getJsPeerName(ClassElement classElem) { + var jsPeer = findAnnotation(classElem, isJsPeerInterface); + return jsPeer == null ? null + : getConstantField(jsPeer, 'name', types.stringType) as String; + } - if (_extensionTypes.contains(classElem)) { - var dartxNames = <JS.Expression>[]; - for (var m in methods) { - if (!m.isAbstract && !m.isStatic && m.element.isPublic) { - dartxNames.add(_elementMemberName(m.element, allowExtensions: false)); - } - } - if (dartxNames.isNotEmpty) { - body.add(js.statement('dart.defineExtensionNames(#)', - [new JS.ArrayInitializer(dartxNames, multiline: true)])); - } - } + void _addClassJsPeerSetup(_ClassBuilder builder) { + var jsPeerName = builder.info.jsPeerName; + if (jsPeerName == null) return; - body.add(new JS.ClassDeclaration(cls)); + ClassElement classElem = builder.info.element; // TODO(jmesserly): we should really just extend native Array. - if (jsPeerName != null && classElem.typeParameters.isNotEmpty) { - body.add(js.statement('dart.setBaseClass(#, dart.global.#);', - [classElem.name, _propertyName(jsPeerName)])); + if (classElem.typeParameters.isNotEmpty) { + builder.statements.add((classRef) => + js.statement('dart.setBaseClass(#, dart.global.#);', + [classRef, _propertyName(jsPeerName)])); } - // Interfaces + // This class isn't allowed to be lazy, because we need to set up + // the native JS type eagerly at this point. + // If we wanted to support laziness, we could defer the hookup until + // the end of the Dart library cycle load. + assert(_loader.isLoaded(classElem)); + + // TODO(jmesserly): this copies the dynamic members. + // Probably fine for objects coming from JS, but not if we actually + // want to support construction of instances with generic types other + // than dynamic. See issue #154 for Array and List<E> related bug. + builder.topLevelStatements.add( + js.statement( + 'dart.registerExtension(dart.global.#, #);', [ + _propertyName(jsPeerName), + classElem.name + ])); + } + void _addClassInterfaces(_ClassBuilder builder) { + ClassElement classElem = builder.info.element; if (classElem.interfaces.isNotEmpty) { - body.add(js.statement('#[dart.implements] = () => #;', [ - name, - new JS.ArrayInitializer(new List<JS.Expression>.from( - classElem.interfaces.map(_emitTypeName))) - ])); + builder.statements.add((classRef) => + js.statement('#[dart.implements] = () => #;', [ + classRef, + new JS.ArrayInitializer(new List<JS.Expression>.from( + classElem.interfaces.map(_emitTypeName))) + ])); } + } - // Named constructors - for (ConstructorDeclaration member in ctors) { - if (member.name != null && member.factoryKeyword == null) { - body.add(js.statement('dart.defineNamedConstructor(#, #);', - [name, _emitMemberName(member.name.name, isStatic: true)])); - } - } + /// Emit statements for members that need to come after the class declaration, + /// such as static fields. See [_emitClassMethods] for things that are emitted + /// inside the ES6 `class { ... }` node. + void _addClassMemberSignatures(_ClassBuilder builder) { - // Instance fields, if they override getter/setter pairs - for (FieldDeclaration member in fields) { - for (VariableDeclaration fieldDecl in member.fields.variables) { - var field = fieldDecl.element as FieldElement; - if (_fieldsNeedingStorage.contains(field)) { - body.add(_overrideField(field)); - } - } - } + var ctors = builder.info.ctors; + var methods = builder.info.methods; + + ClassElement classElem = builder.info.element; // Emit the signature on the class recording the runtime type information { @@ -782,8 +888,8 @@ } if (!sigFields.isEmpty) { var sig = new JS.ObjectInitializer(sigFields); - var classExpr = new JS.Identifier(name); - body.add(js.statement('dart.setSignature(#, #);', [classExpr, sig])); + builder.statements.add((classRef) => + js.statement('dart.setSignature(#, #);', [classRef, sig])); } } @@ -795,23 +901,27 @@ for (var e in extensions) { methodNames.add(_elementMemberName(e)); } - body.add(js.statement('dart.defineExtensionMembers(#, #);', [ - name, - new JS.ArrayInitializer(methodNames, multiline: methodNames.length > 4) - ])); + builder.statements.add((classRef) => + js.statement('dart.defineExtensionMembers(#, #);', [ + classRef, + new JS.ArrayInitializer(methodNames, + multiline: methodNames.length > 4) + ])); } + } + void _addClassMetadata(_ClassBuilder builder) { + var metadata = builder.info.declaration?.metadata ?? const []; // TODO(vsm): Make this optional per #268. // Metadata if (metadata.isNotEmpty) { - body.add(js.statement('#[dart.metadata] = () => #;', [ - name, - new JS.ArrayInitializer( - new List<JS.Expression>.from(metadata.map(_instantiateAnnotation))) - ])); + builder.statements.add((classRef) => + js.statement('#[dart.metadata] = () => #;', [ + classRef, + new JS.ArrayInitializer( + new List<JS.Expression>.from(metadata.map(_instantiateAnnotation))) + ])); } - - return _statement(body); } List<ExecutableElement> _extensionsToImplement(ClassElement element) { @@ -856,12 +966,6 @@ _collectExtensions(type.superclass, types); } - JS.Statement _overrideField(FieldElement e) { - var cls = e.enclosingElement; - return js.statement('dart.virtualField(#, #)', - [cls.name, _emitMemberName(e.name, type: cls.type)]); - } - /// Generates the implicit default constructor for class C of the form /// `C() : super() {}`. JS.Method _emitImplicitConstructor( @@ -1071,7 +1175,7 @@ /// 3. constructor field initializers, /// 4. initialize fields not covered in 1-3 JS.Statement _initializeFields( - ClassDeclaration cls, List<FieldDeclaration> fieldDecls, + ClassDeclaration cls, Iterable<FieldDeclaration> fieldDecls, [ConstructorDeclaration ctor]) { var unit = cls.getAncestor((a) => a is CompilationUnit) as CompilationUnit; var constField = new ConstFieldVisitor(types, unit); @@ -1638,15 +1742,26 @@ return _maybeQualifiedName(element); } + JS.Expression _maybeQualifiedLocalType(Element e, [String name]) { + name ??= e.name; + return isPublic(name) && _qualifyExports + ? _maybeQualifiedName(e, name) + : new JS.Identifier(name); + } + JS.Expression _maybeQualifiedName(Element e, [String name]) { var libName = _libraryName(e.library); var nameExpr = _propertyName(name ?? e.name); + // bool isPrivate = name is JS.LiteralString + // && !isPublic(name.valueWithoutQuotes); + // Always qualify: // * mutable top-level fields // * elements from other libraries bool mutableTopLevel = e is TopLevelVariableElement && !e.isConst; bool fromAnotherLibrary = e.library != currentLibrary; + if (mutableTopLevel || fromAnotherLibrary) { return new JS.PropertyAccess(libName, nameExpr); } @@ -1654,6 +1769,23 @@ var id = new JS.MaybeQualifiedId(libName, nameExpr); _qualifiedIds.add(new Tuple2(e, id)); return id; + + // if (name is JS.LiteralString + // && !fromAnotherLibrary + // && !mutableTopLevel + // && (isPrivate || !_qualifyExports)) { + // return new JS.Identifier(name.valueWithoutQuotes); + // } + // var libName = _libraryName(e.library); + + // if (!isCurrentLibrary + // || _qualifyExports && !isPrivate + // || mutableTopLevel) { + // return new JS.PropertyAccess(libName, name); + // } + + // return (idTable ?? _qualifiedIds) + // .putIfAbsent(e, () => new JS.MaybeQualifiedId(libName, name)); } @override @@ -2078,7 +2210,7 @@ JS.Expression objExpr = _exportsVar; var target = _lazyFields[0].element.enclosingElement; if (target is ClassElement) { - objExpr = new JS.Identifier(target.type.name); + objExpr = _maybeQualifiedLocalType(target); } return js.statement(
diff --git a/test/codegen/closure.dart b/test/codegen/closure.dart index d40e8a7..dea593d 100644 --- a/test/codegen/closure.dart +++ b/test/codegen/closure.dart
@@ -15,7 +15,7 @@ factory Foo.build() => new Foo(1, null); untyped_method(a, b) {} - + T pass(T t) => t; String typed_method( @@ -52,8 +52,10 @@ Baz(int i) : super(i, 123); } +class _Bam<M> {} + void main(args) {} const String some_top_level_constant = "abc"; final String some_top_level_final = "abc"; -String some_top_level_var = "abc"; \ No newline at end of file +String some_top_level_var = "abc";
diff --git a/test/codegen/expect/closure.js b/test/codegen/expect/closure.js index d89bed7..2886527 100644 --- a/test/codegen/expect/closure.js +++ b/test/codegen/expect/closure.js
@@ -7,8 +7,8 @@ 'use strict'; let dartx = dart.dartx; /** @typedef {function({i: (?number|undefined)}=)} */ - let Callback = dart.typedef('Callback', () => dart.functionType(dart.void, [], {i: core.int})); - let Foo$ = dart.generic(function(T) { + exports.Callback = dart.typedef('Callback', () => dart.functionType(dart.void, [], {i: core.int})); + exports.Foo$ = dart.generic(function(T) { class Foo extends core.Object { /** * @param {?number} i @@ -111,23 +111,29 @@ }); return Foo; }); - let Foo = Foo$(); + exports.Foo = Foo$(); /** @final {string} */ Foo.some_static_constant = "abc"; /** @final {string} */ Foo.some_static_final = "abc"; /** @type {string} */ Foo.some_static_var = "abc"; - class Bar extends core.Object {} - class Baz extends dart.mixin(Foo$(core.int), Bar) { + exports.Bar = class Bar extends core.Object {}; + let Baz$super = dart.mixin(Foo$(core.int), Bar); + exports.Baz = class Baz extends Baz$super { /** @param {?number} i */ Baz(i) { super.Foo(i, 123); } - } + }; dart.setSignature(Baz, { constructors: () => ({Baz: [Baz, [core.int]]}) }); + let _Bam$ = dart.generic(function(M) { + class _Bam extends core.Object {} + return _Bam; + }); + let _Bam = _Bam$(); /** @param {?} args */ function main(args) { } @@ -139,11 +145,6 @@ /** @type {string} */ exports.some_top_level_var = "abc"; // Exports: - exports.Callback = Callback; - exports.Foo$ = Foo$; - exports.Foo = Foo; - exports.Bar = Bar; - exports.Baz = Baz; exports.main = main; exports.some_top_level_constant = some_top_level_constant; });
diff --git a/test/codegen/expect/collection/equality.txt b/test/codegen/expect/collection/equality.txt index a7e3f2f..85c9652 100644 --- a/test/codegen/expect/collection/equality.txt +++ b/test/codegen/expect/collection/equality.txt
@@ -8,3 +8,5 @@ severe: [StaticTypeError] Type check failed: const DefaultEquality() (DefaultEquality) is not of type Equality<V> (package:collection/equality.dart, line 264, col 44) warning: [DownCastComposite] it1.current (dynamic) will need runtime check to cast to type E (package:collection/equality.dart, line 87, col 36) warning: [DownCastComposite] it2.current (dynamic) will need runtime check to cast to type E (package:collection/equality.dart, line 87, col 49) +warning: [DownCastComposite] e (dynamic) will need runtime check to cast to type E (package:collection/equality.dart, line 171, col 14) +warning: [DownCastComposite] e (dynamic) will need runtime check to cast to type E (package:collection/equality.dart, line 177, col 14)
diff --git a/test/codegen/expect/collection/iterable_zip.js b/test/codegen/expect/collection/iterable_zip.js index f6500b0..aa68cef 100644 --- a/test/codegen/expect/collection/iterable_zip.js +++ b/test/codegen/expect/collection/iterable_zip.js
@@ -1,9 +1,9 @@ dart_library.library('collection/iterable_zip', null, /* Imports */[ "dart/_runtime", - 'dart/collection', - 'dart/core' + 'dart/core', + 'dart/collection' ], /* Lazy imports */[ -], function(exports, dart, collection, core) { +], function(exports, dart, core, collection) { 'use strict'; let dartx = dart.dartx; let _iterables = Symbol('_iterables');
diff --git a/test/codegen/expect/collection/src/queue_list.txt b/test/codegen/expect/collection/src/queue_list.txt index 675bafd..0d1232c 100644 --- a/test/codegen/expect/collection/src/queue_list.txt +++ b/test/codegen/expect/collection/src/queue_list.txt
@@ -1,7 +1,5 @@ // Messages from compiling queue_list.dart -warning: [DownCastComposite] source (Iterable<E>) will need runtime check to cast to type List<dynamic> (package:collection/src/queue_list.dart, line 44, col 25) warning: [DownCastComposite] sourceList (List<dynamic>) will need runtime check to cast to type Iterable<E> (package:collection/src/queue_list.dart, line 45, col 40) -warning: [DownCastComposite] elements (Iterable<E>) will need runtime check to cast to type List<dynamic> (package:collection/src/queue_list.dart, line 61, col 19) warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (package:collection/src/queue_list.dart, line 67, col 52) warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (package:collection/src/queue_list.dart, line 73, col 52) warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (package:collection/src/queue_list.dart, line 77, col 52)
diff --git a/test/codegen/expect/collection/wrappers.txt b/test/codegen/expect/collection/wrappers.txt index 41532dd..4f222ca 100644 --- a/test/codegen/expect/collection/wrappers.txt +++ b/test/codegen/expect/collection/wrappers.txt
@@ -1,4 +1,16 @@ // Messages from compiling wrappers.dart +severe: [AnalyzerMessage] Missing concrete implementation of 'Set.lookup' (package:collection/src/unmodifiable_wrappers.dart, line 132, col 7) +severe: [InvalidMethodOverride] Mixin introduces an invalid override. The type of UnmodifiableMapMixin.remove ((K) → V) is not a subtype of DelegatingMap<K, V>.remove ((Object) → V). (package:collection/src/unmodifiable_wrappers.dart, line 205, col 38) +severe: [InvalidMethodOverride] Invalid override. The type of UnmodifiableMapMixin.remove ((K) → V) is not a subtype of Map<K, V>.remove ((Object) → V). (package:collection/src/unmodifiable_wrappers.dart, line 240, col 3) +severe: [InvalidMethodOverride] Invalid override. The type of DelegatingSet.lookup ((E) → E) is not a subtype of Set<E>.lookup ((Object) → E). (package:collection/wrappers.dart, line 237, col 3) +severe: [InvalidMethodOverride] Invalid override. The type of MapValueSet.lookup ((V) → V) is not a subtype of Set<V>.lookup ((Object) → V). (package:collection/wrappers.dart, line 521, col 3) +warning: [DownCastComposite] _throw() (dynamic) will need runtime check to cast to type E (package:collection/src/unmodifiable_wrappers.dart, line 84, col 28) +warning: [DownCastComposite] _throw() (dynamic) will need runtime check to cast to type E (package:collection/src/unmodifiable_wrappers.dart, line 90, col 21) +warning: [DownCastComposite] _throw() (dynamic) will need runtime check to cast to type V (package:collection/src/unmodifiable_wrappers.dart, line 228, col 41) +warning: [DownCastComposite] _throw() (dynamic) will need runtime check to cast to type V (package:collection/src/unmodifiable_wrappers.dart, line 240, col 22) +warning: [DownCastComposite] _base (Iterable<E>) will need runtime check to cast to type List<E> (package:collection/wrappers.dart, line 120, col 28) +warning: [DownCastComposite] _base (Iterable<E>) will need runtime check to cast to type Set<E> (package:collection/wrappers.dart, line 219, col 26) +warning: [DownCastComposite] _base (Iterable<E>) will need runtime check to cast to type Queue<E> (package:collection/wrappers.dart, line 272, col 30) warning: [DownCastComposite] _keyForValue(value) (dynamic) will need runtime check to cast to type K (package:collection/wrappers.dart, line 483, col 13) warning: [UninferredClosure] () {result = true; return value;} (() → dynamic) will need runtime check to cast to type () → V (package:collection/wrappers.dart, line 485, col 31) warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type V (package:collection/wrappers.dart, line 536, col 16)
diff --git a/test/codegen/expect/js_test.txt b/test/codegen/expect/js_test.txt index 87f21ba..e8f7fb2 100644 --- a/test/codegen/expect/js_test.txt +++ b/test/codegen/expect/js_test.txt
@@ -320,3 +320,5 @@ severe: [AnalyzerMessage] Undefined name 'document' (test/codegen/js_test.dart, line 694, col 32) severe: [AnalyzerMessage] The name 'CanvasRenderingContext2D' is not a type and cannot be used in an 'as' expression (test/codegen/js_test.dart, line 695, col 46) severe: [AnalyzerMessage] The function 'expect' is not defined (test/codegen/js_test.dart, line 698, col 9) +warning: [MissingTypeError] type analysis didn't compute the type of: new Blob(fileParts, type: 'text/html') InstanceCreationExpression (test/codegen/js_test.dart, line 667, col 24) +warning: [MissingTypeError] type analysis didn't compute the type of: new CustomEvent('test') InstanceCreationExpression (test/codegen/js_test.dart, line 683, col 24)
diff --git a/tool/sdk_expected_errors.txt b/tool/sdk_expected_errors.txt index b63b40f..e69de29 100644 --- a/tool/sdk_expected_errors.txt +++ b/tool/sdk_expected_errors.txt
@@ -1,270 +0,0 @@ -severe: [AnalyzerMessage] The redirected constructor '(dynamic) → JSArray<dynamic>' has incompatible parameters with '(dynamic) → JSArray<E>' (dart:_interceptors/js_array.dart, line 29, col 46) -severe: [AnalyzerMessage] Missing concrete implementation of 'num.==' (dart:_interceptors/js_number.dart, line 12, col 7) -severe: [AnalyzerMessage] Missing concrete implementation of 'String.==' (dart:_interceptors/js_string.dart, line 14, col 7) -severe: [AnalyzerMessage] The redirected constructor '((Stream<dynamic>, bool) → StreamSubscription<dynamic>) → _StreamSubscriptionTransformer<dynamic, dynamic>' has incompatible parameters with '((Stream<S>, bool) → StreamSubscription<T>) → StreamTransformer<S, T>' (dart:async/stream.dart, line 1571, col 9) -severe: [AnalyzerMessage] The redirected constructor '({handleData: (dynamic, EventSink<dynamic>) → void, handleError: (Object, StackTrace, EventSink<dynamic>) → void, handleDone: (EventSink<dynamic>) → void}) → _StreamHandlerTransformer<dynamic, dynamic>' has incompatible parameters with '({handleData: (S, EventSink<T>) → void, handleError: (Object, StackTrace, EventSink<T>) → void, handleDone: (EventSink<T>) → void}) → StreamTransformer<S, T>' (dart:async/stream.dart, line 1588, col 13) -severe: [AnalyzerMessage] The redirected constructor '((List<dynamic>) → void) → _SimpleCallbackSink<dynamic>' has incompatible parameters with '((List<T>) → void) → ChunkedConversionSink<T>' (dart:convert/chunked_conversion.dart, line 23, col 45) -severe: [AnalyzerMessage] The redirected constructor '(Iterable<E>) → LinkedHashSet<E>' has incompatible parameters with '(Iterable<dynamic>) → Set<E>' (dart:core/set.dart, line 75, col 41) -warning: [DownCastComposite] doneHandlers (dynamic) will need runtime check to cast to type Iterable<SendPort> (dart:_isolate_helper, line 574, col 29) -warning: [DownCastComposite] args (dynamic) will need runtime check to cast to type List<String> (dart:_isolate_helper, line 839, col 37) -warning: [DownCastComposite] msg['args'] (dynamic) will need runtime check to cast to type List<String> (dart:_isolate_helper, line 886, col 11) -warning: [DownCastComposite] JS('var', r'#.pop()', this) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 80, col 12) -warning: [DownCastComposite] JS('', '#[#]', this, i) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 125, col 9) -warning: [DownCastComposite] IterableMixinWorkaround.reduce(this, combine) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 161, col 12) -warning: [DownCastComposite] IterableMixinWorkaround.firstWhere(this, test, orElse) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 169, col 12) -warning: [DownCastComposite] IterableMixinWorkaround.lastWhereList(this, test, orElse) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 173, col 12) -warning: [DownCastComposite] IterableMixinWorkaround.singleWhere(this, test) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 177, col 12) -warning: [DownCastComposite] JS('var', '#[#]', this, index) (dynamic) will need runtime check to cast to type E (dart:_interceptors/js_array.dart, line 313, col 12) -warning: [DownCastComposite] charCodes (dynamic) will need runtime check to cast to type List<int> (dart:_js_helper, line 264, col 31) -warning: [DownCastComposite] JS('', '#.value', ret) (dynamic) will need runtime check to cast to type E (dart:_js_helper, line 779, col 16) -warning: [DownCastComposite] JS('JSExtendableArray', r'#.split(#)', this, pattern) (dynamic) will need runtime check to cast to type List<String> (dart:_interceptors/js_string.dart, line 86, col 14) -warning: [DownCastComposite] JS('JSExtendableArray', r'#.split(#)', this, re) (dynamic) will need runtime check to cast to type List<String> (dart:_interceptors/js_string.dart, line 89, col 14) -warning: [DownCastComposite] JS('JSExtendableArray|Null', r'#.exec(#)', _nativeRegExp, checkString(string)) (dynamic) will need runtime check to cast to type List<String> (dart:_js_helper/regexp_helper.dart, line 108, col 22) -warning: [DownCastComposite] match (List<dynamic>) will need runtime check to cast to type List<String> (dart:_js_helper/regexp_helper.dart, line 140, col 43) -warning: [DownCastComposite] match (List<dynamic>) will need runtime check to cast to type List<String> (dart:_js_helper/regexp_helper.dart, line 152, col 43) -warning: [DownCastComposite] pattern.allMatches(receiver) (dynamic) will need runtime check to cast to type Iterable<Match> (dart:_js_helper/string_helper.dart, line 137, col 23) -warning: [DownCastComposite] controller (_StreamControllerLifecycle<dynamic>) will need runtime check to cast to type _StreamControllerLifecycle<T> (dart:async/broadcast_stream_controller.dart, line 8, col 67) -warning: [DownCastComposite] controller (_StreamControllerLifecycle<dynamic>) will need runtime check to cast to type _StreamControllerLifecycle<T> (dart:async/broadcast_stream_controller.dart, line 36, col 15) -warning: [DownCastComposite] subscription (StreamSubscription<dynamic>) will need runtime check to cast to type _BroadcastSubscription<T> (dart:async/broadcast_stream_controller.dart, line 196, col 18) -warning: [DownCastComposite] subscription (StreamSubscription<dynamic>) will need runtime check to cast to type StreamSubscription<T> (dart:async/broadcast_stream_controller.dart, line 201, col 12) -warning: [DownCastComposite] link (_BroadcastSubscriptionLink) will need runtime check to cast to type _BroadcastSubscription<T> (dart:async/broadcast_stream_controller.dart, line 310, col 48) -warning: [UninferredClosure] (_BroadcastSubscription<T> subscription) {subscription._close();} ((_BroadcastSubscription<T>) → dynamic) will need runtime check to cast to type (_BufferingStreamSubscription<T>) → void (dart:async/broadcast_stream_controller.dart, line 373, col 24) -warning: [DownCastComposite] link (_BroadcastSubscriptionLink) will need runtime check to cast to type _BroadcastSubscription<T> (dart:async/broadcast_stream_controller.dart, line 394, col 48) -warning: [DownCastComposite] link (_BroadcastSubscriptionLink) will need runtime check to cast to type _BroadcastSubscription<T> (dart:async/broadcast_stream_controller.dart, line 403, col 48) -warning: [DownCastComposite] link (_BroadcastSubscriptionLink) will need runtime check to cast to type _BroadcastSubscription<T> (dart:async/broadcast_stream_controller.dart, line 413, col 50) -warning: [DownCastComposite] result (_Future<dynamic>) will need runtime check to cast to type Future<T> (dart:async/future.dart, line 123, col 12) -warning: [DownCastComposite] result (_Future<dynamic>) will need runtime check to cast to type Future<T> (dart:async/future.dart, line 149, col 12) -warning: [DownCastComposite] result (_Future<dynamic>) will need runtime check to cast to type Future<T> (dart:async/future.dart, line 233, col 12) -warning: [DownCastComposite] callback (Function) will need runtime check to cast to type (dynamic) → bool (dart:async/future_impl.dart, line 117, col 12) -warning: [DownCastComposite] result._zone.registerUnaryCallback(f) ((dynamic) → dynamic) will need runtime check to cast to type (T) → dynamic (dart:async/future_impl.dart, line 208, col 11) -warning: [DownCastComposite] result._zone.registerUnaryCallback(test) ((dynamic) → dynamic) will need runtime check to cast to type (dynamic) → bool (dart:async/future_impl.dart, line 221, col 32) -warning: [DownCastComposite] result (_Future<dynamic>) will need runtime check to cast to type Future<T> (dart:async/future_impl.dart, line 233, col 12) -warning: [DownCastComposite] _resultOrListeners (dynamic) will need runtime check to cast to type T (dart:async/future_impl.dart, line 245, col 12) -warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type T (dart:async/future_impl.dart, line 347, col 17) -warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type T (dart:async/future_impl.dart, line 357, col 15) -warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type Future<T> (dart:async/future_impl.dart, line 386, col 31) -warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type T (dart:async/future_impl.dart, line 407, col 22) -warning: [DownCastComposite] callback (dynamic) will need runtime check to cast to type () → void (dart:async/schedule_microtask.dart, line 66, col 61) -warning: [DownCastComposite] callback (dynamic) will need runtime check to cast to type () → void (dart:async/schedule_microtask.dart, line 71, col 60) -warning: [DownCastComposite] callback (dynamic) will need runtime check to cast to type () → void (dart:async/schedule_microtask.dart, line 84, col 55) -warning: [DownCastComposite] value (dynamic) will need runtime check to cast to type T (dart:async/stream.dart, line 90, col 25) -warning: [DownCastComposite] mapSink ((EventSink<T>) → EventSink<dynamic>) will need runtime check to cast to type (EventSink<dynamic>) → EventSink<dynamic> (dart:async/stream.dart, line 217, col 41) -warning: [DownCastComposite] onListen ((StreamSubscription<T>) → void) will need runtime check to cast to type (StreamSubscription<dynamic>) → void (dart:async/stream.dart, line 249, col 44) -warning: [DownCastComposite] onCancel ((StreamSubscription<T>) → void) will need runtime check to cast to type (StreamSubscription<dynamic>) → void (dart:async/stream.dart, line 249, col 54) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, result) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 502, col 24) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, result) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 535, col 11) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 603, col 13) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 629, col 13) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 658, col 13) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 695, col 13) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 1037, col 11) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 1078, col 11) -warning: [DownCastComposite] _cancelAndErrorClosure(subscription, future) (dynamic) will need runtime check to cast to type (dynamic, StackTrace) → dynamic (dart:async/stream.dart, line 1130, col 11) -warning: [DownCastComposite] timeout (Function) will need runtime check to cast to type () → void (dart:async/stream.dart, line 1220, col 43) -warning: [DownCastComposite] timeout (Function) will need runtime check to cast to type () → void (dart:async/stream.dart, line 1228, col 43) -warning: [DownCastComposite] zone.registerUnaryCallback(onTimeout) ((dynamic) → dynamic) will need runtime check to cast to type (EventSink<dynamic>) → void (dart:async/stream.dart, line 1246, col 21) -warning: [DownCastComposite] timeout (Function) will need runtime check to cast to type () → void (dart:async/stream.dart, line 1257, col 43) -warning: [DownCastComposite] timeout (Function) will need runtime check to cast to type () → void (dart:async/stream.dart, line 1276, col 53) -warning: [DownCastComposite] sync ? new _NoCallbackSyncStreamController() : new _NoCallbackAsyncStreamController() (_StreamController<dynamic>) will need runtime check to cast to type StreamController<T> (dart:async/stream_controller.dart, line 83, col 14) -warning: [DownCastComposite] subscription (_ControllerSubscription<dynamic>) will need runtime check to cast to type StreamSubscription<T> (dart:async/stream_controller.dart, line 516, col 12) -warning: [DownCastComposite] controller (_StreamController<dynamic>) will need runtime check to cast to type _EventSink<T> (dart:async/stream_controller.dart, line 798, col 15) -warning: [DownCastComposite] _nullDataHandler ((dynamic) → void) will need runtime check to cast to type (T) → void (dart:async/stream_impl.dart, line 153, col 42) -warning: [DownCastComposite] _zone.registerUnaryCallback(handleData) ((dynamic) → dynamic) will need runtime check to cast to type (T) → void (dart:async/stream_impl.dart, line 154, col 15) -warning: [DownCastComposite] subscription (StreamSubscription<dynamic>) will need runtime check to cast to type StreamSubscription<T> (dart:async/stream_impl.dart, line 476, col 12) -warning: [DownCastComposite] new _BufferingStreamSubscription(onData, onError, onDone, cancelOnError).._setPendingEvents(_pending()) (_BufferingStreamSubscription<dynamic>) will need runtime check to cast to type StreamSubscription<T> (dart:async/stream_impl.dart, line 515, col 12) -warning: [DownCastComposite] Zone.current.registerUnaryCallback(onListenHandler) ((dynamic) → dynamic) will need runtime check to cast to type (StreamSubscription<dynamic>) → void (dart:async/stream_impl.dart, line 813, col 28) -warning: [DownCastComposite] Zone.current.registerUnaryCallback(onCancelHandler) ((dynamic) → dynamic) will need runtime check to cast to type (StreamSubscription<dynamic>) → void (dart:async/stream_impl.dart, line 814, col 28) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type Future<bool> (dart:async/stream_impl.dart, line 1000, col 14) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type T (dart:async/stream_impl.dart, line 1006, col 22) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type _Future<bool> (dart:async/stream_impl.dart, line 1035, col 31) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type _Future<bool> (dart:async/stream_impl.dart, line 1047, col 31) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type _Future<bool> (dart:async/stream_impl.dart, line 1061, col 31) -warning: [DownCastComposite] _futureOrPrefetch (dynamic) will need runtime check to cast to type _Future<bool> (dart:async/stream_impl.dart, line 1075, col 31) -warning: [DownCastComposite] outputData (dynamic) will need runtime check to cast to type T (dart:async/stream_pipe.dart, line 104, col 15) -warning: [DownCastComposite] _transform(inputEvent) (dynamic) will need runtime check to cast to type T (dart:async/stream_pipe.dart, line 235, col 21) -warning: [DownCastComposite] _previous (Object) will need runtime check to cast to type T (dart:async/stream_pipe.dart, line 426, col 29) -warning: [DownCastComposite] _sinkMapper ((EventSink<T>) → EventSink<S>) will need runtime check to cast to type (EventSink<dynamic>) → EventSink<dynamic> (dart:async/stream_transformers.dart, line 187, col 18) -warning: [UninferredClosure] (EventSink<T> outputSink) {if (handleData == null) handleData = _defaultHandleData; if (handleError == null) handleError = _defaultHandleError; if (handleDone == null) handleDone = _defaultHandleDone; return new _HandlerEventSink<S, T>(handleData, handleError, handleDone, outputSink);} ((EventSink<T>) → dynamic) will need runtime check to cast to type (EventSink<T>) → EventSink<S> (dart:async/stream_transformers.dart, line 233, col 15) -warning: [DownCastComposite] _defaultHandleData ((dynamic, EventSink<dynamic>) → void) will need runtime check to cast to type (S, EventSink<T>) → void (dart:async/stream_transformers.dart, line 234, col 48) -warning: [DownCastComposite] _defaultHandleError ((dynamic, StackTrace, EventSink<dynamic>) → void) will need runtime check to cast to type (Object, StackTrace, EventSink<T>) → void (dart:async/stream_transformers.dart, line 235, col 50) -warning: [DownCastComposite] Zone.current.bindUnaryCallback(callback, runGuarded: true) ((dynamic) → dynamic) will need runtime check to cast to type (Timer) → void (dart:async/timer.dart, line 80, col 19) -warning: [DownCastComposite] zone.bindUnaryCallback(callback) ((dynamic) → dynamic) will need runtime check to cast to type (Timer) → void (dart:async/zone.dart, line 962, col 16) -warning: [DownCastComposite] JS('var', '#.splice(#, 2)[1]', bucket, index) (dynamic) will need runtime check to cast to type V (dart:collection, line 179, col 12) -warning: [DownCastComposite] key (dynamic) will need runtime check to cast to type K (dart:collection, line 193, col 14) -warning: [DownCastComposite] _getTableEntry(table, key) (dynamic) will need runtime check to cast to type V (dart:collection, line 261, col 17) -warning: [DownCastComposite] key (dynamic) will need runtime check to cast to type K (dart:collection, line 397, col 49) -warning: [DownCastComposite] JS('var', '#[#]', bucket, i) (dynamic) will need runtime check to cast to type K (dart:collection, line 404, col 19) -warning: [DownCastComposite] key (dynamic) will need runtime check to cast to type K (dart:collection, line 404, col 49) -warning: [DownCastComposite] JS('var', '#[#]', keys, i) (dynamic) will need runtime check to cast to type E (dart:collection, line 430, col 9) -warning: [DownCastComposite] JS('var', '#[#]', keys, offset) (dynamic) will need runtime check to cast to type E (dart:collection, line 456, col 18) -warning: [DownCastComposite] cell._value (dynamic) will need runtime check to cast to type V (dart:collection, line 561, col 12) -warning: [DownCastComposite] cell._value (dynamic) will need runtime check to cast to type V (dart:collection, line 627, col 12) -warning: [DownCastComposite] cell._key (dynamic) will need runtime check to cast to type K (dart:collection, line 642, col 14) -warning: [DownCastComposite] cell._value (dynamic) will need runtime check to cast to type V (dart:collection, line 642, col 25) -warning: [DownCastComposite] cell._value (dynamic) will need runtime check to cast to type V (dart:collection, line 665, col 12) -warning: [DownCastComposite] key (dynamic) will need runtime check to cast to type K (dart:collection, line 820, col 49) -warning: [DownCastComposite] cell._key (dynamic) will need runtime check to cast to type K (dart:collection, line 828, col 19) -warning: [DownCastComposite] key (dynamic) will need runtime check to cast to type K (dart:collection, line 828, col 30) -warning: [DownCastComposite] cell._key (dynamic) will need runtime check to cast to type E (dart:collection, line 862, col 9) -warning: [DownCastComposite] _cell._key (dynamic) will need runtime check to cast to type E (dart:collection, line 889, col 18) -warning: [DownCastComposite] this.contains(object) ? object : null (Object) will need runtime check to cast to type E (dart:collection, line 951, col 14) -warning: [DownCastComposite] bucket[index] (dynamic) will need runtime check to cast to type E (dart:collection, line 962, col 12) -warning: [DownCastComposite] JS('var', '#[#]', bucket, i) (dynamic) will need runtime check to cast to type E (dart:collection, line 1202, col 21) -warning: [DownCastComposite] element (dynamic) will need runtime check to cast to type E (dart:collection, line 1202, col 51) -warning: [DownCastComposite] element (dynamic) will need runtime check to cast to type E (dart:collection, line 1212, col 47) -warning: [DownCastComposite] JS('var', '#[#]', elements, offset) (dynamic) will need runtime check to cast to type E (dart:collection, line 1251, col 18) -warning: [DownCastComposite] this.contains(object) ? object : null (Object) will need runtime check to cast to type E (dart:collection, line 1328, col 14) -warning: [DownCastComposite] bucket[index]._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1340, col 12) -warning: [DownCastComposite] cell._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1347, col 14) -warning: [DownCastComposite] _first._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1357, col 12) -warning: [DownCastComposite] _last._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1362, col 12) -warning: [DownCastComposite] cell._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1431, col 19) -warning: [DownCastComposite] cell._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1606, col 21) -warning: [DownCastComposite] element (dynamic) will need runtime check to cast to type E (dart:collection, line 1606, col 36) -warning: [DownCastComposite] element (dynamic) will need runtime check to cast to type E (dart:collection, line 1616, col 47) -warning: [DownCastComposite] _cell._element (dynamic) will need runtime check to cast to type E (dart:collection, line 1678, col 18) -warning: [DownCastComposite] k (dynamic) will need runtime check to cast to type K (dart:collection/hash_map.dart, line 112, col 35) -warning: [DownCastComposite] v (dynamic) will need runtime check to cast to type V (dart:collection/hash_map.dart, line 112, col 40) -warning: [DownCastComposite] elements (Iterable<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/hash_set.dart, line 128, col 17) -warning: [DownCastComposite] _iterator.current (dynamic) will need runtime check to cast to type E (dart:collection/iterator.dart, line 33, col 16) -warning: [DownCastComposite] k (dynamic) will need runtime check to cast to type K (dart:collection/linked_hash_map.dart, line 99, col 35) -warning: [DownCastComposite] v (dynamic) will need runtime check to cast to type V (dart:collection/linked_hash_map.dart, line 99, col 40) -warning: [DownCastComposite] fillLiteralMap(keyValuePairs, new _LinkedHashMap<K, V>()) (dynamic) will need runtime check to cast to type LinkedHashMap<K, V> (dart:collection/linked_hash_map.dart, line 142, col 12) -warning: [DownCastComposite] entry (dynamic) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 65, col 56) -warning: [DownCastComposite] next (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 93, col 17) -warning: [DownCastComposite] _next (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 105, col 12) -warning: [DownCastComposite] _previous (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 112, col 12) -warning: [DownCastComposite] _next (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 122, col 12) -warning: [DownCastComposite] current (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 134, col 14) -warning: [DownCastComposite] _next (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 192, col 16) -warning: [DownCastComposite] _next (_LinkedListLink) will need runtime check to cast to type E (dart:collection/linked_list.dart, line 249, col 16) -warning: [DownCastComposite] iterable (Iterable<E>) will need runtime check to cast to type List<dynamic> (dart:collection/list.dart, line 365, col 19) -warning: [DownCastComposite] otherList[otherStart + i] (dynamic) will need runtime check to cast to type E (dart:collection/list.dart, line 377, col 27) -warning: [DownCastComposite] otherList[otherStart + i] (dynamic) will need runtime check to cast to type E (dart:collection/list.dart, line 381, col 27) -warning: [DownCastComposite] _map[_map.keys.first] (dynamic) will need runtime check to cast to type V (dart:collection/maps.dart, line 122, col 18) -warning: [DownCastComposite] _map[_map.keys.single] (dynamic) will need runtime check to cast to type V (dart:collection/maps.dart, line 123, col 19) -warning: [DownCastComposite] _map[_map.keys.last] (dynamic) will need runtime check to cast to type V (dart:collection/maps.dart, line 124, col 17) -warning: [DownCastComposite] _map[_keys.current] (dynamic) will need runtime check to cast to type V (dart:collection/maps.dart, line 144, col 18) -warning: [DownCastComposite] elements (Iterable<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 208, col 23) -warning: [DownCastComposite] sourceList (List<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 402, col 40) -warning: [DownCastComposite] elements (Iterable<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 411, col 31) -warning: [DownCastComposite] elements (Iterable<E>) will need runtime check to cast to type List<dynamic> (dart:collection/queue.dart, line 474, col 19) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 480, col 52) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 486, col 52) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 490, col 52) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/queue.dart, line 491, col 40) -warning: [DownCastComposite] _queue._table[_position] (dynamic) will need runtime check to cast to type E (dart:collection/queue.dart, line 738, col 16) -warning: [DownCastComposite] current (_SplayTreeNode<dynamic>) will need runtime check to cast to type _SplayTreeNode<K> (dart:collection/splay_tree.dart, line 155, col 12) -warning: [DownCastComposite] current (_SplayTreeNode<dynamic>) will need runtime check to cast to type _SplayTreeNode<K> (dart:collection/splay_tree.dart, line 171, col 12) -warning: [DownCastComposite] (compare == null) ? Comparable.compare : compare (Function) will need runtime check to cast to type (K, K) → int (dart:collection/splay_tree.dart, line 269, col 23) -warning: [DownCastComposite] k (dynamic) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 279, col 35) -warning: [DownCastComposite] v (dynamic) will need runtime check to cast to type V (dart:collection/splay_tree.dart, line 279, col 40) -warning: [DownCastComposite] key (Object) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 332, col 25) -warning: [DownCastComposite] _root (_SplayTreeNode<K>) will need runtime check to cast to type _SplayTreeMapNode<dynamic, dynamic> (dart:collection/splay_tree.dart, line 334, col 37) -warning: [DownCastComposite] mapRoot.value (dynamic) will need runtime check to cast to type V (dart:collection/splay_tree.dart, line 335, col 16) -warning: [DownCastComposite] key (Object) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 343, col 41) -warning: [DownCastComposite] mapRoot.value (dynamic) will need runtime check to cast to type V (dart:collection/splay_tree.dart, line 344, col 33) -warning: [DownCastComposite] _root (_SplayTreeNode<K>) will need runtime check to cast to type _SplayTreeMapNode<dynamic, dynamic> (dart:collection/splay_tree.dart, line 354, col 35) -warning: [DownCastComposite] _root (_SplayTreeNode<K>) will need runtime check to cast to type _SplayTreeMapNode<dynamic, dynamic> (dart:collection/splay_tree.dart, line 366, col 35) -warning: [DownCastComposite] mapRoot.value (dynamic) will need runtime check to cast to type V (dart:collection/splay_tree.dart, line 367, col 14) -warning: [DownCastComposite] key (Object) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 412, col 37) -warning: [DownCastComposite] _root (_SplayTreeNode<K>) will need runtime check to cast to type _SplayTreeMapNode<dynamic, dynamic> (dart:collection/splay_tree.dart, line 429, col 18) -warning: [DownCastComposite] _first.key (dynamic) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 445, col 12) -warning: [DownCastComposite] _last.key (dynamic) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 453, col 12) -warning: [DownCastComposite] node.key (dynamic) will need runtime check to cast to type K (dart:collection/splay_tree.dart, line 632, col 39) -warning: [DownCastComposite] node.value (dynamic) will need runtime check to cast to type V (dart:collection/splay_tree.dart, line 637, col 42) -warning: [DownCastComposite] node (_SplayTreeNode<dynamic>) will need runtime check to cast to type _SplayTreeNode<K> (dart:collection/splay_tree.dart, line 645, col 55) -warning: [DownCastComposite] (compare == null) ? Comparable.compare : compare (Function) will need runtime check to cast to type (E, E) → int (dart:collection/splay_tree.dart, line 695, col 23) -warning: [DownCastComposite] elements (Iterable<dynamic>) will need runtime check to cast to type Iterable<E> (dart:collection/splay_tree.dart, line 709, col 29) -warning: [DownCastComposite] _first.key (dynamic) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 727, col 12) -warning: [DownCastComposite] _last.key (dynamic) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 732, col 12) -warning: [DownCastComposite] object (Object) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 743, col 40) -warning: [DownCastComposite] object (Object) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 755, col 20) -warning: [DownCastComposite] element (Object) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 769, col 39) -warning: [DownCastComposite] object (Object) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 783, col 39) -warning: [DownCastComposite] object (Object) will need runtime check to cast to type E (dart:collection/splay_tree.dart, line 795, col 23) -warning: [DownCastComposite] result (List<dynamic>) will need runtime check to cast to type List<int> (dart:convert/ascii.dart, line 96, col 12) -warning: [DownCastComposite] _first.encoder.fuse(_second.encoder) (Converter<S, dynamic>) will need runtime check to cast to type Converter<S, T> (dart:convert/codec.dart, line 87, col 34) -warning: [DownCastComposite] _second.decoder.fuse(_first.decoder) (Converter<T, dynamic>) will need runtime check to cast to type Converter<T, S> (dart:convert/codec.dart, line 88, col 34) -warning: [DownCastComposite] JS('JSExtendableArray', '#', keys) (dynamic) will need runtime check to cast to type List<String> (dart:convert, line 311, col 12) -warning: [DownCastComposite] _second.convert(_first.convert(input)) (dynamic) will need runtime check to cast to type T (dart:convert/converter.dart, line 58, col 25) -warning: [DownCastComposite] toEncodable ((dynamic) → dynamic) will need runtime check to cast to type (Object) → Object (dart:convert/json.dart, line 142, col 28) -warning: [DownCastComposite] _toEncodable ((dynamic) → dynamic) will need runtime check to cast to type (Object) → Object (dart:convert/json.dart, line 147, col 28) -warning: [DownCastComposite] _toEncodable (Function) will need runtime check to cast to type (Object) → dynamic (dart:convert/json.dart, line 270, col 42) -warning: [DownCastComposite] _toEncodable (Function) will need runtime check to cast to type (Object) → dynamic (dart:convert/json.dart, line 352, col 36) -warning: [DownCastComposite] _toEncodable (Function) will need runtime check to cast to type (Object) → dynamic (dart:convert/json.dart, line 455, col 53) -warning: [DownCastComposite] object (dynamic) will need runtime check to cast to type Map<String, Object> (dart:convert/json.dart, line 715, col 16) -warning: [DownCastComposite] _toEncodable (dynamic) will need runtime check to cast to type (Object) → Object (dart:convert/json.dart, line 817, col 60) -warning: [DownCastComposite] toEncodable (dynamic) will need runtime check to cast to type (Object) → Object (dart:convert/json.dart, line 895, col 15) -warning: [DownCastComposite] sink (Sink<dynamic>) will need runtime check to cast to type Sink<String> (dart:convert/line_splitter.dart, line 24, col 44) -warning: [DownCastComposite] (generator != null) ? generator : _id (Function) will need runtime check to cast to type (int) → E (dart:core/iterable.dart, line 319, col 22) -warning: [DownCastComposite] e (dynamic) will need runtime check to cast to type E (dart:core/list.dart, line 121, col 16) -warning: [DownCastComposite] makeListFixedLength(list) (List<dynamic>) will need runtime check to cast to type List<E> (dart:core/list.dart, line 124, col 12) -warning: [DownCastComposite] charCodes (Iterable<int>) will need runtime check to cast to type List<dynamic> (dart:core/string.dart, line 121, col 17) -warning: [DownCastComposite] _userinfoTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1131, col 45) -warning: [DownCastComposite] _pathCharOrSlashTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1144, col 45) -warning: [DownCastComposite] _pathCharTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1146, col 51) -warning: [DownCastComposite] _queryCharTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1163, col 61) -warning: [DownCastComposite] _queryCharTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1183, col 45) -warning: [DownCastComposite] codeUnits (List<dynamic>) will need runtime check to cast to type Iterable<int> (dart:core/uri.dart, line 1278, col 37) -warning: [DownCastComposite] _unreserved2396Table (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1754, col 23) -warning: [DownCastComposite] _unreservedTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1793, col 9) -warning: [DownCastComposite] _encodeFullTable (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1837, col 23) -warning: [DownCastComposite] query.split("&").fold({}, (map, element) {int index = element.indexOf("="); if (index == -1) {if (element != "") {map[decodeQueryComponent(element, encoding: encoding)] = "";}} else if (index != 0) {var key = element.substring(0, index); var value = element.substring(index + 1); map[Uri.decodeQueryComponent(key, encoding: encoding)] = decodeQueryComponent(value, encoding: encoding);} return map;}) (dynamic) will need runtime check to cast to type Map<String, String> (dart:core/uri.dart, line 1869, col 12) -warning: [DownCastComposite] bytes.map((byteString) {int byte = int.parse(byteString); if (byte < 0 || byte > 255) {error('each part must be in the range of `0..255`');} return byte;}).toList() (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 1901, col 12) -warning: [DownCastComposite] bytes (List<dynamic>) will need runtime check to cast to type List<int> (dart:core/uri.dart, line 2023, col 12) -warning: [DownCastComposite] result (List<dynamic>) will need runtime check to cast to type List<E> (dart:_internal/iterable.dart, line 310, col 12) -warning: [DownCastComposite] iterable (Iterable<dynamic>) will need runtime check to cast to type Iterable<S> (dart:_internal/iterable.dart, line 357, col 39) -warning: [DownCastComposite] iterable (Iterable<dynamic>) will need runtime check to cast to type Iterable<S> (dart:_internal/iterable.dart, line 378, col 17) -warning: [DownCastComposite] _f ((dynamic) → Iterable<dynamic>) will need runtime check to cast to type (S) → Iterable<T> (dart:_internal/iterable.dart, line 454, col 76) -warning: [DownCastComposite] _f(_iterator.current).iterator (Iterator<dynamic>) will need runtime check to cast to type Iterator<T> (dart:_internal/iterable.dart, line 481, col 29) -warning: [DownCastComposite] iterable (Iterable<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 961, col 33) -warning: [DownCastComposite] f ((dynamic) → bool) will need runtime check to cast to type (T) → bool (dart:_internal/iterable.dart, line 961, col 43) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 978, col 35) -warning: [DownCastComposite] iterable (Iterable<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 983, col 37) -warning: [DownCastComposite] test ((dynamic) → bool) will need runtime check to cast to type (T) → bool (dart:_internal/iterable.dart, line 983, col 47) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 988, col 35) -warning: [DownCastComposite] iterable (Iterable<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 993, col 37) -warning: [DownCastComposite] test ((dynamic) → bool) will need runtime check to cast to type (T) → bool (dart:_internal/iterable.dart, line 993, col 47) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 997, col 40) -warning: [DownCastComposite] list (List<dynamic>) will need runtime check to cast to type Iterable<T> (dart:_internal/iterable.dart, line 1033, col 35) -warning: [DownCastComposite] l (List<dynamic>) will need runtime check to cast to type List<T> (dart:_internal/iterable.dart, line 1115, col 31) -warning: [DownCastComposite] _convertToJS ((dynamic) → dynamic) will need runtime check to cast to type (E) → dynamic (dart:js, line 325, col 44) -warning: [DownCastComposite] super[index] (dynamic) will need runtime check to cast to type E (dart:js, line 358, col 12) -warning: [DownCastComposite] callMethod('splice', [index, 1])[0] (dynamic) will need runtime check to cast to type E (dart:js, line 404, col 12) -warning: [DownCastComposite] callMethod('pop') (dynamic) will need runtime check to cast to type E (dart:js, line 409, col 12) -warning: [DownCastComposite] x + other.x (num) will need runtime check to cast to type T (dart:math/point.dart, line 37, col 25) -warning: [DownCastComposite] y + other.y (num) will need runtime check to cast to type T (dart:math/point.dart, line 37, col 38) -warning: [DownCastComposite] x - other.x (num) will need runtime check to cast to type T (dart:math/point.dart, line 46, col 25) -warning: [DownCastComposite] y - other.y (num) will need runtime check to cast to type T (dart:math/point.dart, line 46, col 38) -warning: [DownCastComposite] x * factor (num) will need runtime check to cast to type T (dart:math/point.dart, line 59, col 25) -warning: [DownCastComposite] y * factor (num) will need runtime check to cast to type T (dart:math/point.dart, line 59, col 37) -warning: [DownCastComposite] dx * dx + dy * dy (num) will need runtime check to cast to type T (dart:math/point.dart, line 86, col 12) -warning: [DownCastComposite] left + width (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 33, col 18) -warning: [DownCastComposite] top + height (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 35, col 19) -warning: [DownCastComposite] x0 (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 68, col 33) -warning: [DownCastComposite] y0 (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 68, col 37) -warning: [DownCastComposite] x1 - x0 (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 68, col 41) -warning: [DownCastComposite] y1 - y0 (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 68, col 50) -warning: [DownCastComposite] left (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 95, col 29) -warning: [DownCastComposite] top (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 95, col 35) -warning: [DownCastComposite] right - left (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 95, col 40) -warning: [DownCastComposite] bottom - top (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 95, col 54) -warning: [DownCastComposite] this.left + this.width (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 119, col 41) -warning: [DownCastComposite] this.left + this.width (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 120, col 44) -warning: [DownCastComposite] this.top + this.height (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 121, col 7) -warning: [DownCastComposite] this.top + this.height (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 123, col 7) -warning: [DownCastComposite] (width < 0) ? -width * 0 : width (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 151, col 22) -warning: [DownCastComposite] (height < 0) ? -height * 0 : height (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 152, col 23) -warning: [DownCastComposite] min(a.x, b.x) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 167, col 14) -warning: [DownCastComposite] max(a.x, b.x) - left (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 168, col 15) -warning: [DownCastComposite] min(a.y, b.y) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 169, col 13) -warning: [DownCastComposite] max(a.y, b.y) - top (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 170, col 16) -warning: [DownCastComposite] (width < 0) ? _clampToZero(width) : width (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 212, col 23) -warning: [DownCastComposite] (height < 0) ? _clampToZero(height) : height (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 213, col 24) -warning: [DownCastComposite] min(a.x, b.x) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 228, col 14) -warning: [DownCastComposite] max(a.x, b.x) - left (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 229, col 15) -warning: [DownCastComposite] min(a.y, b.y) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 230, col 13) -warning: [DownCastComposite] max(a.y, b.y) - top (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 231, col 16) -warning: [DownCastComposite] _clampToZero(width) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 247, col 28) -warning: [DownCastComposite] _clampToZero(height) (num) will need runtime check to cast to type T (dart:math/rectangle.dart, line 263, col 30)