File tree 2 files changed +35
-5
lines changed
2 files changed +35
-5
lines changed Original file line number Diff line number Diff line change @@ -299,13 +299,13 @@ export function createParser(
299
299
}
300
300
}
301
301
302
- function parseSelector ( ) : AstSelector {
302
+ function parseSelector ( relative = false ) : AstSelector {
303
303
skipWhitespace ( ) ;
304
- const rules : AstRule [ ] = [ parseRule ( ) ] ;
304
+ const rules : AstRule [ ] = [ parseRule ( relative ) ] ;
305
305
while ( is ( ',' ) ) {
306
306
next ( ) ;
307
307
skipWhitespace ( ) ;
308
- rules . push ( parseRule ( ) ) ;
308
+ rules . push ( parseRule ( relative ) ) ;
309
309
}
310
310
return {
311
311
type : 'Selector' ,
@@ -493,7 +493,7 @@ export function createParser(
493
493
} ;
494
494
assert ( pseudo . argument . value , 'Expected pseudo-class argument value.' ) ;
495
495
} else if ( pseudoDefinition . type === 'Selector' ) {
496
- pseudo . argument = parseSelector ( ) ;
496
+ pseudo . argument = parseSelector ( true ) ;
497
497
} else if ( pseudoDefinition . type === 'Formula' ) {
498
498
const [ a , b ] = parseFormula ( ) ;
499
499
pseudo . argument = {
@@ -596,9 +596,16 @@ export function createParser(
596
596
}
597
597
}
598
598
599
- function parseRule ( ) : AstRule {
599
+ function parseRule ( relative = false ) : AstRule {
600
600
const rule : Partial < AstRule > = { } ;
601
601
let isRuleStart = true ;
602
+ if ( relative ) {
603
+ const combinator = matchMulticharIndex ( combinatorsIndex ) ;
604
+ if ( combinator ) {
605
+ rule . combinator = combinator ;
606
+ skipWhitespace ( ) ;
607
+ }
608
+ }
602
609
while ( pos < l ) {
603
610
if ( isTagStart ( ) ) {
604
611
assert ( isRuleStart , 'Unexpected tag/namespace start.' ) ;
Original file line number Diff line number Diff line change @@ -1123,6 +1123,29 @@ describe('parse()', () => {
1123
1123
} )
1124
1124
) ;
1125
1125
} ) ;
1126
+ it ( 'should parse a relative nested selector' , ( ) => {
1127
+ expect ( parse ( ':has(>div)' ) ) . toEqual (
1128
+ ast . selector ( {
1129
+ rules : [
1130
+ ast . rule ( {
1131
+ pseudoClasses : [
1132
+ ast . pseudoClass ( {
1133
+ name : 'has' ,
1134
+ argument : ast . selector ( {
1135
+ rules : [
1136
+ ast . rule ( {
1137
+ tag : ast . tagName ( { name : 'div' } ) ,
1138
+ combinator : '>'
1139
+ } )
1140
+ ]
1141
+ } )
1142
+ } )
1143
+ ]
1144
+ } )
1145
+ ]
1146
+ } )
1147
+ ) ;
1148
+ } ) ;
1126
1149
it ( 'should fail on empty substitute name' , ( ) => {
1127
1150
expect ( ( ) =>
1128
1151
createParser ( {
You can’t perform that action at this time.
0 commit comments