Chromium Code Reviews| Index: lib/src/compiler/code_generator.dart |
| diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart |
| index 69b6ebff8be7c9bf09492da6a226c8a8ab27613e..564660a1bc72b8f9a52b97396c3705554e283f6f 100644 |
| --- a/lib/src/compiler/code_generator.dart |
| +++ b/lib/src/compiler/code_generator.dart |
| @@ -283,12 +283,12 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| var libraryJSName = getAnnotationName(e.library, isPublicJSAnnotation); |
| - var libraryPrefix = []; |
| + var libraryPrefix = <String>[]; |
| if (libraryJSName != null && libraryJSName.isNotEmpty) { |
| libraryPrefix.addAll(libraryJSName.split('.')); |
| } |
| - var elementJSName; |
| + String elementJSName; |
| if (findAnnotation(e, isPublicJSAnnotation) != null) { |
| elementJSName = getAnnotationName(e, isPublicJSAnnotation) ?? ''; |
| } |
| @@ -300,7 +300,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| if (elementJSName == null) return null; |
| - var elementJSParts = []; |
| + var elementJSParts = <String>[]; |
| if (elementJSName.isNotEmpty) { |
| elementJSParts.addAll(elementJSName.split('.')); |
| } else { |
| @@ -314,7 +314,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var jsName = _getJSName(e); |
| if (jsName == null) return null; |
| var fullName = ['global']..addAll(jsName); |
| - var access = _runtimeLibVar; |
| + JS.Expression access = _runtimeLibVar; |
| for (var part in fullName) { |
| access = new JS.PropertyAccess(access, js.string(part)); |
| } |
| @@ -692,7 +692,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| className = _emitTopLevelName(classElem); |
| } |
| - var allFields = new List.from(fields)..addAll(staticFields); |
| + var allFields = fields.toList()..addAll(staticFields); |
| var superclasses = getSuperclasses(classElem); |
| var virtualFields = <FieldElement, JS.TemporaryId>{}; |
| var virtualFieldSymbols = <JS.Statement>[]; |
| @@ -942,7 +942,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var jsMethods = <JS.Method>[]; |
| if (!node.isStatic) { |
| for (var decl in node.fields.variables) { |
| - var field = decl.element; |
| + var field = decl.element as FieldElement; |
| var name = getAnnotationName(field, isJsName) ?? field.name; |
| // Generate getter |
| var fn = new JS.Fun([], js.statement('{ return this.#; }', [name])); |
| @@ -1344,12 +1344,12 @@ class CodeGenerator extends GeneralizingAstVisitor |
| dartxNames.add(_elementMemberName(m.element, useExtension: false)); |
| } |
| } |
| - for (var f in fields) { |
| - if (!f.isStatic) { |
| - for (var d in f.fields.variables) { |
| - if (d.element.isPublic) { |
| - dartxNames.add( |
| - _elementMemberName(d.element.getter, useExtension: false)); |
| + for (var fieldDecl in fields) { |
| + if (!fieldDecl.isStatic) { |
| + for (var field in fieldDecl.fields.variables) { |
| + var e = field.element as FieldElement; |
| + if (e.isPublic) { |
| + dartxNames.add(_elementMemberName(e.getter, useExtension: false)); |
| } |
| } |
| } |
| @@ -1535,7 +1535,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| JS.Statement visitRedirectingConstructorInvocation( |
| RedirectingConstructorInvocation node) { |
| var ctor = node.staticElement; |
| - var cls = ctor.enclosingElement as ClassElement; |
| + var cls = ctor.enclosingElement; |
| // We can't dispatch to the constructor with `this.new` as that might hit a |
| // derived class constructor with the same name. |
| return js.statement('#.prototype.#.call(this, #);', [ |
| @@ -1839,7 +1839,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var props = <JS.Method>[_emitTopLevelProperty(node)]; |
| var setter = element.correspondingSetter; |
| if (setter != null) { |
| - props.add(_loader.emitDeclaration(setter, _emitTopLevelProperty)); |
| + props.add(_loader.emitDeclaration( |
| + setter, (node) => _emitTopLevelProperty(node))); |
|
Leaf
2016/05/26 17:53:37
Annoying. I guess alternatively emitDeclaration c
Jennifer Messerly
2016/05/26 18:11:48
yeah, that was my thought too. Seems like either w
|
| } |
| return js.statement('dart.copyProperties(#, { # });', |
| [emitLibraryName(currentLibrary), props]); |
| @@ -1849,7 +1850,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var props = <JS.Method>[_emitTopLevelProperty(node)]; |
| var getter = element.correspondingGetter; |
| if (getter != null) { |
| - props.add(_loader.emitDeclaration(getter, _emitTopLevelProperty)); |
| + props.add(_loader.emitDeclaration( |
| + getter, (node) => _emitTopLevelProperty(node))); |
| } |
| return js.statement('dart.copyProperties(#, { # });', |
| [emitLibraryName(currentLibrary), props]); |
| @@ -1974,7 +1976,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| JS.ArrowFun _emitArrowFunction(FunctionExpression node) { |
| JS.Fun f = _emitFunctionBody(node.element, node.parameters, node.body); |
| - var body = f.body; |
| + JS.Node body = f.body; |
| // Simplify `=> { return e; }` to `=> e` |
| if (body is JS.Block) { |
| @@ -1990,25 +1992,24 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var fn = new JS.ArrowFun(f.params, body, |
| typeParams: f.typeParams, returnType: f.returnType); |
| - return annotate(_makeGenericFunction(fn), node); |
| + return annotate(_makeGenericArrowFun(fn), node); |
| } |
| - JS.FunctionExpression/*=T*/ _makeGenericFunction |
| - /*<T extends JS.FunctionExpression>*/(JS.FunctionExpression/*=T*/ fn) { |
| + JS.ArrowFun _makeGenericArrowFun(JS.ArrowFun fn) { |
| + if (fn.typeParams == null || fn.typeParams.isEmpty) return fn; |
| + return new JS.ArrowFun(fn.typeParams, fn); |
| + } |
| + |
| + JS.Fun _makeGenericFunction(JS.Fun fn) { |
| if (fn.typeParams == null || fn.typeParams.isEmpty) return fn; |
| // TODO(jmesserly): we could make these default to `dynamic`. |
| - var typeParams = fn.typeParams; |
| - if (fn is JS.ArrowFun) { |
| - return new JS.ArrowFun(typeParams, fn); |
| - } |
| - var f = fn as JS.Fun; |
| return new JS.Fun( |
| - typeParams, |
| + fn.typeParams, |
| new JS.Block([ |
| // Convert the function to an => function, to ensure `this` binding. |
| - new JS.Return(new JS.ArrowFun(f.params, f.body, |
| - typeParams: f.typeParams, returnType: f.returnType)) |
| + new JS.Return(new JS.ArrowFun(fn.params, fn.body, |
| + typeParams: fn.typeParams, returnType: fn.returnType)) |
| ])); |
| } |
| @@ -2082,7 +2083,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| // `await` is generated as `yield`. |
| // runtime/_generators.js has an example of what the code is generated as. |
| var savedController = _asyncStarController; |
| - List jsParams = visitFormalParameterList(parameters); |
| + var jsParams = visitFormalParameterList(parameters); |
| if (kind == 'asyncStar') { |
| _asyncStarController = new JS.TemporaryId('stream'); |
| jsParams.insert(0, _asyncStarController); |
| @@ -2276,8 +2277,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
| _emitType(types[i], nameType: nameType, hoistType: hoistType); |
| var value = typeName; |
| if (options.emitMetadata && metadata.isNotEmpty) { |
| - metadata = metadata.map(_instantiateAnnotation).toList(); |
| - value = new JS.ArrayInitializer([typeName]..addAll(metadata)); |
| + value = new JS.ArrayInitializer( |
| + [typeName]..addAll(metadata.map(_instantiateAnnotation))); |
| } |
| result.add(value); |
| } |
| @@ -2587,7 +2588,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| JS.Expression _emitMethodCall(Expression target, MethodInvocation node) { |
| - List<JS.Expression> args = _visit(node.argumentList); |
| + var args = _visit(node.argumentList) as List<JS.Expression>; |
| var typeArgs = _emitInvokeTypeArguments(node); |
| if (target is SuperExpression && !_superAllowed) { |
| @@ -2669,7 +2670,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| /// an expression. |
| JS.Expression _emitFunctionCall(InvocationExpression node) { |
| var fn = _visit(node.function); |
| - var args = _visit(node.argumentList); |
| + var args = _visit(node.argumentList) as List<JS.Expression>; |
| if (DynamicInvoke.get(node.function)) { |
| var typeArgs = _emitInvokeTypeArguments(node); |
| if (typeArgs != null) { |
| @@ -2746,7 +2747,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var args = node.argumentList.arguments; |
| // arg[0] is static return type, used in `RestrictedStaticTypeAnalyzer` |
| var code = args[1]; |
| - var templateArgs; |
| + List<AstNode> templateArgs; |
| var source; |
| if (code is StringInterpolation) { |
| if (args.length > 2) { |
| @@ -2763,7 +2764,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| }).join(); |
| } else { |
| - templateArgs = args.skip(2); |
| + templateArgs = args.skip(2).toList(); |
| source = (code as StringLiteral).stringValue; |
| } |
| @@ -4037,7 +4038,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| // full desugaring seems okay. |
| var streamIterator = rules.instantiateToBounds(_asyncStreamIterator); |
| var createStreamIter = _emitInstanceCreationExpression( |
| - streamIterator.element.unnamedConstructor, |
| + (streamIterator.element as ClassElement).unnamedConstructor, |
| streamIterator, |
| null, |
| AstBuilder.argumentList([node.iterable]), |
| @@ -4333,7 +4334,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| List/*<T>*/ _visitList/*<T extends AstNode>*/(Iterable/*<T>*/ nodes) { |
| if (nodes == null) return null; |
| var result = /*<T>*/ []; |
| - for (var node in nodes) result.add(_visit(node)); |
| + for (var node in nodes) result.add(_visit(node) as dynamic/*=T*/); |
| return result; |
| } |
| @@ -4466,7 +4467,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| // Dart "extension" methods. Used for JS Array, Boolean, Number, String. |
| var baseType = type; |
| while (baseType is TypeParameterType) { |
| - baseType = baseType.element.bound; |
| + baseType = (baseType.element as TypeParameterElement).bound; |
| } |
| useExtension = baseType != null && |
| _extensionTypes.hasNativeSubtype(baseType) && |
| @@ -4506,7 +4507,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| [Element element]) { |
| if (options.closure && element != null) { |
| node = node.withClosureAnnotation(closureAnnotationFor( |
| - node, original, element, namedArgumentTemp.name)); |
| + node, original, element, namedArgumentTemp.name)) as dynamic/*=T*/; |
| } |
| return node..sourceInformation = original; |
| } |