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.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  =begin
3
- This file is generated by the bin/template script and should not be
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 = 7
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).load
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).load_tokens
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
- comments = load_varint.times.map { Comment.new(Comment::TYPES.fetch(load_varint), load_location) }
64
- errors = load_varint.times.map { ParseError.new(load_string, load_location) }
65
- warnings = load_varint.times.map { ParseWarning.new(load_string, load_location) }
74
+ tokens
75
+ end
66
76
 
67
- raise "Expected to consume all bytes while deserializing" unless @io.eof?
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 load
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 = Encoding.find(io.read(load_varint))
94
+ @encoding = load_encoding
77
95
  @input = input.force_encoding(@encoding).freeze
78
96
 
79
- comments = load_varint.times.map { Comment.new(Comment::TYPES.fetch(io.getbyte), load_location) }
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
- ast = load_node
102
+ [load_node, comments, errors, warnings]
103
+ end
87
104
 
88
- YARP::ParseResult.new(ast, comments, errors, warnings, @source)
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 load_string
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
- ClassVariableOperatorAndWriteNode.new(load_location, load_location, load_node, location)
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
- ClassVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
237
+ ClassVariableTargetNode.new(location)
208
238
  when 28 then
209
- ConstantOperatorAndWriteNode.new(load_location, load_location, load_node, location)
239
+ ClassVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
210
240
  when 29 then
211
- ConstantOperatorOrWriteNode.new(load_location, load_location, load_node, location)
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
- ConstantPathNode.new(load_optional_node, load_node, load_location, location)
245
+ ConstantOrWriteNode.new(load_location, load_location, load_node, location)
216
246
  when 32 then
217
- ConstantPathOperatorAndWriteNode.new(load_node, load_location, load_node, location)
247
+ ConstantPathAndWriteNode.new(load_node, load_location, load_node, location)
218
248
  when 33 then
219
- ConstantPathOperatorOrWriteNode.new(load_node, load_location, load_node, location)
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
- ConstantPathWriteNode.new(load_node, load_optional_location, load_optional_node, location)
253
+ ConstantPathOrWriteNode.new(load_node, load_location, load_node, location)
224
254
  when 36 then
225
- ConstantReadNode.new(location)
255
+ ConstantPathTargetNode.new(load_optional_node, load_node, load_location, location)
226
256
  when 37 then
227
- ConstantWriteNode.new(load_location, load_optional_node, load_optional_location, location)
257
+ ConstantPathWriteNode.new(load_node, load_location, load_node, location)
228
258
  when 38 then
229
- load_serialized_length
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
- DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
261
+ ConstantTargetNode.new(location)
233
262
  when 40 then
234
- ElseNode.new(load_location, load_optional_node, load_optional_location, location)
263
+ ConstantWriteNode.new(load_location, load_node, load_location, location)
235
264
  when 41 then
236
- EmbeddedStatementsNode.new(load_location, load_optional_node, load_location, location)
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
- EmbeddedVariableNode.new(load_location, load_node, location)
268
+ DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
239
269
  when 43 then
240
- EnsureNode.new(load_location, load_optional_node, load_location, location)
270
+ ElseNode.new(load_location, load_optional_node, load_optional_location, location)
241
271
  when 44 then
242
- FalseNode.new(location)
272
+ EmbeddedStatementsNode.new(load_location, load_optional_node, load_location, location)
243
273
  when 45 then
244
- FindPatternNode.new(load_optional_node, load_node, Array.new(load_varint) { load_node }, load_node, load_optional_location, load_optional_location, location)
274
+ EmbeddedVariableNode.new(load_location, load_node, location)
245
275
  when 46 then
246
- FlipFlopNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
276
+ EnsureNode.new(load_location, load_optional_node, load_location, location)
247
277
  when 47 then
248
- FloatNode.new(location)
278
+ FalseNode.new(location)
249
279
  when 48 then
250
- ForNode.new(load_node, load_node, load_optional_node, load_location, load_location, load_optional_location, load_location, location)
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
- ForwardingArgumentsNode.new(location)
282
+ FlipFlopNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
253
283
  when 50 then
254
- ForwardingParameterNode.new(location)
284
+ FloatNode.new(location)
255
285
  when 51 then
256
- ForwardingSuperNode.new(load_optional_node, location)
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
- GlobalVariableOperatorAndWriteNode.new(load_location, load_location, load_node, location)
288
+ ForwardingArgumentsNode.new(location)
259
289
  when 53 then
260
- GlobalVariableOperatorOrWriteNode.new(load_location, load_location, load_node, location)
290
+ ForwardingParameterNode.new(location)
261
291
  when 54 then
