From 70f97d3b8143547a3dcc7288140bc71319b9ceea Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 14:02:45 +0800 Subject: [PATCH 1/8] Stop inserting space in LESS variable property access --- changelog_unreleased/less/14103.md | 17 +++++++++++++++++ src/language-css/printer-postcss.js | 16 +++++++++++++++- .../less/case/__snapshots__/jsfmt.spec.js.snap | 10 +++++----- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 changelog_unreleased/less/14103.md diff --git a/changelog_unreleased/less/14103.md b/changelog_unreleased/less/14103.md new file mode 100644 index 000000000000..fe8d35b5bd98 --- /dev/null +++ b/changelog_unreleased/less/14103.md @@ -0,0 +1,17 @@ +#### Do not insert space in LESS property access (#14034 by @mvorisek) + + +```less +// Input +a { + color: @colors[@white]; +} + +// Prettier stable +a { + color: @colors[ @white]; +} + +// Prettier main + +``` diff --git a/src/language-css/printer-postcss.js b/src/language-css/printer-postcss.js index c847279b3910..d787f6345db3 100644 --- a/src/language-css/printer-postcss.js +++ b/src/language-css/printer-postcss.js @@ -620,7 +620,21 @@ function genericPrint(path, options, print) { } // Ignore `@` in Less (i.e. `@@var;`) - if (iNode.type === "value-atword" && iNode.value === "") { + if ( + iNode.type === "value-atword" && + (iNode.value === "" || + /* + @var[ @notVarNested ][notVar] + ^^^^ + */ + iNode.value.endsWith("[") || + /* + @var[ @notVarNested ][notVar] + ^^^^^^^^^ + */ + (iNextNode?.type === "value-word" && + iNextNode.value.startsWith("]"))) + ) { continue; } diff --git a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap index 9abe3bd1d0b1..16dd1982b474 100644 --- a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap @@ -453,11 +453,11 @@ printWidth: 80 }; @not-var { - canchangecase: @var[ @notVarNested][notVar]; - canchangecase: @var[ @notVarNested][notVar]; - canchangecase: @var[ @notVarNested ][notVar]; - canchangecase: @var[ @notVarNested][ notVar]; - canchangecase: @var[ @notVarNested][notVar ]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; canchangecase: @var[notVar]; } From b467fbfdb7c9aa1abac9e7077886fe64e929784f Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 14:12:13 +0800 Subject: [PATCH 2/8] More test --- .../less/case/__snapshots__/jsfmt.spec.js.snap | 12 ++++++++++++ tests/format/less/case/variable.less | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap index 16dd1982b474..9a4696dd6b7b 100644 --- a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap @@ -389,9 +389,15 @@ printWidth: 80 canChangeCase: @var[@notVarNested][notVar]; canChangeCase: @var[ @notVarNested][notVar]; canChangeCase: @var[@notVarNested ][notVar]; + canChangeCase: @var[ @notVarNested ][notVar]; + canChangeCase: @var[@notVarNested][notVar]; canChangeCase: @var[@notVarNested][ notVar]; canChangeCase: @var[@notVarNested][notVar ]; + canChangeCase: @var[@notVarNested][ notVar ]; canChangeCase: @var[notVar]; + canChangeCase: @var[ notVar]; + canChangeCase: @var[notVar ]; + canChangeCase: @var[ notVar ]; } =====================================output===================================== @@ -458,7 +464,13 @@ printWidth: 80 canchangecase: @var[@notVarNested][notVar]; canchangecase: @var[@notVarNested][notVar]; canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[@notVarNested][notVar ]; + canchangecase: @var[notVar]; + canchangecase: @var[notVar]; canchangecase: @var[notVar]; + canchangecase: @var[notVar ]; } ================================================================================ diff --git a/tests/format/less/case/variable.less b/tests/format/less/case/variable.less index 29fdd9052f67..599c34754f1e 100644 --- a/tests/format/less/case/variable.less +++ b/tests/format/less/case/variable.less @@ -59,7 +59,13 @@ canChangeCase: @var[@notVarNested][notVar]; canChangeCase: @var[ @notVarNested][notVar]; canChangeCase: @var[@notVarNested ][notVar]; + canChangeCase: @var[ @notVarNested ][notVar]; + canChangeCase: @var[@notVarNested][notVar]; canChangeCase: @var[@notVarNested][ notVar]; canChangeCase: @var[@notVarNested][notVar ]; + canChangeCase: @var[@notVarNested][ notVar ]; canChangeCase: @var[notVar]; + canChangeCase: @var[ notVar]; + canChangeCase: @var[notVar ]; + canChangeCase: @var[ notVar ]; } From f472913a28158fe411881687d97f75bdc5e089ab Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 14:18:04 +0800 Subject: [PATCH 3/8] Fix --- src/language-css/printer-postcss.js | 19 ++++++++++++------- .../case/__snapshots__/jsfmt.spec.js.snap | 4 ++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/language-css/printer-postcss.js b/src/language-css/printer-postcss.js index d787f6345db3..ae152fdaa15b 100644 --- a/src/language-css/printer-postcss.js +++ b/src/language-css/printer-postcss.js @@ -627,13 +627,18 @@ function genericPrint(path, options, print) { @var[ @notVarNested ][notVar] ^^^^ */ - iNode.value.endsWith("[") || - /* - @var[ @notVarNested ][notVar] - ^^^^^^^^^ - */ - (iNextNode?.type === "value-word" && - iNextNode.value.startsWith("]"))) + iNode.value.endsWith("[")) + ) { + continue; + } + + /* + @var[ @notVarNested ][notVar] + ^^^^^^^^^ + */ + if ( + iNextNode.type === "value-word" && + iNextNode.value.startsWith("]") ) { continue; } diff --git a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap index 9a4696dd6b7b..f67031abd06b 100644 --- a/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/less/case/__snapshots__/jsfmt.spec.js.snap @@ -466,11 +466,11 @@ printWidth: 80 canchangecase: @var[@notVarNested][notVar]; canchangecase: @var[@notVarNested][notVar]; canchangecase: @var[@notVarNested][notVar]; - canchangecase: @var[@notVarNested][notVar ]; + canchangecase: @var[@notVarNested][notVar]; + canchangecase: @var[notVar]; canchangecase: @var[notVar]; canchangecase: @var[notVar]; canchangecase: @var[notVar]; - canchangecase: @var[notVar ]; } ================================================================================ From a055d9395a09be29a0f4c4239194265548fe242a Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 14:21:47 +0800 Subject: [PATCH 4/8] Fix comment --- src/language-css/printer-postcss.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/language-css/printer-postcss.js b/src/language-css/printer-postcss.js index ae152fdaa15b..2a9cf1648ec8 100644 --- a/src/language-css/printer-postcss.js +++ b/src/language-css/printer-postcss.js @@ -625,7 +625,7 @@ function genericPrint(path, options, print) { (iNode.value === "" || /* @var[ @notVarNested ][notVar] - ^^^^ + ^^^^^ */ iNode.value.endsWith("[")) ) { From cbda451606c68e71b748660520d7d196ae379791 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 15:30:09 +0800 Subject: [PATCH 5/8] Fix changelog --- changelog_unreleased/less/14103.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog_unreleased/less/14103.md b/changelog_unreleased/less/14103.md index fe8d35b5bd98..cddb91e0f786 100644 --- a/changelog_unreleased/less/14103.md +++ b/changelog_unreleased/less/14103.md @@ -1,4 +1,4 @@ -#### Do not insert space in LESS property access (#14034 by @mvorisek) +#### Do not insert space in LESS property access (#14103 by @fisker) ```less From 63829cc7c0b44347d8ddc1bcb3b1740fe1d82b25 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 15:50:06 +0800 Subject: [PATCH 6/8] Fix AST_COMPARE test --- src/language-css/clean.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/language-css/clean.js b/src/language-css/clean.js index 8dc592570c93..6313acc15eaa 100644 --- a/src/language-css/clean.js +++ b/src/language-css/clean.js @@ -183,6 +183,25 @@ function clean(ast, newObj, parent) { }); } } + + // We parse `@var[ foo ]` and `@var[foo]` differently + if ( + ast.type === "value-comma_group" && + ast.groups.some( + (node) => node.value.endsWith("[") || node.value.startsWith("]") + ) + ) { + return { + type: "value-atword", + value: ast.groups.map((node) => node.value).join(""), + group: { + open: null, + close: null, + groups: [], + type: "value-paren_group", + }, + }; + } } clean.ignoredProperties = ignoredProperties; From 7df90a54d9b144269c47ba77411ef42bdf2bbc9c Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 17:37:45 +0800 Subject: [PATCH 7/8] Fix --- src/language-css/clean.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/language-css/clean.js b/src/language-css/clean.js index 6313acc15eaa..23226036968c 100644 --- a/src/language-css/clean.js +++ b/src/language-css/clean.js @@ -188,7 +188,9 @@ function clean(ast, newObj, parent) { if ( ast.type === "value-comma_group" && ast.groups.some( - (node) => node.value.endsWith("[") || node.value.startsWith("]") + (node) => + typeof node.value === "string" && + (node.value.endsWith("[") || node.value.startsWith("]")) ) ) { return { From 69db73fb7a4e0e3f06a828bb5a74b6769e43e1ef Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 3 Jan 2023 18:44:06 +0800 Subject: [PATCH 8/8] Use `node.type` instead of `typeof` --- src/language-css/clean.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/language-css/clean.js b/src/language-css/clean.js index 23226036968c..eee08eda6e0e 100644 --- a/src/language-css/clean.js +++ b/src/language-css/clean.js @@ -189,8 +189,8 @@ function clean(ast, newObj, parent) { ast.type === "value-comma_group" && ast.groups.some( (node) => - typeof node.value === "string" && - (node.value.endsWith("[") || node.value.startsWith("]")) + (node.type === "value-atword" && node.value.endsWith("[")) || + (node.type === "value-word" && node.value.startsWith("]")) ) ) { return {