support for [await]...of statements (#4627)

This commit is contained in:
Alex Lam S.L
2021-02-08 20:28:23 +00:00
committed by GitHub
parent aedc1e7fc9
commit e13d1e9969
11 changed files with 203 additions and 64 deletions

View File

@@ -1039,6 +1039,7 @@ function parse($TEXT, options) {
}
function for_() {
var await = is("name", "await") && next();
expect("(");
var init = null;
if (!is("punc", ";")) {
@@ -1049,16 +1050,26 @@ function parse($TEXT, options) {
: is("keyword", "var")
? (next(), var_(true))
: expression(true);
if (is("operator", "in")) {
var ctor;
if (await) {
expect_token("name", "of");
ctor = AST_ForAwaitOf;
} else if (is("operator", "in")) {
next();
ctor = AST_ForIn;
} else if (is("name", "of")) {
next();
ctor = AST_ForOf;
}
if (ctor) {
if (init instanceof AST_Definitions) {
if (init.definitions.length > 1) {
token_error(init.start, "Only one variable declaration allowed in for..in loop");
token_error(init.start, "Only one variable declaration allowed in for..in/of loop");
}
} else if (!(is_assignable(init) || (init = to_destructured(init)) instanceof AST_Destructured)) {
token_error(init.start, "Invalid left-hand side in for..in loop");
token_error(init.start, "Invalid left-hand side in for..in/of loop");
}
next();
return for_in(init);
return for_enum(ctor, init);
}
}
return regular_for(init);
@@ -1078,10 +1089,10 @@ function parse($TEXT, options) {
});
}
function for_in(init) {
function for_enum(ctor, init) {
var obj = expression();
expect(")");
return new AST_ForIn({
return new ctor({
init : init,
object : obj,
body : in_loop(statement)
@@ -1523,7 +1534,7 @@ function parse($TEXT, options) {
func.end = prev();
return subscripts(func, allow_calls);
}
if (is("name")) {
if (is("name") && is_token(peek(), "punc", "=>")) {
start = S.token;
sym = _make_symbol(AST_SymbolRef, start);
next();