Skip to content

Commit

Permalink
fix(parser): fix SequenceExpression span (#9035)
Browse files Browse the repository at this point in the history
There's a very minor difference in span when `SequenceExpression` has empty spaces right after `(` or before `)`.

For example,  the following code has a different span/range depending on parsers:

```js
( 1, 2 )
  ^^^^    (acorn, swc, babel)
 ^^^^^^   (oxc, tsc)
```

- oxc https://ast.sxzz.dev/#eNpNijEKgDAQBL9ybKUQBC19gC+wvCbECErMBaOiiH/3Cgu7md25EdBitofNbp3SBoOkg5xOySkVVBtqqFQV1ZsjESPLvjrfX8kzWvVFhj0om//dTcFHu3zJKFJtmcHxwfMCI14kXg==
- acorn https://ast.sxzz.dev/#eNotijEOwjAMRa8SeQIpC4w9BQNiymIZD0WpHdlJJVT17hi12/vv/Q0qTPDBFZ1sbh0ytBBIahJMwZd0y+merjE15lYkpQJMC77YfFYpMIWo2Nl7gXx012HEz2/jIy/6HjX4zM3Y2VZ+oLH4/9JtcJEd9h+w8S5G

Just for acorn estree conformance sake, I changed a span to match acorn, but I'm not sure if there's any real value in choosing one over another.
  • Loading branch information
hi-ogawa committed Feb 11, 2025
1 parent ad93ece commit 567bc2c
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 16 deletions.
17 changes: 8 additions & 9 deletions crates/oxc_parser/src/js/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,7 @@ impl<'a> ParserImpl<'a> {

fn parse_parenthesized_expression(&mut self, span: Span) -> Result<Expression<'a>> {
self.expect(Kind::LParen)?;
let expr_span = self.start_span();
let mut expressions = self.context(Context::In, Context::Decorator, |p| {
p.parse_delimited_list(
Kind::RParen,
Expand All @@ -207,26 +208,24 @@ impl<'a> ParserImpl<'a> {
Self::parse_assignment_expression_or_higher,
)
})?;
self.expect(Kind::RParen)?;

let paren_span = self.end_span(span);

if expressions.is_empty() {
return Err(diagnostics::empty_parenthesized_expression(paren_span));
self.expect(Kind::RParen)?;
return Err(diagnostics::empty_parenthesized_expression(self.end_span(span)));
}

let expr_span = self.end_span(expr_span);
self.expect(Kind::RParen)?;

// ParenthesizedExpression is from acorn --preserveParens
let expression = if expressions.len() == 1 {
expressions.remove(0)
} else {
self.ast.expression_sequence(
Span::new(paren_span.start + 1, paren_span.end - 1),
expressions,
)
self.ast.expression_sequence(expr_span, expressions)
};

Ok(if self.options.preserve_parens {
self.ast.expression_parenthesized(paren_span, expression)
self.ast.expression_parenthesized(self.end_span(span), expression)
} else {
expression
})
Expand Down
8 changes: 1 addition & 7 deletions tasks/coverage/snapshots/estree_test262.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ commit: bc5c1417

estree_test262 Summary:
AST Parsed : 44293/44293 (100.00%)
Positive Passed: 44156/44293 (99.69%)
Positive Passed: 44162/44293 (99.70%)
tasks/coverage/test262/test/annexB/built-ins/RegExp/prototype/compile/pattern-string-u.js
serde_json error: unexpected end of hex escape at line 316 column 33

Expand Down Expand Up @@ -186,12 +186,7 @@ serde_json error: unexpected end of hex escape at line 184 column 33

Mismatch: tasks/coverage/test262/test/language/expressions/assignment/fn-name-lhs-cover.js
Mismatch: tasks/coverage/test262/test/language/expressions/assignment/target-cover-id.js
Mismatch: tasks/coverage/test262/test/language/expressions/class/scope-name-lex-open-heritage.js
Mismatch: tasks/coverage/test262/test/language/expressions/dynamic-import/import-attributes/2nd-param-await-ident.js
Mismatch: tasks/coverage/test262/test/language/expressions/function/scope-name-var-open-non-strict.js
Mismatch: tasks/coverage/test262/test/language/expressions/function/scope-name-var-open-strict.js
Mismatch: tasks/coverage/test262/test/language/expressions/generators/scope-name-var-open-non-strict.js
Mismatch: tasks/coverage/test262/test/language/expressions/generators/scope-name-var-open-strict.js
Mismatch: tasks/coverage/test262/test/language/expressions/in/private-field-rhs-non-object.js
Mismatch: tasks/coverage/test262/test/language/expressions/postfix-decrement/target-cover-id.js
Mismatch: tasks/coverage/test262/test/language/expressions/postfix-increment/target-cover-id.js
Expand All @@ -210,7 +205,6 @@ serde_json error: unexpected end of hex escape at line 125 column 33
tasks/coverage/test262/test/language/literals/regexp/u-surrogate-pairs-atom-escape-decimal.js
serde_json error: unexpected end of hex escape at line 67 column 37

Mismatch: tasks/coverage/test262/test/language/statements/class/scope-name-lex-open-heritage.js
Mismatch: tasks/coverage/test262/test/language/statements/for-in/head-lhs-cover.js
Mismatch: tasks/coverage/test262/test/language/statements/for-of/head-lhs-async-parens.js
Mismatch: tasks/coverage/test262/test/language/statements/for-of/head-lhs-cover.js
Expand Down

0 comments on commit 567bc2c

Please sign in to comment.