prism 0.13.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -52,4 +52,48 @@ module Prism
52
52
  o
53
53
  end
54
54
  end
55
+
56
+ class ConstantReadNode < Node
57
+ # Returns the list of parts for the full name of this constant. For example: [:Foo]
58
+ def full_name_parts
59
+ [name]
60
+ end
61
+
62
+ # Returns the full name of this constant. For example: "Foo"
63
+ def full_name
64
+ name.name
65
+ end
66
+ end
67
+
68
+ class ConstantPathNode < Node
69
+ # Returns the list of parts for the full name of this constant path. For example: [:Foo, :Bar]
70
+ def full_name_parts
71
+ parts = [child.name]
72
+ current = parent
73
+
74
+ while current.is_a?(ConstantPathNode)
75
+ parts.unshift(current.child.name)
76
+ current = current.parent
77
+ end
78
+
79
+ parts.unshift(current&.name || :"")
80
+ end
81
+
82
+ # Returns the full name of this constant path. For example: "Foo::Bar"
83
+ def full_name
84
+ full_name_parts.join("::")
85
+ end
86
+ end
87
+
88
+ class ConstantPathTargetNode < Node
89
+ # Returns the list of parts for the full name of this constant path. For example: [:Foo, :Bar]
90
+ def full_name_parts
91
+ (parent&.full_name_parts || [:""]).push(child.name)
92
+ end
93
+
94
+ # Returns the full name of this constant path. For example: "Foo::Bar"
95
+ def full_name
96
+ full_name_parts.join("::")
97
+ end
98
+ end
55
99
  end
@@ -117,7 +117,7 @@ module Prism
117
117
  end
118
118
 
119
119
  def pretty_print(q)
120
- q.text("(#{start_line},#{start_column})-(#{end_line},#{end_column}))")
120
+ q.text("(#{start_line},#{start_column})-(#{end_line},#{end_column})")
121
121
  end
122
122
 
123
123
  def ==(other)
@@ -137,7 +137,7 @@ module Prism
137
137
  end
138
138
 
139
139
  def self.null
140
- new(0, 0)
140
+ new(nil, 0, 0)
141
141
  end
142
142
  end
143
143
 
@@ -166,6 +166,32 @@ module Prism
166
166
  end
167
167
  end
168
168
 
169
+ # This represents a magic comment that was encountered during parsing.
170
+ class MagicComment
171
+ attr_reader :key_loc, :value_loc
172
+
173
+ def initialize(key_loc, value_loc)
174
+ @key_loc = key_loc
175
+ @value_loc = value_loc
176
+ end
177
+
178
+ def key
179
+ key_loc.slice
180
+ end
181
+
182
+ def value
183
+ value_loc.slice
184
+ end
185
+
186
+ def deconstruct_keys(keys)
187
+ { key_loc: key_loc, value_loc: value_loc }
188
+ end
189
+
190
+ def inspect
191
+ "#<Prism::MagicComment @key=#{key.inspect} @value=#{value.inspect}>"
192
+ end
193
+ end
194
+
169
195
  # This represents an error that was encountered during parsing.
170
196
  class ParseError
171
197
  attr_reader :message, :location
@@ -206,18 +232,19 @@ module Prism
206
232
  # the AST, any comments that were encounters, and any errors that were
207
233
  # encountered.
208
234
  class ParseResult
209
- attr_reader :value, :comments, :errors, :warnings, :source
235
+ attr_reader :value, :comments, :magic_comments, :errors, :warnings, :source
210
236
 
211
- def initialize(value, comments, errors, warnings, source)
237
+ def initialize(value, comments, magic_comments, errors, warnings, source)
212
238
  @value = value
213
239
  @comments = comments
240
+ @magic_comments = magic_comments
214
241
  @errors = errors
215
242
  @warnings = warnings
216
243
  @source = source
217
244
  end
218
245
 
219
246
  def deconstruct_keys(keys)
220
- { value: value, comments: comments, errors: errors, warnings: warnings }
247
+ { value: value, comments: comments, magic_comments: magic_comments, errors: errors, warnings: warnings }
221
248
  end
222
249
 
223
250
  def success?
data/lib/prism/pattern.rb CHANGED
@@ -10,7 +10,7 @@ module Prism
10
10
  # in ConstantPathNode[ConstantReadNode[name: :Prism], ConstantReadNode[name: :Pattern]]
