mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 20:28:58 +00:00
fix(codegen): preserve parenthesis for ChainExpression (#6430)
close: #6385
The fixing way was referenced from `esbuild`, it is according to these [states](332727499e/internal/js_ast/js_ast.go (L590-L604)
)(determined in the parser) to determine whether to print parenthesis
Due to differences in implementation details, we are unable to record certain information like `esbuild` does in its parser. But fortunately, The `ParenthesisExpression` AST is actually like what `esbuild` stored states.
This commit is contained in:
parent
c56343d1f3
commit
02bfbfeef5
3 changed files with 45 additions and 6 deletions
|
|
@ -2,9 +2,10 @@ use oxc_syntax::precedence::{GetPrecedence, Precedence};
|
|||
|
||||
use crate::ast::{
|
||||
match_member_expression, AssignmentExpression, AwaitExpression, BinaryExpression,
|
||||
CallExpression, ComputedMemberExpression, ConditionalExpression, Expression, ImportExpression,
|
||||
LogicalExpression, MemberExpression, NewExpression, PrivateFieldExpression, SequenceExpression,
|
||||
StaticMemberExpression, TSTypeAssertion, UnaryExpression, UpdateExpression, YieldExpression,
|
||||
CallExpression, ChainExpression, ComputedMemberExpression, ConditionalExpression, Expression,
|
||||
ImportExpression, LogicalExpression, MemberExpression, NewExpression, PrivateFieldExpression,
|
||||
SequenceExpression, StaticMemberExpression, TSTypeAssertion, UnaryExpression, UpdateExpression,
|
||||
YieldExpression,
|
||||
};
|
||||
|
||||
impl<'a> GetPrecedence for Expression<'a> {
|
||||
|
|
@ -103,6 +104,12 @@ impl<'a> GetPrecedence for NewExpression<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a> GetPrecedence for ChainExpression<'a> {
|
||||
fn precedence(&self) -> Precedence {
|
||||
Precedence::Member
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> GetPrecedence for MemberExpression<'a> {
|
||||
fn precedence(&self) -> Precedence {
|
||||
Precedence::Member
|
||||
|
|
|
|||
|
|
@ -2047,12 +2047,12 @@ impl<'a> GenExpr for AwaitExpression<'a> {
|
|||
|
||||
impl<'a> GenExpr for ChainExpression<'a> {
|
||||
fn gen_expr(&self, p: &mut Codegen, precedence: Precedence, ctx: Context) {
|
||||
match &self.expression {
|
||||
p.wrap(precedence >= Precedence::Postfix, |p| match &self.expression {
|
||||
ChainElement::CallExpression(expr) => expr.print_expr(p, precedence, ctx),
|
||||
match_member_expression!(ChainElement) => {
|
||||
self.expression.to_member_expression().print_expr(p, precedence, ctx);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
//! Tests ported from [esbuild](https://github.com/evanw/esbuild/blob/main/internal/js_printer/js_printer_test.go#L164)
|
||||
//! Tests ported from `esbuild`
|
||||
//! * <https://github.com/evanw/esbuild/blob/main/internal/js_printer/js_printer_test.go>
|
||||
//! * <https://github.com/evanw/esbuild/blob/main/internal/js_parser/js_parser_test.go>
|
||||
|
||||
use crate::tester::{test, test_minify};
|
||||
|
||||
|
|
@ -1155,3 +1157,33 @@ fn test_using() {
|
|||
test_minify("await using x = y", "await using x=y;");
|
||||
test_minify("await using x = y, z = _", "await using x=y,z=_;");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_preserve_optional_chain_parentheses() {
|
||||
test("a?.b.c", "a?.b.c;\n");
|
||||
test("(a?.b).c", "(a?.b).c;\n");
|
||||
test("a?.b.c.d", "a?.b.c.d;\n");
|
||||
test("(a?.b.c).d", "(a?.b.c).d;\n");
|
||||
test("a?.b[c]", "a?.b[c];\n");
|
||||
test("(a?.b)[c]", "(a?.b)[c];\n");
|
||||
test("a?.b(c)", "a?.b(c);\n");
|
||||
test("(a?.b)(c)", "(a?.b)(c);\n");
|
||||
|
||||
test("a?.[b][c]", "a?.[b][c];\n");
|
||||
test("(a?.[b])[c]", "(a?.[b])[c];\n");
|
||||
test("a?.[b][c][d]", "a?.[b][c][d];\n");
|
||||
test("(a?.[b][c])[d]", "(a?.[b][c])[d];\n");
|
||||
test("a?.[b].c", "a?.[b].c;\n");
|
||||
test("(a?.[b]).c", "(a?.[b]).c;\n");
|
||||
test("a?.[b](c)", "a?.[b](c);\n");
|
||||
test("(a?.[b])(c)", "(a?.[b])(c);\n");
|
||||
|
||||
test("a?.(b)(c)", "a?.(b)(c);\n");
|
||||
test("(a?.(b))(c)", "(a?.(b))(c);\n");
|
||||
test("a?.(b)(c)(d)", "a?.(b)(c)(d);\n");
|
||||
test("(a?.(b)(c))(d)", "(a?.(b)(c))(d);\n");
|
||||
test("a?.(b).c", "a?.(b).c;\n");
|
||||
test("(a?.(b)).c", "(a?.(b)).c;\n");
|
||||
test("a?.(b)[c]", "a?.(b)[c];\n");
|
||||
test("(a?.(b))[c]", "(a?.(b))[c];\n");
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue