yarp 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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 = 8
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
@@ -158,225 +188,267 @@ module YARP
158
188
  when 3 then
159
189
  AndNode.new(load_node, load_node, load_location, location)
160
190
  when 4 then
161
- AndWriteNode.new(load_node, load_node, load_location, location)
162
- when 5 then
163
191
  ArgumentsNode.new(Array.new(load_varint) { load_node }, location)
164
- when 6 then
192
+ when 5 then
165
193
  ArrayNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location)
166
- when 7 then
194
+ when 6 then
167
195
  ArrayPatternNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location)
168
- when 8 then
196
+ when 7 then
169
197
  AssocNode.new(load_node, load_optional_node, load_optional_location, location)
170
- when 9 then
198
+ when 8 then
171
199
  AssocSplatNode.new(load_optional_node, load_location, location)
172
- when 10 then
200
+ when 9 then
173
201
  BackReferenceReadNode.new(location)
174
- when 11 then
202
+ when 10 then
175
203
  BeginNode.new(load_optional_location, load_optional_node, load_optional_node, load_optional_node, load_optional_node, load_optional_location, location)
176
- when 12 then
204
+ when 11 then
177
205
  BlockArgumentNode.new(load_optional_node, load_location, location)
178
- when 13 then
206
+ when 12 then
179
207
  BlockNode.new(Array.new(load_varint) { load_constant }, load_optional_node, load_optional_node, load_location, load_location, location)
180
- when 14 then
208
+ when 13 then
181
209
  BlockParameterNode.new(load_optional_location, load_location, location)
182
- when 15 then
210
+ when 14 then
183
211
  BlockParametersNode.new(load_optional_node, Array.new(load_varint) { load_location }, load_optional_location, load_optional_location, location)
184
- when 16 then
212
+ when 15 then
185
213
  BreakNode.new(load_optional_node, load_location, location)
186
- when 17 then
214
+ when 16 then
187
215
  CallNode.new(load_optional_node, load_optional_location, load_optional_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, load_varint, load_string, location)
188
- when 18 then
216
+ when 17 then
189
217
  CallOperatorAndWriteNode.new(load_node, load_location, load_node, location)
190
- when 19 then
218
+ when 18 then
191
219
  CallOperatorOrWriteNode.new(load_node, load_node, load_location, location)
192
- when 20 then
220
+ when 19 then
193
221
  CallOperatorWriteNode.new(load_node, load_location, load_node, load_constant, location)
194
- when 21 then
222
+ when 20 then
195
223
  CapturePatternNode.new(load_node, load_node, load_location, location)
196
- when 22 then
224
+ when 21 then
197
225
  CaseNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_location, load_location, location)
226
+ when 22 then
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
- ClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_location, load_optional_node, load_optional_node, load_location, location)
229
+ ClassVariableAndWriteNode.new(load_location, load_location, load_node, location)
200
230
  when 24 then
201
- ClassVariableReadNode.new(location)
231
+ ClassVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
202
232
  when 25 then
203
- ClassVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
233
+ ClassVariableOrWriteNode.new(load_location, load_location, load_node, location)
204
234
  when 26 then
205
- ConstantPathNode.new(load_optional_node, load_node, load_location, location)
235
+ ClassVariableReadNode.new(location)
206
236
  when 27 then
207
- ConstantPathWriteNode.new(load_node, load_optional_location, load_optional_node, location)
237
+ ClassVariableTargetNode.new(location)
208
238
  when 28 then
209
- ConstantReadNode.new(location)
239
+ ClassVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
210
240
  when 29 then
211
- ConstantWriteNode.new(load_location, load_optional_node, load_optional_location, location)
241
+ ConstantAndWriteNode.new(load_location, load_location, load_node, location)
212
242
  when 30 then
213
- load_serialized_length
214
- 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)
243
+ ConstantOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
215
244
  when 31 then
216
- DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
245
+ ConstantOrWriteNode.new(load_location, load_location, load_node, location)
217
246
  when 32 then
