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): Computed member assignment formatting
Browse files Browse the repository at this point in the history
This PR improves the formatting of computed member assignment to match the formatting of computed member expressions.
  • Loading branch information
MichaReiser committed Aug 15, 2022
1 parent 8358d25 commit e63306b
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 117 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
use crate::prelude::*;
use rome_formatter::write;

use crate::js::expressions::computed_member_expression::JsAnyComputedMemberLike;
use rome_js_syntax::JsComputedMemberAssignment;
use rome_js_syntax::JsComputedMemberAssignmentFields;

#[derive(Debug, Clone, Default)]
pub struct FormatJsComputedMemberAssignment;
Expand All @@ -13,21 +12,6 @@ impl FormatNodeRule<JsComputedMemberAssignment> for FormatJsComputedMemberAssign
node: &JsComputedMemberAssignment,
f: &mut JsFormatter,
) -> FormatResult<()> {
let JsComputedMemberAssignmentFields {
object,
l_brack_token,
member,
r_brack_token,
} = node.as_fields();

write!(
f,
[
object.format(),
l_brack_token.format(),
member.format(),
r_brack_token.format(),
]
)
JsAnyComputedMemberLike::from(node.clone()).fmt(f)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
use crate::prelude::*;

use rome_formatter::{format_args, write};
use rome_js_syntax::JsComputedMemberExpression;
use rome_js_syntax::JsComputedMemberExpressionFields;
use rome_js_syntax::JsSyntaxToken;
use rome_js_syntax::{
JsAnyExpression, JsAnyLiteralExpression, JsComputedMemberAssignment, JsComputedMemberExpression,
};
use rome_rowan::{declare_node_union, SyntaxResult};

#[derive(Debug, Clone, Default)]
pub struct FormatJsComputedMemberExpression;
Expand All @@ -13,26 +16,91 @@ impl FormatNodeRule<JsComputedMemberExpression> for FormatJsComputedMemberExpres
node: &JsComputedMemberExpression,
f: &mut JsFormatter,
) -> FormatResult<()> {
let JsComputedMemberExpressionFields {
object,
optional_chain_token,
l_brack_token,
member,
r_brack_token,
} = node.as_fields();

write![
f,
[
object.format(),
group(&format_args![
optional_chain_token.format(),
l_brack_token.format(),
soft_line_break(),
soft_block_indent(&member.format()),
r_brack_token.format()
]),
]
]
JsAnyComputedMemberLike::from(node.clone()).fmt(f)
}
}

declare_node_union! {
pub(crate) JsAnyComputedMemberLike = JsComputedMemberExpression | JsComputedMemberAssignment
}

impl Format<JsFormatContext> for JsAnyComputedMemberLike {
fn fmt(&self, f: &mut Formatter<JsFormatContext>) -> FormatResult<()> {
write!(f, [self.object().format()])?;

match self.member()? {
JsAnyExpression::JsAnyLiteralExpression(
JsAnyLiteralExpression::JsNumberLiteralExpression(literal),
) => {
write!(
f,
[
self.optional_chain_token().format(),
self.l_brack_token().format(),
literal.format(),
self.r_brack_token().format()
]
)
}
member => {
write![
f,
[group(&format_args![
self.optional_chain_token().format(),
self.l_brack_token().format(),
soft_line_break(),
soft_block_indent(&member.format()),
self.r_brack_token().format()
]),]
]
}
}
}
}

