Skip to content

Commit 1b3dcdf

Browse files
Closure Teamcopybara-github
authored andcommitted
Forces BY_WHOLE style renaming for CSS variables (disambiguated by -- prefix) and added support for CSS variable parsing in goog.setCssNameMapping calls.
PiperOrigin-RevId: 789013338
1 parent 0629dfc commit 1b3dcdf

File tree

3 files changed

+94
-21
lines changed

3 files changed

+94
-21
lines changed

src/com/google/javascript/jscomp/ProcessClosurePrimitives.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,10 +622,11 @@ private void reportPossibleBadBaseMethodUse(Node n, String className, String ext
622622
}
623623

624624
if (style == CssRenamingMap.Style.BY_PART) {
625-
// Make sure that no keys contain -'s
625+
// Make sure that no class keys contain -'s
626+
// Variable keys can contain -'s since they're always named BY_WHOLE.
626627
List<String> errors = new ArrayList<>();
627628
for (String key : cssNames.keySet()) {
628-
if (key.contains("-")) {
629+
if (key.contains("-") && !key.startsWith("--")) {
629630
errors.add(key);
630631
}
631632
}

src/com/google/javascript/jscomp/ReplaceCssNames.java

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -508,27 +508,37 @@ private void processStringNode(Node n) {
508508
String[] parts = name.split("-");
509509
if (symbolMap != null) {
510510
String replacement = null;
511-
switch (symbolMap.getStyle()) {
512-
case BY_WHOLE:
513-
replacement = symbolMap.get(name);
514-
if (replacement == null) {
515-
compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, name, name));
516-
return;
517-
}
518-
break;
519-
case BY_PART:
520-
String[] replaced = new String[parts.length];
521-
for (int i = 0; i < parts.length; i++) {
522-
String part = symbolMap.get(parts[i]);
523-
if (part == null) {
524-
// If we can't encode all parts, don't encode any of it.
525-
compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, parts[i], name));
511+
512+
if (name.startsWith("--")) {
513+
// Force BY_WHOLE style for CSS variables.
514+
replacement = symbolMap.get(name);
515+
if (replacement == null) {
516+
compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, name, name));
517+
return;
518+
}
519+
} else {
520+
switch (symbolMap.getStyle()) {
521+
case BY_WHOLE:
522+
replacement = symbolMap.get(name);
523+
if (replacement == null) {
524+
compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, name, name));
526525
return;
527526
}
528-
replaced[i] = part;
529-
}
530-
replacement = Joiner.on("-").join(replaced);
531-
break;
527+
break;
528+
case BY_PART:
529+
String[] replaced = new String[parts.length];
530+
for (int i = 0; i < parts.length; i++) {
531+
String part = symbolMap.get(parts[i]);
532+
if (part == null) {
533+
// If we can't encode all parts, don't encode any of it.
534+
compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, parts[i], name));
535+
return;
536+
}
537+
replaced[i] = part;
538+
}
539+
replacement = Joiner.on("-").join(replaced);
540+
break;
541+
}
532542
}
533543
n.setString(replacement);
534544
}

test/com/google/javascript/jscomp/ReplaceCssNamesTest.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public final class ReplaceCssNamesTest extends CompilerTestCase {
5353
.put("goog", "g")
5454
.put("fooStylesBar", "fsr")
5555
.put("fooStylesBaz", "fsz")
56+
.put("--foo-bar", "--fb")
57+
.put("---foo-baz", "--fbz")
58+
.put("--foo-bar-baz--qux", "--fbzq")
5659
.buildOrThrow();
5760

5861
Map<String, String> replacementMapFull =
@@ -63,6 +66,9 @@ public final class ReplaceCssNamesTest extends CompilerTestCase {
6366
.put("unrelated", "l")
6467
.put("long-suffix", "m")
6568
.put("long-prefix-suffix1", "h-i")
69+
.put("--foo-bar", "--fb")
70+
.put("---foo-baz", "--fbz")
71+
.put("--foo-bar-baz--qux", "--fbzq")
6672
.buildOrThrow();
6773

6874
CssRenamingMap renamingMap;
@@ -151,6 +157,18 @@ public void testValidSetCssNameMapping_byPart() {
151157
"const x = 'bar', y = 'baz', z = 'bar-baz';");
152158
}
153159

160+
@Test
161+
public void testValidSetCssNameMapping_byPart_withCssVariable() {
162+
test(
163+
"""
164+
goog.setCssNameMapping({classy: 'c',selector: 's',"--foo":'--f',"--biz-baz":'--b'}, 'BY_PART');
165+
const x = goog.getCssName('--foo'),
166+
y = goog.getCssName('--biz-baz'),
167+
z = goog.getCssName('classy-selector');
168+
""",
169+
"const x = '--f', y = '--b', z = 'c-s';");
170+
}
171+
154172
@Test
155173
public void testValidSetCssNameMapping_byWhole() {
156174
test(
@@ -172,6 +190,18 @@ public void testValidSetCssNameMapping_byWhole() {
172190
"const x = 'bar', y = 'baz', z = 'foo-biz';");
173191
}
174192

193+
@Test
194+
public void testValidSetCssNameMapping_byWhole_withCssVariable() {
195+
test(
196+
"""
197+
goog.setCssNameMapping({classy: 'c',"--foo":'--f',"--biz-baz":'--b'}, 'BY_WHOLE');
198+
const x = goog.getCssName('--foo'),
199+
y = goog.getCssName('--biz-baz'),
200+
z = goog.getCssName('classy');
201+
""",
202+
"const x = '--f', y = '--b', z = 'c';");
203+
}
204+
175205
@Test
176206
public void testDoNotUseReplacementMap() {
177207
useReplacementMap = false;
@@ -259,6 +289,23 @@ public void testOneArgWithCompositeClassNamesFull() {
259289
"var x = 'k'");
260290
}
261291

292+
@Test
293+
public void testOneArgWithCssVariables_byWhole() {
294+
renamingMap = getFullMap();
295+
296+
test(
297+
"var x = goog.getCssName('--foo-bar')", //
298+
"var x = '--fb'");
299+
300+
test(
301+
"var x = goog.getCssName('---foo-baz')", //
302+
"var x = '--fbz'");
303+
304+
test(
305+
"var x = goog.getCssName('--foo-bar-baz--qux')", //
306+
"var x = '--fbzq'");
307+
}
308+
262309
@Test
263310
public void testOneArgWithCompositeClassNamesWithUnknownParts() {
264311
test(
@@ -275,6 +322,21 @@ public void testOneArgWithCompositeClassNamesWithUnknownParts() {
275322
warning(UNKNOWN_SYMBOL_WARNING));
276323
}
277324

325+
@Test
326+
public void testOneArgWithCssVariable() {
327+
test(
328+
"var x = goog.getCssName('--foo-bar')", //
329+
"var x = '--fb'");
330+
331+
test(
332+
"var x = goog.getCssName('---foo-baz')", //
333+
"var x = '--fbz'");
334+
335+
test(
336+
"var x = goog.getCssName('--foo-bar-baz--qux')", //
337+
"var x = '--fbzq'");
338+
}
339+
278340
@Test
279341
public void testTwoArgsWithStringLiterals() {
280342
testError("var x = goog.getCssName('header', 'active')", UNEXPECTED_STRING_LITERAL_ERROR);

0 commit comments

Comments
 (0)