File tree Expand file tree Collapse file tree 2 files changed +27
-15
lines changed Expand file tree Collapse file tree 2 files changed +27
-15
lines changed Original file line number Diff line number Diff line change @@ -137,6 +137,7 @@ private static function processTokens(array $tokens): array
137
137
{
138
138
$ resolved = [];
139
139
$ escaped = false ;
140
+ $ bracketOpen = false ;
140
141
$ brackets = [];
141
142
142
143
for ($ offset = 0 ; $ offset < count ($ tokens ); $ offset ++) {
@@ -205,14 +206,24 @@ private static function processTokens(array $tokens): array
205
206
}
206
207
207
208
if ($ type === self ::T_BRACKET_OPEN && $ tokens [$ offset + 1 ][0 ] === self ::T_BRACKET_CLOSE ) {
208
- $ resolved [] = [self ::T_BRACKET_OPEN , $ char ];
209
+ $ bracketOpen = true ;
210
+ $ resolved [] = [self ::T_BRACKET_OPEN , '[ ' ];
209
211
$ brackets [] = array_key_last ($ resolved );
210
- $ resolved [] = [self ::T_CHAR , $ char ];
212
+ $ resolved [] = [self ::T_CHAR , '] ' ];
213
+ $ offset += 1 ;
214
+
215
+ continue ;
216
+ }
211
217
218
+ if ($ bracketOpen === true && $ type === self ::T_BRACKET_OPEN ) {
219
+ // if bracket is already open, interpret everything as a
220
+ // literal char
221
+ $ resolved [] = [self ::T_CHAR , $ char ];
212
222
continue ;
213
223
}
214
224
215
- if ($ type === self ::T_BRACKET_OPEN ) {
225
+ if ($ bracketOpen === false && $ type === self ::T_BRACKET_OPEN ) {
226
+ $ bracketOpen = true ;
216
227
$ resolved [] = [$ type , $ char ];
217
228
$ brackets [] = array_key_last ($ resolved );
218
229
Original file line number Diff line number Diff line change @@ -297,22 +297,24 @@ public static function provideCharacterGroup(): Generator
297
297
yield 'unterminated char group followed by char group ' => [
298
298
new FileMatcherPattern ('/[AB[a-z] ' ),
299
299
[
300
- '/[ ' => false ,
301
- '/[Ac ' => false ,
302
- '/[ABc ' => true ,
303
- '/[ABc/foo ' => true ,
300
+ '/[ ' => true , // nested [ is literal
301
+ '/f ' => true , // within a-z
302
+ '/A ' => true ,
303
+ '/B ' => true ,
304
+
305
+ '/Z ' => false ,
306
+ '/[c ' => false ,
304
307
],
305
308
];
306
309
307
310
yield 'multiple unterminated char groups followed by char group ' => [
308
311
new FileMatcherPattern ('/[AB[CD[a-z]EF ' ),
309
312
[
310
- '/[ ' => false ,
311
- '/[Ac ' => false ,
312
- '/[AB[C ' => false ,
313
- '/[AB[CD ' => false ,
314
- '/[AB[CDz ' => false ,
315
- '/[AB[CDzEF ' => true ,
313
+ '/[EF ' => true ,
314
+ '/AEF ' => true ,
315
+ '/[EF ' => true ,
316
+ '/DEF ' => true ,
317
+ '/EEF ' => false ,
316
318
],
317
319
];
318
320
@@ -358,7 +360,7 @@ public static function provideCharacterGroup(): Generator
358
360
359
361
// https://man7.org/linux/man-pages/man7/glob.7.html
360
362
yield 'square bracket in char group ' => [
361
- new FileMatcherPattern ('/[][!] ' ),
363
+ new FileMatcherPattern ('/[][!]* ' ),
362
364
[
363
365
'/[hello ' => true ,
364
366
'/[ ' => true ,
@@ -367,7 +369,6 @@ public static function provideCharacterGroup(): Generator
367
369
'/a ' => false ,
368
370
'/ ' => false ,
369
371
],
370
- 'This test fails because `[` should be interpreted a literal ' ,
371
372
];
372
373
373
374
yield 'match ranges ' => [
You can’t perform that action at this time.
0 commit comments