remove AST_ArrowParametersOrSeq (#1997)
This commit is contained in:
73
lib/ast.js
73
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: {
|
||||
|
||||
113
lib/parse.js
113
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()
|
||||
|
||||
Reference in New Issue
Block a user