Skip to content

Commit

Permalink
fix(es/parser): Fix parsing of await (#6316)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Nov 3, 2022
1 parent 8b19e3c commit 28af15e
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 9 deletions.
12 changes: 6 additions & 6 deletions crates/swc_ecma_parser/src/parser/expr/ops.rs
Expand Up @@ -331,10 +331,6 @@ impl<I: Tokens> Parser<I> {
}

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();
}

Expand Down Expand Up @@ -379,14 +375,18 @@ impl<I: Tokens> Parser<I> {

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);
}
Expand Down
42 changes: 42 additions & 0 deletions crates/swc_ecma_parser/src/parser/stmt.rs
Expand Up @@ -2485,4 +2485,46 @@ const foo;"#;

test_parser(src, Default::default(), |p| p.parse_script());
}

#[test]
fn issue_6301_await_expr_stmt() {
let src = "try { await; } catch { console.log('caught'); }";

test_parser(src, Default::default(), |p| p.parse_script());
}

#[test]
fn issue_6301_await_expr_stmt_1() {
let src = "try { await, await; } catch { console.log('caught'); }";

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());
}
}
@@ -1,12 +1,11 @@

x Unexpected token `<eof>`. 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
: ^^^^^
Expand Down

1 comment on commit 28af15e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 28af15e Previous: 13b4d31 Ratio
es/full/bugs-1 424297 ns/iter (± 46066) 411569 ns/iter (± 84069) 1.03
es/full/minify/libraries/antd 1947259651 ns/iter (± 56106256) 2034412953 ns/iter (± 751767865) 0.96
es/full/minify/libraries/d3 452680638 ns/iter (± 25836419) 450125683 ns/iter (± 16112755) 1.01
es/full/minify/libraries/echarts 1640895465 ns/iter (± 37276067) 1666674308 ns/iter (± 82312460) 0.98
es/full/minify/libraries/jquery 136765669 ns/iter (± 15712367) 119588845 ns/iter (± 10754116) 1.14
es/full/minify/libraries/lodash 177927480 ns/iter (± 83326823) 135091807 ns/iter (± 8103588) 1.32
es/full/minify/libraries/moment 94595882 ns/iter (± 57187000) 68347310 ns/iter (± 8939993) 1.38
es/full/minify/libraries/react 30303937 ns/iter (± 3203328) 22691023 ns/iter (± 3366768) 1.34
es/full/minify/libraries/terser 436332567 ns/iter (± 25002868) 298522230 ns/iter (± 18606952) 1.46
es/full/minify/libraries/three 769662541 ns/iter (± 117981717) 575733476 ns/iter (± 23904790) 1.34
es/full/minify/libraries/typescript 4218445590 ns/iter (± 153807248) 3801682219 ns/iter (± 503709032) 1.11
es/full/minify/libraries/victory 1038213830 ns/iter (± 107286427) 1055156087 ns/iter (± 119623826) 0.98
es/full/minify/libraries/vue 243555969 ns/iter (± 37619348) 225152948 ns/iter (± 59537048) 1.08
es/full/codegen/es3 40598 ns/iter (± 3121) 35111 ns/iter (± 1771) 1.16
es/full/codegen/es5 38181 ns/iter (± 3472) 36259 ns/iter (± 2569) 1.05
es/full/codegen/es2015 38818 ns/iter (± 7996) 36274 ns/iter (± 3402) 1.07
es/full/codegen/es2016 37390 ns/iter (± 6679) 36310 ns/iter (± 2975) 1.03
es/full/codegen/es2017 40165 ns/iter (± 3308) 36793 ns/iter (± 7085) 1.09
es/full/codegen/es2018 41551 ns/iter (± 7111) 35799 ns/iter (± 4453) 1.16
es/full/codegen/es2019 41375 ns/iter (± 15368) 37048 ns/iter (± 44884) 1.12
es/full/codegen/es2020 38216 ns/iter (± 8231) 34989 ns/iter (± 2262) 1.09
es/full/all/es3 252769740 ns/iter (± 42018346) 254819785 ns/iter (± 151108945) 0.99
es/full/all/es5 238249786 ns/iter (± 44426318) 220983476 ns/iter (± 89542128) 1.08
es/full/all/es2015 184904623 ns/iter (± 24143129) 166968124 ns/iter (± 54023957) 1.11
es/full/all/es2016 186245789 ns/iter (± 40236162) 165047188 ns/iter (± 51227991) 1.13
es/full/all/es2017 188089057 ns/iter (± 30362691) 162132693 ns/iter (± 58918637) 1.16
es/full/all/es2018 184603694 ns/iter (± 53414734) 159070830 ns/iter (± 64180713) 1.16
es/full/all/es2019 184774934 ns/iter (± 69855387) 157643629 ns/iter (± 37856263) 1.17
es/full/all/es2020 151245491 ns/iter (± 47204410) 151007454 ns/iter (± 58627723) 1.00
es/full/parser 756120 ns/iter (± 319730) 770563 ns/iter (± 71839) 0.98
es/full/base/fixer 27907 ns/iter (± 3866) 28036 ns/iter (± 8826) 1.00
es/full/base/resolver_and_hygiene 94913 ns/iter (± 3534) 95544 ns/iter (± 23453) 0.99
serialization of ast node 215 ns/iter (± 2) 217 ns/iter (± 76) 0.99
serialization of serde 216 ns/iter (± 20) 226 ns/iter (± 12) 0.96

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.