11
11
  # end
12
12
  #
13
- # the pattern is the `ConstantPathNode[...]` expression.
13
+ # the pattern is the <tt>ConstantPathNode[...]</tt> expression.
14
14
  #
15
15
  # The pattern gets compiled into an object that responds to #call by running
16
16
  # the #compile method. This method itself will run back through Prism to
@@ -21,7 +21,7 @@ end
21
21
  module Prism
22
22
  module Serialize
23
23
  MAJOR_VERSION = 0
24
- MINOR_VERSION = 13
24
+ MINOR_VERSION = 15
25
25
  PATCH_VERSION = 0
26
26
 
27
27
  def self.load(input, serialized)
@@ -62,9 +62,10 @@ module Prism
62
62
 
63
63
  def load_metadata
64
64
  comments = load_varint.times.map { Comment.new(Comment::TYPES.fetch(load_varint), load_location) }
65
+ magic_comments = load_varint.times.map { MagicComment.new(load_location, load_location) }
65
66
  errors = load_varint.times.map { ParseError.new(load_embedded_string, load_location) }
66
67
  warnings = load_varint.times.map { ParseWarning.new(load_embedded_string, load_location) }
67
- [comments, errors, warnings]
68
+ [comments, magic_comments, errors, warnings]
68
69
  end
69
70
 
70
71
  def load_tokens
@@ -83,14 +84,14 @@ module Prism
83
84
  def load_tokens_result
84
85
  tokens = load_tokens
85
86
  encoding = load_encoding
86
- comments, errors, warnings = load_metadata
87
+ comments, magic_comments, errors, warnings = load_metadata
87
88
 
88
89
  if encoding != @encoding
89
90
  tokens.each { |token,| token.value.force_encoding(encoding) }
90
91
  end
91
92
 
92
93
  raise "Expected to consume all bytes while deserializing" unless @io.eof?
93
- Prism::ParseResult.new(tokens, comments, errors, warnings, @source)
94
+ Prism::ParseResult.new(tokens, comments, magic_comments, errors, warnings, @source)
94
95
  end
95
96
 
96
97
  def load_nodes
@@ -104,17 +105,17 @@ module Prism
104
105
  @encoding = load_encoding
105
106
  @input = input.force_encoding(@encoding).freeze
106
107
 
107
- comments, errors, warnings = load_metadata
108
+ comments, magic_comments, errors, warnings = load_metadata
108
109
 
109
110
  @constant_pool_offset = io.read(4).unpack1("L")
110
111
  @constant_pool = Array.new(load_varint, nil)
111
112
 
112
- [load_node, comments, errors, warnings]
113
+ [load_node, comments, magic_comments, errors, warnings]
113
114
  end
114
115
 
115
116
  def load_result
116
- node, comments, errors, warnings = load_nodes
117
- Prism::ParseResult.new(node, comments, errors, warnings, @source)
117
+ node, comments, magic_comments, errors, warnings = load_nodes
118
+ Prism::ParseResult.new(node, comments, magic_comments, errors, warnings, @source)
118
119
  end
119
120
 
120
121
  private
@@ -151,13 +152,14 @@ module Prism
151
152
  end
152
153
 
153
154
  def load_string
154
- case io.getbyte
155
+ type = io.getbyte
156
+ case type
155
157
  when 1
156
158
  input.byteslice(load_varint, load_varint).force_encoding(encoding)
157
159
  when 2
158
160
  load_embedded_string
159
161
  else
160
- raise
162
+ raise "Unknown serialized string type: #{type}"
161
163
  end
162
164
  end
163
165
 
@@ -223,7 +225,7 @@ module Prism
223
225
  when 9 then
224
226
  AssocSplatNode.new(load_optional_node, load_location, location)
225
227
  when 10 then
226
- BackReferenceReadNode.new(location)
228
+ BackReferenceReadNode.new(load_required_constant, location)
227
229
  when 11 then
228
230
  BeginNode.new(load_optional_location, load_optional_node, load_optional_node, load_optional_node, load_optional_node, load_optional_location, location)
229
231
  when 12 then
@@ -239,13 +241,13 @@ module Prism
239
241
  when 17 then
240
242
  BreakNode.new(load_optional_node, load_location, location)
241
243
  when 18 then
