From 2b02d84565e8411fb20ad959c69dc196d8232fd9 Mon Sep 17 00:00:00 2001 From: camc314 <18101008+camc314@users.noreply.github.com> Date: Wed, 14 May 2025 04:57:57 +0000 Subject: [PATCH] fix(parser): allow `for(using using` stmts (#10985) fixes #10981 --- crates/oxc_parser/src/js/statement.rs | 15 +++++++++++++-- tasks/coverage/misc/pass/oxc-10981.ts | 9 +++++++++ tasks/coverage/snapshots/codegen_misc.snap | 4 ++-- tasks/coverage/snapshots/parser_misc.snap | 4 ++-- tasks/coverage/snapshots/semantic_misc.snap | 4 ++-- tasks/coverage/snapshots/transformer_misc.snap | 4 ++-- .../snapshots/prettier.js.snap.md | 3 +-- 7 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 tasks/coverage/misc/pass/oxc-10981.ts diff --git a/crates/oxc_parser/src/js/statement.rs b/crates/oxc_parser/src/js/statement.rs index ab43840ca4b9c..87a1ec65ace9d 100644 --- a/crates/oxc_parser/src/js/statement.rs +++ b/crates/oxc_parser/src/js/statement.rs @@ -345,9 +345,20 @@ impl<'a> ParserImpl<'a> { { return self.parse_variable_declaration_for_statement(span, r#await); } + // [+Using, +Await] await [no LineTerminator here] using [no LineTerminator here] + if self.cur_kind() == Kind::Await + && !self.peek_token().is_on_new_line() + && self.peek_kind() == Kind::Using + && !self.nth(2).is_on_new_line() + { + return self.parse_using_declaration_for_statement(span, r#await); + } - if (self.cur_kind() == Kind::Await && self.peek_kind() == Kind::Using) - || (self.cur_kind() == Kind::Using && self.peek_kind() == Kind::Ident) + // [+Using] using [no LineTerminator here] ForBinding[?Yield, ?Await, ~Pattern] + if self.cur_kind() == Kind::Using + && !self.peek_token().is_on_new_line() + && self.peek_kind() != Kind::Of + && self.peek_kind().is_binding_identifier() { return self.parse_using_declaration_for_statement(span, r#await); } diff --git a/tasks/coverage/misc/pass/oxc-10981.ts b/tasks/coverage/misc/pass/oxc-10981.ts new file mode 100644 index 0000000000000..a1a8a81bece9f --- /dev/null +++ b/tasks/coverage/misc/pass/oxc-10981.ts @@ -0,0 +1,9 @@ +{ + using using = of; +} +{ + for (using using of of) {} +} +{ + for (using foo of of) {} +} diff --git a/tasks/coverage/snapshots/codegen_misc.snap b/tasks/coverage/snapshots/codegen_misc.snap index 43f781ca30240..8125cc7aabde9 100644 --- a/tasks/coverage/snapshots/codegen_misc.snap +++ b/tasks/coverage/snapshots/codegen_misc.snap @@ -1,3 +1,3 @@ codegen_misc Summary: -AST Parsed : 35/35 (100.00%) -Positive Passed: 35/35 (100.00%) +AST Parsed : 36/36 (100.00%) +Positive Passed: 36/36 (100.00%) diff --git a/tasks/coverage/snapshots/parser_misc.snap b/tasks/coverage/snapshots/parser_misc.snap index ff011afd69728..374a804c98060 100644 --- a/tasks/coverage/snapshots/parser_misc.snap +++ b/tasks/coverage/snapshots/parser_misc.snap @@ -1,6 +1,6 @@ parser_misc Summary: -AST Parsed : 35/35 (100.00%) -Positive Passed: 35/35 (100.00%) +AST Parsed : 36/36 (100.00%) +Positive Passed: 36/36 (100.00%) Negative Passed: 33/33 (100.00%) × Identifier `b` has already been declared diff --git a/tasks/coverage/snapshots/semantic_misc.snap b/tasks/coverage/snapshots/semantic_misc.snap index ba3c9f859b81e..481447a013e26 100644 --- a/tasks/coverage/snapshots/semantic_misc.snap +++ b/tasks/coverage/snapshots/semantic_misc.snap @@ -1,6 +1,6 @@ semantic_misc Summary: -AST Parsed : 35/35 (100.00%) -Positive Passed: 20/35 (57.14%) +AST Parsed : 36/36 (100.00%) +Positive Passed: 21/36 (58.33%) semantic Error: tasks/coverage/misc/pass/oxc-1288.ts Bindings mismatch: after transform: ScopeId(0): ["from"] diff --git a/tasks/coverage/snapshots/transformer_misc.snap b/tasks/coverage/snapshots/transformer_misc.snap index c9b0be2ed71a2..ca227b3334d41 100644 --- a/tasks/coverage/snapshots/transformer_misc.snap +++ b/tasks/coverage/snapshots/transformer_misc.snap @@ -1,3 +1,3 @@ transformer_misc Summary: -AST Parsed : 35/35 (100.00%) -Positive Passed: 35/35 (100.00%) +AST Parsed : 36/36 (100.00%) +Positive Passed: 36/36 (100.00%) diff --git a/tasks/prettier_conformance/snapshots/prettier.js.snap.md b/tasks/prettier_conformance/snapshots/prettier.js.snap.md index eb1c617726e42..11a4c507deac9 100644 --- a/tasks/prettier_conformance/snapshots/prettier.js.snap.md +++ b/tasks/prettier_conformance/snapshots/prettier.js.snap.md @@ -1,4 +1,4 @@ -js compatibility: 236/699 (33.76%) +js compatibility: 237/699 (33.91%) # Failed @@ -219,7 +219,6 @@ js compatibility: 236/699 (33.76%) | js/explicit-resource-management/using-declarations.js | 💥 | 80.00% | | js/explicit-resource-management/valid-await-using-comments.js | 💥 | 60.61% | | js/explicit-resource-management/valid-using-as-identifier-for-init.js | 💥 | 0.00% | -| js/explicit-resource-management/valid-using-binding-using.js | 💥 | 0.00% | | js/export/blank-line-between-specifiers.js | 💥💥 | 95.00% | | js/export-default/function_in_template.js | 💥 | 0.00% | | js/export-default/iife.js | 💥 | 0.00% |