remove AST_ArrowParametersOrSeq (#1997)

This commit is contained in:
Alex Lam S.L
2017-05-24 17:45:18 +08:00
committed by GitHub
parent 075b648bb1
commit c988e5f4d6
2 changed files with 73 additions and 113 deletions

View File

@@ -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()