yarp 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -1
- data/Makefile +5 -1
- data/config.yml +156 -125
- data/docs/encoding.md +5 -5
- data/docs/serialization.md +2 -2
- data/ext/yarp/api_node.c +142 -98
- data/ext/yarp/extension.c +21 -7
- data/ext/yarp/extension.h +1 -1
- data/include/yarp/ast.h +327 -18
- data/include/yarp/defines.h +2 -1
- data/include/yarp/diagnostic.h +3 -3
- data/include/yarp/enc/yp_encoding.h +10 -10
- data/include/yarp/parser.h +19 -19
- data/include/yarp/regexp.h +1 -1
- data/include/yarp/unescape.h +4 -4
- data/include/yarp/util/yp_buffer.h +3 -0
- data/include/yarp/util/yp_char.h +16 -16
- data/include/yarp/util/yp_constant_pool.h +2 -2
- data/include/yarp/util/yp_newline_list.h +5 -5
- data/include/yarp/util/yp_string.h +4 -4
- data/include/yarp/util/yp_string_list.h +0 -3
- data/include/yarp/util/yp_strpbrk.h +1 -1
- data/include/yarp/version.h +2 -2
- data/include/yarp.h +5 -4
- data/lib/yarp/desugar_visitor.rb +59 -122
- data/lib/yarp/node.rb +230 -240
- data/lib/yarp/serialize.rb +16 -16
- data/lib/yarp.rb +5 -5
- data/src/diagnostic.c +1 -1
- data/src/enc/yp_big5.c +15 -42
- data/src/enc/yp_euc_jp.c +16 -43
- data/src/enc/yp_gbk.c +19 -46
- data/src/enc/yp_shift_jis.c +16 -43
- data/src/enc/yp_tables.c +36 -38
- data/src/enc/yp_unicode.c +20 -25
- data/src/enc/yp_windows_31j.c +16 -43
- data/src/node.c +1271 -899
- data/src/prettyprint.c +87 -48
- data/src/regexp.c +21 -21
- data/src/serialize.c +28 -15
- data/src/unescape.c +151 -121
- data/src/util/yp_buffer.c +7 -2
- data/src/util/yp_char.c +34 -34
- data/src/util/yp_constant_pool.c +4 -4
- data/src/util/yp_memchr.c +1 -1
- data/src/util/yp_newline_list.c +5 -4
- data/src/util/yp_string.c +22 -20
- data/src/util/yp_string_list.c +0 -6
- data/src/util/yp_strncasecmp.c +3 -6
- data/src/util/yp_strpbrk.c +8 -8
- data/src/yarp.c +355 -216
- data/yarp.gemspec +1 -1
- metadata +2 -2
data/lib/yarp/desugar_visitor.rb
CHANGED
@@ -8,26 +8,16 @@ module YARP
|
|
8
8
|
#
|
9
9
|
# @@foo && @@foo = bar
|
10
10
|
def visit_class_variable_and_write_node(node)
|
11
|
-
|
12
|
-
ClassVariableReadNode.new(node.name_loc),
|
13
|
-
ClassVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
14
|
-
node.operator_loc,
|
15
|
-
node.location
|
16
|
-
)
|
11
|
+
desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
|
17
12
|
end
|
18
13
|
|
19
14
|
# @@foo ||= bar
|
20
15
|
#
|
21
16
|
# becomes
|
22
17
|
#
|
23
|
-
# @@foo
|
18
|
+
# defined?(@@foo) ? @@foo : @@foo = bar
|
24
19
|
def visit_class_variable_or_write_node(node)
|
25
|
-
|
26
|
-
ClassVariableReadNode.new(node.name_loc),
|
27
|
-
ClassVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
28
|
-
node.operator_loc,
|
29
|
-
node.location
|
30
|
-
)
|
20
|
+
desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
|
31
21
|
end
|
32
22
|
|
33
23
|
# @@foo += bar
|
@@ -36,7 +26,7 @@ module YARP
|
|
36
26
|
#
|
37
27
|
# @@foo = @@foo + bar
|
38
28
|
def visit_class_variable_operator_write_node(node)
|
39
|
-
desugar_operator_write_node(node, ClassVariableWriteNode,
|
29
|
+
desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, arguments: [node.name])
|
40
30
|
end
|
41
31
|
|
42
32
|
# Foo &&= bar
|
@@ -45,26 +35,16 @@ module YARP
|
|
45
35
|
#
|
46
36
|
# Foo && Foo = bar
|
47
37
|
def visit_constant_and_write_node(node)
|
48
|
-
|
49
|
-
ConstantReadNode.new(node.name_loc),
|
50
|
-
ConstantWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
51
|
-
node.operator_loc,
|
52
|
-
node.location
|
53
|
-
)
|
38
|
+
desugar_and_write_node(node, ConstantReadNode, ConstantWriteNode)
|
54
39
|
end
|
55
40
|
|
56
41
|
# Foo ||= bar
|
57
42
|
#
|
58
43
|
# becomes
|
59
44
|
#
|
60
|
-
# Foo
|
45
|
+
# defined?(Foo) ? Foo : Foo = bar
|
61
46
|
def visit_constant_or_write_node(node)
|
62
|
-
|
63
|
-
ConstantReadNode.new(node.name_loc),
|
64
|
-
ConstantWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
65
|
-
node.operator_loc,
|
66
|
-
node.location
|
67
|
-
)
|
47
|
+
desugar_or_write_defined_node(node, ConstantReadNode, ConstantWriteNode)
|
68
48
|
end
|
69
49
|
|
70
50
|
# Foo += bar
|
@@ -73,60 +53,7 @@ module YARP
|
|
73
53
|
#
|
74
54
|
# Foo = Foo + bar
|
75
55
|
def visit_constant_operator_write_node(node)
|
76
|
-
desugar_operator_write_node(node,
|
77
|
-
end
|
78
|
-
|
79
|
-
# Foo::Bar &&= baz
|
80
|
-
#
|
81
|
-
# becomes
|
82
|
-
#
|
83
|
-
# Foo::Bar && Foo::Bar = baz
|
84
|
-
def visit_constant_path_and_write_node(node)
|
85
|
-
AndNode.new(
|
86
|
-
node.target,
|
87
|
-
ConstantPathWriteNode.new(node.target, node.value, node.operator_loc, node.location),
|
88
|
-
node.operator_loc,
|
89
|
-
node.location
|
90
|
-
)
|
91
|
-
end
|
92
|
-
|
93
|
-
# Foo::Bar ||= baz
|
94
|
-
#
|
95
|
-
# becomes
|
96
|
-
#
|
97
|
-
# Foo::Bar || Foo::Bar = baz
|
98
|
-
def visit_constant_path_or_write_node(node)
|
99
|
-
OrNode.new(
|
100
|
-
node.target,
|
101
|
-
ConstantPathWriteNode.new(node.target, node.value, node.operator_loc, node.location),
|
102
|
-
node.operator_loc,
|
103
|
-
node.location
|
104
|
-
)
|
105
|
-
end
|
106
|
-
|
107
|
-
# Foo::Bar += baz
|
108
|
-
#
|
109
|
-
# becomes
|
110
|
-
#
|
111
|
-
# Foo::Bar = Foo::Bar + baz
|
112
|
-
def visit_constant_path_operator_write_node(node)
|
113
|
-
ConstantPathWriteNode.new(
|
114
|
-
node.target,
|
115
|
-
CallNode.new(
|
116
|
-
node.target,
|
117
|
-
nil,
|
118
|
-
node.operator_loc.copy(length: node.operator_loc.length - 1),
|
119
|
-
nil,
|
120
|
-
ArgumentsNode.new([node.value], node.value.location),
|
121
|
-
nil,
|
122
|
-
nil,
|
123
|
-
0,
|
124
|
-
node.operator_loc.slice.chomp("="),
|
125
|
-
node.location
|
126
|
-
),
|
127
|
-
node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
|
128
|
-
node.location
|
129
|
-
)
|
56
|
+
desugar_operator_write_node(node, ConstantReadNode, ConstantWriteNode)
|
130
57
|
end
|
131
58
|
|
132
59
|
# $foo &&= bar
|
@@ -135,26 +62,16 @@ module YARP
|
|
135
62
|
#
|
136
63
|
# $foo && $foo = bar
|
137
64
|
def visit_global_variable_and_write_node(node)
|
138
|
-
|
139
|
-
GlobalVariableReadNode.new(node.name_loc),
|
140
|
-
GlobalVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
141
|
-
node.operator_loc,
|
142
|
-
node.location
|
143
|
-
)
|
65
|
+
desugar_and_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
144
66
|
end
|
145
67
|
|
146
68
|
# $foo ||= bar
|
147
69
|
#
|
148
70
|
# becomes
|
149
71
|
#
|
150
|
-
# $foo
|
72
|
+
# defined?($foo) ? $foo : $foo = bar
|
151
73
|
def visit_global_variable_or_write_node(node)
|
152
|
-
|
153
|
-
GlobalVariableReadNode.new(node.name_loc),
|
154
|
-
GlobalVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
155
|
-
node.operator_loc,
|
156
|
-
node.location
|
157
|
-
)
|
74
|
+
desugar_or_write_defined_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
158
75
|
end
|
159
76
|
|
160
77
|
# $foo += bar
|
@@ -163,7 +80,7 @@ module YARP
|
|
163
80
|
#
|
164
81
|
# $foo = $foo + bar
|
165
82
|
def visit_global_variable_operator_write_node(node)
|
166
|
-
desugar_operator_write_node(node,
|
83
|
+
desugar_operator_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode)
|
167
84
|
end
|
168
85
|
|
169
86
|
# @foo &&= bar
|
@@ -172,12 +89,7 @@ module YARP
|
|
172
89
|
#
|
173
90
|
# @foo && @foo = bar
|
174
91
|
def visit_instance_variable_and_write_node(node)
|
175
|
-
|
176
|
-
InstanceVariableReadNode.new(node.name_loc),
|
177
|
-
InstanceVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
178
|
-
node.operator_loc,
|
179
|
-
node.location
|
180
|
-
)
|
92
|
+
desugar_and_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, arguments: [node.name])
|
181
93
|
end
|
182
94
|
|
183
95
|
# @foo ||= bar
|
@@ -186,12 +98,7 @@ module YARP
|
|
186
98
|
#
|
187
99
|
# @foo || @foo = bar
|
188
100
|
def visit_instance_variable_or_write_node(node)
|
189
|
-
|
190
|
-
InstanceVariableReadNode.new(node.name_loc),
|
191
|
-
InstanceVariableWriteNode.new(node.name_loc, node.value, node.operator_loc, node.location),
|
192
|
-
node.operator_loc,
|
193
|
-
node.location
|
194
|
-
)
|
101
|
+
desugar_or_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, arguments: [node.name])
|
195
102
|
end
|
196
103
|
|
197
104
|
# @foo += bar
|
@@ -200,7 +107,7 @@ module YARP
|
|
200
107
|
#
|
201
108
|
# @foo = @foo + bar
|
202
109
|
def visit_instance_variable_operator_write_node(node)
|
203
|
-
desugar_operator_write_node(node, InstanceVariableWriteNode,
|
110
|
+
desugar_operator_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, arguments: [node.name])
|
204
111
|
end
|
205
112
|
|
206
113
|
# foo &&= bar
|
@@ -209,12 +116,7 @@ module YARP
|
|
209
116
|
#
|
210
117
|
# foo && foo = bar
|
211
118
|
def visit_local_variable_and_write_node(node)
|
212
|
-
|
213
|
-
LocalVariableReadNode.new(node.constant_id, node.depth, node.name_loc),
|
214
|
-
LocalVariableWriteNode.new(node.constant_id, node.depth, node.name_loc, node.value, node.operator_loc, node.location),
|
215
|
-
node.operator_loc,
|
216
|
-
node.location
|
217
|
-
)
|
119
|
+
desugar_and_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, arguments: [node.name, node.depth])
|
218
120
|
end
|
219
121
|
|
220
122
|
# foo ||= bar
|
@@ -223,12 +125,7 @@ module YARP
|
|
223
125
|
#
|
224
126
|
# foo || foo = bar
|
225
127
|
def visit_local_variable_or_write_node(node)
|
226
|
-
|
227
|
-
LocalVariableReadNode.new(node.constant_id, node.depth, node.name_loc),
|
228
|
-
LocalVariableWriteNode.new(node.constant_id, node.depth, node.name_loc, node.value, node.operator_loc, node.location),
|
229
|
-
node.operator_loc,
|
230
|
-
node.location
|
231
|
-
)
|
128
|
+
desugar_or_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, arguments: [node.name, node.depth])
|
232
129
|
end
|
233
130
|
|
234
131
|
# foo += bar
|
@@ -237,13 +134,23 @@ module YARP
|
|
237
134
|
#
|
238
135
|
# foo = foo + bar
|
239
136
|
def visit_local_variable_operator_write_node(node)
|
240
|
-
desugar_operator_write_node(node,
|
137
|
+
desugar_operator_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, arguments: [node.name, node.depth])
|
241
138
|
end
|
242
139
|
|
243
140
|
private
|
244
141
|
|
142
|
+
# Desugar `x &&= y` to `x && x = y`
|
143
|
+
def desugar_and_write_node(node, read_class, write_class, arguments: [])
|
144
|
+
AndNode.new(
|
145
|
+
read_class.new(*arguments, node.name_loc),
|
146
|
+
write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
|
147
|
+
node.operator_loc,
|
148
|
+
node.location
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
245
152
|
# Desugar `x += y` to `x = x + y`
|
246
|
-
def desugar_operator_write_node(node,
|
153
|
+
def desugar_operator_write_node(node, read_class, write_class, arguments: [])
|
247
154
|
write_class.new(
|
248
155
|
*arguments,
|
249
156
|
node.name_loc,
|
@@ -263,5 +170,35 @@ module YARP
|
|
263
170
|
node.location
|
264
171
|
)
|
265
172
|
end
|
173
|
+
|
174
|
+
# Desugar `x ||= y` to `x || x = y`
|
175
|
+
def desugar_or_write_node(node, read_class, write_class, arguments: [])
|
176
|
+
OrNode.new(
|
177
|
+
read_class.new(*arguments, node.name_loc),
|
178
|
+
write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
|
179
|
+
node.operator_loc,
|
180
|
+
node.location
|
181
|
+
)
|
182
|
+
end
|
183
|
+
|
184
|
+
# Desugar `x ||= y` to `defined?(x) ? x : x = y`
|
185
|
+
def desugar_or_write_defined_node(node, read_class, write_class, arguments: [])
|
186
|
+
IfNode.new(
|
187
|
+
node.operator_loc,
|
188
|
+
DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
|
189
|
+
StatementsNode.new([read_class.new(*arguments, node.name_loc)], node.location),
|
190
|
+
ElseNode.new(
|
191
|
+
node.operator_loc,
|
192
|
+
StatementsNode.new(
|
193
|
+
[write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location)],
|
194
|
+
node.location
|
195
|
+
),
|
196
|
+
node.operator_loc,
|
197
|
+
node.location
|
198
|
+
),
|
199
|
+
node.operator_loc,
|
200
|
+
node.location
|
201
|
+
)
|
202
|
+
end
|
266
203
|
end
|
267
204
|
end
|