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

Commit

Permalink
refactor(rome_js_formatter): Remove unnecessary groups from `format_s…
Browse files Browse the repository at this point in the history
…eparated`

`format_separated` used to group all elements by default. This is often undesired and also comes with a performance cost (printer needs to test if the elements fit).

This PR changes the default of `format_separated` so that it doesn't group the elements except if enabled explicitly using `nodes_grouped`.

This PR further fixes the formatting of named import specifiers to more closely match Prettier's foramtting.
  • Loading branch information
MichaReiser committed Jun 23, 2022
1 parent ffe1f92 commit f8074de
Show file tree
Hide file tree
Showing 15 changed files with 41 additions and 74 deletions.
6 changes: 1 addition & 5 deletions crates/rome_formatter/src/printer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -327,11 +327,7 @@ impl<'a> Printer<'a> {
queue.extend(
line_break
.into_iter()
.chain(self.state.line_suffixes.drain(..).map(move |mut call| {
// Overwrite the arguments for the PrintElementCalls in the queue with the current arguments
call.args = args;
call
}))
.chain(self.state.line_suffixes.drain(..))
.chain(once(call_self)),
);
}
Expand Down
14 changes: 5 additions & 9 deletions crates/rome_js_formatter/src/js/expressions/call_arguments.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,7 @@ impl FormatNodeRule<JsCallArguments> for FormatJsCallArguments {
// We also disallow the trailing separator, we are interested in doing it manually.
let separated: Vec<_> = args
.format_separated(JsSyntaxKind::COMMA)
.with_options(
FormatSeparatedOptions::default()
.with_trailing_separator(TrailingSeparator::Omit),
)
.with_trailing_separator(TrailingSeparator::Omit)
.map(|e| e.memoized())
.collect();

Expand Down Expand Up @@ -191,11 +188,10 @@ impl FormatNodeRule<JsCallArguments> for FormatJsCallArguments {
l_paren,
l_trailing_trivia,
&soft_block_indent(&format_with(|f| {
let separated =
args.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default()
.with_trailing_separator(TrailingSeparator::Omit),
);
let separated = args
.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(TrailingSeparator::Omit)
.nodes_grouped();
write_arguments_multi_line(separated, f)
}),),
r_leading_trivia,
Expand Down
7 changes: 3 additions & 4 deletions crates/rome_js_formatter/src/js/lists/call_argument_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,9 @@ impl FormatRule<JsCallArgumentList> for FormatJsCallArgumentList {
write!(
f,
[&group_elements(&soft_block_indent(&format_with(|f| {
let separated = node.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default()
.with_trailing_separator(TrailingSeparator::Omit),
);
let separated = node
.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(TrailingSeparator::Omit);
write_arguments_multi_line(separated, f)
})))]
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ impl FormatRule<JsObjectAssignmentPatternPropertyList>
};

f.join_with(&soft_line_break_or_space())
.entries(node.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default().with_trailing_separator(trailing_separator),
))
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(trailing_separator),
)
.finish()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ impl FormatRule<JsObjectBindingPatternPropertyList> for FormatJsObjectBindingPat
};

f.join_with(&soft_line_break_or_space())
.entries(node.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default().with_trailing_separator(trailing_separator),
))
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(trailing_separator),
)
.finish()
}
}
7 changes: 4 additions & 3 deletions crates/rome_js_formatter/src/js/lists/parameter_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ impl FormatRule<JsParameterList> for FormatJsParameterList {
};

f.join_with(&soft_line_break_or_space())
.entries(node.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default().with_trailing_separator(trailing_separator),
))
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(trailing_separator),
)
.finish()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ impl FormatNodeRule<JsNamedImportSpecifier> for FormatJsNamedImportSpecifier {
f,
[
name.format(),
soft_line_break_or_space(),
space_token(),
as_token.format(),
soft_line_break_or_space(),
space_token(),
local_name.format()
]
]
Expand Down
29 changes: 5 additions & 24 deletions crates/rome_js_formatter/src/separated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ where
let node = self.element.node()?;
let separator = self.element.trailing_separator()?;

