From 6b0cf14e39edbd8abe667f87dddd5fa5f3630914 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Wed, 2 Nov 2022 17:43:20 +0300 Subject: [PATCH] fix: more --- crates/swc_ecma_parser/src/parser/expr/ops.rs | 12 ++++---- crates/swc_ecma_parser/src/parser/stmt.rs | 28 +++++++++++++++++++ .../fail/1aefe47e20eb91fa.module.js.stderr | 5 ++-- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/crates/swc_ecma_parser/src/parser/expr/ops.rs b/crates/swc_ecma_parser/src/parser/expr/ops.rs index 962c95794ba9..410c4dd063e0 100644 --- a/crates/swc_ecma_parser/src/parser/expr/ops.rs +++ b/crates/swc_ecma_parser/src/parser/expr/ops.rs @@ -331,10 +331,6 @@ impl Parser { } if is!(self, "await") { - let ctx = self.ctx(); - if ctx.in_function && !ctx.in_async { - self.emit_err(self.input.cur_span(), SyntaxError::AwaitInFunction); - } return self.parse_await_expr(); } @@ -379,14 +375,18 @@ impl Parser { let span = span!(self, start); - if is_one_of!(self, ')', ']', ';', ',') && !self.ctx().in_async { - if ctx.in_async || ctx.module { + if is_one_of!(self, ')', ']', ';', ',') && !ctx.in_async { + if ctx.module { self.emit_err(span, SyntaxError::InvalidIdentInAsync); } return Ok(Box::new(Expr::Ident(Ident::new(js_word!("await"), span)))); } + if ctx.in_function && !ctx.in_async { + self.emit_err(self.input.cur_span(), SyntaxError::AwaitInFunction); + } + if ctx.in_parameters && !ctx.in_function { self.emit_err(span, SyntaxError::AwaitParamInAsync); } diff --git a/crates/swc_ecma_parser/src/parser/stmt.rs b/crates/swc_ecma_parser/src/parser/stmt.rs index 728eb006d396..3ad1bfbf285f 100644 --- a/crates/swc_ecma_parser/src/parser/stmt.rs +++ b/crates/swc_ecma_parser/src/parser/stmt.rs @@ -2499,4 +2499,32 @@ const foo;"#; test_parser(src, Default::default(), |p| p.parse_script()); } + + #[test] + fn issue_6301_await_expr_stmt_2() { + let src = "function test() { await; }"; + + test_parser(src, Default::default(), |p| p.parse_script()); + } + + #[test] + fn issue_6301_await_expr_stmt_3() { + let src = "function test() { await, await; }"; + + test_parser(src, Default::default(), |p| p.parse_script()); + } + + #[test] + fn issue_6301_await_expr_stmt_4() { + let src = "function test() { [await]; }"; + + test_parser(src, Default::default(), |p| p.parse_script()); + } + + #[test] + fn issue_6301_await_expr_stmt_5() { + let src = "function test() { (await); }"; + + test_parser(src, Default::default(), |p| p.parse_script()); + } } diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/1aefe47e20eb91fa.module.js.stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/1aefe47e20eb91fa.module.js.stderr index bd224bc476ff..2762a3a2f8c1 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/1aefe47e20eb91fa.module.js.stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/1aefe47e20eb91fa.module.js.stderr @@ -1,12 +1,11 @@ - x Unexpected token ``. Expected this, import, async, function, [ for array literal, { for object literal, @ for decorator, function, class, null, true, false, number, bigint, string, regexp, - | ` for template literal, (, or an identifier + x top level await requires target to es2017 or higher and topLevelAwait:true for ecmascript ,-[$DIR/tests/test262-parser/fail/1aefe47e20eb91fa.module.js:1:1] 1 | await : ^^^^^ `---- - x top level await requires target to es2017 or higher and topLevelAwait:true for ecmascript + x `await` cannot be used as an identifier in an async context ,-[$DIR/tests/test262-parser/fail/1aefe47e20eb91fa.module.js:1:1] 1 | await : ^^^^^