Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
feat(rome_js_formatter): type alias as assignment like
Browse files Browse the repository at this point in the history
  • Loading branch information
ematipico committed Jun 27, 2022
1 parent 58c297f commit c9035cc
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 35 deletions.
9 changes: 6 additions & 3 deletions crates/rome_js_formatter/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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<TsTypeAliasDeclaration> 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()
)]
)
}
Expand Down
73 changes: 68 additions & 5 deletions crates/rome_js_formatter/src/utils/assignment_like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand All @@ -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! {
Expand Down Expand Up @@ -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,
}
}
}
Expand All @@ -167,6 +171,9 @@ impl Format<JsFormatContext> for RightAssignmentLike {
RightAssignmentLike::JsInitializerClause(initializer) => {
write!(f, [space_token(), initializer.format()])
}
RightAssignmentLike::TsType(ty) => {
write!(f, [space_token(), ty.format()])
}
}
}
}
Expand Down Expand Up @@ -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())
}
}
}

Expand All @@ -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())
}
}
}

Expand Down Expand Up @@ -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)
}
}
}

Expand All @@ -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()])
}
}
}

Expand Down Expand Up @@ -403,6 +431,10 @@ impl JsAnyAssignmentLike {
}
Ok(())
}
JsAnyAssignmentLike::TsTypeAliasDeclaration(type_alias_declaration) => {
let ty = type_alias_declaration.ty()?;
write!(f, [space_token(), ty.format()])
}
}
}

Expand Down Expand Up @@ -559,6 +591,35 @@ impl JsAnyAssignmentLike {
Ok(false)
}

fn is_complex_type_alias(&self) -> SyntaxResult<bool> {
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<bool> {
Expand All @@ -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)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
source: crates/rome_js_formatter/tests/prettier_tests.rs
assertion_line: 182
expression: trailing-comma-for-empty-tuples.ts
---
# Input
Expand All @@ -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;
```

0 comments on commit c9035cc

Please sign in to comment.