synvert-core 1.3.1 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/synvert/core/node_query/compiler/{simple_selector.rb → basic_selector.rb} +4 -5
- data/lib/synvert/core/node_query/compiler/expression.rb +5 -22
- data/lib/synvert/core/node_query/compiler/selector.rb +12 -37
- data/lib/synvert/core/node_query/compiler.rb +1 -1
- data/lib/synvert/core/node_query/lexer.rex +1 -10
- data/lib/synvert/core/node_query/lexer.rex.rb +2 -25
- data/lib/synvert/core/node_query/parser.racc.rb +102 -119
- data/lib/synvert/core/node_query/parser.y +8 -10
- data/lib/synvert/core/node_query.rb +3 -4
- data/lib/synvert/core/version.rb +1 -1
- data/spec/synvert/core/node_query/lexer_spec.rb +2 -62
- data/spec/synvert/core/node_query/parser_spec.rb +6 -51
- data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +7 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 741ca9c2f6f29e5bbafbc5b63d94b3cd9a56aa20e8a00f3f70830b73b1fb697e
|
4
|
+
data.tar.gz: a8bbf6e0c48a4af42578abb20807f3d86359fc069dc85ff90e12cf011f076998
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fcadf632c863b1f3ba410b65f63c741b594255567f337ebc86c51ae45e681484653b45eec01fc5c3e3a4ea170a6bd38e899bdf22f65b2e980d58cac8c11cfcd
|
7
|
+
data.tar.gz: 80ebe8f07ef9679c6921233d52b46979a6bfb895e4b63b974672dec193ef52ce08c40454d2a92fd509f12b8f3567065bb7d2dbee33af7bca37a96246e6373381
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Synvert::Core::NodeQuery::Compiler
|
4
|
-
#
|
5
|
-
class
|
6
|
-
# Initialize a
|
4
|
+
# BasicSelector used to match nodes, it combines by node type and/or attribute list.
|
5
|
+
class BasicSelector
|
6
|
+
# Initialize a BasicSelector.
|
7
7
|
# @param node_type [String] the node type
|
8
8
|
# @param attribute_list [Synvert::Core::NodeQuery::Compiler::AttributeList] the attribute list
|
9
9
|
def initialize(node_type:, attribute_list: nil)
|
@@ -20,8 +20,7 @@ module Synvert::Core::NodeQuery::Compiler
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_s
|
23
|
-
result = []
|
24
|
-
result << ".#{@node_type}" if @node_type
|
23
|
+
result = [".#{@node_type}"]
|
25
24
|
result << @attribute_list.to_s if @attribute_list
|
26
25
|
result.join('')
|
27
26
|
end
|
@@ -21,13 +21,14 @@ module Synvert::Core::NodeQuery::Compiler
|
|
21
21
|
# Query nodes by the selector and the rest expression.
|
22
22
|
#
|
23
23
|
# @param node [Parser::AST::Node] node to match
|
24
|
-
# @param descendant_match [Boolean] whether to match in descendant node
|
25
24
|
# @return [Array<Parser::AST::Node>] matching nodes.
|
26
|
-
def query_nodes(node
|
27
|
-
matching_nodes =
|
25
|
+
def query_nodes(node)
|
26
|
+
matching_nodes = @selector.query_nodes(node)
|
28
27
|
return matching_nodes if @rest.nil?
|
29
28
|
|
30
|
-
matching_nodes.flat_map
|
29
|
+
matching_nodes.flat_map do |matching_node|
|
30
|
+
@rest.query_nodes(matching_node)
|
31
|
+
end
|
31
32
|
end
|
32
33
|
|
33
34
|
def to_s
|
@@ -36,23 +37,5 @@ module Synvert::Core::NodeQuery::Compiler
|
|
36
37
|
result << @rest.to_s if @rest
|
37
38
|
result.join(' ')
|
38
39
|
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
# Find nodes by @rest
|
43
|
-
# @param node [Parser::AST::Node] node to match
|
44
|
-
# @param descendant_match [Boolean] whether to match in descendant node
|
45
|
-
def find_nodes_by_rest(node, descendant_match = false)
|
46
|
-
@rest.query_nodes(node, descendant_match)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Find nodes with nil relationship.
|
50
|
-
# @param node [Parser::AST::Node] node to match
|
51
|
-
# @param descendant_match [Boolean] whether to match in descendant node
|
52
|
-
def find_nodes_by_selector(node, descendant_match = true)
|
53
|
-
return Array(node) if !@selector
|
54
|
-
|
55
|
-
@selector.query_nodes(node, descendant_match)
|
56
|
-
end
|
57
40
|
end
|
58
41
|
end
|
@@ -7,17 +7,15 @@ module Synvert::Core::NodeQuery::Compiler
|
|
7
7
|
# @param goto_scope [String] goto scope
|
8
8
|
# @param relationship [Symbol] the relationship between the selectors, it can be descendant <code>nil</code>, child <code>></code>, next sibling <code>+</code> or subsequent sibing <code>~</code>.
|
9
9
|
# @param rest [Synvert::Core::NodeQuery::Compiler::Selector] the rest selector
|
10
|
-
# @param
|
10
|
+
# @param basic_selector [Synvert::Core::NodeQuery::Compiler::BasicSelector] the simple selector
|
11
11
|
# @param attribute_list [Synvert::Core::NodeQuery::Compiler::AttributeList] the attribute list
|
12
|
-
# @param index [Integer] the index
|
13
12
|
# @param pseudo_class [String] the pseudo class, can be <code>has</code> or <code>not_has</code>
|
14
13
|
# @param pseudo_selector [Synvert::Core::NodeQuery::Compiler::Expression] the pseudo selector
|
15
|
-
def initialize(goto_scope: nil, relationship: nil, rest: nil,
|
14
|
+
def initialize(goto_scope: nil, relationship: nil, rest: nil, basic_selector: nil, pseudo_class: nil, pseudo_selector: nil)
|
16
15
|
@goto_scope = goto_scope
|
17
16
|
@relationship = relationship
|
18
17
|
@rest = rest
|
19
|
-
@
|
20
|
-
@index = index
|
18
|
+
@basic_selector = basic_selector
|
21
19
|
@pseudo_class = pseudo_class
|
22
20
|
@pseudo_selector = pseudo_selector
|
23
21
|
end
|
@@ -25,9 +23,7 @@ module Synvert::Core::NodeQuery::Compiler
|
|
25
23
|
# Check if node matches the selector.
|
26
24
|
# @param node [Parser::AST::Node] the node
|
27
25
|
def match?(node)
|
28
|
-
node.is_a?(::Parser::AST::Node) &&
|
29
|
-
(!@simple_selector || @simple_selector.match?(node)) &&
|
30
|
-
match_pseudo_class?(node)
|
26
|
+
node.is_a?(::Parser::AST::Node) && (!@basic_selector || @basic_selector.match?(node)) && match_pseudo_class?(node)
|
31
27
|
end
|
32
28
|
|
33
29
|
# Query nodes by the selector.
|
@@ -38,47 +34,33 @@ module Synvert::Core::NodeQuery::Compiler
|
|
38
34
|
# * If relationship is next sibling, it try to match next sibling node.
|
39
35
|
# * If relationship is subsequent sibling, it will match in all sibling nodes.
|
40
36
|
# @param node [Parser::AST::Node] node to match
|
41
|
-
# @param descendant_match [Boolean] whether to match in descendant node
|
42
37
|
# @return [Array<Parser::AST::Node>] matching nodes.
|
43
|
-
def query_nodes(node
|
38
|
+
def query_nodes(node)
|
44
39
|
return find_nodes_by_relationship(node) if @relationship
|
45
40
|
|
46
41
|
if node.is_a?(::Array)
|
47
|
-
return node.flat_map { |child_node| query_nodes(child_node
|
42
|
+
return node.flat_map { |child_node| query_nodes(child_node) }
|
48
43
|
end
|
49
44
|
|
50
45
|
return find_nodes_by_goto_scope(node) if @goto_scope
|
51
46
|
|
52
47
|
nodes = []
|
53
48
|
nodes << node if match?(node)
|
54
|
-
if
|
49
|
+
if @basic_selector
|
55
50
|
node.recursive_children do |child_node|
|
56
51
|
nodes << child_node if match?(child_node)
|
57
52
|
end
|
58
53
|
end
|
59
|
-
|
54
|
+
nodes
|
60
55
|
end
|
61
56
|
|
62
57
|
def to_s
|
63
58
|
result = []
|
64
|
-
result << "
|
59
|
+
result << "#{@goto_scope} " if @goto_scope
|
65
60
|
result << "#{@relationship} " if @relationship
|
66
61
|
result << @rest.to_s if @rest
|
67
|
-
result << @
|
62
|
+
result << @basic_selector.to_s if @basic_selector
|
68
63
|
result << ":#{@pseudo_class}(#{@pseudo_selector})" if @pseudo_class
|
69
|
-
if @index
|
70
|
-
result <<
|
71
|
-
case @index
|
72
|
-
when 0
|
73
|
-
':first-child'
|
74
|
-
when -1
|
75
|
-
':last-child'
|
76
|
-
when (1..)
|
77
|
-
":nth-child(#{@index + 1})"
|
78
|
-
else # ...-1
|
79
|
-
":nth-last-child(#{-@index})"
|
80
|
-
end
|
81
|
-
end
|
82
64
|
result.join('')
|
83
65
|
end
|
84
66
|
|
@@ -88,7 +70,7 @@ module Synvert::Core::NodeQuery::Compiler
|
|
88
70
|
# @param node [Parser::AST::Node] node to match
|
89
71
|
def find_nodes_by_goto_scope(node)
|
90
72
|
@goto_scope.split('.').each { |scope| node = node.send(scope) }
|
91
|
-
@rest.query_nodes(node
|
73
|
+
@rest.query_nodes(node)
|
92
74
|
end
|
93
75
|
|
94
76
|
# Find ndoes by @relationship
|
@@ -114,7 +96,7 @@ module Synvert::Core::NodeQuery::Compiler
|
|
114
96
|
nodes << sibling_node if @rest.match?(sibling_node)
|
115
97
|
end
|
116
98
|
end
|
117
|
-
|
99
|
+
nodes
|
118
100
|
end
|
119
101
|
|
120
102
|
def match_pseudo_class?(node)
|
@@ -127,12 +109,5 @@ module Synvert::Core::NodeQuery::Compiler
|
|
127
109
|
true
|
128
110
|
end
|
129
111
|
end
|
130
|
-
|
131
|
-
# Filter nodes by index.
|
132
|
-
def filter(nodes)
|
133
|
-
return nodes if @index.nil?
|
134
|
-
|
135
|
-
nodes[@index] ? [nodes[@index]] : []
|
136
|
-
end
|
137
112
|
end
|
138
113
|
end
|
@@ -8,7 +8,7 @@ module Synvert::Core::NodeQuery::Compiler
|
|
8
8
|
|
9
9
|
autoload :Expression, 'synvert/core/node_query/compiler/expression'
|
10
10
|
autoload :Selector, 'synvert/core/node_query/compiler/selector'
|
11
|
-
autoload :
|
11
|
+
autoload :BasicSelector, 'synvert/core/node_query/compiler/basic_selector'
|
12
12
|
autoload :AttributeList, 'synvert/core/node_query/compiler/attribute_list'
|
13
13
|
autoload :Attribute, 'synvert/core/node_query/compiler/attribute'
|
14
14
|
|
@@ -7,8 +7,6 @@ macros
|
|
7
7
|
CLOSE_ARRAY /\)/
|
8
8
|
OPEN_SELECTOR /\(/
|
9
9
|
CLOSE_SELECTOR /\)/
|
10
|
-
OPEN_GOTO_SCOPE /</
|
11
|
-
CLOSE_GOTO_SCOPE />/
|
12
10
|
OPEN_DYNAMIC_ATTRIBUTE /{{/
|
13
11
|
CLOSE_DYNAMIC_ATTRIBUTE /}}/
|
14
12
|
NODE_TYPE /\.[a-z]+/
|
@@ -29,23 +27,16 @@ rules
|
|
29
27
|
|
30
28
|
# [:state] pattern [actions]
|
31
29
|
/\s+/
|
32
|
-
/:first-child/ { [:tINDEX, 0] }
|
33
|
-
/:last-child/ { [:tINDEX, -1] }
|
34
|
-
/:nth-child\(\d+\)/ { [:tINDEX, text.sub(':nth-child(', '').to_i - 1] }
|
35
|
-
/:nth-last-child\(\d+\)/ { [:tINDEX, -text.sub(':nth-last-child(', '').to_i] }
|
36
30
|
/:has/ { [:tPSEUDO_CLASS, text[1..-1]] }
|
37
31
|
/:not_has/ { [:tPSEUDO_CLASS, text[1..-1]] }
|
38
32
|
/#{NODE_TYPE}/ { [:tNODE_TYPE, text[1..]] }
|
33
|
+
/#{IDENTIFIER}/ { [:tGOTO_SCOPE, text] }
|
39
34
|
/>/ { [:tRELATIONSHIP, text] }
|
40
35
|
/~/ { [:tRELATIONSHIP, text] }
|
41
36
|
/\+/ { [:tRELATIONSHIP, text] }
|
42
37
|
/#{OPEN_SELECTOR}/ { [:tOPEN_SELECTOR, text] }
|
43
38
|
/#{CLOSE_SELECTOR}/ { [:tCLOSE_SELECTOR, text] }
|
44
|
-
/#{OPEN_GOTO_SCOPE}/ { @state = :GOTO_SCOPE; [:tOPEN_GOTO_SCOPE, text] }
|
45
39
|
/#{OPEN_ATTRIBUTE}/ { @nested_count += 1; @state = :KEY; [:tOPEN_ATTRIBUTE, text] }
|
46
|
-
:GOTO_SCOPE /\s+/
|
47
|
-
:GOTO_SCOPE /#{IDENTIFIER}/ { [:tIDENTIFIER, text] }
|
48
|
-
:GOTO_SCOPE /#{CLOSE_GOTO_SCOPE}/ { @state = nil; [:tCLOSE_GOTO_SCOPE, text] }
|
49
40
|
:KEY /\s+/
|
50
41
|
:KEY /\^=/ { @state = :VALUE; [:tOPERATOR, '^='] }
|
51
42
|
:KEY /\$=/ { @state = :VALUE; [:tOPERATOR, '$='] }
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# typed: false
|
2
1
|
# frozen_string_literal: true
|
3
2
|
# encoding: UTF-8
|
4
3
|
#--
|
@@ -21,8 +20,6 @@ class Synvert::Core::NodeQuery::Lexer
|
|
21
20
|
CLOSE_ARRAY = /\)/
|
22
21
|
OPEN_SELECTOR = /\(/
|
23
22
|
CLOSE_SELECTOR = /\)/
|
24
|
-
OPEN_GOTO_SCOPE = /</
|
25
|
-
CLOSE_GOTO_SCOPE = />/
|
26
23
|
OPEN_DYNAMIC_ATTRIBUTE = /{{/
|
27
24
|
CLOSE_DYNAMIC_ATTRIBUTE = /}}/
|
28
25
|
NODE_TYPE = /\.[a-z]+/
|
@@ -128,20 +125,14 @@ class Synvert::Core::NodeQuery::Lexer
|
|
128
125
|
case
|
129
126
|
when ss.skip(/\s+/) then
|
130
127
|
# do nothing
|
131
|
-
when ss.skip(/:first-child/) then
|
132
|
-
action { [:tINDEX, 0] }
|
133
|
-
when ss.skip(/:last-child/) then
|
134
|
-
action { [:tINDEX, -1] }
|
135
|
-
when text = ss.scan(/:nth-child\(\d+\)/) then
|
136
|
-
action { [:tINDEX, text.sub(':nth-child(', '').to_i - 1] }
|
137
|
-
when text = ss.scan(/:nth-last-child\(\d+\)/) then
|
138
|
-
action { [:tINDEX, -text.sub(':nth-last-child(', '').to_i] }
|
139
128
|
when text = ss.scan(/:has/) then
|
140
129
|
action { [:tPSEUDO_CLASS, text[1..-1]] }
|
141
130
|
when text = ss.scan(/:not_has/) then
|
142
131
|
action { [:tPSEUDO_CLASS, text[1..-1]] }
|
143
132
|
when text = ss.scan(/#{NODE_TYPE}/) then
|
144
133
|
action { [:tNODE_TYPE, text[1..]] }
|
134
|
+
when text = ss.scan(/#{IDENTIFIER}/) then
|
135
|
+
action { [:tGOTO_SCOPE, text] }
|
145
136
|
when text = ss.scan(/>/) then
|
146
137
|
action { [:tRELATIONSHIP, text] }
|
147
138
|
when text = ss.scan(/~/) then
|
@@ -152,26 +143,12 @@ class Synvert::Core::NodeQuery::Lexer
|
|
152
143
|
action { [:tOPEN_SELECTOR, text] }
|
153
144
|
when text = ss.scan(/#{CLOSE_SELECTOR}/) then
|
154
145
|
action { [:tCLOSE_SELECTOR, text] }
|
155
|
-
when text = ss.scan(/#{OPEN_GOTO_SCOPE}/) then
|
156
|
-
action { @state = :GOTO_SCOPE; [:tOPEN_GOTO_SCOPE, text] }
|
157
146
|
when text = ss.scan(/#{OPEN_ATTRIBUTE}/) then
|
158
147
|
action { @nested_count += 1; @state = :KEY; [:tOPEN_ATTRIBUTE, text] }
|
159
148
|
else
|
160
149
|
text = ss.string[ss.pos .. -1]
|
161
150
|
raise ScanError, "can not match (#{state.inspect}) at #{location}: '#{text}'"
|
162
151
|
end
|
163
|
-
when :GOTO_SCOPE then
|
164
|
-
case
|
165
|
-
when ss.skip(/\s+/) then
|
166
|
-
# do nothing
|
167
|
-
when text = ss.scan(/#{IDENTIFIER}/) then
|
168
|
-
action { [:tIDENTIFIER, text] }
|
169
|
-
when text = ss.scan(/#{CLOSE_GOTO_SCOPE}/) then
|
170
|
-
action { @state = nil; [:tCLOSE_GOTO_SCOPE, text] }
|
171
|
-
else
|
172
|
-
text = ss.string[ss.pos .. -1]
|
173
|
-
raise ScanError, "can not match (#{state.inspect}) at #{location}: '#{text}'"
|
174
|
-
end
|
175
152
|
when :KEY then
|
176
153
|
case
|
177
154
|
when ss.skip(/\s+/) then
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# typed: true
|
2
1
|
#
|
3
2
|
# DO NOT MODIFY!!!!
|
4
3
|
# This file is automatically generated by Racc 1.6.0
|
@@ -26,98 +25,94 @@ module Synvert
|
|
26
25
|
##### State transition tables begin ###
|
27
26
|
|
28
27
|
racc_action_table = [
|
29
|
-
7,
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
26, 27,
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
6, nil, 6, nil, 6 ]
|
28
|
+
7, 7, 6, 8, 10, 34, 14, 4, 5, 15,
|
29
|
+
26, 18, 24, 19, 20, 21, 14, 38, 39, 27,
|
30
|
+
28, 29, 30, 31, 32, 33, 7, 41, 7, 6,
|
31
|
+
nil, 34, nil, 7, 4, 5, 26, nil, 34, 35,
|
32
|
+
nil, nil, nil, 26, nil, 27, 28, 29, 30, 31,
|
33
|
+
32, 33, 27, 28, 29, 30, 31, 32, 33, 7,
|
34
|
+
6, 7, 6, 7, 6, 4, 5, 4, 5, 4,
|
35
|
+
5 ]
|
38
36
|
|
39
37
|
racc_action_check = [
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
12, nil, 18, nil, 20 ]
|
38
|
+
21, 0, 0, 1, 4, 21, 7, 0, 0, 8,
|
39
|
+
21, 14, 21, 16, 17, 18, 20, 26, 36, 21,
|
40
|
+
21, 21, 21, 21, 21, 21, 24, 38, 2, 2,
|
41
|
+
nil, 24, nil, 37, 2, 2, 24, nil, 37, 24,
|
42
|
+
nil, nil, nil, 37, nil, 24, 24, 24, 24, 24,
|
43
|
+
24, 24, 37, 37, 37, 37, 37, 37, 37, 5,
|
44
|
+
5, 6, 6, 10, 10, 5, 5, 6, 6, 10,
|
45
|
+
10 ]
|
49
46
|
|
50
47
|
racc_action_pointer = [
|
51
|
-
|
52
|
-
nil,
|
53
|
-
|
54
|
-
nil,
|
55
|
-
nil, nil
|
48
|
+
-1, 3, 26, nil, -12, 57, 59, -4, 9, nil,
|
49
|
+
61, nil, nil, nil, 6, nil, -4, 3, -3, nil,
|
50
|
+
6, -2, nil, nil, 24, nil, -3, nil, nil, nil,
|
51
|
+
nil, nil, nil, nil, nil, nil, 3, 31, 14, nil,
|
52
|
+
nil, nil ]
|
56
53
|
|
57
54
|
racc_action_default = [
|
58
|
-
-
|
59
|
-
|
60
|
-
-
|
61
|
-
-
|
62
|
-
-
|
55
|
+
-26, -26, -2, -3, -26, -26, -26, -7, -26, -1,
|
56
|
+
-26, -5, -6, -8, -26, 42, -26, -26, -26, -4,
|
57
|
+
-10, -26, -9, -11, -26, -16, -26, -18, -19, -20,
|
58
|
+
-21, -22, -23, -24, -25, -12, -26, -15, -26, -13,
|
59
|
+
-14, -17 ]
|
63
60
|
|
64
61
|
racc_goto_table = [
|
65
|
-
|
66
|
-
|
62
|
+
25, 13, 36, 25, 11, 12, 1, 17, 9, 16,
|
63
|
+
23, nil, nil, nil, 22, 40, 25 ]
|
67
64
|
|
68
65
|
racc_goto_check = [
|
69
|
-
|
70
|
-
|
66
|
+
3, 4, 7, 3, 2, 2, 1, 5, 1, 2,
|
67
|
+
6, nil, nil, nil, 4, 7, 3 ]
|
71
68
|
|
72
69
|
racc_goto_pointer = [
|
73
|
-
nil,
|
70
|
+
nil, 6, -1, -21, -6, -7, -11, -22 ]
|
74
71
|
|
75
72
|
racc_goto_default = [
|
76
|
-
nil, nil, 2, 3, nil, nil,
|
73
|
+
nil, nil, 2, 3, nil, nil, 37, nil ]
|
77
74
|
|
78
75
|
racc_reduce_table = [
|
79
76
|
0, 0, :racc_error,
|
80
|
-
2,
|
81
|
-
1,
|
82
|
-
1,
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
1,
|
98
|
-
|
99
|
-
1,
|
100
|
-
1,
|
101
|
-
1,
|
102
|
-
1,
|
103
|
-
1,
|
104
|
-
1,
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
racc_shift_n = 49
|
77
|
+
2, 29, :_reduce_1,
|
78
|
+
1, 29, :_reduce_2,
|
79
|
+
1, 30, :_reduce_3,
|
80
|
+
4, 30, :_reduce_4,
|
81
|
+
2, 30, :_reduce_5,
|
82
|
+
2, 30, :_reduce_6,
|
83
|
+
1, 31, :_reduce_7,
|
84
|
+
2, 31, :_reduce_8,
|
85
|
+
4, 32, :_reduce_9,
|
86
|
+
3, 32, :_reduce_10,
|
87
|
+
3, 33, :_reduce_11,
|
88
|
+
4, 33, :_reduce_12,
|
89
|
+
5, 33, :_reduce_13,
|
90
|
+
2, 35, :_reduce_14,
|
91
|
+
1, 35, :_reduce_15,
|
92
|
+
1, 34, :_reduce_none,
|
93
|
+
3, 34, :_reduce_17,
|
94
|
+
1, 34, :_reduce_18,
|
95
|
+
1, 34, :_reduce_19,
|
96
|
+
1, 34, :_reduce_20,
|
97
|
+
1, 34, :_reduce_21,
|
98
|
+
1, 34, :_reduce_22,
|
99
|
+
1, 34, :_reduce_23,
|
100
|
+
1, 34, :_reduce_24,
|
101
|
+
1, 34, :_reduce_25 ]
|
102
|
+
|
103
|
+
racc_reduce_n = 26
|
104
|
+
|
105
|
+
racc_shift_n = 42
|
111
106
|
|
112
107
|
racc_token_table = {
|
113
108
|
false => 0,
|
114
109
|
:error => 1,
|
115
110
|
:tNODE_TYPE => 2,
|
116
|
-
:
|
117
|
-
:
|
118
|
-
:
|
119
|
-
:
|
120
|
-
:
|
111
|
+
:tGOTO_SCOPE => 3,
|
112
|
+
:tATTRIBUTE => 4,
|
113
|
+
:tKEY => 5,
|
114
|
+
:tIDENTIFIER => 6,
|
115
|
+
:tIDENTIFIER_VALUE => 7,
|
121
116
|
:tPSEUDO_CLASS => 8,
|
122
117
|
:tRELATIONSHIP => 9,
|
123
118
|
:tOPEN_ATTRIBUTE => 10,
|
@@ -128,20 +123,18 @@ racc_token_table = {
|
|
128
123
|
:tCLOSE_ARRAY => 15,
|
129
124
|
:tOPEN_SELECTOR => 16,
|
130
125
|
:tCLOSE_SELECTOR => 17,
|
131
|
-
:
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
136
|
-
:
|
137
|
-
:
|
138
|
-
:
|
139
|
-
:
|
140
|
-
:
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
racc_nt_base = 30
|
126
|
+
:tOPERATOR => 18,
|
127
|
+
:tARRAY_VALUE => 19,
|
128
|
+
:tDYNAMIC_ATTRIBUTE => 20,
|
129
|
+
:tBOOLEAN => 21,
|
130
|
+
:tFLOAT => 22,
|
131
|
+
:tINTEGER => 23,
|
132
|
+
:tNIL => 24,
|
133
|
+
:tREGEXP => 25,
|
134
|
+
:tSTRING => 26,
|
135
|
+
:tSYMBOL => 27 }
|
136
|
+
|
137
|
+
racc_nt_base = 28
|
145
138
|
|
146
139
|
racc_use_result_var = false
|
147
140
|
|
@@ -165,11 +158,11 @@ Racc_token_to_s_table = [
|
|
165
158
|
"$end",
|
166
159
|
"error",
|
167
160
|
"tNODE_TYPE",
|
161
|
+
"tGOTO_SCOPE",
|
168
162
|
"tATTRIBUTE",
|
169
163
|
"tKEY",
|
170
164
|
"tIDENTIFIER",
|
171
165
|
"tIDENTIFIER_VALUE",
|
172
|
-
"tINDEX",
|
173
166
|
"tPSEUDO_CLASS",
|
174
167
|
"tRELATIONSHIP",
|
175
168
|
"tOPEN_ATTRIBUTE",
|
@@ -180,8 +173,6 @@ Racc_token_to_s_table = [
|
|
180
173
|
"tCLOSE_ARRAY",
|
181
174
|
"tOPEN_SELECTOR",
|
182
175
|
"tCLOSE_SELECTOR",
|
183
|
-
"tOPEN_GOTO_SCOPE",
|
184
|
-
"tCLOSE_GOTO_SCOPE",
|
185
176
|
"tOPERATOR",
|
186
177
|
"tARRAY_VALUE",
|
187
178
|
"tDYNAMIC_ATTRIBUTE",
|
@@ -195,7 +186,7 @@ Racc_token_to_s_table = [
|
|
195
186
|
"$start",
|
196
187
|
"expression",
|
197
188
|
"selector",
|
198
|
-
"
|
189
|
+
"basic_selector",
|
199
190
|
"attribute_list",
|
200
191
|
"attribute",
|
201
192
|
"value",
|
@@ -216,100 +207,92 @@ def _reduce_2(val, _values)
|
|
216
207
|
end
|
217
208
|
|
218
209
|
def _reduce_3(val, _values)
|
219
|
-
Compiler::Selector.new(
|
210
|
+
Compiler::Selector.new(basic_selector: val[0])
|
220
211
|
end
|
221
212
|
|
222
213
|
def _reduce_4(val, _values)
|
223
|
-
Compiler::Selector.new(
|
214
|
+
Compiler::Selector.new(pseudo_class: val[0], pseudo_selector: val[2])
|
224
215
|
end
|
225
216
|
|
226
217
|
def _reduce_5(val, _values)
|
227
|
-
Compiler::Selector.new(
|
218
|
+
Compiler::Selector.new(relationship: val[0], rest: val[1])
|
228
219
|
end
|
229
220
|
|
230
221
|
def _reduce_6(val, _values)
|
231
|
-
Compiler::Selector.new(
|
222
|
+
Compiler::Selector.new(goto_scope: val[0], rest: val[1])
|
232
223
|
end
|
233
224
|
|
234
225
|
def _reduce_7(val, _values)
|
235
|
-
Compiler::
|
226
|
+
Compiler::BasicSelector.new(node_type: val[0])
|
236
227
|
end
|
237
228
|
|
238
229
|
def _reduce_8(val, _values)
|
239
|
-
Compiler::
|
230
|
+
Compiler::BasicSelector.new(node_type: val[0], attribute_list: val[1])
|
240
231
|
end
|
241
232
|
|
242
233
|
def _reduce_9(val, _values)
|
243
|
-
Compiler::SimpleSelector.new(node_type: val[0])
|
244
|
-
end
|
245
|
-
|
246
|
-
def _reduce_10(val, _values)
|
247
|
-
Compiler::SimpleSelector.new(node_type: val[0], attribute_list: val[1])
|
248
|
-
end
|
249
|
-
|
250
|
-
def _reduce_11(val, _values)
|
251
234
|
Compiler::AttributeList.new(attribute: val[1], rest: val[3])
|
252
235
|
end
|
253
236
|
|
254
|
-
def
|
237
|
+
def _reduce_10(val, _values)
|
255
238
|
Compiler::AttributeList.new(attribute: val[1])
|
256
239
|
end
|
257
240
|
|
258
|
-
def
|
241
|
+
def _reduce_11(val, _values)
|
259
242
|
Compiler::Attribute.new(key: val[0], value: val[2], operator: val[1])
|
260
243
|
end
|
261
244
|
|
262
|
-
def
|
245
|
+
def _reduce_12(val, _values)
|
263
246
|
Compiler::Attribute.new(key: val[0], value: Compiler::Array.new, operator: val[1])
|
264
247
|
end
|
265
248
|
|
266
|
-
def
|
249
|
+
def _reduce_13(val, _values)
|
267
250
|
Compiler::Attribute.new(key: val[0], value: val[3], operator: val[1])
|
268
251
|
end
|
269
252
|
|
270
|
-
def
|
253
|
+
def _reduce_14(val, _values)
|
271
254
|
Compiler::Array.new(value: val[0], rest: val[1])
|
272
255
|
end
|
273
256
|
|
274
|
-
def
|
257
|
+
def _reduce_15(val, _values)
|
275
258
|
Compiler::Array.new(value: val[0])
|
276
259
|
end
|
277
260
|
|
278
|
-
# reduce
|
261
|
+
# reduce 16 omitted
|
279
262
|
|
280
|
-
def
|
263
|
+
def _reduce_17(val, _values)
|
281
264
|
Compiler::DynamicAttribute.new(value: val[1])
|
282
265
|
end
|
283
266
|
|
284
|
-
def
|
267
|
+
def _reduce_18(val, _values)
|
285
268
|
Compiler::Boolean.new(value: val[0])
|
286
269
|
end
|
287
270
|
|
288
|
-
def
|
271
|
+
def _reduce_19(val, _values)
|
289
272
|
Compiler::Float.new(value: val[0])
|
290
273
|
end
|
291
274
|
|
292
|
-
def
|
275
|
+
def _reduce_20(val, _values)
|
293
276
|
Compiler::Integer.new(value: val[0])
|
294
277
|
end
|
295
278
|
|
296
|
-
def
|
279
|
+
def _reduce_21(val, _values)
|
297
280
|
Compiler::Nil.new(value: val[0])
|
298
281
|
end
|
299
282
|
|
300
|
-
def
|
283
|
+
def _reduce_22(val, _values)
|
301
284
|
Compiler::Regexp.new(value: val[0])
|
302
285
|
end
|
303
286
|
|
304
|
-
def
|
287
|
+
def _reduce_23(val, _values)
|
305
288
|
Compiler::String.new(value: val[0])
|
306
289
|
end
|
307
290
|
|
308
|
-
def
|
291
|
+
def _reduce_24(val, _values)
|
309
292
|
Compiler::Symbol.new(value: val[0])
|
310
293
|
end
|
311
294
|
|
312
|
-
def
|
295
|
+
def _reduce_25(val, _values)
|
313
296
|
Compiler::Identifier.new(value: val[0])
|
314
297
|
end
|
315
298
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Synvert::Core::NodeQuery::Parser
|
2
2
|
options no_result_var
|
3
|
-
token tNODE_TYPE tATTRIBUTE tKEY tIDENTIFIER tIDENTIFIER_VALUE
|
3
|
+
token tNODE_TYPE tGOTO_SCOPE tATTRIBUTE tKEY tIDENTIFIER tIDENTIFIER_VALUE tPSEUDO_CLASS tRELATIONSHIP
|
4
4
|
tOPEN_ATTRIBUTE tCLOSE_ATTRIBUTE tOPEN_DYNAMIC_ATTRIBUTE tCLOSE_DYNAMIC_ATTRIBUTE
|
5
|
-
tOPEN_ARRAY tCLOSE_ARRAY tOPEN_SELECTOR tCLOSE_SELECTOR
|
5
|
+
tOPEN_ARRAY tCLOSE_ARRAY tOPEN_SELECTOR tCLOSE_SELECTOR
|
6
6
|
tOPERATOR tARRAY_VALUE tDYNAMIC_ATTRIBUTE tBOOLEAN tFLOAT tINTEGER tNIL tREGEXP tSTRING tSYMBOL
|
7
7
|
rule
|
8
8
|
expression
|
@@ -10,16 +10,14 @@ rule
|
|
10
10
|
| selector { Compiler::Expression.new(selector: val[0]) }
|
11
11
|
|
12
12
|
selector
|
13
|
-
:
|
14
|
-
| simple_selector tINDEX { Compiler::Selector.new(simple_selector: val[0], index: val[1]) }
|
15
|
-
| simple_selector tPSEUDO_CLASS tOPEN_SELECTOR selector tCLOSE_SELECTOR { Compiler::Selector.new(simple_selector: val[0], pseudo_class: val[1], pseudo_selector: val[3]) }
|
13
|
+
: basic_selector { Compiler::Selector.new(basic_selector: val[0]) }
|
16
14
|
| tPSEUDO_CLASS tOPEN_SELECTOR selector tCLOSE_SELECTOR { Compiler::Selector.new(pseudo_class: val[0], pseudo_selector: val[2]) }
|
17
15
|
| tRELATIONSHIP selector { Compiler::Selector.new(relationship: val[0], rest: val[1]) }
|
18
|
-
|
|
16
|
+
| tGOTO_SCOPE selector { Compiler::Selector.new(goto_scope: val[0], rest: val[1]) }
|
19
17
|
|
20
|
-
|
21
|
-
: tNODE_TYPE { Compiler::
|
22
|
-
| tNODE_TYPE attribute_list { Compiler::
|
18
|
+
basic_selector
|
19
|
+
: tNODE_TYPE { Compiler::BasicSelector.new(node_type: val[0]) }
|
20
|
+
| tNODE_TYPE attribute_list { Compiler::BasicSelector.new(node_type: val[0], attribute_list: val[1]) }
|
23
21
|
|
24
22
|
attribute_list
|
25
23
|
: tOPEN_ATTRIBUTE attribute tCLOSE_ATTRIBUTE attribute_list { Compiler::AttributeList.new(attribute: val[1], rest: val[3]) }
|
@@ -35,7 +33,7 @@ rule
|
|
35
33
|
| value { Compiler::Array.new(value: val[0]) }
|
36
34
|
|
37
35
|
value
|
38
|
-
:
|
36
|
+
: basic_selector
|
39
37
|
| tOPEN_DYNAMIC_ATTRIBUTE tDYNAMIC_ATTRIBUTE tCLOSE_DYNAMIC_ATTRIBUTE { Compiler::DynamicAttribute.new(value: val[1]) }
|
40
38
|
| tBOOLEAN { Compiler::Boolean.new(value: val[0]) }
|
41
39
|
| tFLOAT { Compiler::Float.new(value: val[0]) }
|
@@ -9,12 +9,10 @@
|
|
9
9
|
# * attribute regex: <code>.send[key=~/\A:([^'"]+)\z/]</code>, <code>.send[key!~/\A:([^'"]+)\z/]</code>
|
10
10
|
# * attribute conditions: +.send[message != nil]+, +.send[value > 1]+, +.send[value >= 1]+, +.send[value < 1]+, +.send[value <= 1]+
|
11
11
|
# * nested attribute: +.send[caller.message = map]+, +.send[arguments.size = 2]+
|
12
|
-
# * first or last child: +.def:first-child+, +.send:last-child+
|
13
|
-
# * nth-child or nth-last-child: +.def:nth-child(2)+, +.send:nth-last-child(2)+
|
14
12
|
# * descendant: +.class .send+
|
15
13
|
# * child: +.class > .def+
|
16
|
-
# * following sibling: <code>.def
|
17
|
-
# * subsequnt sibling: +.def
|
14
|
+
# * following sibling: <code>.def + .def</code>
|
15
|
+
# * subsequnt sibling: +.def ~ .def+
|
18
16
|
# * has: +.class:has(.def)+
|
19
17
|
#
|
20
18
|
# It also supports some custom selectors:
|
@@ -26,6 +24,7 @@
|
|
26
24
|
# * NOT IN operator: +.send[message NOT IN (create build)]+
|
27
25
|
# * INCLUDES operator: +.send[arguments INCLUDES &block]+
|
28
26
|
# * dynamic attribute value: +.hash > .pair[key={{value}}]+
|
27
|
+
# * goto scope: +.class body > .def+
|
29
28
|
#
|
30
29
|
# @example
|
31
30
|
# # it matches methods call nodes, like `puts message` or `p message`
|
data/lib/synvert/core/version.rb
CHANGED
@@ -502,64 +502,6 @@ module Synvert::Core::NodeQuery
|
|
502
502
|
end
|
503
503
|
end
|
504
504
|
|
505
|
-
context 'position' do
|
506
|
-
it 'matches :first-child' do
|
507
|
-
source = '.send[arguments=:create]:first-child'
|
508
|
-
expected_tokens = [
|
509
|
-
[:tNODE_TYPE, "send"],
|
510
|
-
[:tOPEN_ATTRIBUTE, "["],
|
511
|
-
[:tKEY, "arguments"],
|
512
|
-
[:tOPERATOR, "=="],
|
513
|
-
[:tSYMBOL, :create],
|
514
|
-
[:tCLOSE_ATTRIBUTE, "]"],
|
515
|
-
[:tINDEX, 0]
|
516
|
-
]
|
517
|
-
assert_tokens source, expected_tokens
|
518
|
-
end
|
519
|
-
|
520
|
-
it 'matches :last-child' do
|
521
|
-
source = '.send[arguments=:create]:last-child'
|
522
|
-
expected_tokens = [
|
523
|
-
[:tNODE_TYPE, "send"],
|
524
|
-
[:tOPEN_ATTRIBUTE, "["],
|
525
|
-
[:tKEY, "arguments"],
|
526
|
-
[:tOPERATOR, "=="],
|
527
|
-
[:tSYMBOL, :create],
|
528
|
-
[:tCLOSE_ATTRIBUTE, "]"],
|
529
|
-
[:tINDEX, -1]
|
530
|
-
]
|
531
|
-
assert_tokens source, expected_tokens
|
532
|
-
end
|
533
|
-
|
534
|
-
it 'matches :nth-child(1)' do
|
535
|
-
source = '.send[arguments=:create]:nth-child(1)'
|
536
|
-
expected_tokens = [
|
537
|
-
[:tNODE_TYPE, "send"],
|
538
|
-
[:tOPEN_ATTRIBUTE, "["],
|
539
|
-
[:tKEY, "arguments"],
|
540
|
-
[:tOPERATOR, "=="],
|
541
|
-
[:tSYMBOL, :create],
|
542
|
-
[:tCLOSE_ATTRIBUTE, "]"],
|
543
|
-
[:tINDEX, 0]
|
544
|
-
]
|
545
|
-
assert_tokens source, expected_tokens
|
546
|
-
end
|
547
|
-
|
548
|
-
it 'matches :nth-last-child(1)' do
|
549
|
-
source = '.send[arguments=:create]:nth-last-child(1)'
|
550
|
-
expected_tokens = [
|
551
|
-
[:tNODE_TYPE, "send"],
|
552
|
-
[:tOPEN_ATTRIBUTE, "["],
|
553
|
-
[:tKEY, "arguments"],
|
554
|
-
[:tOPERATOR, "=="],
|
555
|
-
[:tSYMBOL, :create],
|
556
|
-
[:tCLOSE_ATTRIBUTE, "]"],
|
557
|
-
[:tINDEX, -1]
|
558
|
-
]
|
559
|
-
assert_tokens source, expected_tokens
|
560
|
-
end
|
561
|
-
end
|
562
|
-
|
563
505
|
context 'descendant' do
|
564
506
|
it 'matches' do
|
565
507
|
source = '.class .send'
|
@@ -624,12 +566,10 @@ module Synvert::Core::NodeQuery
|
|
624
566
|
|
625
567
|
context 'goto_scope' do
|
626
568
|
it 'matches' do
|
627
|
-
source = '.block
|
569
|
+
source = '.block body > .def'
|
628
570
|
expected_tokens = [
|
629
571
|
[:tNODE_TYPE, "block"],
|
630
|
-
[:
|
631
|
-
[:tIDENTIFIER, "body"],
|
632
|
-
[:tCLOSE_GOTO_SCOPE, ">"],
|
572
|
+
[:tGOTO_SCOPE, "body"],
|
633
573
|
[:tRELATIONSHIP, ">"],
|
634
574
|
[:tNODE_TYPE, "def"]
|
635
575
|
]
|
@@ -30,37 +30,17 @@ module Synvert::Core::NodeQuery
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'parses scope' do
|
33
|
-
source = '.block
|
34
|
-
assert_parser(source)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'parses :first-child' do
|
38
|
-
source = '.class .def:first-child'
|
39
|
-
assert_parser(source)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'parses :last-child' do
|
43
|
-
source = '.class .def:last-child'
|
44
|
-
assert_parser(source)
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'parses :nth-child(n)' do
|
48
|
-
source = '.class .def:nth-child(2)'
|
49
|
-
assert_parser(source)
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'parses :nth-last-child(n)' do
|
53
|
-
source = '.class .def:nth-last-child(2)'
|
33
|
+
source = '.block body > .send'
|
54
34
|
assert_parser(source)
|
55
35
|
end
|
56
36
|
|
57
37
|
it 'parses :has selector' do
|
58
|
-
source = '.class:has(> .def)'
|
38
|
+
source = '.class :has(> .def)'
|
59
39
|
assert_parser(source)
|
60
40
|
end
|
61
41
|
|
62
42
|
it 'parses :not_has selector' do
|
63
|
-
source = '.class:not_has(> .def)'
|
43
|
+
source = '.class :not_has(> .def)'
|
64
44
|
assert_parser(source)
|
65
45
|
end
|
66
46
|
|
@@ -195,31 +175,6 @@ module Synvert::Core::NodeQuery
|
|
195
175
|
expect(expression.query_nodes(node)).to eq node.body
|
196
176
|
end
|
197
177
|
|
198
|
-
it 'matches first def node' do
|
199
|
-
expression = parser.parse('.def:first-child')
|
200
|
-
expect(expression.query_nodes(node)).to eq [node.body.first]
|
201
|
-
end
|
202
|
-
|
203
|
-
it 'matches nested first node' do
|
204
|
-
expression = parser.parse('.def[arguments.size=0] .send:first-child')
|
205
|
-
expect(expression.query_nodes(node)).to eq [node.body.first.body.first, node.body.second.body.first]
|
206
|
-
end
|
207
|
-
|
208
|
-
it 'matches last def node' do
|
209
|
-
expression = parser.parse('.def:last-child')
|
210
|
-
expect(expression.query_nodes(node)).to eq [node.body.last]
|
211
|
-
end
|
212
|
-
|
213
|
-
it 'matches nth-child node' do
|
214
|
-
expression = parser.parse('.def:nth-child(2)')
|
215
|
-
expect(expression.query_nodes(node)).to eq [node.body.second]
|
216
|
-
end
|
217
|
-
|
218
|
-
it 'matches nth-last-child node' do
|
219
|
-
expression = parser.parse('.def:nth-last-child(2)')
|
220
|
-
expect(expression.query_nodes(node)).to eq [node.body[-2]]
|
221
|
-
end
|
222
|
-
|
223
178
|
it 'matches start with' do
|
224
179
|
expression = parser.parse('.def[name^=foo]')
|
225
180
|
expect(expression.query_nodes(node)).to eq [node.body.first, node.body.last]
|
@@ -297,15 +252,15 @@ module Synvert::Core::NodeQuery
|
|
297
252
|
end
|
298
253
|
|
299
254
|
it 'matches goto scope' do
|
300
|
-
expression = parser.parse('.def
|
255
|
+
expression = parser.parse('.def body > .send[message=:create]')
|
301
256
|
expect(expression.query_nodes(node)).to eq [node.body.first.body.last, node.body.second.body.last]
|
302
257
|
|
303
|
-
expression = parser.parse('.def
|
258
|
+
expression = parser.parse('.def body .send[message=:create]')
|
304
259
|
expect(expression.query_nodes(node)).to eq [node.body.first.body.last, node.body.second.body.last]
|
305
260
|
end
|
306
261
|
|
307
262
|
it 'matches multiple goto scope' do
|
308
|
-
expression = parser.parse('.block
|
263
|
+
expression = parser.parse('.block caller.arguments .const[name=Synvert]')
|
309
264
|
expect(expression.query_nodes(test_node)).to eq [test_node.caller.arguments.first]
|
310
265
|
end
|
311
266
|
|
@@ -64,6 +64,13 @@ module Synvert::Core
|
|
64
64
|
scope.process
|
65
65
|
}.to raise_error(NodeQuery::Compiler::ParseError)
|
66
66
|
|
67
|
+
scope = described_class.new(instance, '.block <caller.arguments> .hash') {}
|
68
|
+
expect {
|
69
|
+
scope.process
|
70
|
+
}.to raise_error(NodeQuery::Compiler::ParseError)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'raises InvalidOperatorError' do
|
67
74
|
scope = described_class.new(instance, '.send[receiver IN FactoryGirl]') {}
|
68
75
|
expect {
|
69
76
|
scope.process
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synvert-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- lib/synvert/core/node_query/compiler/array.rb
|
81
81
|
- lib/synvert/core/node_query/compiler/attribute.rb
|
82
82
|
- lib/synvert/core/node_query/compiler/attribute_list.rb
|
83
|
+
- lib/synvert/core/node_query/compiler/basic_selector.rb
|
83
84
|
- lib/synvert/core/node_query/compiler/boolean.rb
|
84
85
|
- lib/synvert/core/node_query/compiler/comparable.rb
|
85
86
|
- lib/synvert/core/node_query/compiler/dynamic_attribute.rb
|
@@ -92,7 +93,6 @@ files:
|
|
92
93
|
- lib/synvert/core/node_query/compiler/parse_error.rb
|
93
94
|
- lib/synvert/core/node_query/compiler/regexp.rb
|
94
95
|
- lib/synvert/core/node_query/compiler/selector.rb
|
95
|
-
- lib/synvert/core/node_query/compiler/simple_selector.rb
|
96
96
|
- lib/synvert/core/node_query/compiler/string.rb
|
97
97
|
- lib/synvert/core/node_query/compiler/symbol.rb
|
98
98
|
- lib/synvert/core/node_query/lexer.rex
|