Index: lib/src/codegen/js_codegen.dart |
diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
index 76b0832f9e5296ec76d8147f74d95d54a05cee3e..b90953952965f056820a94013f833e1f21e38e05 100644 |
--- a/lib/src/codegen/js_codegen.dart |
+++ b/lib/src/codegen/js_codegen.dart |
@@ -122,7 +122,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var libraryDir = unit.directives.first; |
if (libraryDir is LibraryDirective) { |
var jsName = findAnnotation(libraryDir.element, _isJsNameAnnotation); |
- jsDefaultValue = getConstantField(jsName, 'name', types.stringType); |
+ jsDefaultValue = |
+ getConstantField(jsName, 'name', types.stringType) as String; |
} |
} |
@@ -184,14 +185,14 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
list.add(js.string(compiler.getModuleName(library.source.uri), "'")); |
}; |
- var imports = [js.string('dart_runtime/dart')]; |
+ var imports = <JS.Expression>[js.string('dart_runtime/dart')]; |
_imports.forEach((library, temp) { |
if (_loader.libraryIsLoaded(library)) { |
processImport(library, temp, imports); |
} |
}); |
- var lazyImports = []; |
+ var lazyImports = <JS.Expression>[]; |
_imports.forEach((library, temp) { |
if (!_loader.libraryIsLoaded(library)) { |
processImport(library, temp, lazyImports); |
@@ -207,7 +208,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
_moduleItems |
]); |
- var program = [ |
+ var program = <JS.Statement>[ |
js.statement("dart_library.library(#, #, #, #, #)", [ |
js.string(jsPath, "'"), |
jsDefaultValue != null ? jsDefaultValue : new JS.LiteralNull(), |
@@ -325,14 +326,14 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var element = node.element; |
// Forward all generative constructors from the base class. |
- var body = []; |
+ var body = <JS.Method>[]; |
var supertype = element.supertype; |
if (!supertype.isObject) { |
for (var ctor in element.constructors) { |
var parentCtor = supertype.lookUpConstructor(ctor.name, ctor.library); |
var fun = js.call('function() { super.#(...arguments); }', |
- [_constructorName(parentCtor)]); |
+ [_constructorName(parentCtor)]) as JS.Fun; |
body.add(new JS.Method(_constructorName(ctor), fun)); |
} |
} |
@@ -384,7 +385,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
String jsPeerName; |
var jsPeer = findAnnotation(classElem, _isJsPeerInterface); |
if (jsPeer != null) { |
- jsPeerName = getConstantField(jsPeer, 'name', types.stringType); |
+ jsPeerName = getConstantField(jsPeer, 'name', types.stringType) as String; |
} |
var body = _finishClassMembers(classElem, classExpr, ctors, fields, methods, |
@@ -424,8 +425,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// TODO(vsm): Generate any accompanying metadata |
// Create constructor and initialize index |
- var constructor = |
- new JS.Method(name, js.call('function(index) { this.index = index; }')); |
+ var constructor = new JS.Method( |
+ name, js.call('function(index) { this.index = index; }') as JS.Fun); |
var fields = new List<ConstFieldElementImpl>.from( |
element.fields.where((f) => f.type == type)); |
@@ -437,12 +438,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
var nameMap = new JS.ObjectInitializer(properties, multiline: true); |
var toStringF = new JS.Method(js.string('toString'), |
- js.call('function () { return #[this.index]; }', nameMap)); |
+ js.call('function() { return #[this.index]; }', nameMap) as JS.Fun); |
// Create enum class |
var classExpr = new JS.ClassExpression( |
id, _classHeritage(element), [constructor, toStringF]); |
- var result = [js.statement('#', classExpr)]; |
+ var result = <JS.Statement>[js.statement('#', classExpr)]; |
// Create static fields for each enum value |
for (var i = 0; i < fields.length; ++i) { |
@@ -455,8 +456,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
// Create static values list |
- var values = new JS.ArrayInitializer( |
- fields.map((f) => js.call('#.#', [id, f.name])).toList()); |
+ var values = new JS.ArrayInitializer(new List<JS.Expression>.from( |
+ fields.map((f) => js.call('#.#', [id, f.name])))); |
result.add(js.statement('#.values = dart.const(dart.list(#, #));', [ |
id, |
values, |
@@ -611,7 +612,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// an ES6 iterator. |
return new JS.Method(js.call('$_SYMBOL.iterator'), js.call( |
'function() { return new dart.JsIterator(this.#); }', |
- [_emitMemberName('iterator', type: t)])); |
+ [_emitMemberName('iterator', type: t)]) as JS.Fun); |
} |
JS.Expression _instantiateAnnotation(Annotation node) { |
@@ -635,7 +636,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var body = <JS.Statement>[]; |
if (_extensionTypes.contains(classElem)) { |
- var dartxNames = []; |
+ var dartxNames = <JS.Expression>[]; |
for (var m in methods) { |
if (!m.isAbstract && !m.isStatic && m.element.isPublic) { |
dartxNames.add(_elementMemberName(m.element, allowExtensions: false)); |
@@ -661,8 +662,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
if (classElem.interfaces.isNotEmpty) { |
body.add(js.statement('#[dart.implements] = () => #;', [ |
name, |
- new JS.ArrayInitializer( |
- classElem.interfaces.map(_emitTypeName).toList()) |
+ new JS.ArrayInitializer(new List<JS.Expression>.from( |
+ classElem.interfaces.map(_emitTypeName))) |
])); |
} |
@@ -679,7 +680,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// Instance fields, if they override getter/setter pairs |
for (FieldDeclaration member in fields) { |
for (VariableDeclaration fieldDecl in member.fields.variables) { |
- var field = fieldDecl.element; |
+ var field = fieldDecl.element as FieldElement; |
if (_fieldsNeedingStorage.contains(field)) { |
body.add(_overrideField(field)); |
} |
@@ -688,9 +689,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// Emit the signature on the class recording the runtime type information |
{ |
- var tStatics = []; |
- var tMethods = []; |
- var sNames = []; |
+ var tStatics = <JS.Property>[]; |
+ var tMethods = <JS.Property>[]; |
+ var sNames = <JS.Expression>[]; |
for (MethodDeclaration node in methods) { |
if (!(node.isSetter || node.isGetter || node.isAbstract)) { |
var name = node.name.name; |
@@ -712,7 +713,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
} |
- var tCtors = []; |
+ var tCtors = <JS.Property>[]; |
for (ConstructorDeclaration node in ctors) { |
var memberName = _constructorName(node.element); |
var element = node.element; |
@@ -722,14 +723,13 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
tCtors.add(property); |
} |
- build(name, elements) { |
+ JS.Property build(String name, List<JS.Property> elements) { |
var o = |
new JS.ObjectInitializer(elements, multiline: elements.length > 1); |
var e = js.call('() => #', o); |
- var p = new JS.Property(_propertyName(name), e); |
- return p; |
+ return new JS.Property(_propertyName(name), e); |
} |
- var sigFields = []; |
+ var sigFields = <JS.Property>[]; |
if (!tCtors.isEmpty) sigFields.add(build('constructors', tCtors)); |
if (!tMethods.isEmpty) sigFields.add(build('methods', tMethods)); |
if (!tStatics.isEmpty) { |
@@ -750,7 +750,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// add forwarders. |
var extensions = _extensionsToImplement(classElem); |
if (extensions.isNotEmpty) { |
- var methodNames = []; |
+ var methodNames = <JS.Expression>[]; |
for (var e in extensions) { |
methodNames.add(_elementMemberName(e)); |
} |
@@ -764,7 +764,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
if (metadata.isNotEmpty) { |
body.add(js.statement('#[dart.metadata] = () => #;', [ |
name, |
- new JS.ArrayInitializer(metadata.map(_instantiateAnnotation).toList()) |
+ new JS.ArrayInitializer( |
+ new List<JS.Expression>.from(metadata.map(_instantiateAnnotation))) |
])); |
} |
@@ -834,7 +835,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
dynamic body = _initializeFields(node, fields); |
if (superCall != null) body = [[body, superCall]]; |
var name = _constructorName(node.element.unnamedConstructor); |
- return new JS.Method(name, js.call('function() { #; }', body)); |
+ return new JS.Method(name, js.call('function() { #; }', body) as JS.Fun); |
} |
JS.Method _emitConstructor(ConstructorDeclaration node, InterfaceType type, |
@@ -855,7 +856,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
params, |
_visit(redirect), |
params, |
- ]); |
+ ]) as JS.Fun; |
return new JS.Method(name, fun, isStatic: true)..sourceInformation = node; |
} |
@@ -865,7 +866,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var init = _emitArgumentInitializers(node, constructor: true); |
if (init != null) body.add(init); |
body.add(_visit(node.body)); |
- var fun = new JS.Fun(_visit(node.parameters), new JS.Block(body)); |
+ var fun = new JS.Fun( |
+ _visit(node.parameters) as List<JS.Parameter>, new JS.Block(body)); |
return new JS.Method(name, fun, isStatic: true)..sourceInformation = node; |
} |
@@ -893,7 +895,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
let result = void 0; |
if (name in this) result = this[name](...arguments); |
return result === void 0 ? this : result; |
- }'''); |
+ }''') as JS.Block; |
} else { |
body = _emitConstructorBody(node, fields); |
} |
@@ -901,7 +903,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// We generate constructors as initializer methods in the class; |
// this allows use of `super` for instance methods/properties. |
// It also avoids V8 restrictions on `super` in default constructors. |
- return new JS.Method(name, new JS.Fun(_visit(node.parameters), body)) |
+ return new JS.Method( |
+ name, new JS.Fun(_visit(node.parameters) as List<JS.Parameter>, body)) |
..sourceInformation = node; |
} |
@@ -948,10 +951,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// These are expanded into each non-redirecting constructor. |
// In the future we may want to create an initializer function if we have |
// multiple constructors, but it needs to be balanced against readability. |
- body.add(_initializeFields(node.parent, fields, node)); |
+ body.add(_initializeFields(cls, fields, node)); |
var superCall = node.initializers.firstWhere( |
- (i) => i is SuperConstructorInvocation, orElse: () => null); |
+ (i) => i is SuperConstructorInvocation, |
+ orElse: () => null) as SuperConstructorInvocation; |
// If no superinitializer is provided, an implicit superinitializer of the |
// form `super()` is added at the end of the initializer list, unless the |
@@ -1021,7 +1025,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
JS.Statement _initializeFields( |
ClassDeclaration cls, List<FieldDeclaration> fieldDecls, |
[ConstructorDeclaration ctor]) { |
- var unit = cls.getAncestor((a) => a is CompilationUnit); |
+ var unit = cls.getAncestor((a) => a is CompilationUnit) as CompilationUnit; |
var constField = new ConstFieldVisitor(types, unit); |
bool isConst = ctor != null && ctor.constKeyword != null; |
if (isConst) _loader.startTopLevel(cls.element); |
@@ -1033,9 +1037,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
for (var fieldNode in declaration.fields.variables) { |
var element = fieldNode.element; |
if (constField.isFieldInitConstant(fieldNode)) { |
- unsetFields[element] = fieldNode; |
+ unsetFields[element as FieldElement] = fieldNode; |
} else { |
- fields[element] = _visitInitializer(fieldNode); |
+ fields[element as FieldElement] = _visitInitializer(fieldNode); |
} |
} |
} |
@@ -1052,7 +1056,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// Run constructor field initializers such as `: foo = bar.baz` |
for (var init in ctor.initializers) { |
if (init is ConstructorFieldInitializer) { |
- fields[init.fieldName.staticElement] = _visit(init.expression); |
+ fields[init.fieldName.staticElement as FieldElement] = |
+ _visit(init.expression); |
} |
} |
} |
@@ -1104,7 +1109,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var parameters = _parametersOf(node); |
if (parameters == null) return null; |
- var body = []; |
+ var body = <JS.Statement>[]; |
for (var param in parameters.parameters) { |
var jsParam = _visit(param.identifier); |
@@ -1156,8 +1161,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
return null; |
} |
- var params = _visit(node.parameters); |
- if (params == null) params = []; |
+ var params = _visit(node.parameters) as List<JS.Parameter>; |
+ if (params == null) params = <JS.Parameter>[]; |
return new JS.Method( |
_elementMemberName(node.element), _emitJsFunction(params, node.body), |
@@ -1241,8 +1246,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
JS.Expression visitFunctionExpression(FunctionExpression node) { |
- var params = _visit(node.parameters); |
- if (params == null) params = []; |
+ var params = _visit(node.parameters) as List<JS.Parameter>; |
+ if (params == null) params = <JS.Parameter>[]; |
var parent = node.parent; |
var inStmt = parent.parent is FunctionDeclarationStatement; |
@@ -1377,12 +1382,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
return new JS.Identifier(name); |
} |
- JS.TemporaryId _getTemp(Object key, String name) => |
+ JS.TemporaryId _getTemp(Element key, String name) => |
_temps.putIfAbsent(key, () => new JS.TemporaryId(name)); |
JS.ArrayInitializer _emitTypeNames(List<DartType> types) { |
- var build = (t) => _emitTypeName(t); |
- return new JS.ArrayInitializer(types.map(build).toList()); |
+ return new JS.ArrayInitializer( |
+ new List<JS.Expression>.from(types.map(_emitTypeName))); |
} |
JS.ObjectInitializer _emitTypeProperties(Map<String, DartType> types) { |
@@ -1504,11 +1509,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
JS.MetaLet _emitOpAssign( |
- Expression left, Expression right, String op, ExecutableElement element, |
+ Expression left, Expression right, String op, MethodElement element, |
{Expression context}) { |
// Desugar `x += y` as `x = x + y`, ensuring that if `x` has subexpressions |
// (for example, x is IndexExpression) we evaluate those once. |
- var vars = {}; |
+ var vars = <String, JS.Expression>{}; |
var lhs = _bindLeftHandSide(vars, left, context: context); |
var inc = AstBuilder.binaryExpression(lhs, op, right); |
inc.staticElement = element; |
@@ -1566,7 +1571,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
@override |
- JS.Block visitBlock(Block node) => new JS.Block(_visitList(node.statements)); |
+ JS.Block visitBlock(Block node) => |
+ new JS.Block(_visitList(node.statements) as List<JS.Statement>); |
@override |
visitMethodInvocation(MethodInvocation node) { |
@@ -1736,7 +1742,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
visitVariableDeclarationList(VariableDeclarationList node) { |
- return new JS.VariableDeclarationList('let', _visitList(node.variables)); |
+ return new JS.VariableDeclarationList( |
+ 'let', _visitList(node.variables) as List<JS.VariableInitialization>); |
} |
@override |
@@ -1779,7 +1786,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
return js.statement('# = #;', [_visit(field.name), jsInit]); |
} |
- var body = []; |
+ var body = <JS.Statement>[]; |
if (_lazyFields.isNotEmpty) { |
var existingTarget = _lazyFields[0].element.enclosingElement; |
if (existingTarget != element.enclosingElement) { |
@@ -1811,14 +1818,14 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
var name = node.name.name; |
var element = node.element; |
var access = _emitMemberName(name, type: element.type, isStatic: true); |
- methods.add(new JS.Method( |
- access, js.call('function() { return #; }', _visit(node.initializer)), |
+ methods.add(new JS.Method(access, js.call( |
+ 'function() { return #; }', _visit(node.initializer)) as JS.Fun, |
isGetter: true)); |
// TODO(jmesserly): use a dummy setter to indicate writable. |
if (!node.isFinal) { |
- methods.add( |
- new JS.Method(access, js.call('function(_) {}'), isSetter: true)); |
+ methods.add(new JS.Method(access, js.call('function(_) {}') as JS.Fun, |
+ isSetter: true)); |
} |
} |
@@ -1859,7 +1866,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
JS.Expression _emitInstanceCreationExpression(ConstructorElement element, |
DartType type, SimpleIdentifier name, ArgumentList argumentList, |
bool isConst) { |
- emitNew() { |
+ JS.Expression emitNew() { |
JS.Expression ctor; |
bool isFactory = false; |
// var element = node.staticElement; |
@@ -1874,7 +1881,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
ctor = _emitConstructorName(element, type, name); |
isFactory = element.isFactory; |
} |
- var args = _visit(argumentList); |
+ var args = _visit(argumentList) as List<JS.Expression>; |
return isFactory ? new JS.Call(ctor, args) : new JS.New(ctor, args); |
} |
if (isConst) return _emitConst(emitNew); |
@@ -2098,8 +2105,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
prop.operator, prop.propertyName); |
} else if (expr is PrefixedIdentifier) { |
PrefixedIdentifier ident = expr; |
- result = new PrefixedIdentifier( |
- _bindValue(scope, 'o', ident.prefix, context: context), ident.period, |
+ result = new PrefixedIdentifier(_bindValue(scope, 'o', ident.prefix, |
+ context: context) as SimpleIdentifier, ident.period, |
ident.identifier); |
} else { |
return expr as SimpleIdentifier; |
@@ -2164,7 +2171,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// Handle the left hand side, to ensure each of its subexpressions are |
// evaluated only once. |
- var vars = {}; |
+ var vars = <String, JS.Expression>{}; |
var left = _bindLeftHandSide(vars, expr, context: expr); |
// Desugar `x++` as `(x1 = x0 + 1, x0)` where `x0` is the original value |
@@ -2176,7 +2183,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
..staticElement = node.staticElement |
..staticType = getStaticType(expr); |
- var body = [_emitSet(left, increment), _visit(x)]; |
+ var body = <JS.Expression>[_emitSet(left, increment), _visit(x)]; |
return new JS.MetaLet(vars, body, statelessResult: true); |
} |
@@ -2192,7 +2199,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} else if (op.lexeme == '++' || op.lexeme == '--') { |
// We need a null check, so the increment must be expanded out. |
var mathop = op.lexeme[0]; |
- var vars = {}; |
+ var vars = <String, JS.Expression>{}; |
var x = _bindLeftHandSide(vars, expr, context: expr); |
var body = js.call('# = # $mathop 1', [_visit(x), notNull(x)]); |
return new JS.MetaLet(vars, [body]); |
@@ -2220,9 +2227,10 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
JS.Node visitCascadeExpression(CascadeExpression node) { |
var savedCascadeTemp = _cascadeTarget; |
- var vars = {}; |
- _cascadeTarget = _bindValue(vars, '_', node.target, context: node); |
- var sections = _visitList(node.cascadeSections); |
+ var vars = <String, JS.Expression>{}; |
+ _cascadeTarget = |
+ _bindValue(vars, '_', node.target, context: node) as SimpleIdentifier; |
+ var sections = _visitList(node.cascadeSections) as List<JS.Expression>; |
sections.add(_visit(_cascadeTarget)); |
var result = new JS.MetaLet(vars, sections, statelessResult: true); |
_cascadeTarget = savedCascadeTemp; |
@@ -2470,19 +2478,18 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
]), then, otherwise); |
} |
- JS.Statement _statement(Iterable stmts) { |
- List s = stmts is List ? stmts : new List<JS.Statement>.from(stmts); |
+ JS.Statement _statement(List<JS.Statement> statements) { |
// TODO(jmesserly): empty block singleton? |
- if (s.length == 0) return new JS.Block([]); |
- if (s.length == 1) return s[0]; |
- return new JS.Block(s); |
+ if (statements.length == 0) return new JS.Block([]); |
+ if (statements.length == 1) return statements[0]; |
+ return new JS.Block(statements); |
} |
/// Visits the catch clause body. This skips the exception type guard, if any. |
/// That is handled in [_visitCatch]. |
@override |
JS.Statement visitCatchClause(CatchClause node) { |
- var body = []; |
+ var body = <JS.Statement>[]; |
var savedCatch = _catchParameter; |
if (node.catchKeyword != null) { |
@@ -2507,7 +2514,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
JS.Case visitSwitchCase(SwitchCase node) { |
var expr = _visit(node.expression); |
- var body = _visitList(node.statements); |
+ var body = _visitList(node.statements) as List<JS.Statement>; |
if (node.labels.isNotEmpty) { |
body.insert(0, js.comment('Unimplemented case labels: ${node.labels}')); |
} |
@@ -2517,7 +2524,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
JS.Default visitSwitchDefault(SwitchDefault node) { |
- var body = _visitList(node.statements); |
+ var body = _visitList(node.statements) as List<JS.Statement>; |
if (node.labels.isNotEmpty) { |
body.insert(0, js.comment('Unimplemented case labels: ${node.labels}')); |
} |
@@ -2526,8 +2533,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
} |
@override |
- JS.Switch visitSwitchStatement(SwitchStatement node) => |
- new JS.Switch(_visit(node.expression), _visitList(node.members)); |
+ JS.Switch visitSwitchStatement(SwitchStatement node) => new JS.Switch( |
+ _visit(node.expression), |
+ _visitList(node.members) as List<JS.SwitchClause>); |
@override |
JS.Statement visitLabeledStatement(LabeledStatement node) { |
@@ -2549,7 +2557,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
visitSymbolLiteral(SymbolLiteral node) { |
- emitSymbol() { |
+ JS.New emitSymbol() { |
// TODO(vsm): When we canonicalize, we need to treat private symbols |
// correctly. |
var name = js.string(node.components.join('.'), "'"); |
@@ -2560,8 +2568,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
visitListLiteral(ListLiteral node) { |
- emitList() { |
- JS.Expression list = new JS.ArrayInitializer(_visitList(node.elements)); |
+ JS.Expression emitList() { |
+ JS.Expression list = new JS.ArrayInitializer( |
+ _visitList(node.elements) as List<JS.Expression>); |
ParameterizedType type = node.staticType; |
var elementType = type.typeArguments.single; |
if (elementType != types.dynamicType) { |
@@ -2578,7 +2587,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
@override |
visitMapLiteral(MapLiteral node) { |
// TODO(jmesserly): we can likely make these faster. |
- emitMap() { |
+ JS.Expression emitMap() { |
var entries = node.entries; |
var mapArguments = null; |
if (entries.isEmpty) { |
@@ -2587,13 +2596,13 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
// Use JS object literal notation if possible, otherwise use an array. |
// We could do this any time all keys are non-nullable String type. |
// For now, support StringLiteral as the common non-nullable String case. |
- var props = []; |
+ var props = <JS.Property>[]; |
for (var e in entries) { |
props.add(new JS.Property(_visit(e.key), _visit(e.value))); |
} |
mapArguments = new JS.ObjectInitializer(props); |
} else { |
- var values = []; |
+ var values = <JS.Expression>[]; |
for (var e in entries) { |
values.add(_visit(e.key)); |
values.add(_visit(e.value)); |
@@ -2658,9 +2667,11 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
return result; |
} |
- List _visitList(Iterable<AstNode> nodes) { |
+ // TODO(jmesserly): this will need to be a generic method, if we ever want to |
+ // self-host strong mode. |
+ List /*<T>*/ _visitList /*<T>*/ (Iterable<AstNode> nodes) { |
if (nodes == null) return null; |
- var result = []; |
+ var result = /*<T>*/ []; |
for (var node in nodes) result.add(_visit(node)); |
return result; |
} |
@@ -2668,7 +2679,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
/// Visits a list of expressions, creating a comma expression if needed in JS. |
JS.Expression _visitListToBinary(List<Expression> nodes, String operator) { |
if (nodes == null || nodes.isEmpty) return null; |
- return new JS.Expression.binary(_visitList(nodes), operator); |
+ return new JS.Expression.binary( |
+ _visitList(nodes) as List<JS.Expression>, operator); |
} |
/// Like [_emitMemberName], but for declaration sites. |
@@ -2739,7 +2751,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
if (name.startsWith('_')) { |
return _privateNames.putIfAbsent( |
- name, () => _initSymbol(new JS.TemporaryId(name))); |
+ name, () => _initSymbol(new JS.TemporaryId(name)) as JS.TemporaryId); |
} |
if (name == '[]') { |
@@ -2795,7 +2807,7 @@ class JSGenerator extends CodeGenerator { |
void _addExtensionType(InterfaceType t) { |
if (t.isObject || !_extensionTypes.add(t.element)) return; |
- t = fillDynamicTypeArgs(t, rules.provider); |
+ t = fillDynamicTypeArgs(t, rules.provider) as InterfaceType; |
t.interfaces.forEach(_addExtensionType); |
t.mixins.forEach(_addExtensionType); |
_addExtensionType(t.superclass); |