Skip to content

Commit bcf05de

Browse files
authored
fix(es/parser): Parse await using() call (#9693)
**Related issue:** - Closes #9688
1 parent 6ed1715 commit bcf05de

File tree

5 files changed

+42
-28
lines changed

5 files changed

+42
-28
lines changed

.changeset/fifty-ears-press.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
swc_core: patch
3+
swc_ecma_parser: patch
4+
---
5+
6+
fix(es/parser): Parse `await using()` call
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"$schema": "https://swc.rs/schema.json",
3+
"jsc": {
4+
"parser": {
5+
"syntax": "ecmascript"
6+
},
7+
"target": "es2022"
8+
},
9+
"minify": false
10+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
async function using(x) { /* do something... */ }
2+
async function test() {
3+
await using();
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
async function using(x) {}
2+
async function test() {
3+
await using();
4+
}

crates/swc_ecma_parser/src/parser/stmt.rs

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -120,33 +120,6 @@ impl<'a, I: Tokens> Parser<I> {
120120
) -> PResult<Stmt> {
121121
trace_cur!(self, parse_stmt_internal);
122122

123-
if top_level && is!(self, "await") {
124-
self.state.found_module_item = true;
125-
if !self.ctx().can_be_module {
126-
self.emit_err(self.input.cur_span(), SyntaxError::TopLevelAwaitInScript);
127-
}
128-
129-
let mut eaten_await = None;
130-
if peeked_is!(self, "using") {
131-
eaten_await = Some(self.input.cur_pos());
132-
assert_and_bump!(self, "await");
133-
134-
let v = self.parse_using_decl(start, true)?;
135-
if let Some(v) = v {
136-
return Ok(v.into());
137-
}
138-
}
139-
140-
let expr = self.parse_await_expr(eaten_await)?;
141-
let expr = self
142-
.include_in_expr(true)
143-
.parse_bin_op_recursively(expr, 0)?;
144-
eat!(self, ';');
145-
146-
let span = span!(self, start);
147-
return Ok(ExprStmt { span, expr }.into());
148-
}
149-
150123
let is_typescript = self.input.syntax().typescript();
151124

152125
if is_typescript && is!(self, "const") && peeked_is!(self, "enum") {
@@ -159,13 +132,30 @@ impl<'a, I: Tokens> Parser<I> {
159132
}
160133

161134
match cur!(self, true) {
162-
tok!("await") if include_decl => {
135+
tok!("await") if include_decl || top_level => {
136+
if top_level {
137+
self.state.found_module_item = true;
138+
if !self.ctx().can_be_module {
139+
self.emit_err(self.input.cur_span(), SyntaxError::TopLevelAwaitInScript);
140+
}
141+
}
142+
163143
if peeked_is!(self, "using") {
144+
let eaten_await = Some(self.input.cur_pos());
164145
assert_and_bump!(self, "await");
165146
let v = self.parse_using_decl(start, true)?;
166147
if let Some(v) = v {
167148
return Ok(v.into());
168149
}
150+
151+
let expr = self.parse_await_expr(eaten_await)?;
152+
let expr = self
153+
.include_in_expr(true)
154+
.parse_bin_op_recursively(expr, 0)?;
155+
eat!(self, ';');
156+
157+
let span = span!(self, start);
158+
return Ok(ExprStmt { span, expr }.into());
169159
}
170160
}
171161

0 commit comments

Comments
 (0)