242
- CallAndWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_optional_location, load_optional_node, load_optional_location, load_varint, load_string, load_string, load_location, load_node, location)
244
+ CallAndWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_varint, load_required_constant, load_required_constant, load_location, load_node, location)
243
245
  when 19 then
244
- 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)
246
+ 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_required_constant, location)
245
247
  when 20 then
246
- CallOperatorWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_optional_location, load_optional_node, load_optional_location, load_varint, load_string, load_string, load_required_constant, load_location, load_node, location)
248
+ CallOperatorWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_varint, load_required_constant, load_required_constant, load_required_constant, load_location, load_node, location)
247
249
  when 21 then
248
- CallOrWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_optional_location, load_optional_node, load_optional_location, load_varint, load_string, load_string, load_location, load_node, location)
250
+ CallOrWriteNode.new(load_optional_node, load_optional_location, load_optional_location, load_varint, load_required_constant, load_required_constant, load_location, load_node, location)
249
251
  when 22 then
250
252
  CapturePatternNode.new(load_node, load_node, load_location, location)
251
253
  when 23 then
@@ -342,150 +344,156 @@ module Prism
342
344
  when 68 then
343
345
  InNode.new(load_node, load_optional_node, load_location, load_optional_location, location)
344
346
  when 69 then
345
- InstanceVariableAndWriteNode.new(load_required_constant, load_location, load_location, load_node, location)
347
+ IndexAndWriteNode.new(load_optional_node, load_optional_location, load_location, load_optional_node, load_location, load_optional_node, load_varint, load_location, load_node, location)
346
348
  when 70 then
347
- InstanceVariableOperatorWriteNode.new(load_required_constant, load_location, load_location, load_node, load_required_constant, location)
349
+ IndexOperatorWriteNode.new(load_optional_node, load_optional_location, load_location, load_optional_node, load_location, load_optional_node, load_varint, load_required_constant, load_location, load_node, location)
348
350
  when 71 then
349
- InstanceVariableOrWriteNode.new(load_required_constant, load_location, load_location, load_node, location)
351
+ IndexOrWriteNode.new(load_optional_node, load_optional_location, load_location, load_optional_node, load_location, load_optional_node, load_varint, load_location, load_node, location)
350
352
  when 72 then
351
- InstanceVariableReadNode.new(load_required_constant, location)
353
+ InstanceVariableAndWriteNode.new(load_required_constant, load_location, load_location, load_node, location)
352
354
  when 73 then
353
- InstanceVariableTargetNode.new(load_required_constant, location)
355
+ InstanceVariableOperatorWriteNode.new(load_required_constant, load_location, load_location, load_node, load_required_constant, location)
354
356
  when 74 then
355
- InstanceVariableWriteNode.new(load_required_constant, load_location, load_node, load_location, location)
357
+ InstanceVariableOrWriteNode.new(load_required_constant, load_location, load_location, load_node, location)
356
358
  when 75 then
357
- IntegerNode.new(load_varint, location)
359
+ InstanceVariableReadNode.new(load_required_constant, location)
358
360
  when 76 then
359
- InterpolatedMatchLastLineNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
361
+ InstanceVariableTargetNode.new(load_required_constant, location)
360
362
  when 77 then
361
- InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
363
+ InstanceVariableWriteNode.new(load_required_constant, load_location, load_node, load_location, location)
362
364
  when 78 then
363
- InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
365
+ IntegerNode.new(load_varint, location)
364
366
  when 79 then
365
- InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
367
+ InterpolatedMatchLastLineNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
366
368
  when 80 then
367
- InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
369
+ InterpolatedRegularExpressionNode.new(load_location, Array.new(load_varint) { load_node }, load_location, load_varint, location)
368
370
  when 81 then
369
- KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
371
+ InterpolatedStringNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
370
372
  when 82 then
371
- KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location)
373
+ InterpolatedSymbolNode.new(load_optional_location, Array.new(load_varint) { load_node }, load_optional_location, location)
372
374
  when 83 then
373
- KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
375
+ InterpolatedXStringNode.new(load_location, Array.new(load_varint) { load_node }, load_location, location)
374
376
  when 84 then
375
- LambdaNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
377
+ KeywordHashNode.new(Array.new(load_varint) { load_node }, location)
376
378
  when 85 then
377
- LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
379
+ KeywordParameterNode.new(load_required_constant, load_location, load_optional_node, location)
378
380
  when 86 then
