yarp 0.7.0 → 0.9.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 +54 -2
- data/Makefile +2 -0
- data/README.md +9 -5
- data/config.yml +160 -93
- data/docs/configuration.md +1 -0
- data/docs/ruby_api.md +2 -0
- data/docs/serialization.md +1 -1
- data/docs/testing.md +2 -2
- data/ext/yarp/api_node.c +361 -238
- data/ext/yarp/extension.c +75 -26
- data/ext/yarp/extension.h +2 -2
- data/include/yarp/ast.h +226 -175
- data/include/yarp/defines.h +5 -0
- data/include/yarp/node.h +10 -0
- data/include/yarp/unescape.h +4 -2
- data/include/yarp/util/yp_buffer.h +9 -1
- data/include/yarp/util/yp_constant_pool.h +3 -0
- data/include/yarp/util/yp_list.h +7 -7
- data/include/yarp/util/yp_newline_list.h +7 -0
- data/include/yarp/util/yp_state_stack.h +1 -1
- data/include/yarp/version.h +2 -2
- data/include/yarp.h +10 -0
- data/lib/yarp/desugar_visitor.rb +267 -0
- data/lib/yarp/ffi.rb +89 -48
- data/lib/yarp/lex_compat.rb +93 -25
- data/lib/yarp/mutation_visitor.rb +683 -0
- data/lib/yarp/node.rb +2061 -422
- data/lib/yarp/serialize.rb +162 -120
- data/lib/yarp.rb +54 -8
- data/src/node.c +360 -304
- data/src/prettyprint.c +190 -152
- data/src/serialize.c +382 -340
- data/src/token_type.c +2 -2
- data/src/unescape.c +89 -77
- data/src/util/yp_buffer.c +18 -0
- data/src/util/yp_list.c +7 -16
- data/src/util/yp_newline_list.c +10 -0
- data/src/util/yp_state_stack.c +0 -6
- data/src/yarp.c +941 -596
- data/yarp.gemspec +3 -1
- metadata +4 -2
data/lib/yarp/serialize.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
=begin
|
3
|
-
This file is generated by the
|
3
|
+
This file is generated by the templates/template.rb script and should not be
|
4
4
|
modified manually. See templates/lib/yarp/serialize.rb.erb
|
5
5
|
if you are looking to modify the template
|
6
6
|
=end
|
@@ -21,15 +21,15 @@ end
|
|
21
21
|
module YARP
|
22
22
|
module Serialize
|
23
23
|
MAJOR_VERSION = 0
|
24
|
-
MINOR_VERSION =
|
24
|
+
MINOR_VERSION = 9
|
25
25
|
PATCH_VERSION = 0
|
26
26
|
|
27
27
|
def self.load(input, serialized)
|
28
|
-
Loader.new(Source.new(input), serialized).
|
28
|
+
Loader.new(Source.new(input), serialized).load_result
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.load_tokens(source, serialized)
|
32
|
-
Loader.new(source, serialized).
|
32
|
+
Loader.new(source, serialized).load_tokens_result
|
33
33
|
end
|
34
34
|
|
35
35
|
class Loader
|
@@ -50,6 +50,17 @@ module YARP
|
|
50
50
|
@source = source
|
51
51
|
end
|
52
52
|
|
53
|
+
def load_encoding
|
54
|
+
Encoding.find(io.read(load_varint))
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_metadata
|
58
|
+
comments = load_varint.times.map { Comment.new(Comment::TYPES.fetch(load_varint), load_location) }
|
59
|
+
errors = load_varint.times.map { ParseError.new(load_embedded_string, load_location) }
|
60
|
+
warnings = load_varint.times.map { ParseWarning.new(load_embedded_string, load_location) }
|
61
|
+
[comments, errors, warnings]
|
62
|
+
end
|
63
|
+
|
53
64
|
def load_tokens
|
54
65
|
tokens = []
|
55
66
|
while type = TOKEN_TYPES.fetch(load_varint)
|
@@ -60,32 +71,40 @@ module YARP
|
|
60
71
|
tokens << [YARP::Token.new(type, location.slice, location), lex_state]
|
61
72
|
end
|
62
73
|
|
63
|
-
|
64
|
-
|
65
|
-
warnings = load_varint.times.map { ParseWarning.new(load_string, load_location) }
|
74
|
+
tokens
|
75
|
+
end
|
66
76
|
|
67
|
-
|
77
|
+
def load_tokens_result
|
78
|
+
tokens = load_tokens
|
79
|
+
encoding = load_encoding
|
80
|
+
comments, errors, warnings = load_metadata
|
81
|
+
|
82
|
+
if encoding != @encoding
|
83
|
+
tokens.each { |token,| token.value.force_encoding(encoding) }
|
84
|
+
end
|
68
85
|
|
86
|
+
raise "Expected to consume all bytes while deserializing" unless @io.eof?
|
69
87
|
YARP::ParseResult.new(tokens, comments, errors, warnings, @source)
|
70
88
|
end
|
71
89
|
|
72
|
-
def
|
90
|
+
def load_nodes
|
73
91
|
raise "Invalid serialization" if io.read(4) != "YARP"
|
74
92
|
raise "Invalid serialization" if io.read(3).unpack("C3") != [MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION]
|
75
93
|
|
76
|
-
@encoding =
|
94
|
+
@encoding = load_encoding
|
77
95
|
@input = input.force_encoding(@encoding).freeze
|
78
96
|
|
79
|
-
comments
|
80
|
-
errors = load_varint.times.map { ParseError.new(load_string, load_location) }
|
81
|
-
warnings = load_varint.times.map { ParseWarning.new(load_string, load_location) }
|
97
|
+
comments, errors, warnings = load_metadata
|
82
98
|
|
83
99
|
@constant_pool_offset = io.read(4).unpack1("L")
|
84
100
|
@constant_pool = Array.new(load_varint, nil)
|
85
101
|
|
86
|
-
|
102
|
+
[load_node, comments, errors, warnings]
|
103
|
+
end
|
87
104
|
|
88
|
-
|
105
|
+
def load_result
|
106
|
+
node, comments, errors, warnings = load_nodes
|
107
|
+
YARP::ParseResult.new(node, comments, errors, warnings, @source)
|
89
108
|
end
|
90
109
|
|
91
110
|
private
|
@@ -117,10 +136,21 @@ module YARP
|
|
117
136
|
end
|
118
137
|
end
|
119
138
|
|
120
|
-
def
|
139
|
+
def load_embedded_string
|
121
140
|
io.read(load_varint).force_encoding(encoding)
|
122
141
|
end
|
123
142
|
|
143
|
+
def load_string
|
144
|
+
case io.getbyte
|
145
|
+
when 1
|
146
|
+
input.byteslice(load_varint, load_varint).force_encoding(encoding)
|
147
|
+
when 2
|
148
|
+
load_embedded_string
|
149
|
+
else
|
150
|
+
raise
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
124
154
|
def load_location
|
125
155
|
Location.new(source, load_varint, load_varint)
|
126
156
|
end
|
@@ -194,219 +224,231 @@ module YARP
|
|
194
224
|
when 21 then
|
195
225
|
CaseNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_location, load_location, location)
|
196
226
|
when 22 then
|
197
|
-
ClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_location, load_optional_node, load_optional_node, load_location, location)
|
227
|
+
ClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_location, load_optional_node, load_optional_node, load_location, load_string, location)
|
198
228
|
when 23 then
|
199
|
-
|
229
|
+
ClassVariableAndWriteNode.new(load_location, load_location, load_node, location)
|
200
230
|
when 24 then
|
201
|
-
ClassVariableOperatorOrWriteNode.new(load_location, load_location, load_node, location)
|
202
|
-
when 25 then
|
203
231
|
ClassVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
|
232
|
+
when 25 then
|
233
|
+
ClassVariableOrWriteNode.new(load_location, load_location, load_node, location)
|
204
234
|
when 26 then
|
205
235
|
ClassVariableReadNode.new(location)
|
206
236
|
when 27 then
|
207
|
-
|
237
|
+
ClassVariableTargetNode.new(location)
|
208
238
|
when 28 then
|
209
|
-
|
239
|
+
ClassVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
|
210
240
|
when 29 then
|
211
|
-
|
241
|
+
ConstantAndWriteNode.new(load_location, load_location, load_node, location)
|
212
242
|
when 30 then
|
213
243
|
ConstantOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
|
214
244
|
when 31 then
|
215
|
-
|
245
|
+
ConstantOrWriteNode.new(load_location, load_location, load_node, location)
|
216
246
|
when 32 then
|
217
|
-
|
247
|
+
ConstantPathAndWriteNode.new(load_node, load_location, load_node, location)
|
218
248
|
when 33 then
|
219
|
-
|
249
|
+
ConstantPathNode.new(load_optional_node, load_node, load_location, location)
|
220
250
|
when 34 then
|
221
251
|
ConstantPathOperatorWriteNode.new(load_node, load_location, load_node, load_constant, location)
|
222
252
|
when 35 then
|
223
|
-
|
253
|
+
ConstantPathOrWriteNode.new(load_node, load_location, load_node, location)
|
224
254
|
when 36 then
|
225
|
-
|
255
|
+
ConstantPathTargetNode.new(load_optional_node, load_node, load_location, location)
|
226
256
|
when 37 then
|
227
|
-
|
257
|
+
ConstantPathWriteNode.new(load_node, load_location, load_node, location)
|
228
258
|
when 38 then
|
229
|
-
|
230
|
-
DefNode.new(load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varint) { load_constant }, load_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, location)
|
259
|
+
ConstantReadNode.new(location)
|
231
260
|
when 39 then
|
232
|
-
|
261
|
+
ConstantTargetNode.new(location)
|
233
262
|
when 40 then
|
234
|
-
|
263
|
+
ConstantWriteNode.new(load_location, load_node, load_location, location)
|
235
264
|
when 41 then
|
236
|
-
|
265
|
+
load_serialized_length
|
266
|
+
DefNode.new(load_location, load_optional_node, load_optional_node, load_optional_node, Array.new(load_varint) { load_constant }, load_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, load_optional_location, location)
|
237
267
|
when 42 then
|
238
|
-
|
268
|
+
DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
|
239
269
|
when 43 then
|
240
|
-
|
270
|
+
ElseNode.new(load_location, load_optional_node, load_optional_location, location)
|
241
271
|
when 44 then
|
242
|
-
|
272
|
+
EmbeddedStatementsNode.new(load_location, load_optional_node, load_location, location)
|
243
273
|
when 45 then
|
244
|
-
|
274
|
+
EmbeddedVariableNode.new(load_location, load_node, location)
|
245
275
|
when 46 then
|
246
|
-
|
276
|
+
EnsureNode.new(load_location, load_optional_node, load_location, location)
|
247
277
|
when 47 then
|
248
|
-
|
278
|
+
FalseNode.new(location)
|
249
279
|
when 48 then
|
250
|
-
|
280
|
+
FindPatternNode.new(load_optional_node, load_node, Array.new(load_varint) { load_node }, load_node, load_optional_location, load_optional_location, location)
|
251
281
|
when 49 then
|
252
|
-
|
282
|
+
FlipFlopNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
|
253
283
|
when 50 then
|
254
|
-
|
284
|
+
FloatNode.new(location)
|
255
285
|
when 51 then
|
256
|
-
|
286
|
+
ForNode.new(load_node, load_node, load_optional_node, load_location, load_location, load_optional_location, load_location, location)
|
257
287
|
when 52 then
|
258
|
-
|
288
|
+
ForwardingArgumentsNode.new(location)
|
259
289
|
when 53 then
|
260
|
-
|
290
|
+
ForwardingParameterNode.new(location)
|
261
291
|
when 54 then
|
262
|
-
|
292
|
+
ForwardingSuperNode.new(load_optional_node, location)
|
263
293
|
when 55 then
|
264
|
-
|
294
|
+
GlobalVariableAndWriteNode.new(load_location, load_location, load_node, location)
|
265
295
|
when 56 then
|
266
|
-
|
296
|
+
GlobalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
|
267
297
|
when 57 then
|
268
|
-
|
298
|
+
GlobalVariableOrWriteNode.new(load_location, load_location, load_node, location)
|
269
299
|
when 58 then
|
270
|
-
|
300
|
+
GlobalVariableReadNode.new(location)
|
271
301
|
when 59 then
|
272
|
-
|
302
|
+
GlobalVariableTargetNode.new(location)
|
273
303
|
when 60 then
|
274
|
-
|
304
|
+
GlobalVariableWriteNode.new(load_location, load_location, load_node, location)
|
275
305
|
when 61 then
|
276
|
-
|
306
|
+
HashNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
|
277
307
|
when 62 then
|
278
|
-
|
308
|
+
HashPatternNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_optional_location, load_optional_location, location)
|
279
309
|
when 63 then
|
280
|
-
|
310
|
+
IfNode.new(load_optional_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
|
281
311
|
when 64 then
|
282
|
-
|
312
|
+
ImaginaryNode.new(load_node, location)
|
283
313
|
when 65 then
|
284
|
-
|
314
|
+
InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
|
285
315
|
when 66 then
|
286
|
-
|
316
|
+
InstanceVariableAndWriteNode.new(load_location, load_location, load_node, location)
|
287
317
|
when 67 then
|
288
|
-
|
318
|
+
InstanceVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
|
289
319
|
when 68 then
|
290
|
-
|
320
|
+
InstanceVariableOrWriteNode.new(load_location, load_location, load_node, location)
|
291
321
|
when 69 then
|
292
|
-
|
322
|
+
InstanceVariableReadNode.new(location)
|
293
323
|
when 70 then
|
294
|
-
|
324
|
+
InstanceVariableTargetNode.new(location)
|
295
325
|
when 71 then
|
296
|
-
|
326
|
+
InstanceVariableWriteNode.new(load_location, load_node, load_location, location)
|
297
327
|
when 72 then
|
298
|
-
|
328
|
+
IntegerNode.new(location)
|
299
329
|
when 73 then
|
300
|
-
|
330
|
+
InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
|
301
331
|
when 74 then
|
302
|
-
|
332
|
+
InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
|
303
333
|
when 75 then
|
304
|
-
|
334
|
+
InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
|
305
335
|
when 76 then
|
306
|
-
|
336
|
+
InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
|
307
337
|
when 77 then
|
308
|
-
|
338
|
+
KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
|
309
339
|
when 78 then
|
310
|
-
|
340
|
+
KeywordParameterNode.new(load_location, load_optional_node, location)
|
311
341
|
when 79 then
|
312
|
-
|
342
|
+
KeywordRestParameterNode.new(load_location, load_optional_location, location)
|
313
343
|
when 80 then
|
314
|
-
|
344
|
+
LambdaNode.new(Array.new(load_varint) { load_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
|
315
345
|
when 81 then
|
316
|
-
|
346
|
+
LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
|
317
347
|
when 82 then
|
318
|
-
|
348
|
+
LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, load_constant, load_varint, location)
|
319
349
|
when 83 then
|
320
|
-
|
350
|
+
LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
|
321
351
|
when 84 then
|
322
|
-
|
352
|
+
LocalVariableReadNode.new(load_constant, load_varint, location)
|
323
353
|
when 85 then
|
324
|
-
|
354
|
+
LocalVariableTargetNode.new(load_constant, load_varint, location)
|
325
355
|
when 86 then
|
326
|
-
|
356
|
+
LocalVariableWriteNode.new(load_constant, load_varint, load_node, load_location, load_location, location)
|
327
357
|
when 87 then
|
328
|
-
|
358
|
+
MatchPredicateNode.new(load_node, load_node, load_location, location)
|
329
359
|
when 88 then
|
330
|
-
|
360
|
+
MatchRequiredNode.new(load_node, load_node, load_location, location)
|
331
361
|
when 89 then
|
332
|
-
|
362
|
+
MissingNode.new(location)
|
333
363
|
when 90 then
|
334
|
-
|
364
|
+
ModuleNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_node, load_location, load_string, location)
|
335
365
|
when 91 then
|
336
|
-
|
366
|
+
MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_location, load_optional_location, location)
|
337
367
|
when 92 then
|
338
|
-
|
368
|
+
NextNode.new(load_optional_node, load_location, location)
|
339
369
|
when 93 then
|
340
|
-
|
370
|
+
NilNode.new(location)
|
341
371
|
when 94 then
|
342
|
-
|
372
|
+
NoKeywordsParameterNode.new(load_location, load_location, location)
|
343
373
|
when 95 then
|
344
|
-
|
374
|
+
NumberedReferenceReadNode.new(location)
|
345
375
|
when 96 then
|
346
|
-
|
376
|
+
OptionalParameterNode.new(load_constant, load_location, load_location, load_node, location)
|
347
377
|
when 97 then
|
348
|
-
|
378
|
+
OrNode.new(load_node, load_node, load_location, location)
|
349
379
|
when 98 then
|
350
|
-
|
380
|
+
ParametersNode.new(Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_optional_node, location)
|
351
381
|
when 99 then
|
352
|
-
|
382
|
+
ParenthesesNode.new(load_optional_node, load_location, load_location, location)
|
353
383
|
when 100 then
|
354
|
-
|
384
|
+
PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
|
355
385
|
when 101 then
|
356
|
-
|
386
|
+
PinnedVariableNode.new(load_node, load_location, location)
|
357
387
|
when 102 then
|
358
|
-
|
388
|
+
PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
|
359
389
|
when 103 then
|
360
|
-
|
390
|
+
PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
|
361
391
|
when 104 then
|
362
|
-
|
392
|
+
ProgramNode.new(Array.new(load_varint) { load_constant }, load_node, location)
|
363
393
|
when 105 then
|
364
|
-
|
394
|
+
RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
|
365
395
|
when 106 then
|
366
|
-
|
396
|
+
RationalNode.new(load_node, location)
|
367
397
|
when 107 then
|
368
|
-
|
398
|
+
RedoNode.new(location)
|
369
399
|
when 108 then
|
370
|
-
|
400
|
+
RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
|
371
401
|
when 109 then
|
372
|
-
|
402
|
+
RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
|
373
403
|
when 110 then
|
374
|
-
|
404
|
+
RequiredParameterNode.new(load_constant, location)
|
375
405
|
when 111 then
|
376
|
-
|
406
|
+
RescueModifierNode.new(load_node, load_location, load_node, location)
|
377
407
|
when 112 then
|
378
|
-
|
408
|
+
RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
|
379
409
|
when 113 then
|
380
|
-
|
410
|
+
RestParameterNode.new(load_location, load_optional_location, location)
|
381
411
|
when 114 then
|
382
|
-
|
412
|
+
RetryNode.new(location)
|
383
413
|
when 115 then
|
384
|
-
|
414
|
+
ReturnNode.new(load_location, load_optional_node, location)
|
385
415
|
when 116 then
|
386
|
-
|
416
|
+
SelfNode.new(location)
|
387
417
|
when 117 then
|
388
|
-
|
418
|
+
SingletonClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
|
389
419
|
when 118 then
|
390
|
-
|
420
|
+
SourceEncodingNode.new(location)
|
391
421
|
when 119 then
|
392
|
-
|
422
|
+
SourceFileNode.new(load_string, location)
|
393
423
|
when 120 then
|
394
|
-
|
424
|
+
SourceLineNode.new(location)
|
395
425
|
when 121 then
|
396
|
-
|
426
|
+
SplatNode.new(load_location, load_optional_node, location)
|
397
427
|
when 122 then
|
398
|
-
|
428
|
+
StatementsNode.new(Array.new(load_varint) { load_node }, location)
|
399
429
|
when 123 then
|
400
|
-
|
430
|
+
StringConcatNode.new(load_node, load_node, location)
|
401
431
|
when 124 then
|
402
|
-
|
432
|
+
StringNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
|
403
433
|
when 125 then
|
404
|
-
|
434
|
+
SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
|
405
435
|
when 126 then
|
406
|
-
|
436
|
+
SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
|
407
437
|
when 127 then
|
408
|
-
|
438
|
+
TrueNode.new(location)
|
409
439
|
when 128 then
|
440
|
+
UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
|
441
|
+
when 129 then
|
442
|
+
UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
|
443
|
+
when 130 then
|
444
|
+
UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
|
445
|
+
when 131 then
|
446
|
+
WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
|
447
|
+
when 132 then
|
448
|
+
WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
|
449
|
+
when 133 then
|
450
|
+
XStringNode.new(load_location, load_location, load_location, load_string, location)
|
451
|
+
when 134 then
|
410
452
|
YieldNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, location)
|
411
453
|
end
|
412
454
|
end
|
data/lib/yarp.rb
CHANGED
@@ -37,7 +37,7 @@ module YARP
|
|
37
37
|
class Location
|
38
38
|
# A Source object that is used to determine more information from the given
|
39
39
|
# offset and length.
|
40
|
-
|
40
|
+
protected attr_reader :source
|
41
41
|
|
42
42
|
# The byte offset from the beginning of the source where this location
|
43
43
|
# starts.
|
@@ -52,6 +52,16 @@ module YARP
|
|
52
52
|
@length = length
|
53
53
|
end
|
54
54
|
|
55
|
+
# Create a new location object with the given options.
|
56
|
+
def copy(**options)
|
57
|
+
Location.new(
|
58
|
+
options.fetch(:source) { source },
|
59
|
+
options.fetch(:start_offset) { start_offset },
|
60
|
+
options.fetch(:length) { length }
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns a string representation of this location.
|
55
65
|
def inspect
|
56
66
|
"#<YARP::Location @start_offset=#{@start_offset} @length=#{@length}>"
|
57
67
|
end
|
@@ -102,6 +112,16 @@ module YARP
|
|
102
112
|
other.end_offset == end_offset
|
103
113
|
end
|
104
114
|
|
115
|
+
# Returns a new location that stretches from this location to the given
|
116
|
+
# other location. Raises an error if this location is not before the other
|
117
|
+
# location or if they don't share the same source.
|
118
|
+
def join(other)
|
119
|
+
raise "Incompatible sources" if source != other.source
|
120
|
+
raise "Incompatible locations" if start_offset > other.start_offset
|
121
|
+
|
122
|
+
Location.new(source, start_offset, other.end_offset - start_offset)
|
123
|
+
end
|
124
|
+
|
105
125
|
def self.null
|
106
126
|
new(0, 0)
|
107
127
|
end
|
@@ -236,12 +256,6 @@ module YARP
|
|
236
256
|
value.accept(visitor)
|
237
257
|
value
|
238
258
|
end
|
239
|
-
|
240
|
-
# Construct a new ParseResult with the same internal values, but with the
|
241
|
-
# given source.
|
242
|
-
def with_source(source)
|
243
|
-
ParseResult.new(value, comments, errors, warnings, source)
|
244
|
-
end
|
245
259
|
end
|
246
260
|
|
247
261
|
# This represents a token from the Ruby source.
|
@@ -319,6 +333,30 @@ module YARP
|
|
319
333
|
end
|
320
334
|
end
|
321
335
|
|
336
|
+
class FloatNode < Node
|
337
|
+
def value
|
338
|
+
Float(slice)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
class ImaginaryNode < Node
|
343
|
+
def value
|
344
|
+
Complex(0, numeric.value)
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
class IntegerNode < Node
|
349
|
+
def value
|
350
|
+
Integer(slice)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
class RationalNode < Node
|
355
|
+
def value
|
356
|
+
Rational(slice.chomp("r"))
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
322
360
|
# Load the serialized AST using the source as a reference into a tree.
|
323
361
|
def self.load(source, serialized)
|
324
362
|
Serialize.load(source, serialized)
|
@@ -387,6 +425,10 @@ module YARP
|
|
387
425
|
# of those here.
|
388
426
|
names = names.grep_v(/^_\d$/)
|
389
427
|
|
428
|
+
# For some reason, CRuby occasionally pushes this special local
|
429
|
+
# variable when there are splat arguments. We get rid of that here.
|
430
|
+
names = names.grep_v(:"#arg_rest")
|
431
|
+
|
390
432
|
# Now push them onto the list of locals.
|
391
433
|
locals << names
|
392
434
|
end
|
@@ -459,6 +501,8 @@ module YARP
|
|
459
501
|
locals << []
|
460
502
|
when PostExecutionNode
|
461
503
|
locals.push([], [])
|
504
|
+
when InterpolatedRegularExpressionNode
|
505
|
+
locals << [] if node.once?
|
462
506
|
end
|
463
507
|
|
464
508
|
stack.concat(node.child_nodes.compact)
|
@@ -483,6 +527,8 @@ module YARP
|
|
483
527
|
end
|
484
528
|
|
485
529
|
require_relative "yarp/lex_compat"
|
530
|
+
require_relative "yarp/mutation_visitor"
|
531
|
+
require_relative "yarp/desugar_visitor"
|
486
532
|
require_relative "yarp/node"
|
487
533
|
require_relative "yarp/ripper_compat"
|
488
534
|
require_relative "yarp/serialize"
|
@@ -491,5 +537,5 @@ require_relative "yarp/pack"
|
|
491
537
|
if RUBY_ENGINE == "ruby" and !ENV["YARP_FFI_BACKEND"]
|
492
538
|
require "yarp/yarp"
|
493
539
|
else
|
494
|
-
|
540
|
+
require_relative "yarp/ffi"
|
495
541
|
end
|