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", {
|
var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments is_generator", {
|
||||||
$documentation: "Base class for functions",
|
$documentation: "Base class for functions",
|
||||||
$propdoc: {
|
$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) {
|
if (S.token.nlb) {
|
||||||
croak("Unexpected newline before arrow (=>)");
|
croak("Unexpected newline before arrow (=>)");
|
||||||
}
|
}
|
||||||
|
|
||||||
expect_token("arrow", "=>");
|
expect_token("arrow", "=>");
|
||||||
|
|
||||||
var argnames;
|
var body = _function_body(is("punc", "{"));
|
||||||
if (typeof args.length === 'number') {
|
|
||||||
argnames = args;
|
|
||||||
} else {
|
|
||||||
argnames = args.as_params(croak);
|
|
||||||
}
|
|
||||||
|
|
||||||
var body = is("punc", "{") ?
|
|
||||||
_function_body(true) :
|
|
||||||
_function_body(false);
|
|
||||||
|
|
||||||
return new AST_Arrow({
|
return new AST_Arrow({
|
||||||
start : args.start,
|
start : start,
|
||||||
end : body.end,
|
end : body.end,
|
||||||
argnames : argnames,
|
argnames : argnames,
|
||||||
body : body
|
body : body
|
||||||
@@ -1615,8 +1606,6 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function params_or_seq_() {
|
function params_or_seq_() {
|
||||||
var start = S.token
|
|
||||||
expect("(");
|
|
||||||
var first = true;
|
var first = true;
|
||||||
var a = [];
|
var a = [];
|
||||||
while (!is("punc", ")")) {
|
while (!is("punc", ")")) {
|
||||||
@@ -1626,23 +1615,17 @@ function parse($TEXT, options) {
|
|||||||
next();
|
next();
|
||||||
a.push(new AST_Expansion({
|
a.push(new AST_Expansion({
|
||||||
start: prev(),
|
start: prev(),
|
||||||
expression: expression(false),
|
expression: expression(),
|
||||||
end: S.token,
|
end: S.token,
|
||||||
}));
|
}));
|
||||||
if (!is("punc", ")")) {
|
if (!is("punc", ")")) {
|
||||||
unexpected(spread_token);
|
unexpected(spread_token);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
a.push(expression(false));
|
a.push(expression());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var end = S.token
|
return a;
|
||||||
next();
|
|
||||||
return new AST_ArrowParametersOrSeq({
|
|
||||||
start: start,
|
|
||||||
end: end,
|
|
||||||
expressions: a
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _function_body(block, generator, name, args) {
|
function _function_body(block, generator, name, args) {
|
||||||
@@ -1931,6 +1914,63 @@ function parse($TEXT, options) {
|
|||||||
return ret;
|
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) {
|
var expr_atom = function(allow_calls) {
|
||||||
if (is("operator", "new")) {
|
if (is("operator", "new")) {
|
||||||
return new_(allow_calls);
|
return new_(allow_calls);
|
||||||
@@ -1939,13 +1979,15 @@ function parse($TEXT, options) {
|
|||||||
if (is("punc")) {
|
if (is("punc")) {
|
||||||
switch (start.value) {
|
switch (start.value) {
|
||||||
case "(":
|
case "(":
|
||||||
var ex = params_or_seq_();
|
next();
|
||||||
|
var exprs = params_or_seq_();
|
||||||
|
expect(")");
|
||||||
if (is("arrow", "=>")) {
|
if (is("arrow", "=>")) {
|
||||||
ex.start = start;
|
return arrow_function(start, exprs.map(to_fun_args));
|
||||||
ex.end = S.token;
|
|
||||||
return arrow_function(ex);
|
|
||||||
}
|
}
|
||||||
ex = ex.as_expr(croak);
|
var ex = exprs.length == 1 ? exprs[0] : new AST_Sequence({
|
||||||
|
expressions: exprs
|
||||||
|
});
|
||||||
ex.start = start;
|
ex.start = start;
|
||||||
ex.end = S.token;
|
ex.end = S.token;
|
||||||
return subscripts(ex, allow_calls);
|
return subscripts(ex, allow_calls);
|
||||||
@@ -2668,7 +2710,7 @@ function parse($TEXT, options) {
|
|||||||
if (start.type == "punc" && start.value == "(" && peek().value == ")") {
|
if (start.type == "punc" && start.value == "(" && peek().value == ")") {
|
||||||
next();
|
next();
|
||||||
next();
|
next();
|
||||||
return arrow_function([]);
|
return arrow_function(start, []);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is("name") && is_token(peek(), "arrow")) {
|
if (is("name") && is_token(peek(), "arrow")) {
|
||||||
@@ -2678,7 +2720,7 @@ function parse($TEXT, options) {
|
|||||||
end: start,
|
end: start,
|
||||||
});
|
});
|
||||||
next();
|
next();
|
||||||
return arrow_function([param])
|
return arrow_function(start, [param]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var left = maybe_conditional(no_in);
|
var left = maybe_conditional(no_in);
|
||||||
@@ -2709,16 +2751,7 @@ function parse($TEXT, options) {
|
|||||||
next();
|
next();
|
||||||
commas = true;
|
commas = true;
|
||||||
}
|
}
|
||||||
if (exprs.length == 1) {
|
return exprs.length == 1 ? exprs[0] : new AST_Sequence({
|
||||||
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({
|
|
||||||
start : start,
|
start : start,
|
||||||
expressions : exprs,
|
expressions : exprs,
|
||||||
end : peek()
|
end : peek()
|
||||||
|
|||||||
Reference in New Issue
Block a user