From c3090c2c70e36c949d7b1faa11e3803b8491f006 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Wed, 3 Jan 2024 11:34:14 +0800 Subject: [PATCH] fix(parser): terminate parsing if an EmptyParenthesizedExpression error occurs (#1874) close: https://github.com/oxc-project/oxc/issues/1870#issue-2061901976 --- crates/oxc_parser/src/js/expression.rs | 7 ++++--- tasks/coverage/parser_babel.snap | 12 ------------ tasks/coverage/parser_test262.snap | 27 -------------------------- tasks/coverage/parser_typescript.snap | 9 --------- 4 files changed, 4 insertions(+), 51 deletions(-) diff --git a/crates/oxc_parser/src/js/expression.rs b/crates/oxc_parser/src/js/expression.rs index fa0387e67..b0dd4c018 100644 --- a/crates/oxc_parser/src/js/expression.rs +++ b/crates/oxc_parser/src/js/expression.rs @@ -202,13 +202,14 @@ impl<'a> Parser<'a> { let mut expressions = list.elements; let paren_span = self.end_span(span); + if expressions.is_empty() { + return Err(diagnostics::EmptyParenthesizedExpression(paren_span).into()); + } + // ParenthesizedExpression is from acorn --preserveParens let expression = if expressions.len() == 1 { expressions.remove(0) } else { - if expressions.is_empty() { - self.error(diagnostics::EmptyParenthesizedExpression(paren_span)); - } self.ast.sequence_expression( Span::new(paren_span.start + 1, paren_span.end - 1), expressions, diff --git a/tasks/coverage/parser_babel.snap b/tasks/coverage/parser_babel.snap index ce27e7888..be32a8d9b 100644 --- a/tasks/coverage/parser_babel.snap +++ b/tasks/coverage/parser_babel.snap @@ -4156,13 +4156,6 @@ Expect to Parse: "typescript/types/const-type-parameters-babel-7/input.ts" · ── ╰──── - × Expected `,` but found `=>` - ╭─[es2015/uncategorised/38/input.js:1:1] - 1 │ console.log(typeof () => {}); - · ─┬ - · ╰── `,` expected - ╰──── - × Unexpected token ╭─[es2015/uncategorised/386/input.js:1:1] 1 │ export typeof foo; @@ -8352,11 +8345,6 @@ Expect to Parse: "typescript/types/const-type-parameters-babel-7/input.ts" · ── ╰──── - × Expected `:` but found `EOF` - ╭─[esprima/invalid-syntax/migrated_0096/input.js:1:1] - 1 │ () ? 42 - ╰──── - × Empty parenthesized expression ╭─[esprima/invalid-syntax/migrated_0097/input.js:1:1] 1 │ () + 42 diff --git a/tasks/coverage/parser_test262.snap b/tasks/coverage/parser_test262.snap index 9a96b9b68..e2b3e8a52 100644 --- a/tasks/coverage/parser_test262.snap +++ b/tasks/coverage/parser_test262.snap @@ -9678,15 +9678,6 @@ Expect Syntax Error: "language/import/import-attributes/json-named-bindings.js" 24 │ ╰──── - × Expected `{` but found `=>` - ╭─[language/expressions/class/elements/syntax/early-errors/class-heritage-array-literal-arrow-heritage.js:22:1] - 22 │ - 23 │ var C = class extends () => {} { - · ─┬ - · ╰── `{` expected - 24 │ - ╰──── - × Expected `{` but found `=>` ╭─[language/expressions/class/elements/syntax/early-errors/class-heritage-array-literal-async-arrow-heritage.js:22:1] 22 │ @@ -14744,15 +14735,6 @@ Expect Syntax Error: "language/import/import-attributes/json-named-bindings.js" 25 │ } ╰──── - × Expected a semicolon or an implicit semicolon after a statement, but found none - ╭─[language/expressions/in/private-field-invalid-rhs.js:23:1] - 23 │ constructor() { - 24 │ #field in () => {}; - · ─ - 25 │ } - ╰──── - help: Try insert a semicolon here - × The keyword 'yield' is reserved ╭─[language/expressions/in/private-field-rhs-yield-absent.js:30:1] 30 │ static method() { @@ -25173,15 +25155,6 @@ Expect Syntax Error: "language/import/import-attributes/json-named-bindings.js" 24 │ ╰──── - × Expected `{` but found `=>` - ╭─[language/statements/class/elements/syntax/early-errors/class-heritage-array-literal-arrow-heritage.js:22:1] - 22 │ - 23 │ class C extends () => {} { - · ─┬ - · ╰── `{` expected - 24 │ - ╰──── - × Expected `{` but found `=>` ╭─[language/statements/class/elements/syntax/early-errors/class-heritage-array-literal-async-arrow-heritage.js:22:1] 22 │ diff --git a/tasks/coverage/parser_typescript.snap b/tasks/coverage/parser_typescript.snap index 8f4617395..a7170a20b 100644 --- a/tasks/coverage/parser_typescript.snap +++ b/tasks/coverage/parser_typescript.snap @@ -17097,15 +17097,6 @@ Expect to Parse: "conformance/salsa/plainJSRedeclare3.ts" 3 │ } ╰──── - × Expected a semicolon or an implicit semicolon after a statement, but found none - ╭─[conformance/parser/ecmascript5/RegressionTests/parser509669.ts:1:1] - 1 │ function foo():any { - 2 │ return ():void {}; - · ▲ - 3 │ } - ╰──── - help: Try insert a semicolon here - × Expected `}` but found `EOF` ╭─[conformance/parser/ecmascript5/RegressionTests/parser512084.ts:1:1] 1 │ class foo {