From cb33205586799a64eef5a34b39c9fc1a8c519f52 Mon Sep 17 00:00:00 2001 From: Denis Bezrukov <6227442+denbezrukov@users.noreply.github.com> Date: Mon, 21 Nov 2022 13:34:17 +0200 Subject: [PATCH] fix(rome_js_formatter): Inline object like pattern for formal parameter (#3802) Co-authored-by: Micha Reiser --- .../src/js/bindings/formal_parameter.rs | 27 ++++--- .../src/utils/object_pattern_like.rs | 14 +++- .../specs/ts/function/function_parameters.ts | 19 +++++ .../ts/function/function_parameters.ts.snap | 71 +++++++++++++++++++ .../function_trailing_comma.ts | 0 .../function_trailing_comma.ts.snap | 0 .../{ => trailing_comma}/options.json | 0 7 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts create mode 100644 crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts.snap rename crates/rome_js_formatter/tests/specs/ts/function/{ => trailing_comma}/function_trailing_comma.ts (100%) rename crates/rome_js_formatter/tests/specs/ts/function/{ => trailing_comma}/function_trailing_comma.ts.snap (100%) rename crates/rome_js_formatter/tests/specs/ts/function/{ => trailing_comma}/options.json (100%) diff --git a/crates/rome_js_formatter/src/js/bindings/formal_parameter.rs b/crates/rome_js_formatter/src/js/bindings/formal_parameter.rs index e24cacdcec0..eaf6a2e15e8 100644 --- a/crates/rome_js_formatter/src/js/bindings/formal_parameter.rs +++ b/crates/rome_js_formatter/src/js/bindings/formal_parameter.rs @@ -3,8 +3,8 @@ use rome_formatter::write; use crate::utils::FormatInitializerClause; -use rome_js_syntax::JsFormalParameter; use rome_js_syntax::JsFormalParameterFields; +use rome_js_syntax::{JsAnyBindingPattern, JsFormalParameter}; #[derive(Debug, Clone, Default)] pub struct FormatJsFormalParameter; @@ -18,14 +18,23 @@ impl FormatNodeRule for FormatJsFormalParameter { initializer, } = node.as_fields(); - write![ - f, - [ - binding.format(), - question_mark_token.format(), - type_annotation.format(), - FormatInitializerClause::new(initializer.as_ref()) + let content = format_with(|f| { + write![ + f, + [ + binding.format(), + question_mark_token.format(), + type_annotation.format() + ] ] - ] + }); + + if let JsAnyBindingPattern::JsObjectBindingPattern(_) = node.binding()? { + write![f, [group(&content)]]?; + } else { + write![f, [content]]?; + } + + write![f, [FormatInitializerClause::new(initializer.as_ref())]] } } diff --git a/crates/rome_js_formatter/src/utils/object_pattern_like.rs b/crates/rome_js_formatter/src/utils/object_pattern_like.rs index 4ceb157e26f..6bf09d3ed5f 100644 --- a/crates/rome_js_formatter/src/utils/object_pattern_like.rs +++ b/crates/rome_js_formatter/src/utils/object_pattern_like.rs @@ -48,6 +48,16 @@ impl JsObjectPatternLike { } } + fn is_inline(&self, comments: &JsComments) -> FormatResult { + let parent_kind = self.syntax().parent().kind(); + + Ok( + (matches!(parent_kind, Some(JsSyntaxKind::JS_FORMAL_PARAMETER)) + || self.is_hug_parameter(comments)) + && !self.l_curly_token()?.leading_trivia().has_skipped(), + ) + } + fn should_break_properties(&self) -> bool { let parent_kind = self.syntax().parent().kind(); @@ -60,7 +70,6 @@ impl JsObjectPatternLike { | JsSyntaxKind::JS_OBJECT_ASSIGNMENT_PATTERN_PROPERTY | JsSyntaxKind::JS_CATCH_DECLARATION | JsSyntaxKind::JS_OBJECT_BINDING_PATTERN_PROPERTY - | JsSyntaxKind::JS_FORMAL_PARAMETER ) ); @@ -132,8 +141,7 @@ impl JsObjectPatternLike { return Ok(ObjectPatternLayout::Empty); } - if self.is_hug_parameter(comments) && !self.l_curly_token()?.leading_trivia().has_skipped() - { + if self.is_inline(comments)? { return Ok(ObjectPatternLayout::Inline); } diff --git a/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts b/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts new file mode 100644 index 00000000000..1379ea5f3ae --- /dev/null +++ b/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts @@ -0,0 +1,19 @@ +export function formatNumber1( + value: string, + { + a, + b, + c, + formatNumber, + ...props + }: Omit & { + useGrouping?: boolean; + } +): string {} + +export function formatNumber2( + value: string, + { a }: Omit & { + useGrouping?: boolean; + } +): string {} diff --git a/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts.snap b/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts.snap new file mode 100644 index 00000000000..4a0b3274d75 --- /dev/null +++ b/crates/rome_js_formatter/tests/specs/ts/function/function_parameters.ts.snap @@ -0,0 +1,71 @@ +--- +source: crates/rome_js_formatter/tests/spec_test.rs +expression: function_parameters.ts +--- + +# Input + +```js +export function formatNumber1( + value: string, + { + a, + b, + c, + formatNumber, + ...props + }: Omit & { + useGrouping?: boolean; + } +): string {} + +export function formatNumber2( + value: string, + { a }: Omit & { + useGrouping?: boolean; + } +): string {} + +``` + + +============================= + +# Outputs + +## Output 1 + +----- +Indent style: Tab +Line width: 80 +Quote style: Double Quotes +Quote properties: As needed +Trailing comma: All +Semicolons: Always +----- + +```js +export function formatNumber1( + value: string, + { + a, + b, + c, + formatNumber, + ...props + }: Omit & { + useGrouping?: boolean; + }, +): string {} + +export function formatNumber2( + value: string, + { + a, + }: Omit & { + useGrouping?: boolean; + }, +): string {} +``` + + diff --git a/crates/rome_js_formatter/tests/specs/ts/function/function_trailing_comma.ts b/crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/function_trailing_comma.ts similarity index 100% rename from crates/rome_js_formatter/tests/specs/ts/function/function_trailing_comma.ts rename to crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/function_trailing_comma.ts diff --git a/crates/rome_js_formatter/tests/specs/ts/function/function_trailing_comma.ts.snap b/crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/function_trailing_comma.ts.snap similarity index 100% rename from crates/rome_js_formatter/tests/specs/ts/function/function_trailing_comma.ts.snap rename to crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/function_trailing_comma.ts.snap diff --git a/crates/rome_js_formatter/tests/specs/ts/function/options.json b/crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/options.json similarity index 100% rename from crates/rome_js_formatter/tests/specs/ts/function/options.json rename to crates/rome_js_formatter/tests/specs/ts/function/trailing_comma/options.json