From 68a8ea58d1141e3a73bf6e161aa0849909cf03d1 Mon Sep 17 00:00:00 2001 From: Noel Kim Date: Tue, 23 Sep 2025 11:46:43 +0900 Subject: [PATCH] fix(formatter): Add parentheses inside `TSOptionalType` --- .../oxc_formatter/src/parentheses/ts_type.rs | 19 +++++++++++++++---- .../snapshots/prettier.ts.snap.md | 3 +-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/crates/oxc_formatter/src/parentheses/ts_type.rs b/crates/oxc_formatter/src/parentheses/ts_type.rs index 4a367ebc835ef..9280cea5195f0 100644 --- a/crates/oxc_formatter/src/parentheses/ts_type.rs +++ b/crates/oxc_formatter/src/parentheses/ts_type.rs @@ -34,7 +34,9 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSFunctionType<'a>> { AstNodes::TSConditionalType(ty) => { ty.extends_type().span() == self.span() || ty.check_type().span() == self.span() } - AstNodes::TSUnionType(_) | AstNodes::TSIntersectionType(_) => true, + AstNodes::TSUnionType(_) + | AstNodes::TSIntersectionType(_) + | AstNodes::TSOptionalType(_) => true, _ => false, } } @@ -52,7 +54,9 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSConstructorType<'a>> { AstNodes::TSConditionalType(ty) => { ty.extends_type().span() == self.span() || ty.check_type().span() == self.span() } - AstNodes::TSUnionType(_) | AstNodes::TSIntersectionType(_) => true, + AstNodes::TSUnionType(_) + | AstNodes::TSIntersectionType(_) + | AstNodes::TSOptionalType(_) => true, _ => false, } } @@ -73,7 +77,10 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSUnionType<'a>> { /// Returns `true` if a TS primary type needs parentheses fn operator_type_or_higher_needs_parens(span: Span, parent: &AstNodes) -> bool { match parent { - AstNodes::TSArrayType(_) | AstNodes::TSTypeOperator(_) | AstNodes::TSRestType(_) => true, + AstNodes::TSArrayType(_) + | AstNodes::TSTypeOperator(_) + | AstNodes::TSRestType(_) + | AstNodes::TSOptionalType(_) => true, AstNodes::TSIndexedAccessType(indexed) => indexed.object_type.span() == span, _ => false, } @@ -85,6 +92,7 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSIntersectionType<'a>> { self.parent, AstNodes::TSArrayType(_) | AstNodes::TSTypeOperator(_) + | AstNodes::TSOptionalType(_) | AstNodes::TSIndexedAccessType(_) ) } @@ -96,7 +104,9 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSConditionalType<'a>> { AstNodes::TSConditionalType(ty) => { ty.extends_type().span() == self.span() || ty.check_type().span() == self.span() } - AstNodes::TSUnionType(_) | AstNodes::TSIntersectionType(_) => true, + AstNodes::TSUnionType(_) + | AstNodes::TSIntersectionType(_) + | AstNodes::TSOptionalType(_) => true, _ => false, } } @@ -109,6 +119,7 @@ impl<'a> NeedsParentheses<'a> for AstNode<'a, TSTypeOperator<'a>> { AstNodes::TSArrayType(_) | AstNodes::TSTypeOperator(_) | AstNodes::TSIndexedAccessType(_) + | AstNodes::TSOptionalType(_) ) } } diff --git a/tasks/prettier_conformance/snapshots/prettier.ts.snap.md b/tasks/prettier_conformance/snapshots/prettier.ts.snap.md index 1e94556811da0..0448935b9295b 100644 --- a/tasks/prettier_conformance/snapshots/prettier.ts.snap.md +++ b/tasks/prettier_conformance/snapshots/prettier.ts.snap.md @@ -1,4 +1,4 @@ -ts compatibility: 467/573 (81.50%) +ts compatibility: 468/573 (81.68%) # Failed @@ -83,7 +83,6 @@ ts compatibility: 467/573 (81.50%) | typescript/non-null/parens.ts | 💥 | 96.00% | | typescript/nosemi/index-signature.ts | 💥 | 75.00% | | typescript/object-multiline/multiline.ts | 💥✨ | 23.21% | -| typescript/optional-type/complex.ts | 💥 | 0.00% | | typescript/optional-variance/basic.ts | 💥 | 98.36% | | typescript/optional-variance/with-jsx.tsx | 💥 | 98.36% | | typescript/override-modifiers/override-modifier.ts | 💥 | 25.00% |