218
- ElseNode.new(load_location, load_optional_node, load_optional_location, location)
247
+ ConstantPathAndWriteNode.new(load_node, load_location, load_node, location)
219
248
  when 33 then
220
- EmbeddedStatementsNode.new(load_location, load_optional_node, load_location, location)
249
+ ConstantPathNode.new(load_optional_node, load_node, load_location, location)
221
250
  when 34 then
222
- EmbeddedVariableNode.new(load_location, load_node, location)
251
+ ConstantPathOperatorWriteNode.new(load_node, load_location, load_node, load_constant, location)
223
252
  when 35 then
224
- EnsureNode.new(load_location, load_optional_node, load_location, location)
253
+ ConstantPathOrWriteNode.new(load_node, load_location, load_node, location)
225
254
  when 36 then
226
- FalseNode.new(location)
255
+ ConstantPathTargetNode.new(load_optional_node, load_node, load_location, location)
227
256
  when 37 then
228
- FindPatternNode.new(load_optional_node, load_node, Array.new(load_varint) { load_node }, load_node, load_optional_location, load_optional_location, location)
257
+ ConstantPathWriteNode.new(load_node, load_location, load_node, location)
229
258
  when 38 then
230
- FlipFlopNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
259
+ ConstantReadNode.new(location)
231
260
  when 39 then
232
- FloatNode.new(location)
261
+ ConstantTargetNode.new(location)
233
262
  when 40 then
234
- ForNode.new(load_node, load_node, load_optional_node, load_location, load_location, load_optional_location, load_location, location)
263
+ ConstantWriteNode.new(load_location, load_node, load_location, location)
235
264
  when 41 then
