diff --git a/lib/ast.js b/lib/ast.js index 0541dc89..343dd42d 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -422,6 +422,13 @@ var AST_ArrowParametersOrSeq = DEFNODE("ArrowParametersOrSeq", "expressions", { is_array: true, names: ex.elements.map(to_fun_args) }); + } else if (ex instanceof AST_Assign && ex.left instanceof AST_Symbol) { + return new AST_SymbolFunarg({ + name: ex.left.name, + default: ex.right, + start: ex.start, + end: ex.end + }); } else { croak("Invalid function parameter", ex.start.line, ex.start.col); } @@ -1026,8 +1033,16 @@ var AST_SymbolConst = DEFNODE("SymbolConst", null, { $documentation: "A constant declaration" }, AST_SymbolDeclaration); -var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, { +var AST_SymbolFunarg = DEFNODE("SymbolFunarg", "default", { $documentation: "Symbol naming a function argument", + $propdoc: { + default: "[AST_Expression] The default for this parameter. For example, `= 6`" + }, + _walk: function (visitor) { + return visitor._visit(this, function() { + if (this.default) this.default._walk(visitor); + }); + } }, AST_SymbolVar); var AST_SymbolDefun = DEFNODE("SymbolDefun", null, { diff --git a/lib/output.js b/lib/output.js index 80f66e0e..4451d2e5 100644 --- a/lib/output.js +++ b/lib/output.js @@ -1275,9 +1275,21 @@ function OutputStream(options) { output.space(); self.value.print(output); }); - DEFPRINT(AST_Symbol, function(self, output){ - var def = self.definition(); - output.print_name(def ? def.mangled_name || def.name : self.name); + AST_Symbol.DEFMETHOD("_do_print", function(output){ + var def = this.definition(); + output.print_name(def ? def.mangled_name || def.name : this.name); + }); + DEFPRINT(AST_Symbol, function (self, output) { + self._do_print(output); + }); + DEFPRINT(AST_SymbolFunarg, function(self, output){ + self._do_print(output); + if (self.default) { + output.space(); + output.print('='); + output.space(); + self.default.print(output) + } }); DEFPRINT(AST_ObjectSymbol, function(self, output){ var name = self.mangled_key || self.symbol.name; diff --git a/test/compress/harmony.js b/test/compress/harmony.js index e53f9458..a1f2aa9c 100644 --- a/test/compress/harmony.js +++ b/test/compress/harmony.js @@ -132,6 +132,14 @@ destructuring_arguments: { } } +default_arguments: { + input: { + function x(a = 6) { } + function x(a = (6 + 5)) { } + } + expect_exact: "function x(a=6){}function x(a=6+5){}" +} + concise_methods: { input: { x = {