support optional chaining operator (#4899)

This commit is contained in:
Alex Lam S.L
2021-05-03 03:08:29 +01:00
committed by GitHub
parent 203f4b7ad9
commit f0de9a8b5d
12 changed files with 353 additions and 71 deletions

View File

@@ -2245,44 +2245,52 @@ function parse($TEXT, options) {
});
}
var subscripts = function(expr, allow_calls) {
var subscripts = function(expr, allow_calls, optional) {
var start = expr.start;
if (is("punc", ".")) {
next();
return subscripts(new AST_Dot({
start : start,
expression : expr,
property : as_name(),
end : prev()
}), allow_calls);
}
if (is("punc", "[")) {
next();
var prop = expression();
expect("]");
return subscripts(new AST_Sub({
start : start,
expression : expr,
property : prop,
end : prev()
start: start,
optional: optional,
expression: expr,
property: prop,
end: prev(),
}), allow_calls);
}
if (allow_calls && is("punc", "(")) {
next();
var call = new AST_Call({
start : start,
expression : expr,
args : expr_list(")", !options.strict),
end : prev()
start: start,
optional: optional,
expression: expr,
args: expr_list(")", !options.strict),
end: prev(),
});
return subscripts(call, true);
}
if (optional || is("punc", ".")) {
if (!optional) next();
return subscripts(new AST_Dot({
start: start,
optional: optional,
expression: expr,
property: as_name(),
end: prev(),
}), allow_calls);
}
if (is("punc", "`")) {
var tmpl = template(expr);
tmpl.start = expr.start;
tmpl.end = prev();
return subscripts(tmpl, allow_calls);
}
if (is("operator", "?") && is_token(peek(), "punc", ".")) {
next();
next();
return subscripts(expr, allow_calls, true);
}
if (expr instanceof AST_Call && !expr.pure) {
var start = expr.start;
var comments = start.comments_before;
@@ -2405,7 +2413,7 @@ function parse($TEXT, options) {
};
function is_assignable(expr) {
return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
return expr instanceof AST_PropAccess && !expr.optional || expr instanceof AST_SymbolRef;
}
function to_destructured(node) {