236
- ForwardingArgumentsNode.new(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
- ForwardingParameterNode.new(location)
268
+ DefinedNode.new(load_optional_location, load_node, load_optional_location, load_location, location)
239
269
  when 43 then
240
- ForwardingSuperNode.new(load_optional_node, location)
270
+ ElseNode.new(load_location, load_optional_node, load_optional_location, location)
241
271
  when 44 then
242
- GlobalVariableReadNode.new(location)
272
+ EmbeddedStatementsNode.new(load_location, load_optional_node, load_location, location)
243
273
  when 45 then
244
- GlobalVariableWriteNode.new(load_location, load_optional_location, load_optional_node, location)
274
+ EmbeddedVariableNode.new(load_location, load_node, location)
245
275
  when 46 then
246
- HashNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
276
+ EnsureNode.new(load_location, load_optional_node, load_location, location)
247
277
  when 47 then
248
- HashPatternNode.new(load_optional_node, Array.new(load_varint) { load_node }, load_optional_node, load_optional_location, load_optional_location, location)
278
+ FalseNode.new(location)
249
279
  when 48 then
250
- IfNode.new(load_optional_location, load_node, load_optional_node, load_optional_node, load_optional_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
- ImaginaryNode.new(load_node, location)
282
+ FlipFlopNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
253
283
  when 50 then
254
- InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
284
+ FloatNode.new(location)
255
285
  when 51 then
256
- InstanceVariableReadNode.new(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
- InstanceVariableWriteNode.new(load_location, load_optional_node, load_optional_location, location)
288
+ ForwardingArgumentsNode.new(location)
259
289
  when 53 then
260
- IntegerNode.new(location)
290
+ ForwardingParameterNode.new(location)
261
291
  when 54 then
262
- InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
292
+ ForwardingSuperNode.new(load_optional_node, location)
263
293
  when 55 then
264
- InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
294
+ GlobalVariableAndWriteNode.new(load_location, load_location, load_node, location)
265
295
  when 56 then
266
- InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
296
+ GlobalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
267
297
  when 57 then
268
- InterpolatedXStringNode.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
- KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
300
+ GlobalVariableReadNode.new(location)
271
301
  when 59 then
272
- KeywordParameterNode.new(load_location, load_optional_node, location)
302
+ GlobalVariableTargetNode.new(location)
273
303
  when 60 then
274
- KeywordRestParameterNode.new(load_location, load_optional_location, location)
304
+ GlobalVariableWriteNode.new(load_location, load_location, load_node, location)
275
305
  when 61 then
276
- LambdaNode.new(Array.new(load_varint) { load_constant }, load_location, load_optional_node, load_optional_node, location)
306
+ HashNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
277
307
  when 62 then
278
- LocalVariableReadNode.new(load_constant, load_varint, 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
- LocalVariableWriteNode.new(load_constant, load_varint, load_optional_node, load_location, load_optional_location, 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
- MatchPredicateNode.new(load_node, load_node, load_location, location)
312
+ ImaginaryNode.new(load_node, location)
283
313
  when 65 then
284
- MatchRequiredNode.new(load_node, load_node, load_location, location)
314
+ InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
285
315
  when 66 then
286
- MissingNode.new(location)
316
+ InstanceVariableAndWriteNode.new(load_location, load_location, load_node, location)
287
317
  when 67 then
288
- ModuleNode.new(Array.new(load_varint) { load_constant }, load_location, load_node, load_optional_node, load_location, location)
318
+ InstanceVariableOperatorWriteNode.new(load_location, load_location, load_node, load_constant, location)
289
319
  when 68 then
290
- MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_location, load_optional_location, location)
320
+ InstanceVariableOrWriteNode.new(load_location, load_location, load_node, location)
291
321
  when 69 then
292
- NextNode.new(load_optional_node, load_location, location)
322
+ InstanceVariableReadNode.new(location)
293
323
  when 70 then
294
- NilNode.new(location)
324
+ InstanceVariableTargetNode.new(location)
295
325
  when 71 then
296
- NoKeywordsParameterNode.new(load_location, load_location, location)
326
+ InstanceVariableWriteNode.new(load_location, load_node, load_location, location)
297
327
  when 72 then
298
- NumberedReferenceReadNode.new(location)
328
+ IntegerNode.new(location)
299
329
  when 73 then
300
- OperatorWriteNode.new(load_node, load_location, load_constant, load_node, location)
330
+ InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
301
331
  when 74 then
302
- OptionalParameterNode.new(load_constant, load_location, load_location, load_node, location)
332
+ InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
303
333
  when 75 then
304
- OrNode.new(load_node, load_node, load_location, location)
334
+ InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
305
335
  when 76 then
306
- OrWriteNode.new(load_node, load_node, load_location, location)
336
+ InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
307
337
  when 77 then
308
- 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)
338
+ KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
309
339
  when 78 then
310
- ParenthesesNode.new(load_optional_node, load_location, load_location, location)
340
+ KeywordParameterNode.new(load_location, load_optional_node, location)
311
341
  when 79 then
312
- PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
342
+ KeywordRestParameterNode.new(load_location, load_optional_location, location)
313
343
  when 80 then
314
- PinnedVariableNode.new(load_node, load_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
- PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
346
+ LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
317
347
  when 82 then
318
- PreExecutionNode.new(load_optional_node, load_location, load_location, 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
- ProgramNode.new(Array.new(load_varint) { load_constant }, load_node, location)
350
+ LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_constant, load_varint, location)
321
351
  when 84 then
322
- RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
352
+ LocalVariableReadNode.new(load_constant, load_varint, location)
323
353
  when 85 then
324
- RationalNode.new(load_node, location)
354
+ LocalVariableTargetNode.new(load_constant, load_varint, location)
325
355
  when 86 then
326
- RedoNode.new(location)
356
+ LocalVariableWriteNode.new(load_constant, load_varint, load_node, load_location, load_location, location)
327
357
  when 87 then
328
- RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
358
+ MatchPredicateNode.new(load_node, load_node, load_location, location)
329
359
  when 88 then
330
- RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
360
+ MatchRequiredNode.new(load_node, load_node, load_location, location)
331
361
  when 89 then
332
- RequiredParameterNode.new(load_constant, location)
362
+ MissingNode.new(location)
333
363
  when 90 then
334
- RescueModifierNode.new(load_node, 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
- RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, 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
- RestParameterNode.new(load_location, load_optional_location, location)
368
+ NextNode.new(load_optional_node, load_location, location)
339
369
  when 93 then
340
- RetryNode.new(location)
370
+ NilNode.new(location)
341
371
  when 94 then
342
- ReturnNode.new(load_location, load_optional_node, location)
372
+ NoKeywordsParameterNode.new(load_location, load_location, location)
343
373
  when 95 then
344
- SelfNode.new(location)
374
+ NumberedReferenceReadNode.new(location)
345
375
  when 96 then
346
- SingletonClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
376
+ OptionalParameterNode.new(load_constant, load_location, load_location, load_node, location)
347
377
  when 97 then
348
- SourceEncodingNode.new(location)
378
+ OrNode.new(load_node, load_node, load_location, location)
349
379
  when 98 then
350
- SourceFileNode.new(load_string, 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
- SourceLineNode.new(location)
382
+ ParenthesesNode.new(load_optional_node, load_location, load_location, location)
353
383
  when 100 then
354
- SplatNode.new(load_location, load_optional_node, location)
384
+ PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
355
385
  when 101 then
356
- StatementsNode.new(Array.new(load_varint) { load_node }, location)
386
+ PinnedVariableNode.new(load_node, load_location, location)
357
387
  when 102 then
358
- StringConcatNode.new(load_node, load_node, location)
388
+ PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
359
389
  when 103 then
360
- StringNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
390
+ PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
361
391
  when 104 then
362
- SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
392
+ ProgramNode.new(Array.new(load_varint) { load_constant }, load_node, location)
363
393
  when 105 then
364
- SymbolNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
394
+ RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
365
395
  when 106 then
366
- TrueNode.new(location)
396
+ RationalNode.new(load_node, location)
367
397
  when 107 then
368
- UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
398
+ RedoNode.new(location)
369
399
  when 108 then
370
- UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
400
+ RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
371
401
  when 109 then
372
- UntilNode.new(load_location, load_node, load_optional_node, load_varint, location)
402
+ RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
373
403
  when 110 then
374
- WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
404
+ RequiredParameterNode.new(load_constant, location)
375
405
  when 111 then
376
- WhileNode.new(load_location, load_node, load_optional_node, load_varint, location)
406
+ RescueModifierNode.new(load_node, load_location, load_node, location)
377
407
  when 112 then
378
- XStringNode.new(load_location, load_location, load_location, load_string, 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
410
+ RestParameterNode.new(load_location, load_optional_location, location)
411
+ when 114 then
412
+ RetryNode.new(location)
413
+ when 115 then
414
+ ReturnNode.new(load_location, load_optional_node, location)
415
+ when 116 then
416
+ SelfNode.new(location)
417
+ when 117 then
418
+ SingletonClassNode.new(Array.new(load_varint) { load_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
419
+ when 118 then
420
+ SourceEncodingNode.new(location)
421
+ when 119 then
422
+ SourceFileNode.new(load_string, location)
423
+ when 120 then
424
+ SourceLineNode.new(location)
425
+ when 121 then
426
+ SplatNode.new(load_location, load_optional_node, location)
427
+ when 122 then
428
+ StatementsNode.new(Array.new(load_varint) { load_node }, location)
429
+ when 123 then
430
+ StringConcatNode.new(load_node, load_node, location)
431
+ when 124 then
432
+ StringNode.new(load_optional_location, load_location, load_optional_location, load_string, location)
433
+ when 125 then
434
+ SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
435
+ when 126 then
436
+ SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
437
+ when 127 then
438
+ TrueNode.new(location)
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
380
452
  YieldNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, location)
381
453
  end
382
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
@@ -313,6 +333,30 @@ module YARP
313
333
  end
314
334
  end
315
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
+
316
360
  # Load the serialized AST using the source as a reference into a tree.
317
361
  def self.load(source, serialized)
318
362
  Serialize.load(source, serialized)
@@ -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