Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed scss function arguments on different lines in maps #9128 #9184

17 changes: 17 additions & 0 deletions src/language-css/parser-postcss.js
Expand Up @@ -120,6 +120,23 @@ function parseValueNode(valueNode, options) {
parenGroupStack.pop();
parenGroup = parenGroupStack[parenGroupStack.length - 1];
} else if (node.type === "comma") {
if (commaGroup.groups.length > 1) {
for (const group of commaGroup.groups) {
// if css interpolation
if (
group.value &&
typeof group.value === "string" &&
group.value.includes("#{")
) {
commaGroup.groups = [
stringifyNode({
groups: commaGroup.groups,
}).trim(),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure it is safe to trim here, why we do it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stringify was adding extra '\n', so I am using trim

];
break;
}
}
}
parenGroup.groups.push(commaGroup);
commaGroup = {
groups: [],
Expand Down
145 changes: 145 additions & 0 deletions tests/scss/others/__snapshots__/jsfmt.spec.js.snap
@@ -0,0 +1,145 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`functional_argument_on_same_lines_in_maps.scss format 1`] = `
====================================options=====================================
parsers: ["scss"]
printWidth: 80
| printWidth
=====================================input======================================
//simple test
$display-breakpoints: map-deep-merge(
(
"print-only": "only print",
"screen-only": "only screen",
"xs-only": "only screen and (max-width: #{map-get($grid-breakpoints, "sm") - 1})",
"sm-only": "only screen and (min-width: #{map-get($grid-breakpoints, "sm")}) and (max-width: #{map-get($grid-breakpoints, "md") - 1})",
),
$display-breakpoints
);


//list test
@each
$size
in
$sizes {
.icon
#{$size}
{
border
:
"#{$size + "px"}"
solid
red;
}
}

@each
$size
in
$sizes {
.icon-#{$size}
{
border
:
"#{$size + "px"}"
solid
red;
}
}

//map test
$font-weights
:
("regular": 400
,
"medium": 500,
"bold":
700);
@each
$name,
$boldness
in
$icons {
.text
#{
$name
} {
color: red;
font-weight:
"#{$boldness}"
}
}

$font-weights
:
("regular": 400
,
"medium": 500,
"bold":
700);
@each
$name,
$boldness
in
$icons {
.text-#{
$name
} {
color: red;
font-weight:
"#{$boldness}"
}
}
=====================================output=====================================
//simple test
$display-breakpoints: map-deep-merge(
(
"print-only": "only print",
"screen-only": "only screen",
"xs-only": "only screen and (max-width: #{map-get($grid-breakpoints, "sm") - 1})",
"sm-only": "only screen and (min-width: #{map-get($grid-breakpoints, "sm")}) and (max-width: #{map-get($grid-breakpoints, "md") - 1})",
),
$display-breakpoints
);

//list test
@each $size in $sizes {
.icon #{$size} {
border: "#{$size + "px"}" solid red;
}
}

@each $size in $sizes {
.icon-#{$size} {
border: "#{$size + "px"}" solid red;
}
}

//map test
$font-weights: (
"regular": 400,
"medium": 500,
"bold": 700,
);
@each $name, $boldness in $icons {
.text #{ $name } {
Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.icon-#{$size} above didn't add space around

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fisker and should not, you can write it in different ways (all valid):

.text foo { }

.text- foo {}

.text-foo {}

Copy link
Sponsor Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean space inside #{}, this one has space around $name, but .icon-#{$size} don't.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, you are right

/cc @agamkrbit

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I well make the changes ..
so .icon-#{$size} should be like .icon-#{ $size } right ?

Copy link
Sponsor Member

@fisker fisker Sep 16, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like we are keeping spaces on stable version.

Prettier 2.1.2
Playground link

--parser scss

Input:

#{$a                      } {
    color: red;
  }

#{                      $a} {
    color: red;
  }
#{           $a           } {
    color: red;
  }
#{$a} {
    color: red;
  }

Output:

#{$a } {
  color: red;
}

#{ $a} {
  color: red;
}
#{ $a } {
  color: red;
}
#{$a} {
  color: red;
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah.

color: red;
font-weight: "#{$boldness}";
}
}

$font-weights: (
"regular": 400,
"medium": 500,
"bold": 700,
);
@each $name, $boldness in $icons {
.text-#{ $name } {
color: red;
font-weight: "#{$boldness}";
}
}

================================================================================
`;
85 changes: 85 additions & 0 deletions tests/scss/others/functional_argument_on_same_lines_in_maps.scss
@@ -0,0 +1,85 @@
//simple test
$display-breakpoints: map-deep-merge(
(
"print-only": "only print",
"screen-only": "only screen",
"xs-only": "only screen and (max-width: #{map-get($grid-breakpoints, "sm") - 1})",
"sm-only": "only screen and (min-width: #{map-get($grid-breakpoints, "sm")}) and (max-width: #{map-get($grid-breakpoints, "md") - 1})",
),
$display-breakpoints
);


//list test
@each
$size
in
$sizes {
.icon
#{$size}
{
border
:
"#{$size + "px"}"
solid
red;
}
}

@each
$size
in
$sizes {
.icon-#{$size}
{
border
:
"#{$size + "px"}"
solid
red;
}
}

//map test
$font-weights
:
("regular": 400
,
"medium": 500,
"bold":
700);
@each
$name,
$boldness
in
$icons {
.text
#{
$name
} {
color: red;
font-weight:
"#{$boldness}"
}
}

$font-weights
:
("regular": 400
,
"medium": 500,
"bold":
700);
@each
$name,
$boldness
in
$icons {
.text-#{
$name
} {
color: red;
font-weight:
"#{$boldness}"
}
}
1 change: 1 addition & 0 deletions tests/scss/others/jsfmt.spec.js
@@ -0,0 +1 @@
run_spec(__dirname, ["scss"]);