diff --git a/crates/oxc_formatter/src/utils/conditional.rs b/crates/oxc_formatter/src/utils/conditional.rs index babaa1814bf77..dfc1f92c686c3 100644 --- a/crates/oxc_formatter/src/utils/conditional.rs +++ b/crates/oxc_formatter/src/utils/conditional.rs @@ -4,7 +4,7 @@ use oxc_ast::ast::*; use oxc_span::{GetSpan, Span}; use crate::{ - Format, FormatResult, FormatWrite, + Format, FormatResult, FormatWrite, format_args, formatter::{Formatter, prelude::*, trivia::FormatTrailingComments}, generated::ast_nodes::{AstNode, AstNodes}, utils::format_node_without_trailing_comments::FormatNodeWithoutTrailingComments, @@ -373,41 +373,34 @@ impl<'a> FormatConditionalLike<'a, '_> { f: &mut Formatter<'f, 'a>, layout: ConditionalLayout, ) -> FormatResult<()> { - let format_inner = format_with(|f| match self.conditional { - ConditionalLike::ConditionalExpression(conditional) => { - write!(f, FormatNodeWithoutTrailingComments(conditional.test()))?; - format_trailing_comments( - conditional.test.span().end, - conditional.consequent.span().start, - b'?', - f, - ) - } - ConditionalLike::TSConditionalType(conditional) => { - write!( - f, - [ - conditional.check_type(), - space(), - "extends", - space(), - FormatNodeWithoutTrailingComments(conditional.extends_type()) - ] - )?; + let format_inner = format_with(|f| { + let (start, end) = match self.conditional { + ConditionalLike::ConditionalExpression(conditional) => { + write!(f, FormatNodeWithoutTrailingComments(conditional.test()))?; + (conditional.test.span().end, conditional.consequent.span().start) + } + ConditionalLike::TSConditionalType(conditional) => { + write!( + f, + [ + conditional.check_type(), + space(), + "extends", + space(), + FormatNodeWithoutTrailingComments(conditional.extends_type()) + ] + )?; + (conditional.extends_type.span().end, conditional.true_type.span().start) + } + }; - format_trailing_comments( - conditional.extends_type.span().end, - conditional.true_type.span().start, - b'?', - f, - ) - } + format_trailing_comments(start, end, b'?', f) }); if layout.is_nested_alternate() { write!(f, [align(2, &format_inner)]) } else { - format_inner.fmt(f) + write!(f, format_inner) } } @@ -420,27 +413,19 @@ impl<'a> FormatConditionalLike<'a, '_> { write!(f, [soft_line_break_or_space(), "?", space()])?; let format_consequent = format_with(|f| { - let format_consequent_with_trailing_comments = - format_once(|f| match self.conditional { + let format_consequent_with_trailing_comments = format_once(|f| { + let (start, end) = match self.conditional { ConditionalLike::ConditionalExpression(conditional) => { write!(f, FormatNodeWithoutTrailingComments(conditional.consequent()))?; - format_trailing_comments( - conditional.consequent.span().end, - conditional.alternate.span().start, - b':', - f, - ) + (conditional.consequent.span().end, conditional.alternate.span().start) } ConditionalLike::TSConditionalType(conditional) => { write!(f, FormatNodeWithoutTrailingComments(conditional.true_type()))?; - format_trailing_comments( - conditional.true_type.span().end, - conditional.false_type.span().start, - b':', - f, - ) + (conditional.true_type.span().end, conditional.false_type.span().start) } - }); + }; + format_trailing_comments(start, end, b':', f) + }); let format_consequent_with_proper_indentation = format_with(|f| { if f.options().indent_style.is_space() { @@ -606,7 +591,11 @@ impl<'a> Format<'a> for FormatConditionalLike<'a, '_> { }); let grouped = format_with(|f| { - if layout.is_root() { write!(f, [group(&format_inner)]) } else { format_inner.fmt(f) } + if layout.is_root() || layout.is_nested_test() { + write!(f, [group(&format_inner)]) + } else { + format_inner.fmt(f) + } }); if layout.is_nested_test() || should_extra_indent { diff --git a/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts b/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts new file mode 100644 index 0000000000000..6940a71610840 --- /dev/null +++ b/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts @@ -0,0 +1,12 @@ +type IsUnion = ( + Testtttttttttttttttttttttttttttttttttt extends any ? false : never +) extends false + ? false + : true + + + +export const IsUnionType = ( + Testtttttttttttttttttttttttttttttttttt ? false : never +) ? false + : true \ No newline at end of file diff --git a/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts.snap b/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts.snap new file mode 100644 index 0000000000000..0ab67e3d812ad --- /dev/null +++ b/crates/oxc_formatter/tests/fixtures/ts/conditional-type/nested-test.ts.snap @@ -0,0 +1,30 @@ +--- +source: crates/oxc_formatter/tests/fixtures/mod.rs +--- +==================== Input ==================== +type IsUnion = ( + Testtttttttttttttttttttttttttttttttttt extends any ? false : never +) extends false + ? false + : true + + + +export const IsUnionType = ( + Testtttttttttttttttttttttttttttttttttt ? false : never +) ? false + : true +==================== Output ==================== +type IsUnion = ( + Testtttttttttttttttttttttttttttttttttt extends any ? false : never +) extends false + ? false + : true; + +export const IsUnionType = ( + Testtttttttttttttttttttttttttttttttttt ? false : never +) + ? false + : true; + +===================== End =====================