1
1
import type { RegExpVisitor } from "regexpp/visitor"
2
- import type { Character , CharacterSet , Quantifier } from "regexpp/ast"
2
+ import type { Character , CharacterSet } from "regexpp/ast"
3
3
import type { RegExpContext } from "../utils"
4
4
import {
5
5
createRule ,
@@ -10,36 +10,23 @@ import {
10
10
quantToString ,
11
11
} from "../utils"
12
12
13
- class CharBuffer {
14
- public target : CharacterSet | Character
15
-
16
- public min : number
13
+ type CharTarget = CharacterSet | Character
17
14
18
- public max : number
15
+ class CharBuffer {
16
+ public target : CharTarget
19
17
20
- public elements : ( CharacterSet | Character | Quantifier ) [ ]
18
+ public elements : CharTarget [ ]
21
19
22
- public equalChar : ( element : CharacterSet | Character ) => boolean
20
+ public times : number
23
21
24
- public greedy : boolean | null = null
22
+ public equalChar : ( element : CharTarget ) => boolean
25
23
26
- public constructor (
27
- element : CharacterSet | Character | Quantifier ,
28
- target : CharacterSet | Character ,
29
- ) {
24
+ public constructor ( target : CharTarget ) {
30
25
this . target = target
31
- this . elements = [ element ]
26
+ this . elements = [ target ]
27
+
28
+ this . times = 1
32
29
33
- if ( element . type === "Quantifier" ) {
34
- this . min = element . min
35
- this . max = element . max
36
- if ( element . min < element . max ) {
37
- this . greedy = element . greedy
38
- }
39
- } else {
40
- this . min = 1
41
- this . max = 1
42
- }
43
30
if ( target . type === "CharacterSet" ) {
44
31
if ( target . kind === "any" ) {
45
32
this . equalChar = ( e ) =>
@@ -64,18 +51,9 @@ class CharBuffer {
64
51
}
65
52
}
66
53
67
- public addElement ( element : CharacterSet | Character | Quantifier ) {
54
+ public addElement ( element : CharTarget ) {
68
55
this . elements . push ( element )
69
- if ( element . type === "Quantifier" ) {
70
- this . min += element . min
71
- this . max += element . max
72
- if ( element . min < element . max ) {
73
- this . greedy ||= element . greedy
74
- }
75
- } else {
76
- this . min += 1
77
- this . max += 1
78
- }
56
+ this . times += 1
79
57
}
80
58
81
59
public isValid ( ) : boolean {
@@ -114,11 +92,7 @@ class CharBuffer {
114
92
}
115
93
116
94
public getQuantifier ( ) : string {
117
- return quantToString ( {
118
- min : this . min ,
119
- max : this . max ,
120
- greedy : this . greedy !== false ,
121
- } )
95
+ return quantToString ( { min : this . times , max : this . times } )
122
96
}
123
97
}
124
98
@@ -152,59 +126,29 @@ export default createRule("prefer-quantifier", {
152
126
onAlternativeEnter ( aNode ) {
153
127
let charBuffer : CharBuffer | null = null
154
128
for ( const element of aNode . elements ) {
155
- let target : CharacterSet | Character
156
129
if (
157
130
element . type === "CharacterSet" ||
158
131
element . type === "Character"
159
132
) {
160
- target = element
161
- } else if ( element . type === "Quantifier" ) {
162
- if (
163
- element . element . type !== "CharacterSet" &&
164
- element . element . type !== "Character"
165
- ) {
166
- if ( charBuffer ) {
167
- validateBuffer ( charBuffer )
168
- charBuffer = null
169
- }
170
- continue
171
- }
172
- if (
173
- charBuffer &&
174
- charBuffer . greedy != null &&
175
- charBuffer . greedy !== element . greedy
176
- ) {
177
- // greedy flags do not match.
133
+ if ( charBuffer && charBuffer . equalChar ( element ) ) {
134
+ charBuffer . addElement ( element )
135
+ } else {
178
136
validateBuffer ( charBuffer )
179
- charBuffer = null
137
+ charBuffer = new CharBuffer ( element )
180
138
}
181
- target = element . element
182
139
} else {
183
- if ( charBuffer ) {
184
- validateBuffer ( charBuffer )
185
- charBuffer = null
186
- }
187
- continue
188
- }
189
- if ( charBuffer ) {
190
- if ( charBuffer . equalChar ( target ) ) {
191
- charBuffer . addElement ( element )
192
- continue
193
- }
194
140
validateBuffer ( charBuffer )
141
+ charBuffer = null
195
142
}
196
- charBuffer = new CharBuffer ( element , target )
197
- }
198
- if ( charBuffer ) {
199
- validateBuffer ( charBuffer )
200
- charBuffer = null
201
143
}
202
144
145
+ validateBuffer ( charBuffer )
146
+
203
147
/**
204
148
* Validate
205
149
*/
206
- function validateBuffer ( buffer : CharBuffer ) {
207
- if ( buffer . isValid ( ) ) {
150
+ function validateBuffer ( buffer : CharBuffer | null ) {
151
+ if ( ! buffer || buffer . isValid ( ) ) {
208
152
return
209
153
}
210
154
const firstRange = getRegexpRange ( buffer . elements [ 0 ] )
0 commit comments