if self.options.disable_group_nodes {
if !self.options.nodes_grouped {
node.format().fmt(f)?;
} else {
group_elements(&node.format()).fmt(f)?;
Expand Down Expand Up @@ -107,15 +107,9 @@ where
}
}

pub fn with_options(mut self, options: FormatSeparatedOptions) -> Self {
self.options = options;
self
}

/// Sets whatever the nodes should be wrapped by a `group_elements` (default: `true` for compatibility
/// reasons).
pub fn group_nodes(mut self, group_nodes: bool) -> Self {
self.options.disable_group_nodes = !group_nodes;
/// Wraps every node inside of a group
pub fn nodes_grouped(mut self) -> Self {
self.options.nodes_grouped = true;
self
}

Expand Down Expand Up @@ -210,18 +204,5 @@ impl Default for TrailingSeparator {
pub struct FormatSeparatedOptions {
trailing_separator: TrailingSeparator,
group_id: Option<GroupId>,
disable_group_nodes: bool,
}

impl FormatSeparatedOptions {
pub fn with_trailing_separator(mut self, separator: TrailingSeparator) -> Self {
self.trailing_separator = separator;
self
}

#[allow(unused)]
pub fn with_group_id(mut self, group_id: Option<GroupId>) -> Self {
self.group_id = group_id;
self
}
nodes_grouped: bool,
}
2 changes: 1 addition & 1 deletion crates/rome_js_formatter/src/ts/lists/enum_member_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ impl FormatRule<TsEnumMemberList> for FormatTsEnumMemberList {
} else {
soft_line_break_or_space()
})
.entries(node.format_separated(JsSyntaxKind::COMMA))
.entries(node.format_separated(JsSyntaxKind::COMMA).nodes_grouped())
.finish()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ impl FormatRule<TsTupleTypeElementList> for FormatTsTupleTypeElementList {

fn fmt(&self, node: &TsTupleTypeElementList, f: &mut JsFormatter) -> FormatResult<()> {
f.join_with(&soft_line_break_or_space())
.entries(node.format_separated(JsSyntaxKind::COMMA))
.entries(node.format_separated(JsSyntaxKind::COMMA).nodes_grouped())
.finish()
}
}
3 changes: 1 addition & 2 deletions crates/rome_js_formatter/src/ts/lists/type_argument_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ impl FormatRule<TsTypeArgumentList> for FormatTsTypeArgumentList {
f.join_with(&soft_line_break_or_space())
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(TrailingSeparator::Disallowed)
.group_nodes(false),
.with_trailing_separator(TrailingSeparator::Disallowed),
)
.finish()
}
Expand Down
3 changes: 1 addition & 2 deletions crates/rome_js_formatter/src/ts/lists/type_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ impl FormatRule<TsTypeList> for FormatTsTypeList {
f.join_with(&soft_line_break_or_space())
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(TrailingSeparator::Disallowed)
.group_nodes(false),
.with_trailing_separator(TrailingSeparator::Disallowed),
)
.finish()
}
Expand Down
7 changes: 4 additions & 3 deletions crates/rome_js_formatter/src/ts/lists/type_parameter_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ impl FormatRule<TsTypeParameterList> for FormatTsTypeParameterList {
};

f.join_with(&soft_line_break_or_space())
.entries(node.format_separated(JsSyntaxKind::COMMA).with_options(
FormatSeparatedOptions::default().with_trailing_separator(trailing_separator),
))
.entries(
node.format_separated(JsSyntaxKind::COMMA)
.with_trailing_separator(trailing_separator),
)
.finish()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,7 @@ export {
import {
foo,
bar
as // comment
baz,
bar as baz, // comment
} from "foo";
```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,29 +58,24 @@ import {
a //comment1
//comment2
//comment3
as
b,
as b,
} from "";
import {
a
as //comment1
a as //comment1
//comment2
//comment3
b1,
} from "";
import {
a
as //comment2 //comment1
a as //comment2 //comment1
//comment3
b2,
} from "";
import {
a
as //comment3 //comment2 //comment1
b3,
a as b3, //comment3 //comment2 //comment1
} from "";
import {
Expand Down

0 comments on commit f8074de

Please sign in to comment.