379
- LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_required_constant, load_required_constant, load_varint, location)
381
+ KeywordRestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
380
382
  when 87 then
381
- LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
383
+ LambdaNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_location, load_optional_node, load_optional_node, location)
382
384
  when 88 then
383
- LocalVariableReadNode.new(load_required_constant, load_varint, location)
385
+ LocalVariableAndWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
384
386
  when 89 then
385
- LocalVariableTargetNode.new(load_required_constant, load_varint, location)
387
+ LocalVariableOperatorWriteNode.new(load_location, load_location, load_node, load_required_constant, load_required_constant, load_varint, location)
386
388
  when 90 then
387
- LocalVariableWriteNode.new(load_required_constant, load_varint, load_location, load_node, load_location, location)
389
+ LocalVariableOrWriteNode.new(load_location, load_location, load_node, load_required_constant, load_varint, location)
388
390
  when 91 then
389
- MatchLastLineNode.new(load_location, load_location, load_location, load_string, load_varint, location)
391
+ LocalVariableReadNode.new(load_required_constant, load_varint, location)
390
392
  when 92 then
391
- MatchPredicateNode.new(load_node, load_node, load_location, location)
393
+ LocalVariableTargetNode.new(load_required_constant, load_varint, location)
392
394
  when 93 then
393
- MatchRequiredNode.new(load_node, load_node, load_location, location)
395
+ LocalVariableWriteNode.new(load_required_constant, load_varint, load_location, load_node, load_location, location)
394
396
  when 94 then
395
- MatchWriteNode.new(load_node, Array.new(load_varint) { load_required_constant }, location)
397
+ MatchLastLineNode.new(load_location, load_location, load_location, load_string, load_varint, location)
396
398
  when 95 then
397
- MissingNode.new(location)
399
+ MatchPredicateNode.new(load_node, load_node, load_location, location)
398
400
  when 96 then
399
- ModuleNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_node, load_optional_node, load_location, load_required_constant, location)
401
+ MatchRequiredNode.new(load_node, load_node, load_location, location)
400
402
  when 97 then
401
- MultiTargetNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location)
403
+ MatchWriteNode.new(load_node, Array.new(load_varint) { load_required_constant }, location)
402
404
  when 98 then
403
- MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, load_location, load_node, location)
405
+ MissingNode.new(location)
404
406
  when 99 then
405
- NextNode.new(load_optional_node, load_location, location)
407
+ ModuleNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_node, load_optional_node, load_location, load_required_constant, location)
406
408
  when 100 then
407
- NilNode.new(location)
409
+ MultiTargetNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, location)
408
410
  when 101 then
409
- NoKeywordsParameterNode.new(load_location, load_location, location)
411
+ MultiWriteNode.new(Array.new(load_varint) { load_node }, load_optional_location, load_optional_location, load_location, load_node, location)
410
412
  when 102 then
411
- NumberedReferenceReadNode.new(load_varint, location)
413
+ NextNode.new(load_optional_node, load_location, location)
412
414
  when 103 then
413
- OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
415
+ NilNode.new(location)
414
416
  when 104 then
415
- OrNode.new(load_node, load_node, load_location, location)
417
+ NoKeywordsParameterNode.new(load_location, load_location, location)
416
418
  when 105 then
417
- ParametersNode.new(Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, load_optional_node, load_optional_node, location)
419
+ NumberedReferenceReadNode.new(load_varint, location)
418
420
  when 106 then
419
- ParenthesesNode.new(load_optional_node, load_location, load_location, location)
421
+ OptionalParameterNode.new(load_required_constant, load_location, load_location, load_node, location)
420
422
  when 107 then
421
- PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
423
+ OrNode.new(load_node, load_node, load_location, location)
422
424
  when 108 then
423
- PinnedVariableNode.new(load_node, load_location, location)
425
+ ParametersNode.new(Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, load_optional_node, Array.new(load_varint) { load_node }, Array.new(load_varint) { load_node }, load_optional_node, load_optional_node, location)
424
426
  when 109 then
425
- PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
427
+ ParenthesesNode.new(load_optional_node, load_location, load_location, location)
426
428
  when 110 then
427
- PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
429
+ PinnedExpressionNode.new(load_node, load_location, load_location, load_location, location)
428
430
  when 111 then
