Skip to content

Commit 3fd8ebc

Browse files
authored
Fix wrong autofix for regexp/order-in-character-class rule (#50)
1 parent 5e49c13 commit 3fd8ebc

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Expression } from "estree"
22
import type { RegExpVisitor } from "regexpp/visitor"
33
import type {
4+
CharacterClass,
45
CharacterClassElement,
56
UnicodePropertyCharacterSet,
67
} from "regexpp/ast"
@@ -9,6 +10,7 @@ import {
910
CP_SPACE,
1011
createRule,
1112
defineRegexpVisitor,
13+
fixerApplyEscape,
1214
getRegexpLocation,
1315
getRegexpRange,
1416
} from "../utils"
@@ -126,9 +128,15 @@ export default createRule("order-in-character-class", {
126128
if (!targetRange || !nextRange) {
127129
return
128130
}
131+
129132
yield fixer.insertTextBeforeRange(
130133
targetRange,
131-
next.raw,
134+
fixerApplyEscape(
135+
(isNeedEscape(next, moveTarget)
136+
? "\\"
137+
: "") + next.raw,
138+
node,
139+
),
132140
)
133141

134142
yield fixer.removeRange(nextRange)
@@ -250,3 +258,21 @@ export default createRule("order-in-character-class", {
250258
})
251259
},
252260
})
261+
262+
/**
263+
*Check whether the given CharacterClassElement is need escape.
264+
*/
265+
function isNeedEscape(
266+
next: CharacterClassElement,
267+
target: CharacterClassElement,
268+
) {
269+
if (!next.raw.startsWith("-")) {
270+
return false
271+
}
272+
const parent = target.parent as CharacterClass
273+
const prev = parent.elements[parent.elements.indexOf(target) - 1]
274+
if (prev.type !== "Character" && prev.type !== "CharacterSet") {
275+
return false
276+
}
277+
return true
278+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,5 +171,12 @@ tester.run("order-in-character-class", rule as any, {
171171
"Expected character class elements to be in ascending order. '\\w' should be before '\\d'.",
172172
],
173173
},
174+
{
175+
code: String.raw`/[\da-b-]/u`,
176+
output: String.raw`/[\d\-a-b]/u`,
177+
errors: [
178+
"Expected character class elements to be in ascending order. '-' should be before 'a-b'.",
179+
],
180+
},
174181
],
175182
})

0 commit comments

Comments
 (0)