262
- GlobalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
292
+ ForwardingSuperNode.new(load_optional_node, location)
263
293
  when 55 then
264
- GlobalVariableReadNode.new(location)
294
+ GlobalVariableAndWriteNode.new(load_location, load_location, load_node, location)
265
295
  when 56 then
266
- GlobalVariableWriteNode.new(load_location, load_optional_location, load_optional_node, location)
296
+ GlobalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
267
297
  when 57 then
268
- HashNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
298
+ GlobalVariableOrWriteNode.new(load_location, load_location, load_node, location)
269
299
  when 58 then
270
- HashPatternNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_optional_location, load_optional_location, location)
300
+ GlobalVariableReadNode.new(location)
271
301
  when 59 then
272
- IfNode.new(load_optional_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
302
+ GlobalVariableTargetNode.new(location)
273
303
  when 60 then
274
- ImaginaryNode.new(load_node, location)
304
+ GlobalVariableWriteNode.new(load_location, load_location, load_node, location)
275
305
  when 61 then
276
- InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
306
+ HashNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
277
307
  when 62 then
278
- InstanceVariableOperatorAndWriteNode.new(load_location, load_location, load_node, location)
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
- InstanceVariableOperatorOrWriteNode.new(load_location, load_location, load_node, location)
310
+ IfNode.new(load_optional_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
281
311
  when 64 then
282
- InstanceVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
312
+ ImaginaryNode.new(load_node, location)
283
313
  when 65 then
284
- InstanceVariableReadNode.new(location)
314
+ InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
285
315
  when 66 then
286
- InstanceVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
316
+ InstanceVariableAndWriteNode.new(load_location, load_location, load_node, location)
287
317
  when 67 then
288
- IntegerNode.new(location)
318
+ InstanceVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
289
319
  when 68 then
290
- InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
320
+ InstanceVariableOrWriteNode.new(load_location, load_location, load_node, location)
291
321
  when 69 then
292
- InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
322
+ InstanceVariableReadNode.new(location)
293
323
  when 70 then
294
- InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
324
+ InstanceVariableTargetNode.new(location)
295
325
  when 71 then
296
- InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
326
+ InstanceVariableWriteNode.new(load_location, load_node, load_location, location)
297
327
  when 72 then
298
- KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
328
+ IntegerNode.new(location)
299
329
  when 73 then
300
- KeywordParameterNode.new(load_location, load_optional_node, location)
330
+ InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
301
331
  when 74 then
302
- KeywordRestParameterNode.new(load_location, load_optional_location, location)
332
+ InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
303
333
  when 75 then
304
- LambdaNode.new(Array.new(load_varint) { load_constant }, load_location, load_optional_node, load_optional_node, location)
334
+ InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
305
335
  when 76 then
306
- LocalVariableOperatorAndWriteNode.new(load_location, load_location, load_node, load_constant, location)
336
+ InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
307
337
  when 77 then
308
- LocalVariableOperatorOrWriteNode.new(load_location, load_location, load_node, load_constant, location)
338
+ KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
309
339
  when 78 then
310
- LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, load_constant, location)
340
+ KeywordParameterNode.new(load_location, load_optional_node, location)
311
341
  when 79 then
312
- LocalVariableReadNode.new(load_constant, load_varint, location)
342
+ KeywordRestParameterNode.new(load_location, load_optional_location, location)
313
343
  when 80 then
314
- LocalVariableWriteNode.new(load_constant, load_varint, load_optional_node, load_location, load_optional_location, location)
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
- MatchPredicateNode.new(load_node, load_node, load_location, location)
346
+ LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
317
347
  when 82 then
318
- MatchRequiredNode.new(load_node, load_node, load_location, location)
348
+ LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, load_constant, load_varint, location)
319
349
  when 83 then
320
- MissingNode.new(location)
350
+ LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
321
351
  when 84 then
322
- ModuleNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_node, load_location, location)
352
+ LocalVariableReadNode.new(load_constant, load_varint, location)
323
353
  when 85 then
324
- MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_location, load_optional_location, location)
354
+ LocalVariableTargetNode.new(load_constant, load_varint, location)
325
355
  when 86 then
326
- NextNode.new(load_optional_node, load_location, location)
356
+ LocalVariableWriteNode.new(load_constant, load_varint, load_node, load_location, load_location, location)
327
357
  when 87 then
328
- NilNode.new(location)
358
+ MatchPredicateNode.new(load_node, load_node, load_location, location)
329
359
  when 88 then
