Skip to content

Commit 99c535d

Browse files
authored
Fix wrong autofix for regexp/order-in-character-class rule (#53)
1 parent 917e03a commit 99c535d

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

lib/rules/order-in-character-class.ts

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,7 @@ export default createRule("order-in-character-class", {
132132
yield fixer.insertTextBeforeRange(
133133
targetRange,
134134
fixerApplyEscape(
135-
(isNeedEscape(next, moveTarget)
136-
? "\\"
137-
: "") + next.raw,
135+
escapeRaw(next, moveTarget),
138136
node,
139137
),
140138
)
@@ -260,19 +258,24 @@ export default createRule("order-in-character-class", {
260258
})
261259

262260
/**
263-
*Check whether the given CharacterClassElement is need escape.
261+
* get the escape text from the given CharacterClassElement.
264262
*/
265-
function isNeedEscape(
266-
next: CharacterClassElement,
267-
target: CharacterClassElement,
268-
) {
269-
if (!next.raw.startsWith("-")) {
270-
return false
263+
function escapeRaw(node: CharacterClassElement, target: CharacterClassElement) {
264+
let raw = node.raw
265+
if (raw.startsWith("-")) {
266+
const parent = target.parent as CharacterClass
267+
const prev = parent.elements[parent.elements.indexOf(target) - 1]
268+
if (
269+
prev &&
270+
(prev.type === "Character" || prev.type === "CharacterSet")
271+
) {
272+
raw = `\\${raw}`
273+
}
271274
}
272-
const parent = target.parent as CharacterClass
273-
const prev = parent.elements[parent.elements.indexOf(target) - 1]
274-
if (!prev || (prev.type !== "Character" && prev.type !== "CharacterSet")) {
275-
return false
275+
if (target.raw.startsWith("-")) {
276+
if (node.type === "Character" || node.type === "CharacterSet") {
277+
raw = `${raw}\\`
278+
}
276279
}
277-
return true
280+
return raw
278281
}

tests/lib/rules/order-in-character-class.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,5 +185,26 @@ tester.run("order-in-character-class", rule as any, {
185185
"Expected character class elements to be in ascending order. '-' should be before 'a-b'.",
186186
],
187187
},
188+
{
189+
code: String.raw`/[-$a]/u`,
190+
output: String.raw`/[$\-a]/u`,
191+
errors: [
192+
"Expected character class elements to be in ascending order. '$' should be before '-'.",
193+
],
194+
},
195+
{
196+
code: String.raw`/[-_\s]+/gu`,
197+
output: String.raw`/[\s\-_]+/gu`,
198+
errors: [
199+
"Expected character class elements to be in ascending order. '\\s' should be before '-'.",
200+
],
201+
},
202+
{
203+
code: String.raw`/[-_-]/u`,
204+
output: String.raw`/[-\-_]/u`,
205+
errors: [
206+
"Expected character class elements to be in ascending order. '-' should be before '_'.",
207+
],
208+
},
188209
],
189210
})

0 commit comments

Comments
 (0)