Skip to content

Commit

Permalink
remove AST_ArrowParametersOrSeq
Browse files Browse the repository at this point in the history
  • Loading branch information
alexlamsl committed May 24, 2017
1 parent 075b648 commit 324b076
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 113 deletions.
73 changes: 0 additions & 73 deletions lib/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
113 changes: 73 additions & 40 deletions lib/parse.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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", ")")) {
Expand All @@ -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) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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")) {
Expand All @@ -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);
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 324b076

Please sign in to comment.