impl JsAnyComputedMemberLike {
fn object(&self) -> SyntaxResult<JsAnyExpression> {
match self {
JsAnyComputedMemberLike::JsComputedMemberExpression(expression) => expression.object(),
JsAnyComputedMemberLike::JsComputedMemberAssignment(assignment) => assignment.object(),
}
}

fn l_brack_token(&self) -> SyntaxResult<JsSyntaxToken> {
match self {
JsAnyComputedMemberLike::JsComputedMemberExpression(expression) => {
expression.l_brack_token()
}
JsAnyComputedMemberLike::JsComputedMemberAssignment(assignment) => {
assignment.l_brack_token()
}
}
}

fn optional_chain_token(&self) -> Option<JsSyntaxToken> {
match self {
JsAnyComputedMemberLike::JsComputedMemberExpression(expression) => {
expression.optional_chain_token()
}
JsAnyComputedMemberLike::JsComputedMemberAssignment(_) => None,
}
}

fn member(&self) -> SyntaxResult<JsAnyExpression> {
match self {
JsAnyComputedMemberLike::JsComputedMemberExpression(expression) => expression.member(),
JsAnyComputedMemberLike::JsComputedMemberAssignment(assignment) => assignment.member(),
}
}

fn r_brack_token(&self) -> SyntaxResult<JsSyntaxToken> {
match self {
JsAnyComputedMemberLike::JsComputedMemberExpression(expression) => {
expression.r_brack_token()
}
JsAnyComputedMemberLike::JsComputedMemberAssignment(assignment) => {
assignment.r_brack_token()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::prelude::*;

use crate::js::expressions::computed_member_expression::JsAnyComputedMemberLike;
use rome_formatter::{format_args, write};
use rome_js_syntax::{
JsAnyAssignment, JsAnyAssignmentPattern, JsAnyExpression, JsAnyName, JsAssignmentExpression,
Expand All @@ -16,6 +17,7 @@ impl FormatNodeRule<JsStaticMemberExpression> for FormatJsStaticMemberExpression
}
}

#[derive(Debug, Copy, Clone)]
enum StaticMemberLikeLayout {
/// Forces that there's no line break between the object, operator, and member
NoBreak,
Expand Down Expand Up @@ -106,6 +108,7 @@ impl JsAnyStaticMemberLike {
}

JsAnyStaticMemberLike::can_cast(parent.kind())
|| JsAnyComputedMemberLike::can_cast(parent.kind())
}
None => false,
};
Expand All @@ -114,10 +117,10 @@ impl JsAnyStaticMemberLike {
return Ok(StaticMemberLikeLayout::NoBreak);
}

let first_non_static_member_ancestor = self
.syntax()
.ancestors()
.find(|parent| !JsAnyStaticMemberLike::can_cast(parent.kind()));
let first_non_static_member_ancestor = self.syntax().ancestors().find(|parent| {
!JsAnyStaticMemberLike::can_cast(parent.kind())
|| JsAnyComputedMemberLike::can_cast(parent.kind())
});

let layout = match first_non_static_member_ancestor.and_then(JsAnyExpression::cast) {
Some(JsAnyExpression::JsNewExpression(_)) => StaticMemberLikeLayout::NoBreak,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,7 @@ const {
```diff
--- Prettier
+++ Rome
@@ -3,22 +3,17 @@
weNeedToReachTheEightyCharacterLimitXXXXXXXXXXXXXXXXX.someNode
.childrenInAnArray[0];
superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered;
-superSupersuperSupersuperSupersuperSupersuperSuperLong
- .exampleOfOrderOfGetterAndSetterReordered[0];
+superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered[
+ 0
+];

expect(
findDOMNode(component.instance()).getElementsByClassName(styles.inner)[0]
@@ -11,14 +11,8 @@
.style.paddingRight,
).toBe("1000px");

Expand All @@ -71,9 +60,8 @@ SomeVeryLongUpperCaseConstant.someVeryLongCallExpression()
weNeedToReachTheEightyCharacterLimitXXXXXXXXXXXXXXXXX.someNode
.childrenInAnArray[0];
superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered;
superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered[
0
];
superSupersuperSupersuperSupersuperSupersuperSuperLong
.exampleOfOrderOfGetterAndSetterReordered[0];

expect(
findDOMNode(component.instance()).getElementsByClassName(styles.inner)[0]
Expand Down Expand Up @@ -104,6 +92,5 @@ const {
# Lines exceeding max width of 80 characters
```
5: superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered;
6: superSupersuperSupersuperSupersuperSupersuperSuperLong.exampleOfOrderOfGetterAndSetterReordered[
```

0 comments on commit e63306b

Please sign in to comment.