diff --git a/crates/oxc_parser/Cargo.toml b/crates/oxc_parser/Cargo.toml index bfb83c235..30dbeffdd 100644 --- a/crates/oxc_parser/Cargo.toml +++ b/crates/oxc_parser/Cargo.toml @@ -34,7 +34,7 @@ seq-macro = { workspace = true } memchr = "2.7.1" [dev-dependencies] -oxc_ast = { workspace = true } +oxc_ast = { workspace = true, features = ["serialize"] } miette = { workspace = true } serde_json = { workspace = true } ouroboros = "0.18.3" # for `multi-thread` example diff --git a/crates/oxc_parser/src/jsx/mod.rs b/crates/oxc_parser/src/jsx/mod.rs index 7bcfe1b02..33fe6de56 100644 --- a/crates/oxc_parser/src/jsx/mod.rs +++ b/crates/oxc_parser/src/jsx/mod.rs @@ -215,7 +215,7 @@ impl<'a> ParserImpl<'a> { } // {expr} Kind::LCurly => self - .parse_jsx_expression_container(true) + .parse_jsx_expression_container(/* is_jsx_child */ true) .map(JSXChild::ExpressionContainer) .map(Some), // text @@ -232,13 +232,17 @@ impl<'a> ParserImpl<'a> { let span = self.start_span(); self.bump_any(); // bump `{` - let expr = if self.eat(Kind::RCurly) { + let expr = if self.at(Kind::RCurly) { + if in_jsx_child { + self.expect_jsx_child(Kind::RCurly) + } else { + self.expect(Kind::RCurly) + }?; + let span = self.end_span(span); // Handle comment between curly braces (ex. `{/* comment */}`) // ^^^^^^^^^^^^^ span - let span = self.end_span(span); - JSXExpression::EmptyExpression( - self.ast.jsx_empty_expression(Span::new(span.start + 1, span.end - 1)), - ) + let expr = self.ast.jsx_empty_expression(Span::new(span.start + 1, span.end - 1)); + JSXExpression::EmptyExpression(expr) } else { let expr = self.parse_jsx_assignment_expression().map(JSXExpression::Expression)?; if in_jsx_child { @@ -339,7 +343,7 @@ impl<'a> ParserImpl<'a> { match self.cur_kind() { Kind::Str => self.parse_literal_string().map(JSXAttributeValue::StringLiteral), Kind::LCurly => { - let expr = self.parse_jsx_expression_container(false)?; + let expr = self.parse_jsx_expression_container(/* is_jsx_child */ false)?; Ok(JSXAttributeValue::ExpressionContainer(expr)) } Kind::LAngle => { diff --git a/tasks/coverage/codegen_misc.snap b/tasks/coverage/codegen_misc.snap index 7fe960a68..8844037bd 100644 --- a/tasks/coverage/codegen_misc.snap +++ b/tasks/coverage/codegen_misc.snap @@ -1,3 +1,3 @@ codegen_misc Summary: -AST Parsed : 14/14 (100.00%) -Positive Passed: 14/14 (100.00%) +AST Parsed : 15/15 (100.00%) +Positive Passed: 15/15 (100.00%) diff --git a/tasks/coverage/misc/pass/oxc-2723.jsx b/tasks/coverage/misc/pass/oxc-2723.jsx new file mode 100644 index 000000000..b004f9f88 --- /dev/null +++ b/tasks/coverage/misc/pass/oxc-2723.jsx @@ -0,0 +1,13 @@ +const A = ( +