330
- NoKeywordsParameterNode.new(load_location, load_location, location)
360
+ MatchRequiredNode.new(load_node, load_node, load_location, location)
331
361
  when 89 then
332
- NumberedReferenceReadNode.new(location)
362
+ MissingNode.new(location)
333
363
  when 90 then
334
- OptionalParameterNode.new(load_constant, load_location, load_location, load_node, location)
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
- OrNode.new(load_node, load_node, load_location, location)
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
- 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)
368
+ NextNode.new(load_optional_node, load_location, location)
339
369
  when 93 then
340
- ParenthesesNode.new(load_optional_node, load_location, load_location, location)
370
+ NilNode.new(location)
341
371
  when 94 then
342
- PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
372
+ NoKeywordsParameterNode.new(load_location, load_location, location)
343
373
  when 95 then
344
- PinnedVariableNode.new(load_node, load_location, location)
374
+ NumberedReferenceReadNode.new(location)
345
375
  when 96 then
346
- PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
376
+ OptionalParameterNode.new(load_constant, load_location, load_location, load_node, location)
347
377
  when 97 then
348
- PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
378
+ OrNode.new(load_node, load_node, load_location, location)
349
379
  when 98 then
350
- ProgramNode.new(Array.new(load_varint) { load_constant }, load_node, location)
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
- RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
382
+ ParenthesesNode.new(load_optional_node, load_location, load_location, location)
353
383
  when 100 then
354
- RationalNode.new(load_node, location)
384
+ PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
355
385
  when 101 then
356
- RedoNode.new(location)
386
+ PinnedVariableNode.new(load_node, load_location, location)
357
387
  when 102 then
358
- RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
388
+ PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
359
389
  when 103 then
360
- RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
390
+ PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
361
391
  when 104 then
362
- RequiredParameterNode.new(load_constant, location)
392
+ ProgramNode.new(Array.new(load_varint) { load_constant }, load_node, location)
363
393
  when 105 then
364
- RescueModifierNode.new(load_node, load_location, load_node, location)
394
+ RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
365
395
  when 106 then
366
- RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
396
+ RationalNode.new(load_node, location)
367
397
  when 107 then
368
- RestParameterNode.new(load_location, load_optional_location, location)
398
+ RedoNode.new(location)
369
399
  when 108 then
370
- RetryNode.new(location)
400
+ RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
371
401
  when 109 then
372
- ReturnNode.new(load_location, load_optional_node, location)
402
+ RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
373
403
  when 110 then
374
- SelfNode.new(location)
404
+ RequiredParameterNode.new(load_constant, location)
375
405
  when 111 then
376
- SingletonClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
406
+ RescueModifierNode.new(load_node, load_location, load_node, location)
377
407
  when 112 then
378
- SourceEncodingNode.new(location)
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
- SourceFileNode.new(load_string, location)
410
+ RestParameterNode.new(load_location, load_optional_location, location)
381
411
  when 114 then
382
- SourceLineNode.new(location)
412
+ RetryNode.new(location)
383
413
  when 115 then
384
- SplatNode.new(load_location, load_optional_node, location)
414
+ ReturnNode.new(load_location, load_optional_node, location)
385
415
  when 116 then
386
- StatementsNode.new(Array.new(load_varint) { load_node }, location)
416
+ SelfNode.new(location)
387
417
  when 117 then
388
- StringConcatNode.new(load_node, load_node, location)
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
- StringNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
420
+ SourceEncodingNode.new(location)
391
421
  when 119 then
392
- SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
422
+ SourceFileNode.new(load_string, location)
393
423
  when 120 then
394
- SymbolNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
424
+ SourceLineNode.new(location)
395
425
  when 121 then
396
- TrueNode.new(location)
426
+ SplatNode.new(load_location, load_optional_node, location)
397
427
  when 122 then
398
- UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
428
+ StatementsNode.new(Array.new(load_varint) { load_node }, location)
399
429
  when 123 then
400
- UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
430
+ StringConcatNode.new(load_node, load_node, location)
401
431
  when 124 then
402
- UntilNode.new(load_location, load_node, load_optional_node, load_varint, location)
432
+ StringNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
403
433
  when 125 then
404
- WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
434
+ SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
405
435
  when 126 then
406
- WhileNode.new(load_location, load_node, load_optional_node, load_varint, location)
436
+ SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
407
437
  when 127 then
408
- XStringNode.new(load_location, load_location, load_location, load_string, location)
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
- private attr_reader :source
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
- require "yarp/ffi"
540
+ require_relative "yarp/ffi"
495
541
  end