Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 45b5ece

Browse files
committed
Flatten the AST of ComplexSelector
1 parent a6d9b01 commit 45b5ece

File tree

4 files changed

+52
-54
lines changed

4 files changed

+52
-54
lines changed

lib/syntax_tree/css/format.rb

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,10 @@ def visit_combinator(node)
9191
# Visit a Selectors::ComplexSelector node.
9292
def visit_complex_selector(node)
9393
q.group do
94-
node.left.format(q)
95-
96-
if node.combinator
97-
q.text(" ")
98-
node.combinator.format(q)
94+
node.child_nodes.each_with_index do |child_node, j|
95+
q.text(" ") unless j == 0
96+
child_node.format(q)
9997
end
100-
101-
q.text(" ")
102-
node.right.format(q)
10398
end
10499
end
105100

lib/syntax_tree/css/pretty_print.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -432,14 +432,10 @@ def visit_combinator(node)
432432
# Visit a Selectors::ComplexSelector node.
433433
def visit_complex_selector(node)
434434
token("complex-selector") do
435-
q.breakable
436-
q.pp(node.left)
437-
438-
q.breakable
439-
q.pp(node.combinator)
440-
441-
q.breakable
442-
q.pp(node.right)
435+
node.child_nodes.each do |child|
436+
q.breakable
437+
q.pp(child)
438+
end
443439
end
444440
end
445441

lib/syntax_tree/css/selectors.rb

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -94,26 +94,20 @@ def deconstruct_keys(keys)
9494
end
9595

9696
class ComplexSelector < Node
97-
attr_reader :left, :combinator, :right
97+
attr_reader :child_nodes
9898

99-
def initialize(left:, combinator:, right:)
100-
@left = left
101-
@combinator = combinator
102-
@right = right
99+
def initialize(child_nodes:)
100+
@child_nodes = child_nodes
103101
end
104102

105103
def accept(visitor)
106104
visitor.visit_complex_selector(self)
107105
end
108106

109-
def child_nodes
110-
[left, combinator, right]
111-
end
112-
113107
alias deconstruct child_nodes
114108

115109
def deconstruct_keys(keys)
116-
{ left: left, combinator: combinator, right: right }
110+
{ child_nodes: child_nodes }
117111
end
118112
end
119113

@@ -337,16 +331,23 @@ def relative_selector_list
337331

338332
# <complex-selector> = <compound-selector> [ <combinator>? <compound-selector> ]*
339333
def complex_selector
340-
consume_whitespace
334+
child_nodes = [compound_selector]
341335

342-
left = compound_selector
336+
loop do
337+
if (c = maybe { combinator })
338+
child_nodes << c
339+
end
340+
if (s = maybe { compound_selector })
341+
child_nodes << s
342+
else
343+
break
344+
end
345+
end
343346

344-
if (c = maybe { combinator })
345-
ComplexSelector.new(left: left, combinator: c, right: complex_selector)
346-
elsif (right = maybe { complex_selector })
347-
ComplexSelector.new(left: left, combinator: nil, right: right)
347+
if child_nodes.length > 1
348+
ComplexSelector.new(child_nodes: child_nodes)
348349
else
349-
left
350+
child_nodes.first
350351
end
351352
end
352353

@@ -362,6 +363,8 @@ def relative_selector
362363
# <compound-selector> = [ <type-selector>? <subclass-selector>*
363364
# [ <pseudo-element-selector> <pseudo-class-selector>* ]* ]!
364365
def compound_selector
366+
consume_whitespace
367+
365368
type = maybe { type_selector }
366369
subclasses = []
367370

test/selectors_test.rb

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,11 @@ class SelectorsTest < Minitest::Spec
7272
assert_pattern do
7373
actual => [
7474
Selectors::ComplexSelector[
75-
left: Selectors::TypeSelector[value: { name: { value: "section" } }],
76-
combinator: { value: { value: ">" } },
77-
right: Selectors::TypeSelector[value: { name: { value: "table" } }]
75+
child_nodes: [
76+
Selectors::TypeSelector[value: { name: { value: "section" } }],
77+
Selectors::Combinator[value: { value: ">" }],
78+
Selectors::TypeSelector[value: { name: { value: "table" } }]
79+
]
7880
]
7981
]
8082
end
@@ -86,12 +88,12 @@ class SelectorsTest < Minitest::Spec
8688
assert_pattern do
8789
actual => [
8890
Selectors::ComplexSelector[
89-
left: Selectors::TypeSelector[value: { name: { value: "section" } }],
90-
combinator: { value: { value: ">" } },
91-
right: Selectors::ComplexSelector[
92-
left: Selectors::TypeSelector[value: { name: { value: "table" } }],
93-
combinator: { value: { value: ">" } },
94-
right: Selectors::TypeSelector[value: { name: { value: "tr" } }]
91+
child_nodes: [
92+
Selectors::TypeSelector[value: { name: { value: "section" } }],
93+
Selectors::Combinator[value: { value: ">" }],
94+
Selectors::TypeSelector[value: { name: { value: "table" } }],
95+
Selectors::Combinator[value: { value: ">" }],
96+
Selectors::TypeSelector[value: { name: { value: "tr" } }],
9597
]
9698
]
9799
]
@@ -104,9 +106,11 @@ class SelectorsTest < Minitest::Spec
104106
assert_pattern do
105107
actual => [
106108
Selectors::ComplexSelector[
107-
left: Selectors::TypeSelector[value: { name: { value: "section" } }],
108-
combinator: { value: { value: ">" } },
109-
right: Selectors::TypeSelector[value: { name: { value: "table" } }],
109+
child_nodes: [
110+
Selectors::TypeSelector[value: { name: { value: "section" } }],
111+
Selectors::Combinator[value: { value: ">" }],
112+
Selectors::TypeSelector[value: { name: { value: "table" } }],
113+
]
110114
]
111115
]
112116
end
@@ -118,9 +122,10 @@ class SelectorsTest < Minitest::Spec
118122
assert_pattern do
119123
actual => [
120124
Selectors::ComplexSelector[
121-
left: Selectors::TypeSelector[value: { name: { value: "section" } }],
122-
combinator: nil,
123-
right: Selectors::TypeSelector[value: { name: { value: "table" } }],
125+
child_nodes: [
126+
Selectors::TypeSelector[value: { name: { value: "section" } }],
127+
Selectors::TypeSelector[value: { name: { value: "table" } }],
128+
]
124129
]
125130
]
126131
end
@@ -132,12 +137,11 @@ class SelectorsTest < Minitest::Spec
132137
assert_pattern do
133138
actual => [
134139
Selectors::ComplexSelector[
135-
left: Selectors::TypeSelector[value: { name: { value: "section" } }],
136-
combinator: { value: { value: ">" } },
137-
right: Selectors::ComplexSelector[
138-
left: Selectors::TypeSelector[value: { name: { value: "table" } }],
139-
combinator: nil,
140-
right: Selectors::TypeSelector[value: { name: { value: "tr" } }]
140+
child_nodes: [
141+
Selectors::TypeSelector[value: { name: { value: "section" } }],
142+
Selectors::Combinator[value: { value: ">" }],
143+
Selectors::TypeSelector[value: { name: { value: "table" } }],
144+
Selectors::TypeSelector[value: { name: { value: "tr" } }]
141145
]
142146
]
143147
]

0 commit comments

Comments
 (0)