| Index: lib/src/codegen/js_codegen.dart
|
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart
|
| index 005808114b65eefe3e35961473b15a75dcb16424..65dddc8093fa1b8fb418b5610058e18df71f9d47 100644
|
| --- a/lib/src/codegen/js_codegen.dart
|
| +++ b/lib/src/codegen/js_codegen.dart
|
| @@ -466,10 +466,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| return result;
|
| }
|
|
|
| - Iterable<JS.Identifier> _emitTypeParams(TypeParameterizedElement e) sync* {
|
| + Iterable<JS.TypeParameter> _emitTypeParams(TypeParameterizedElement e) sync* {
|
| if (!options.closure) return;
|
| for (var typeParam in e.typeParameters) {
|
| - yield new JS.Identifier(typeParam.name);
|
| + yield new JS.TypeParameter(
|
| + new JS.Identifier(typeParam.name),
|
| + bound: emitTypeRef(typeParam.bound));
|
| }
|
| }
|
|
|
| @@ -483,11 +485,10 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
|
|
| makeInitialization(VariableDeclaration decl) =>
|
| new JS.VariableInitialization(
|
| - new JS.Identifier(
|
| - // TODO(ochafik): use a refactored _emitMemberName instead.
|
| - decl.name.name,
|
| - type: emitTypeRef(decl.element.type)),
|
| - null);
|
| + // TODO(ochafik): use a refactored _emitMemberName instead.
|
| + new JS.Identifier(decl.name.name),
|
| + null,
|
| + type: emitTypeRef(decl.element.type));
|
|
|
| for (var field in fields) {
|
| yield new JS.VariableDeclarationList(
|
| @@ -1211,7 +1212,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| for (var p in ctor.parameters.parameters) {
|
| var element = p.element;
|
| if (element is FieldFormalParameterElement) {
|
| - fields[element.field] = _emitFormalParameter(p, allowType: false);
|
| + fields[element.field] = _visit(p.identifier);
|
| }
|
| }
|
|
|
| @@ -1269,7 +1270,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
|
|
| var body = <JS.Statement>[];
|
| for (var param in parameters.parameters) {
|
| - var jsParam = _emitSimpleIdentifier(param.identifier, allowType: false);
|
| + var jsParam = _visit(param.identifier);
|
|
|
| if (param.kind == ParameterKind.NAMED) {
|
| if (!options.destructureNamedParams) {
|
| @@ -1336,7 +1337,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| params.isNotEmpty) {
|
| // []= methods need to return the value. We could also address this at
|
| // call sites, but it's cleaner to instead transform the operator method.
|
| - var returnValue = new JS.Return(params.last);
|
| + // TODO(ochafik): How do we ensure this is an expression and not a destructing pattern?
|
| + var returnValue = new JS.Return(params.last.binding as JS.Expression);
|
| var body = fn.body;
|
| if (JS.Return.foundIn(fn)) {
|
| // If a return is inside body, transform `(params) { body }` to
|
| @@ -1543,7 +1545,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| }
|
|
|
| JS.Fun _emitFunctionBody(List<JS.Parameter> params, FunctionBody body,
|
| - List<JS.Identifier> typeParams, JS.TypeRef returnType) {
|
| + List<JS.TypeParameter> typeParams, JS.TypeRef returnType) {
|
| // sync*, async, async*
|
| if (body.isAsynchronous || body.isGenerator) {
|
| return new JS.Fun(
|
| @@ -1641,14 +1643,10 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| ]);
|
| }
|
|
|
| - @override
|
| - JS.Expression visitSimpleIdentifier(SimpleIdentifier node) =>
|
| - _emitSimpleIdentifier(node);
|
| -
|
| /// Writes a simple identifier. This can handle implicit `this` as well as
|
| /// going through the qualified library name if necessary.
|
| - JS.Expression _emitSimpleIdentifier(SimpleIdentifier node,
|
| - {bool allowType: false}) {
|
| + @override
|
| + JS.Expression visitSimpleIdentifier(SimpleIdentifier node) {
|
| var accessor = node.staticElement;
|
| if (accessor == null) {
|
| return js.commentExpression(
|
| @@ -1717,10 +1715,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| }
|
| }
|
|
|
| - return annotate(
|
| - new JS.Identifier(name,
|
| - type: allowType ? emitTypeRef(node.bestType) : null),
|
| - node);
|
| + return annotate(new JS.Identifier(name), node);
|
| }
|
|
|
| JS.TemporaryId _getTemp(Element key, String name) =>
|
| @@ -2095,13 +2090,13 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| var args = <JS.Expression>[];
|
| var named = <JS.Property>[];
|
| for (var arg in node.arguments) {
|
| + var jsArg = _visit(arg);
|
| if (arg is NamedExpression) {
|
| - named.add(_visit(arg));
|
| + named.add(jsArg);
|
| } else if (arg is MethodInvocation && isJsSpreadInvocation(arg)) {
|
| - args.add(
|
| - new JS.RestParameter(_visit(arg.argumentList.arguments.single)));
|
| + args.add(new JS.Spread(jsArg));
|
| } else {
|
| - args.add(_visit(arg));
|
| + args.add(jsArg);
|
| }
|
| }
|
| if (named.isNotEmpty) {
|
| @@ -2156,17 +2151,12 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| needsOpts = true;
|
| }
|
| } else {
|
| - var jsParam = _visit(param);
|
| - result.add(
|
| - param is DefaultFormalParameter && options.destructureNamedParams
|
| - ? new JS.DestructuredVariable(
|
| - name: jsParam, defaultValue: _defaultParamValue(param))
|
| - : jsParam);
|
| + result.add(_visit(param));
|
| }
|
| }
|
|
|
| if (needsOpts) {
|
| - result.add(_namedArgTemp);
|
| + result.add(new JS.Parameter(_namedArgTemp));
|
| } else if (namedVars.isNotEmpty) {
|
| // Note: `var {valueOf} = {}` extracts `Object.prototype.valueOf`, so
|
| // in case there are conflicting names we create an object without
|
| @@ -2174,8 +2164,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| var defaultOpts = hasNamedArgsConflictingWithObjectProperties
|
| ? js.call('Object.create(null)')
|
| : js.call('{}');
|
| - result.add(new JS.DestructuredVariable(
|
| - structure: new JS.ObjectBindingPattern(namedVars),
|
| + result.add(new JS.Parameter(
|
| + new JS.ObjectBindingPattern(namedVars),
|
| type: emitNamedParamsArgType(node.parameterElements),
|
| defaultValue: defaultOpts));
|
| }
|
| @@ -2308,9 +2298,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| return _emitTopLevelField(node);
|
| }
|
|
|
| - var name =
|
| - new JS.Identifier(node.name.name, type: emitTypeRef(node.element.type));
|
| - return new JS.VariableInitialization(name, _visitInitializer(node));
|
| + var name = new JS.Identifier(node.name.name);
|
| + return new JS.VariableInitialization(name, _visitInitializer(node),
|
| + type: emitTypeRef(node.element.type));
|
| }
|
|
|
| bool _isFinalJSDecl(AstNode field) =>
|
| @@ -2403,9 +2393,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| annotate(
|
| new JS.VariableDeclarationList(declKeyword, [
|
| new JS.VariableInitialization(
|
| - new JS.Identifier(fieldName,
|
| - type: emitTypeRef(field.element.type)),
|
| - jsInit)
|
| + new JS.Identifier(fieldName),
|
| + jsInit,
|
| + type: emitTypeRef(field.element.type))
|
| ]),
|
| field,
|
| field.element)
|
| @@ -2837,13 +2827,15 @@ class JSCodegenVisitor extends GeneralizingAstVisitor
|
| _visit(node.expression);
|
|
|
| @override
|
| - visitFormalParameter(FormalParameter node) => _emitFormalParameter(node);
|
| -
|
| - _emitFormalParameter(FormalParameter node, {bool allowType: true}) {
|
| - var id = _emitSimpleIdentifier(node.identifier, allowType: allowType);
|
| -
|
| - var isRestArg = findAnnotation(node.element, isJsRestAnnotation) != null;
|
| - return isRestArg ? new JS.RestParameter(id) : id;
|
| + visitFormalParameter(FormalParameter node) {
|
| + var defaultValue =
|
| + node is DefaultFormalParameter && options.destructureNamedParams
|
| + ? _defaultParamValue(node) : null;
|
| + return new JS.Parameter(
|
| + _visit(node.identifier),
|
| + type: emitTypeRef(node.element.type),
|
| + defaultValue: defaultValue,
|
| + isRest: findAnnotation(node.element, isJsRestAnnotation) != null);
|
| }
|
|
|
| @override
|
|
|