Skip to content

Commit a1c46af

Browse files
authored
fix(noUselessEscapeInString): correctly flag chars (#9420)
1 parent f2581b8 commit a1c46af

6 files changed

Lines changed: 48 additions & 20 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@biomejs/biome": patch
3+
---
4+
5+
Fixed [#9385](https://github.com/biomejs/biome/issues/9385): [`noUselessEscapeInString`](https://biomejs.dev/linter/rules/no-useless-escape-in-string/) no longer incorrectly flags valid CSS hex escapes (e.g. `\e7bb`) as useless. The rule now recognizes all hex digits (`0-9`, `a-f`, `A-F`) as valid escape characters in CSS strings.

crates/biome_css_analyze/src/lint/suspicious/no_useless_escape_in_string.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ declare_lint_rule! {
1919
///
2020
/// ```css,expect_diagnostic
2121
/// a::after {
22-
/// content: "\a"
22+
/// content: "\z"
2323
/// }
2424
/// ```
2525
///
@@ -43,6 +43,12 @@ declare_lint_rule! {
4343
/// }
4444
/// ```
4545
///
46+
/// ```css
47+
/// a::after {
48+
/// content: "\e7bb"
49+
/// }
50+
/// ```
51+
///
4652
pub NoUselessEscapeInString {
4753
version: "2.0.0",
4854
name: "noUselessEscapeInString",
@@ -109,10 +115,10 @@ fn next_useless_escape(str: &str, quote: u8) -> Option<usize> {
109115
b'^'
110116
| b'\r'
111117
| b'\n'
112-
| b'0'..=b'7'
118+
| b'0'..=b'9'
119+
| b'a'..=b'f'
120+
| b'A'..=b'F'
113121
| b'\\'
114-
| b'b'
115-
| b'f'
116122
| b'n'
117123
| b'r'
118124
| b't'
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
/* should generate diagnostics */
2+
13
.a::after {
2-
content: /*before*/ "useless \a" /*after*/
4+
content: /*before*/ "useless \z" /*after*/
35
}
46
.b::after {
57
content: "useless \'"
6-
}
8+
}

crates/biome_css_analyze/tests/specs/suspicious/noUselessEscapeInString/invalid.css.snap

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,51 +4,55 @@ expression: invalid.css
44
---
55
# Input
66
```css
7+
/* should generate diagnostics */
8+
79
.a::after {
8-
content: /*before*/ "useless \a" /*after*/
10+
content: /*before*/ "useless \z" /*after*/
911
}
1012
.b::after {
1113
content: "useless \'"
1214
}
15+
1316
```
1417

1518
# Diagnostics
1619
```
17-
invalid.css:2:35 lint/suspicious/noUselessEscapeInString FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
20+
invalid.css:4:35 lint/suspicious/noUselessEscapeInString FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1821
1922
! The character doesn't need to be escaped.
2023
21-
1 │ .a::after {
22-
> 2content: /*before*/ "useless \a" /*after*/
24+
3 │ .a::after {
25+
> 4content: /*before*/ "useless \z" /*after*/
2326
^
24-
3}
25-
4 │ .b::after {
27+
5}
28+
6 │ .b::after {
2629
2730
i Only quotes that enclose the string and special characters need to be escaped.
2831
2932
i Safe fix: Unescape the character.
3033
31-
2 │ ····content/*before*/·"useless·\a"·/*after*/
34+
4 │ ····content/*before*/·"useless·\z"·/*after*/
3235
-
3336
3437
```
3538
3639
```
37-
invalid.css:5:24 lint/suspicious/noUselessEscapeInString FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
40+
invalid.css:7:24 lint/suspicious/noUselessEscapeInString FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
3841
3942
! The character doesn't need to be escaped.
4043
41-
3}
42-
4 │ .b::after {
43-
> 5content: "useless \'"
44+
5}
45+
6 │ .b::after {
46+
> 7content: "useless \'"
4447
^
45-
6}
48+
8}
49+
9 │
4650
4751
i Only quotes that enclose the string and special characters need to be escaped.
4852
4953
i Safe fix: Unescape the character.
5054
51-
5 │ ····content:·"useless·\'"
55+
7 │ ····content:·"useless·\'"
5256
│ -
5357
5458
```
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
/* should not generate diagnostics */
2+
23
.a::after {
34
content: "\""
45
}
56
.b::after {
67
content: "\t"
7-
}
8+
}
9+
10+
.icon-file:before {
11+
content: "\e7bb";
12+
}

crates/biome_css_analyze/tests/specs/suspicious/noUselessEscapeInString/valid.css.snap

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ expression: valid.css
55
# Input
66
```css
77
/* should not generate diagnostics */
8+
89
.a::after {
910
content: "\""
1011
}
1112
.b::after {
1213
content: "\t"
1314
}
15+
16+
.icon-file:before {
17+
content: "\e7bb";
18+
}
19+
1420
```

0 commit comments

Comments
 (0)