429
- ProgramNode.new(Array.new(load_varint) { load_required_constant }, load_node, location)
431
+ PinnedVariableNode.new(load_node, load_location, location)
430
432
  when 112 then
431
- RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
433
+ PostExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
432
434
  when 113 then
433
- RationalNode.new(load_node, location)
435
+ PreExecutionNode.new(load_optional_node, load_location, load_location, load_location, location)
434
436
  when 114 then
435
- RedoNode.new(location)
437
+ ProgramNode.new(Array.new(load_varint) { load_required_constant }, load_node, location)
436
438
  when 115 then
437
- RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
439
+ RangeNode.new(load_optional_node, load_optional_node, load_location, load_varint, location)
438
440
  when 116 then
439
- RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
441
+ RationalNode.new(load_node, location)
440
442
  when 117 then
441
- RequiredParameterNode.new(load_required_constant, location)
443
+ RedoNode.new(location)
442
444
  when 118 then
443
- RescueModifierNode.new(load_node, load_location, load_node, location)
445
+ RegularExpressionNode.new(load_location, load_location, load_location, load_string, load_varint, location)
444
446
  when 119 then
445
- RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
447
+ RequiredDestructuredParameterNode.new(Array.new(load_varint) { load_node }, load_location, load_location, location)
446
448
  when 120 then
447
- RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
449
+ RequiredParameterNode.new(load_required_constant, location)
448
450
  when 121 then
449
- RetryNode.new(location)
451
+ RescueModifierNode.new(load_node, load_location, load_node, location)
450
452
  when 122 then
451
- ReturnNode.new(load_location, load_optional_node, location)
453
+ RescueNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_location, load_optional_node, load_optional_node, load_optional_node, location)
452
454
  when 123 then
453
- SelfNode.new(location)
455
+ RestParameterNode.new(load_optional_constant, load_optional_location, load_location, location)
454
456
  when 124 then
455
- SingletonClassNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
457
+ RetryNode.new(location)
456
458
  when 125 then
457
- SourceEncodingNode.new(location)
459
+ ReturnNode.new(load_location, load_optional_node, location)
458
460
  when 126 then
459
- SourceFileNode.new(load_string, location)
461
+ SelfNode.new(location)
460
462
  when 127 then
461
- SourceLineNode.new(location)
463
+ SingletonClassNode.new(Array.new(load_varint) { load_required_constant }, load_location, load_location, load_node, load_optional_node, load_location, location)
462
464
  when 128 then
463
- SplatNode.new(load_location, load_optional_node, location)
465
+ SourceEncodingNode.new(location)
464
466
  when 129 then
465
- StatementsNode.new(Array.new(load_varint) { load_node }, location)
467
+ SourceFileNode.new(load_string, location)
466
468
  when 130 then
467
- StringConcatNode.new(load_node, load_node, location)
469
+ SourceLineNode.new(location)
468
470
  when 131 then
469
- StringNode.new(load_varint, load_optional_location, load_location, load_optional_location, load_string, location)
471
+ SplatNode.new(load_location, load_optional_node, location)
470
472
  when 132 then
471
- SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
473
+ StatementsNode.new(Array.new(load_varint) { load_node }, location)
472
474
  when 133 then
473
- SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
475
+ StringConcatNode.new(load_node, load_node, location)
474
476
  when 134 then
475
- TrueNode.new(location)
477
+ StringNode.new(load_varint, load_optional_location, load_location, load_optional_location, load_string, location)
476
478
  when 135 then
477
- UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
479
+ SuperNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, load_optional_node, location)
478
480
  when 136 then
479
- UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
481
+ SymbolNode.new(load_optional_location, load_optional_location, load_optional_location, load_string, location)
480
482
  when 137 then
481
- UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
483
+ TrueNode.new(location)
482
484
  when 138 then
483
- WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
485
+ UndefNode.new(Array.new(load_varint) { load_node }, load_location, location)
484
486
  when 139 then
485
- WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
487
+ UnlessNode.new(load_location, load_node, load_optional_node, load_optional_node, load_optional_location, location)
486
488
  when 140 then
487
- XStringNode.new(load_location, load_location, load_location, load_string, location)
489
+ UntilNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
488
490
  when 141 then
