@@ -71,9 +71,73 @@ def deconstruct_keys(keys)
7171 end
7272 end
7373
74- Combinator = Struct . new ( :value , keyword_init : true )
75- ComplexSelector = Struct . new ( :left , :combinator , :right , keyword_init : true )
76- CompoundSelector = Struct . new ( :type , :subclasses , :pseudo_elements , keyword_init : true )
74+ class Combinator < Node
75+ attr_reader :value
76+
77+ def initialize ( value :)
78+ @value = value
79+ end
80+
81+ def accept ( visitor )
82+ visitor . visit_combinator ( self )
83+ end
84+
85+ def child_nodes
86+ [ value ]
87+ end
88+
89+ alias deconstruct child_nodes
90+
91+ def deconstruct_keys ( keys )
92+ { value : value }
93+ end
94+ end
95+
96+ class ComplexSelector < Node
97+ attr_reader :child_nodes
98+
99+ def initialize ( child_nodes :)
100+ @child_nodes = child_nodes
101+ end
102+
103+ def accept ( visitor )
104+ visitor . visit_complex_selector ( self )
105+ end
106+
107+ alias deconstruct child_nodes
108+
109+ def deconstruct_keys ( keys )
110+ { child_nodes : child_nodes }
111+ end
112+ end
113+
114+ class CompoundSelector < Node
115+ attr_reader :type , :subclasses , :pseudo_elements
116+
117+ def initialize ( type :, subclasses :, pseudo_elements :)
118+ @type = type
119+ @subclasses = subclasses
120+ @pseudo_elements = pseudo_elements
121+ end
122+
123+ def accept ( visitor )
124+ visitor . visit_compound_selector ( self )
125+ end
126+
127+ def child_nodes
128+ [ type , subclasses , pseudo_elements ] . flatten
129+ end
130+
131+ alias deconstruct child_nodes
132+
133+ def deconstruct_keys ( keys )
134+ {
135+ type : type ,
136+ subclasses : subclasses ,
137+ pseudo_elements : pseudo_elements
138+ }
139+ end
140+ end
77141
78142 # The ID of an element, e.g., #foo
79143 # https://www.w3.org/TR/selectors-4/#typedef-id-selector
@@ -267,27 +331,30 @@ def relative_selector_list
267331
268332 # <complex-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*
269333 def complex_selector
270- left = compound_selector
334+ child_nodes = [ compound_selector ]
271335
272336 loop do
273- if ( combinator = maybe { combinator } )
274- ComplexSelector . new ( left : left , combinator : combinator , right : compound_selector )
275- elsif ( right = maybe { compound_selector } )
276- ComplexSelector . new ( left : left , combinator : nil , right : right )
337+ if ( c = maybe { combinator } )
338+ child_nodes << c
339+ end
340+ if ( s = maybe { compound_selector } )
341+ child_nodes << s
277342 else
278343 break
279344 end
280345 end
281346
282- left
347+ if child_nodes . length > 1
348+ ComplexSelector . new ( child_nodes : child_nodes )
349+ else
350+ child_nodes . first
351+ end
283352 end
284353
285354 # <relative-selector> = <combinator>? <complex-selector>
286355 def relative_selector
287- combinator = maybe { combinator }
288-
289- if combinator
290- RelativeSelector . new ( combinator : combinator , complex_selector : complex_selector )
356+ if ( c = maybe { combinator } )
357+ RelativeSelector . new ( combinator : c , complex_selector : complex_selector )
291358 else
292359 complex_selector
293360 end
@@ -296,6 +363,8 @@ def relative_selector
296363 # <compound-selector> = [ <type-selector>? <subclass-selector>*
297364 # [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!
298365 def compound_selector
366+ consume_whitespace
367+
299368 type = maybe { type_selector }
300369 subclasses = [ ]
301370
@@ -332,6 +401,8 @@ def simple_selector
332401
333402 # <combinator> = '>' | '+' | '~' | [ '|' '|' ]
334403 def combinator
404+ consume_whitespace
405+
335406 value =
336407 options do
337408 maybe { consume ( ">" ) } ||
0 commit comments