From c988e5f4d6eb06b954aca8cf7a5e34bf01ec644c Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Wed, 24 May 2017 17:45:18 +0800 Subject: [PATCH] remove `AST_ArrowParametersOrSeq` (#1997) --- lib/ast.js | 73 --------------------------------- lib/parse.js | 113 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 73 insertions(+), 113 deletions(-) diff --git a/lib/ast.js b/lib/ast.js index 0ef121b4..452c5bd0 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -355,79 +355,6 @@ var AST_Expansion = DEFNODE("Expansion", "expression", { } }); -var AST_ArrowParametersOrSeq = DEFNODE("ArrowParametersOrSeq", "expressions", { - $documentation: "A set of arrow function parameters or a sequence expression. This is used because when the parser sees a \"(\" it could be the start of a seq, or the start of a parameter list of an arrow function.", - $propdoc: { - expressions: "[AST_Expression|AST_Destructuring|AST_Expansion*] array of expressions or argument names or destructurings." - }, - as_params: function (croak) { - // We don't want anything which doesn't belong in a destructuring - var root = this; - return this.expressions.map(function to_fun_args(ex, _, __, default_seen_above) { - var insert_default = function(ex, default_value) { - if (default_value) { - return new AST_DefaultAssign({ - start: ex.start, - left: ex, - operator: "=", - right: default_value, - end: default_value.end - }); - } - return ex; - } - if (ex instanceof AST_Object) { - return insert_default(new AST_Destructuring({ - start: ex.start, - end: ex.end, - is_array: false, - names: ex.properties.map(to_fun_args) - }), default_seen_above); - } else if (ex instanceof AST_ObjectKeyVal) { - if (ex.key instanceof AST_SymbolRef) { - ex.key = to_fun_args(ex.key, 0, [ex.key]); - } - ex.value = to_fun_args(ex.value, 0, [ex.key]); - return insert_default(ex, default_seen_above); - } else if (ex instanceof AST_Hole) { - return ex; - } else if (ex instanceof AST_Destructuring) { - ex.names = ex.names.map(to_fun_args); - return insert_default(ex, default_seen_above); - } else if (ex instanceof AST_SymbolRef) { - return insert_default(new AST_SymbolFunarg({ - name: ex.name, - start: ex.start, - end: ex.end - }), default_seen_above); - } else if (ex instanceof AST_Expansion) { - ex.expression = to_fun_args(ex.expression); - return insert_default(ex, default_seen_above); - } else if (ex instanceof AST_Array) { - return insert_default(new AST_Destructuring({ - start: ex.start, - end: ex.end, - is_array: true, - names: ex.elements.map(to_fun_args) - }), default_seen_above); - } else if (ex instanceof AST_Assign) { - return insert_default(to_fun_args(ex.left, undefined, undefined, ex.right), default_seen_above); - } else if (ex instanceof AST_DefaultAssign) { - ex.left = to_fun_args(ex.left, 0, [ex.left]); - return ex; - } else { - croak("Invalid function parameter", ex.start.line, ex.start.col); - } - }); - }, - as_expr: function() { - var exprs = this.expressions; - return exprs.length == 1 ? exprs[0] : new AST_Sequence({ - expressions: exprs - }); - } -}); - var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator", { $documentation: "Base class for functions", $propdoc: { diff --git a/lib/parse.js b/lib/parse.js index 35c5fd27..88da98d8 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -1272,26 +1272,17 @@ function parse($TEXT, options) { }); }; - var arrow_function = function(args) { + var arrow_function = function(start, argnames) { if (S.token.nlb) { croak("Unexpected newline before arrow (=>)"); } expect_token("arrow", "=>"); - var argnames; - if (typeof args.length === 'number') { - argnames = args; - } else { - argnames = args.as_params(croak); - } - - var body = is("punc", "{") ? - _function_body(true) : - _function_body(false); + var body = _function_body(is("punc", "{")); return new AST_Arrow({ - start : args.start, + start : start, end : body.end, argnames : argnames, body : body @@ -1615,8 +1606,6 @@ function parse($TEXT, options) { } function params_or_seq_() { - var start = S.token - expect("("); var first = true; var a = []; while (!is("punc", ")")) { @@ -1626,23 +1615,17 @@ function parse($TEXT, options) { next(); a.push(new AST_Expansion({ start: prev(), - expression: expression(false), + expression: expression(), end: S.token, })); if (!is("punc", ")")) { unexpected(spread_token); } } else { - a.push(expression(false)); + a.push(expression()); } } - var end = S.token - next(); - return new AST_ArrowParametersOrSeq({ - start: start, - end: end, - expressions: a - }); + return a; } function _function_body(block, generator, name, args) { @@ -1931,6 +1914,63 @@ function parse($TEXT, options) { return ret; }; + function to_fun_args(ex, _, __, default_seen_above) { + var insert_default = function(ex, default_value) { + if (default_value) { + return new AST_DefaultAssign({ + start: ex.start, + left: ex, + operator: "=", + right: default_value, + end: default_value.end + }); + } + return ex; + } + if (ex instanceof AST_Object) { + return insert_default(new AST_Destructuring({ + start: ex.start, + end: ex.end, + is_array: false, + names: ex.properties.map(to_fun_args) + }), default_seen_above); + } else if (ex instanceof AST_ObjectKeyVal) { + if (ex.key instanceof AST_SymbolRef) { + ex.key = to_fun_args(ex.key, 0, [ex.key]); + } + ex.value = to_fun_args(ex.value, 0, [ex.key]); + return insert_default(ex, default_seen_above); + } else if (ex instanceof AST_Hole) { + return ex; + } else if (ex instanceof AST_Destructuring) { + ex.names = ex.names.map(to_fun_args); + return insert_default(ex, default_seen_above); + } else if (ex instanceof AST_SymbolRef) { + return insert_default(new AST_SymbolFunarg({ + name: ex.name, + start: ex.start, + end: ex.end + }), default_seen_above); + } else if (ex instanceof AST_Expansion) { + ex.expression = to_fun_args(ex.expression); + return insert_default(ex, default_seen_above); + } else if (ex instanceof AST_Array) { + return insert_default(new AST_Destructuring({ + start: ex.start, + end: ex.end, + is_array: true, + names: ex.elements.map(to_fun_args) + }), default_seen_above); + } else if (ex instanceof AST_Assign) { + return insert_default(to_fun_args(ex.left, undefined, undefined, ex.right), default_seen_above); + } else if (ex instanceof AST_DefaultAssign) { + ex.left = to_fun_args(ex.left, 0, [ex.left]); + return ex; + } else { + croak("Invalid function parameter", ex.start.line, ex.start.col); + } + } + var expr_atom = function(allow_calls) { if (is("operator", "new")) { return new_(allow_calls); @@ -1939,13 +1979,15 @@ function parse($TEXT, options) { if (is("punc")) { switch (start.value) { case "(": - var ex = params_or_seq_(); + next(); + var exprs = params_or_seq_(); + expect(")"); if (is("arrow", "=>")) { - ex.start = start; - ex.end = S.token; - return arrow_function(ex); + return arrow_function(start, exprs.map(to_fun_args)); } - ex = ex.as_expr(croak); + var ex = exprs.length == 1 ? exprs[0] : new AST_Sequence({ + expressions: exprs + }); ex.start = start; ex.end = S.token; return subscripts(ex, allow_calls); @@ -2668,7 +2710,7 @@ function parse($TEXT, options) { if (start.type == "punc" && start.value == "(" && peek().value == ")") { next(); next(); - return arrow_function([]); + return arrow_function(start, []); } if (is("name") && is_token(peek(), "arrow")) { @@ -2678,7 +2720,7 @@ function parse($TEXT, options) { end: start, }); next(); - return arrow_function([param]) + return arrow_function(start, [param]); } var left = maybe_conditional(no_in); @@ -2709,16 +2751,7 @@ function parse($TEXT, options) { next(); commas = true; } - if (exprs.length == 1) { - var expr = exprs[0]; - if (!(expr instanceof AST_SymbolRef) || !is("arrow", "=>")) return expr; - return arrow_function(new AST_ArrowParametersOrSeq({ - start: expr.start, - end: expr.end, - expressions: [expr] - })); - } - return new AST_Sequence({ + return exprs.length == 1 ? exprs[0] : new AST_Sequence({ start : start, expressions : exprs, end : peek()