From b1c40a411f01792f9b9f4bc9d5f08782fc6d6a1c Mon Sep 17 00:00:00 2001 From: Yukang Date: Mon, 10 Apr 2023 16:46:01 +0800 Subject: [PATCH] fix(es/parser): Use a hard error for missing r-paren in an if stmt (#7223) **Related issue:** - Closes https://github.com/swc-project/swc/issues/7104. --- crates/swc_ecma_parser/src/parser/stmt.rs | 14 +------------- .../typescript-errors/issue-7104/case1/input.ts | 5 +++++ .../issue-7104/case1/input.ts.swc-stderr | 14 ++++++++++++++ .../typescript-errors/issue-7104/case2/input.ts | 5 +++++ .../issue-7104/case2/input.ts.swc-stderr | 8 ++++++++ 5 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts create mode 100644 crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts.swc-stderr create mode 100644 crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts create mode 100644 crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts.swc-stderr diff --git a/crates/swc_ecma_parser/src/parser/stmt.rs b/crates/swc_ecma_parser/src/parser/stmt.rs index cc8160ad3dfd..6e9165128881 100644 --- a/crates/swc_ecma_parser/src/parser/stmt.rs +++ b/crates/swc_ecma_parser/src/parser/stmt.rs @@ -470,20 +470,8 @@ impl<'a, I: Tokens> Parser { }, ) })?; - if !eat!(self, ')') { - self.emit_err(self.input.cur_span(), SyntaxError::TS1005); - let span = span!(self, start); - return Ok(IfStmt { - span, - test, - cons: Box::new(Stmt::Expr(ExprStmt { - span, - expr: Box::new(Expr::Invalid(Invalid { span })), - })), - alt: Default::default(), - }); - } + expect!(self, ')'); let cons = { // Prevent stack overflow diff --git a/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts new file mode 100644 index 000000000000..d9ee8f21f506 --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts @@ -0,0 +1,5 @@ +const foo = () => { + if (bar() { + console.log(1); + } +}; \ No newline at end of file diff --git a/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts.swc-stderr new file mode 100644 index 000000000000..ed41125e774b --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case1/input.ts.swc-stderr @@ -0,0 +1,14 @@ + + x An arrow function is not allowed here + ,-[$DIR/tests/typescript-errors/issue-7104/case1/input.ts:1:1] + 1 | const foo = () => { + : ^^ + 2 | if (bar() { + `---- + + x Expression expected + ,-[$DIR/tests/typescript-errors/issue-7104/case1/input.ts:1:1] + 1 | const foo = () => { + : ^ + 2 | if (bar() { + `---- diff --git a/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts new file mode 100644 index 000000000000..8d08f4daefe0 --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts @@ -0,0 +1,5 @@ +const foo = () => { + if (bar() { + console.log(1); + } +}; \ No newline at end of file diff --git a/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts.swc-stderr new file mode 100644 index 000000000000..66bed9cddbb5 --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript-errors/issue-7104/case2/input.ts.swc-stderr @@ -0,0 +1,8 @@ + + x Expected ')', got '{' + ,-[$DIR/tests/typescript-errors/issue-7104/case2/input.ts:1:1] + 1 | const foo = () => { + 2 | if (bar() { + : ^ + 3 | console.log(1); + `----