diff --git a/malva/src/doc_gen/at_rule/custom_selector.rs b/malva/src/doc_gen/at_rule/custom_selector.rs index 53468bb..71505d0 100644 --- a/malva/src/doc_gen/at_rule/custom_selector.rs +++ b/malva/src/doc_gen/at_rule/custom_selector.rs @@ -31,12 +31,11 @@ impl<'s> DocGen<'s> for CustomSelectorArg<'s> { impl<'s> DocGen<'s> for CustomSelectorArgs<'s> { fn doc(&self, ctx: &Ctx<'_, 's>) -> Doc<'s> { helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()).format( - &self.args, - &self.comma_spans, - self.span.start, - ctx, - ), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.args, ctx), + ) + .format(&self.args, &self.comma_spans, self.span.start, ctx), self.args .last() .map(|arg| arg.span.end) diff --git a/malva/src/doc_gen/helpers.rs b/malva/src/doc_gen/helpers.rs index 2960136..2aa55cb 100644 --- a/malva/src/doc_gen/helpers.rs +++ b/malva/src/doc_gen/helpers.rs @@ -262,3 +262,19 @@ pub(super) fn ident_to_lowercase<'s>( name => name.doc(ctx), } } + +pub(super) fn get_smart_linebreak<'s, N>( + start: usize, + elements: &[N], + ctx: &Ctx<'_, 's>, +) -> Doc<'static> +where + N: Spanned, +{ + match elements.first() { + Some(element) if ctx.line_bounds.line_distance(start, element.span().start) > 0 => { + Doc::hard_line() + } + _ => Doc::line_or_space(), + } +} diff --git a/malva/src/doc_gen/less.rs b/malva/src/doc_gen/less.rs index 506800e..bc7b0f4 100644 --- a/malva/src/doc_gen/less.rs +++ b/malva/src/doc_gen/less.rs @@ -178,9 +178,12 @@ impl<'s> DocGen<'s> for LessFormatFunction { impl<'s> DocGen<'s> for LessImportOptions<'s> { fn doc(&self, ctx: &Ctx<'_, 's>) -> Doc<'s> { helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(&self.names, &self.comma_spans, self.span.start, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.names, ctx), + ) + .with_trailing() + .format(&self.names, &self.comma_spans, self.span.start, ctx), self.names .last() .map(|name| name.span.end) @@ -382,7 +385,7 @@ impl<'s> DocGen<'s> for LessMixinArguments<'s> { .append( helpers::SeparatedListFormatter::new( if self.is_comma_separated { "," } else { ";" }, - Doc::line_or_space(), + helpers::get_smart_linebreak(self.span.start, &self.args, ctx), ) .with_trailing() .format( @@ -556,7 +559,7 @@ impl<'s> DocGen<'s> for LessMixinParameters<'s> { helpers::format_parenthesized( helpers::SeparatedListFormatter::new( if self.is_comma_separated { "," } else { ";" }, - Doc::line_or_space(), + helpers::get_smart_linebreak(self.span.start, &self.params, ctx), ) .with_trailing() .format(&self.params, &self.separator_spans, self.span.start, ctx), diff --git a/malva/src/doc_gen/sass.rs b/malva/src/doc_gen/sass.rs index 26c538e..ccfaa18 100644 --- a/malva/src/doc_gen/sass.rs +++ b/malva/src/doc_gen/sass.rs @@ -135,9 +135,12 @@ impl<'s> DocGen<'s> for SassConditionalClause<'s> { impl<'s> DocGen<'s> for SassContent<'s> { fn doc(&self, ctx: &Ctx<'_, 's>) -> Doc<'s> { helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(&self.args, &self.comma_spans, self.span.start, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.args, ctx), + ) + .with_trailing() + .format(&self.args, &self.comma_spans, self.span.start, ctx), self.args .len() .checked_sub(1) @@ -409,9 +412,12 @@ impl<'s> DocGen<'s> for SassInclude<'s> { impl<'s> DocGen<'s> for SassIncludeArgs<'s> { fn doc(&self, ctx: &Ctx<'_, 's>) -> Doc<'s> { helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(&self.args, &self.comma_spans, self.span.start, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.args, ctx), + ) + .with_trailing() + .format(&self.args, &self.comma_spans, self.span.start, ctx), self.args .len() .checked_sub(1) @@ -576,9 +582,12 @@ impl<'s> DocGen<'s> for SassList<'s> { impl<'s> DocGen<'s> for SassMap<'s> { fn doc(&self, ctx: &Ctx<'_, 's>) -> Doc<'s> { helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(&self.items, &self.comma_spans, self.span.start, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.items, ctx), + ) + .with_trailing() + .format(&self.items, &self.comma_spans, self.span.start, ctx), self.items .last() .map(|item| item.span.end) @@ -616,9 +625,12 @@ impl<'s> DocGen<'s> for SassModuleConfig<'s> { Doc::text("with ") .concat(ctx.end_spaced_comments(self.with_span.end, self.lparen_span.start)) .append(helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(&self.items, &self.comma_spans, self.lparen_span.end, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, &self.items, ctx), + ) + .with_trailing() + .format(&self.items, &self.comma_spans, self.lparen_span.end, ctx), self.items .last() .map(|item| item.span.end) @@ -727,9 +739,12 @@ impl<'s> DocGen<'s> for SassParameters<'s> { ) .collect::>(); helpers::format_parenthesized( - helpers::SeparatedListFormatter::new(",", Doc::line_or_space()) - .with_trailing() - .format(¶ms, &self.comma_spans, self.span.start, ctx), + helpers::SeparatedListFormatter::new( + ",", + helpers::get_smart_linebreak(self.span.start, ¶ms, ctx), + ) + .with_trailing() + .format(¶ms, &self.comma_spans, self.span.start, ctx), self.params .len() .checked_sub(1) diff --git a/malva/tests/fmt/scss/at-rule/each.snap b/malva/tests/fmt/scss/at-rule/each.snap index cc64362..b05906c 100644 --- a/malva/tests/fmt/scss/at-rule/each.snap +++ b/malva/tests/fmt/scss/at-rule/each.snap @@ -31,6 +31,21 @@ source: malva/tests/fmt.rs @each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} @each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} @each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} -@each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} -@each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} -@each $element, $size in (h1: 20px, h2: 16px, h3: 14px) {} +@each $element, $size in + ( + h1: 20px, + h2: 16px, + h3: 14px +) {} +@each $element, $size in + ( + h1: 20px, + h2: 16px, + h3: 14px +) {} +@each $element, $size in + ( + h1: 20px, + h2: 16px, + h3: 14px +) {} diff --git a/malva/tests/fmt/scss/at-rule/function.snap b/malva/tests/fmt/scss/at-rule/function.snap index 9698796..b0eeead 100644 --- a/malva/tests/fmt/scss/at-rule/function.snap +++ b/malva/tests/fmt/scss/at-rule/function.snap @@ -13,16 +13,36 @@ source: malva/tests/fmt.rs @function func($arg, $arg1, $arg2: 10, $args...) { @return "Func"; } -@function func($arg, $arg1, $arg2: 10, $args...) { +@function func( + $arg, + $arg1, + $arg2: 10, + $args... +) { @return "Func"; } -@function func($arg, $arg1, $arg2: 10, $args...) { +@function func( + $arg, + $arg1, + $arg2: 10, + $args... +) { @return "Func"; } -@function func($arg, $arg1, $arg2: 10, $args...) { +@function func( + $arg, + $arg1, + $arg2: 10, + $args... +) { @return "Func"; } -@function func($arg, $arg1, $arg2: 10, $args...) { +@function func( + $arg, + $arg1, + $arg2: 10, + $args... +) { @return "Func"; } @function func( diff --git a/malva/tests/fmt/scss/at-rule/include.snap b/malva/tests/fmt/scss/at-rule/include.snap index 4005a00..cb6b2ae 100644 --- a/malva/tests/fmt/scss/at-rule/include.snap +++ b/malva/tests/fmt/scss/at-rule/include.snap @@ -5,11 +5,31 @@ source: malva/tests/fmt.rs @include mix(1px, 2px, $arg2: 10, 2px 4px 6px); @include mix(1px, 2px, $arg2: 10, 2px 4px 6px); @include mix(1px, 2px, $arg2: 10, 2px 4px 6px); -@include mix(1px, 2px, $arg2: 10, 2px 4px 6px); -@include mix(1px, 2px, $arg2: 10, 2px 4px 6px); -@include mix(1px, 2px, $arg2: 10, 2px 4px 6px); +@include mix( + 1px, + 2px, + $arg2: 10, + 2px 4px 6px +); +@include mix( + 1px, + 2px, + $arg2: 10, + 2px 4px 6px +); +@include mix( + 1px, + 2px, + $arg2: 10, + 2px 4px 6px +); -@include mix(1px, 2px, $arg2: 10, 2px 4px 6px); +@include mix( + 1px, + 2px, + $arg2: 10, + 2px 4px 6px +); @include mix( $very-very-very-very-very-very-very-very-very-very-very-very-very-very-long-arg: 1px, @@ -61,7 +81,10 @@ a { a { @include item-spotlight-properties-transition( "-title", - (box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15), border-color: $brand-primary) + ( + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15), + border-color: $brand-primary + ) ); } diff --git a/malva/tests/fmt/scss/at-rule/mixin.snap b/malva/tests/fmt/scss/at-rule/mixin.snap index 50f214d..8e0c33b 100644 --- a/malva/tests/fmt/scss/at-rule/mixin.snap +++ b/malva/tests/fmt/scss/at-rule/mixin.snap @@ -13,10 +13,30 @@ source: malva/tests/fmt.rs @mixin mix($arg, $arg1, $arg2: 10, $args...) {} @mixin mix($arg, $arg1, $arg2: 10, $args...) {} @mixin mix($arg, $arg1, $arg2: 10, $args...) {} -@mixin mix($arg, $arg1, $arg2: 10, $args...) {} -@mixin mix($arg, $arg1, $arg2: 10, $args...) {} -@mixin mix($arg, $arg1, $arg2: 10, $args...) {} -@mixin mix($arg, $arg1, $arg2: 10, $args...) {} +@mixin mix( + $arg, + $arg1, + $arg2: 10, + $args... +) {} +@mixin mix( + $arg, + $arg1, + $arg2: 10, + $args... +) {} +@mixin mix( + $arg, + $arg1, + $arg2: 10, + $args... +) {} +@mixin mix( + $arg, + $arg1, + $arg2: 10, + $args... +) {} @mixin mix( $very-very-very-very-very-very-very-very-very-very-very-very-very-very-long-arg, $very-very-very-very-very-very-very-very-very-very-very-very-very-very-long-arg1, diff --git a/malva/tests/fmt/scss/configuration/use.snap b/malva/tests/fmt/scss/configuration/use.snap index 4c43ea3..b46a573 100644 --- a/malva/tests/fmt/scss/configuration/use.snap +++ b/malva/tests/fmt/scss/configuration/use.snap @@ -9,4 +9,7 @@ source: malva/tests/fmt.rs $h3-font-weight: 500 ); -@use "library" with ($black: #222, $border-radius: 0.1rem); +@use "library" with ( + $black: #222, + $border-radius: 0.1rem +); diff --git a/malva/tests/fmt/scss/ignore/default.snap b/malva/tests/fmt/scss/ignore/default.snap index b4f4927..9a08b95 100644 --- a/malva/tests/fmt/scss/ignore/default.snap +++ b/malva/tests/fmt/scss/ignore/default.snap @@ -39,4 +39,7 @@ a, b {} // malva-ignore-will-not-apply a, b {} -$size: (sm: 16px, md: 24px); +$size: ( + sm: 16px, + md: 24px +); diff --git a/malva/tests/fmt/scss/parens/2.snap b/malva/tests/fmt/scss/parens/2.snap index b7bd130..b1ff344 100644 --- a/malva/tests/fmt/scss/parens/2.snap +++ b/malva/tests/fmt/scss/parens/2.snap @@ -2,6 +2,12 @@ source: malva/tests/fmt.rs --- $icons: ( - cal-day-group: (left: 253, top: 73), - /* Should preserve empty lines */ cal-week-group: (left: 1, top: 169) + cal-day-group: ( + left: 253, + top: 73 + ), + /* Should preserve empty lines */ cal-week-group: ( + left: 1, + top: 169 + ) ); diff --git a/malva/tests/fmt/scss/scss/arbitrary-arguments.snap b/malva/tests/fmt/scss/scss/arbitrary-arguments.snap index 8cb5828..c2c927a 100644 --- a/malva/tests/fmt/scss/scss/arbitrary-arguments.snap +++ b/malva/tests/fmt/scss/scss/arbitrary-arguments.snap @@ -26,7 +26,11 @@ $form-selectors: "input.name", "input.address", "input.zip" !default; background-color: nth($gradients, 1); background-image: linear-gradient($direction, $gradients...); } -$parameters: ("c": "kittens", "a": true, "b": 42); +$parameters: ( + "c": "kittens", + "a": true, + "b": 42 +); $value: dummy($parameters...); body { diff --git a/malva/tests/fmt/scss/scss/scss.snap b/malva/tests/fmt/scss/scss/scss.snap index 89c2f5f..5b7f586 100644 --- a/malva/tests/fmt/scss/scss/scss.snap +++ b/malva/tests/fmt/scss/scss/scss.snap @@ -47,10 +47,22 @@ $map: (key: value, other-key: other-value) !default; $map: (key: value, other-key: other-value) !default; $map: (key: value, other-key: other-value); $map: (key: value, other-key: other-value); -$map: (key: value, other-key: other-value); -$map: (key: value, other-key: other-value); -$map: (key: value, other-key: other-value); -$map: (key: value, other-key: other-value); +$map: ( + key: value, + other-key: other-value +); +$map: ( + key: value, + other-key: other-value +); +$map: ( + key: value, + other-key: other-value +); +$map: ( + key: value, + other-key: other-value +); $map: ( very-very-very-very-very-very-very-very-very-very-very-very-very-very-very-verylong-key: very-very-very-very-very-very-very-very-very-very-very-very-very-very-very-verylong-value, very-very-very-very-very-very-very-very-very-very-very-very-very-very-very-verylong-other-key: very-very-very-very-very-very-very-very-very-very-very-very-very-very-very-verylong-other-value @@ -681,9 +693,21 @@ $extmods: (eot: "?", svg: "#" + str-replace($name, " ", "_")); } $colors: ( - primary: (base: #00abc9, light: #daf1f6, dark: #12799a), - secondary: (base: #424d55, light: #ccc, lightest: #efefef, dark: #404247), - success: (base: #bbd33e, light: #eaf0c6) + primary: ( + base: #00abc9, + light: #daf1f6, + dark: #12799a + ), + secondary: ( + base: #424d55, + light: #ccc, + lightest: #efefef, + dark: #404247 + ), + success: ( + base: #bbd33e, + light: #eaf0c6 + ) ); @function color($color, $tone: "base") { @@ -733,7 +757,12 @@ $o-grid-default-config: ( gutter: 10px, min-width: 240px, max-width: 1330px, - layouts: (S: 370px, M: 610px, L: 850px, XL: 1090px), + layouts: ( + S: 370px, + M: 610px, + L: 850px, + XL: 1090px + ), fluid: true, debug: false, fixed-layout: M, @@ -748,7 +777,10 @@ $d: (null); $threads-properties: map-merge($threads-properties, ($border-label: ())); $o-grid-default-config: (layouts: (S: 370px)); -$map: (key: (value), other-key: (key: other-other-value)); +$map: ( + key: (value), + other-key: (key: other-other-value) +); a { content: "#{".5"}"; diff --git a/malva/tests/fmt/scss/trailing-comma/at-rules.snap b/malva/tests/fmt/scss/trailing-comma/at-rules.snap index 57d9850..d5910bf 100644 --- a/malva/tests/fmt/scss/trailing-comma/at-rules.snap +++ b/malva/tests/fmt/scss/trailing-comma/at-rules.snap @@ -3,7 +3,10 @@ source: malva/tests/fmt.rs --- a { @include section-type-1( - $header: (margin: 0 0 $margin-base, text-align: left), + $header: ( + margin: 0 0 $margin-base, + text-align: left + ), $decoration: ( type: base, margin: 0 auto -1px 0, diff --git a/malva/tests/fmt/scss/trailing-comma/enabled.snap b/malva/tests/fmt/scss/trailing-comma/enabled.snap index 5b85f7d..e4db5da 100644 --- a/malva/tests/fmt/scss/trailing-comma/enabled.snap +++ b/malva/tests/fmt/scss/trailing-comma/enabled.snap @@ -3,7 +3,10 @@ source: malva/tests/fmt.rs --- /*cfg trailingComma = true*/ @include section-type-1( - $header: (margin: 0 0 $margin-base, text-align: left), + $header: ( + margin: 0 0 $margin-base, + text-align: left, + ), $decoration: ( type: base, margin: 0 auto -1px 0, @@ -25,8 +28,16 @@ $list: ("Helvetica", "Arial", sans-serif); $colors: ("red", "blue"); $config: ( themes: ( - mist: (header: #dcfac0, content: #00968b, footer: #85c79c), - $spring: (header: #f4fac7, content: #c2454e, footer: #ffb158), + mist: ( + header: #dcfac0, + content: #00968b, + footer: #85c79c, + ), + $spring: ( + header: #f4fac7, + content: #c2454e, + footer: #ffb158, + ), ), ); diff --git a/malva/tests/fmt/scss/trailing-comma/list.snap b/malva/tests/fmt/scss/trailing-comma/list.snap index a2dd925..5762ce7 100644 --- a/malva/tests/fmt/scss/trailing-comma/list.snap +++ b/malva/tests/fmt/scss/trailing-comma/list.snap @@ -7,8 +7,16 @@ $list: ("Helvetica", "Arial", sans-serif); $colors: ("red", "blue"); $config: ( themes: ( - mist: (header: #dcfac0, content: #00968b, footer: #85c79c), - $spring: (header: #f4fac7, content: #c2454e, footer: #ffb158) + mist: ( + header: #dcfac0, + content: #00968b, + footer: #85c79c + ), + $spring: ( + header: #f4fac7, + content: #c2454e, + footer: #ffb158 + ) ) ); diff --git a/malva/tests/fmt/scss/trailing-comma/map.snap b/malva/tests/fmt/scss/trailing-comma/map.snap index c27be44..cc084b7 100644 --- a/malva/tests/fmt/scss/trailing-comma/map.snap +++ b/malva/tests/fmt/scss/trailing-comma/map.snap @@ -1,7 +1,11 @@ --- source: malva/tests/fmt.rs --- -$map: (small: 767px, medium: 992px, large: 1200px); +$map: ( + small: 767px, + medium: 992px, + large: 1200px +); $map: ( "medium": (min-width: 800px), "large": (min-width: 1000px),