| Index: lib/src/js/printer.dart
|
| diff --git a/lib/src/js/printer.dart b/lib/src/js/printer.dart
|
| index cc347255cb69d824453503dc5aeac5ba30f5cda4..c8eca7aaf988647380fd2cd9eeebbf7789291f14 100644
|
| --- a/lib/src/js/printer.dart
|
| +++ b/lib/src/js/printer.dart
|
| @@ -213,9 +213,15 @@ class Printer extends TypeScriptTypePrinter implements NodeVisitor {
|
| out(",");
|
| spaceOut();
|
| }
|
| - visitNestedExpression(nodes[i], hasRequiredType,
|
| - newInForInit: newInForInit,
|
| - newAtStatementBegin: newAtStatementBegin);
|
| + var node = nodes[i];
|
| + if (node is Expression) {
|
| + visitNestedExpression(node, hasRequiredType,
|
| + newInForInit: newInForInit,
|
| + newAtStatementBegin: newAtStatementBegin);
|
| + } else {
|
| + // TODO(ochafik): Precedence of Parameters?
|
| + visit(node);
|
| + }
|
| }
|
| }
|
|
|
| @@ -878,12 +884,20 @@ class Printer extends TypeScriptTypePrinter implements NodeVisitor {
|
|
|
| visitIdentifier(Identifier node) {
|
| out(localNamer.getName(node));
|
| + }
|
| +
|
| + visitParameter(Parameter node) {
|
| + if (node.isRest) out('...');
|
| + visit(node.binding);
|
| outTypeAnnotation(node.type);
|
| }
|
|
|
| - visitRestParameter(RestParameter node) {
|
| - out('...');
|
| - visitIdentifier(node.parameter);
|
| + visitTypeParameter(TypeParameter node) {
|
| + visit(node.name);
|
| + if (node.bound != null && options.shouldEmitTypes) {
|
| + out(" extends ");
|
| + visit(node.bound);
|
| + }
|
| }
|
|
|
| bool isDigit(int charCode) {
|
| @@ -944,10 +958,11 @@ class Printer extends TypeScriptTypePrinter implements NodeVisitor {
|
|
|
| visitArrowFun(ArrowFun fun) {
|
| localNamer.enterScope(fun);
|
| - if (fun.params.length == 1 &&
|
| + if (fun.params.length == 1 && fun.params.single.binding is Expression &&
|
| (fun.params.single.type == null || !options.shouldEmitTypes)) {
|
| - visitNestedExpression(fun.params.single, SPREAD,
|
| - newInForInit: false, newAtStatementBegin: false);
|
| + visit(fun.params.single.binding);
|
| + // visitNestedExpression(fun.params.single, SPREAD,
|
| + // newInForInit: false, newAtStatementBegin: false);
|
| } else {
|
| out("(");
|
| visitCommaSeparated(fun.params, SPREAD,
|
| @@ -1093,7 +1108,7 @@ class Printer extends TypeScriptTypePrinter implements NodeVisitor {
|
| lineOut();
|
| }
|
|
|
| - void outTypeParams(Iterable<Identifier> typeParams) {
|
| + void outTypeParams(Iterable<TypeParameter> typeParams) {
|
| if (typeParams != null && options.shouldEmitTypes && typeParams.isNotEmpty) {
|
| out("<");
|
| var first = true;
|
| @@ -1391,7 +1406,18 @@ class VarCollector extends BaseVisitor {
|
| nested = true;
|
| if (fun.params != null) {
|
| for (var param in fun.params) {
|
| - params.add(param.name);
|
| + collectBinding(Node node) {
|
| + if (node is Identifier) {
|
| + // TODO(ochafik): collect destructured
|
| + params.add(node.name);
|
| + } else if (node is DestructuredVariable) {
|
| + collectBinding(node.name);
|
| + collectBinding(node.structure);
|
| + } else if (node is BindingPattern) {
|
| + node.variables.forEach(collectBinding);
|
| + }
|
| + }
|
| + collectBinding(param.binding);
|
| }
|
| }
|
| fun.body.accept(this);
|
| @@ -1644,12 +1670,13 @@ abstract class VariableDeclarationVisitor<T> extends BaseVisitor<T> {
|
|
|
| _scanVariableBinding(VariableBinding d) {
|
| if (d is Identifier) declare(d);
|
| + else if (d is Parameter) _scanVariableBinding(d.binding);
|
| else d.accept(this);
|
| }
|
|
|
| - visitRestParameter(RestParameter node) {
|
| - _scanVariableBinding(node.parameter);
|
| - super.visitRestParameter(node);
|
| + visitParameter(Parameter node) {
|
| + _scanVariableBinding(node.binding);
|
| + super.visitParameter(node);
|
| }
|
|
|
| visitDestructuredVariable(DestructuredVariable node) {
|
|
|