491
+ WhenNode.new(load_location, Array.new(load_varint) { load_node }, load_optional_node, location)
492
+ when 142 then
493
+ WhileNode.new(load_location, load_optional_location, load_node, load_optional_node, load_varint, location)
494
+ when 143 then
495
+ XStringNode.new(load_location, load_location, load_location, load_string, location)
496
+ when 144 then
489
497
  YieldNode.new(load_location, load_optional_location, load_optional_node, load_optional_location, location)
490
498
  end
491
499
  end
data/lib/prism/visitor.rb CHANGED
@@ -248,6 +248,15 @@ module Prism
248
248
  # Visit a InNode node
249
249
  alias visit_in_node visit_child_nodes
250
250
 
251
+ # Visit a IndexAndWriteNode node
252
+ alias visit_index_and_write_node visit_child_nodes
253
+
254
+ # Visit a IndexOperatorWriteNode node
255
+ alias visit_index_operator_write_node visit_child_nodes
256
+
257
+ # Visit a IndexOrWriteNode node
258
+ alias visit_index_or_write_node visit_child_nodes
259
+
251
260
  # Visit a InstanceVariableAndWriteNode node
252
261
  alias visit_instance_variable_and_write_node visit_child_nodes
253
262
 
data/prism.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "prism"
5
- spec.version = "0.13.0"
5
+ spec.version = "0.15.0"
6
6
  spec.authors = ["Shopify"]
7
7
  spec.email = ["ruby@shopify.com"]
8
8
 
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  "docs/fuzzing.md",
30
30
  "docs/heredocs.md",
31
31
  "docs/mapping.md",
32
+ "docs/prism.png",
32
33
  "docs/ripper.md",
33
34
  "docs/ruby_api.md",
34
35
  "docs/serialization.md",
@@ -46,7 +47,6 @@ Gem::Specification.new do |spec|
46
47
  "include/prism/pack.h",
47
48
  "include/prism/parser.h",
48
49
  "include/prism/regexp.h",
49
- "include/prism/unescape.h",
50
50
  "include/prism/util/pm_buffer.h",
51
51
  "include/prism/util/pm_char.h",
52
52
  "include/prism/util/pm_constant_pool.h",
@@ -92,7 +92,6 @@ Gem::Specification.new do |spec|
92
92
  "src/regexp.c",
93
93
  "src/serialize.c",
94
94
  "src/token_type.c",
95
- "src/unescape.c",
96
95
  "src/util/pm_buffer.c",
97
96
  "src/util/pm_char.c",
98
97
  "src/util/pm_constant_pool.c",
data/src/diagnostic.c CHANGED
@@ -192,6 +192,7 @@ static const char* const diagnostic_messages[PM_DIAGNOSTIC_ID_LEN] = {
192
192
  [PM_ERR_NUMBERED_PARAMETER_NOT_ALLOWED] = "Numbered parameters are not allowed alongside explicit parameters",
193
193
  [PM_ERR_NUMBERED_PARAMETER_OUTER_SCOPE] = "Numbered parameter is already used in outer scope",
194
194
  [PM_ERR_OPERATOR_MULTI_ASSIGN] = "Unexpected operator for a multiple assignment",
195
+ [PM_ERR_OPERATOR_WRITE_ARGUMENTS] = "Unexpected operator after a call with arguments",
195
196
  [PM_ERR_OPERATOR_WRITE_BLOCK] = "Unexpected operator after a call with a block",
196
197
  [PM_ERR_PARAMETER_ASSOC_SPLAT_MULTI] = "Unexpected multiple `**` splat parameters",
197
198
  [PM_ERR_PARAMETER_BLOCK_MULTI] = "Multiple block parameters; only one block is allowed",
@@ -265,7 +266,7 @@ pm_diagnostic_message(pm_diagnostic_id_t diag_id) {
265
266
  // Append an error to the given list of diagnostic.
266
267
  bool
267
268
  pm_diagnostic_list_append(pm_list_t *list, const uint8_t *start, const uint8_t *end, pm_diagnostic_id_t diag_id) {
268
- pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) malloc(sizeof(pm_diagnostic_t));
269
+ pm_diagnostic_t *diagnostic = (pm_diagnostic_t *) calloc(sizeof(pm_diagnostic_t), 1);
269
270
  if (diagnostic == NULL) return false;
270
271
 
271
272
  *diagnostic = (pm_diagnostic_t) { .start = start, .end = end, .message = pm_diagnostic_message(diag_id) };