diff --git a/crates/rome_js_formatter/src/lib.rs b/crates/rome_js_formatter/src/lib.rs index 871893e7ed46..c4024575a23d 100644 --- a/crates/rome_js_formatter/src/lib.rs +++ b/crates/rome_js_formatter/src/lib.rs @@ -457,10 +457,13 @@ mod test { // use this test check if your snippet prints as you wish, without using a snapshot fn quick_test() { let src = r#" +type Props1 = // (DispatchProps & StateProps); WHY DON'T YOU WORK FLOW!!!!!!!!! +{ + isPlaying: boolean, +}; + + -it(`does something really long and complicated so I have to write a very long name for the test`, function () { - console.log("hello!"); - }); "#; let syntax = SourceType::tsx(); diff --git a/crates/rome_js_formatter/src/ts/declarations/type_alias_declaration.rs b/crates/rome_js_formatter/src/ts/declarations/type_alias_declaration.rs index f81fbdab8b72..3f937680e9be 100644 --- a/crates/rome_js_formatter/src/ts/declarations/type_alias_declaration.rs +++ b/crates/rome_js_formatter/src/ts/declarations/type_alias_declaration.rs @@ -1,37 +1,21 @@ use crate::prelude::*; -use crate::utils::FormatWithSemicolon; - +use crate::utils::{FormatWithSemicolon, JsAnyAssignmentLike}; use rome_formatter::{format_args, write}; -use rome_js_syntax::{TsTypeAliasDeclaration, TsTypeAliasDeclarationFields}; +use rome_js_syntax::TsTypeAliasDeclaration; #[derive(Debug, Clone, Default)] pub struct FormatTsTypeAliasDeclaration; impl FormatNodeRule for FormatTsTypeAliasDeclaration { fn fmt_fields(&self, node: &TsTypeAliasDeclaration, f: &mut JsFormatter) -> FormatResult<()> { - let TsTypeAliasDeclarationFields { - type_token, - binding_identifier, - type_parameters, - eq_token, - ty, - semicolon_token, - } = node.as_fields(); - + let type_token = node.type_token()?; + let semicolon = node.semicolon_token(); + let assignment_like = format_with(|f| write!(f, [JsAnyAssignmentLike::from(node.clone())])); write!( f, [FormatWithSemicolon::new( - &format_args!( - type_token.format(), - space_token(), - binding_identifier.format(), - type_parameters.format(), - space_token(), - eq_token.format(), - space_token(), - ty.format(), - ), - semicolon_token.as_ref() + &format_args![type_token.format(), space_token(), assignment_like], + semicolon.as_ref() )] ) } diff --git a/crates/rome_js_formatter/src/utils/assignment_like.rs b/crates/rome_js_formatter/src/utils/assignment_like.rs index 86fcd89c2b47..27d2c7511534 100644 --- a/crates/rome_js_formatter/src/utils/assignment_like.rs +++ b/crates/rome_js_formatter/src/utils/assignment_like.rs @@ -7,7 +7,8 @@ use rome_js_syntax::{ JsAnyObjectAssignmentPatternMember, JsAnyObjectBindingPatternMember, JsAnyObjectMemberName, JsAssignmentExpression, JsInitializerClause, JsObjectAssignmentPattern, JsObjectAssignmentPatternProperty, JsObjectBindingPattern, JsPropertyObjectMember, - JsSyntaxKind, JsVariableDeclarator, TsAnyVariableAnnotation, TsType, + JsSyntaxKind, JsVariableDeclarator, TsAnyVariableAnnotation, TsIdentifierBinding, TsType, + TsTypeAliasDeclaration, }; use rome_js_syntax::{JsAnyLiteralExpression, JsSyntaxNode}; use rome_rowan::{declare_node_union, AstNode, SyntaxResult}; @@ -17,15 +18,16 @@ declare_node_union! { JsPropertyObjectMember | JsAssignmentExpression | JsObjectAssignmentPatternProperty | - JsVariableDeclarator + JsVariableDeclarator | + TsTypeAliasDeclaration } declare_node_union! { - pub(crate) LeftAssignmentLike = JsAnyAssignmentPattern | JsAnyObjectMemberName | JsAnyBindingPattern + pub(crate) LeftAssignmentLike = JsAnyAssignmentPattern | JsAnyObjectMemberName | JsAnyBindingPattern | TsIdentifierBinding } declare_node_union! { - pub(crate) RightAssignmentLike = JsAnyExpression | JsAnyAssignmentPattern | JsInitializerClause + pub(crate) RightAssignmentLike = JsAnyExpression | JsAnyAssignmentPattern | JsInitializerClause | TsType } declare_node_union! { @@ -151,6 +153,8 @@ impl RightAssignmentLike { RightAssignmentLike::JsAnyExpression(expression) => Some(expression.clone()), RightAssignmentLike::JsInitializerClause(initializer) => initializer.expression().ok(), RightAssignmentLike::JsAnyAssignmentPattern(_) => None, + // TODO: check here + RightAssignmentLike::TsType(_) => None, } } } @@ -167,6 +171,9 @@ impl Format for RightAssignmentLike { RightAssignmentLike::JsInitializerClause(initializer) => { write!(f, [space_token(), initializer.format()]) } + RightAssignmentLike::TsType(ty) => { + write!(f, [space_token(), ty.format()]) + } } } } @@ -294,6 +301,9 @@ impl JsAnyAssignmentLike { // SAFETY: Calling `unwrap` here is safe because we check `should_only_left` variant at the beginning of the `layout` function Ok(variable_declarator.initializer().unwrap().into()) } + JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => { + Ok(type_alias_declaration.ty()?.into()) + } } } @@ -309,6 +319,9 @@ impl JsAnyAssignmentLike { JsAnyAssignmentLike::JsVariableDeclarator(variable_declarator) => { Ok(variable_declarator.id()?.into()) } + JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => { + Ok(type_alias_declaration.binding_identifier()?.into()) + } } } @@ -347,9 +360,20 @@ impl JsAnyAssignmentLike { JsAnyAssignmentLike::JsVariableDeclarator(variable_declarator) => { let id = variable_declarator.id()?; let variable_annotation = variable_declarator.variable_annotation(); + write!(f, [id.format(), variable_annotation.format()])?; Ok(false) } + JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => { + let binding_identifier = type_alias_declaration.binding_identifier()?; + let type_parameters = type_alias_declaration.type_parameters(); + + write!(f, [binding_identifier.format()])?; + if let Some(type_parameters) = type_parameters { + write!(f, [type_parameters.format(),])?; + } + Ok(false) + } } } @@ -374,6 +398,10 @@ impl JsAnyAssignmentLike { } Ok(()) } + JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => { + let eq_token = type_alias_declaration.eq_token()?; + write!(f, [space_token(), eq_token.format()]) + } } } @@ -403,6 +431,10 @@ impl JsAnyAssignmentLike { } Ok(()) } + JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => { + let ty = type_alias_declaration.ty()?; + write!(f, [space_token(), ty.format()]) + } } } @@ -559,6 +591,35 @@ impl JsAnyAssignmentLike { Ok(false) } + fn is_complex_type_alias(&self) -> SyntaxResult { + let result = if let JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) = + self + { + let type_parameters = type_alias_declaration.type_parameters(); + + if let Some(type_parameters) = type_parameters { + let items = type_parameters.items(); + if items.len() <= 1 { + return Ok(false); + }; + for type_parameter in type_parameters.items() { + let type_parameter = type_parameter?; + + if type_parameter.constraint().is_some() || type_parameter.default().is_some() { + return Ok(true); + } + } + return Ok(false); + } else { + false + } + } else { + false + }; + + Ok(result) + } + /// Particular function that checks if the left hand side of a [JsAnyAssignmentLike] should /// be broken on multiple lines fn should_break_left_hand_side(&self) -> SyntaxResult { @@ -573,7 +634,9 @@ impl JsAnyAssignmentLike { .and_then(|annotation| is_complex_type_annotation(annotation).ok()) .unwrap_or(false); - Ok(is_complex_destructuring || has_complex_type_annotation) + let is_complex_type_alias = self.is_complex_type_alias()?; + + Ok(is_complex_destructuring || has_complex_type_annotation || is_complex_type_alias) } } diff --git a/crates/rome_js_formatter/tests/specs/prettier/typescript/tuple/trailing-comma-for-empty-tuples.ts.snap b/crates/rome_js_formatter/tests/specs/prettier/typescript/tuple/trailing-comma-for-empty-tuples.ts.snap index 73303f3466e4..7441072c669a 100644 --- a/crates/rome_js_formatter/tests/specs/prettier/typescript/tuple/trailing-comma-for-empty-tuples.ts.snap +++ b/crates/rome_js_formatter/tests/specs/prettier/typescript/tuple/trailing-comma-for-empty-tuples.ts.snap @@ -1,5 +1,6 @@ --- source: crates/rome_js_formatter/tests/prettier_tests.rs +assertion_line: 182 expression: trailing-comma-for-empty-tuples.ts --- # Input @@ -11,15 +12,16 @@ type Foo = Foooooooooooooooooooooooooooooooooooooooooooooooooooooooooo extends [ # Output ```js -type Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong = []; +type Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong = + []; -type Foo = Foooooooooooooooooooooooooooooooooooooooooooooooooooooooooo extends [] ? Foo3 : Foo4; +type Foo = + Foooooooooooooooooooooooooooooooooooooooooooooooooooooooooo extends [] ? Foo3 : Foo4; ``` # Lines exceeding max width of 80 characters ``` - 1: type Loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong = []; - 3: type Foo = Foooooooooooooooooooooooooooooooooooooooooooooooooooooooooo extends [] ? Foo3 : Foo4; + 5: Foooooooooooooooooooooooooooooooooooooooooooooooooooooooooo extends [] ? Foo3 : Foo4; ```