prism 0.28.0 → 0.30.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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -1
  3. data/CONTRIBUTING.md +0 -4
  4. data/README.md +1 -0
  5. data/config.yml +95 -26
  6. data/docs/fuzzing.md +1 -1
  7. data/docs/ripper_translation.md +22 -0
  8. data/ext/prism/api_node.c +70 -52
  9. data/ext/prism/extconf.rb +27 -23
  10. data/ext/prism/extension.c +107 -372
  11. data/ext/prism/extension.h +1 -1
  12. data/include/prism/ast.h +170 -102
  13. data/include/prism/diagnostic.h +18 -3
  14. data/include/prism/node.h +0 -21
  15. data/include/prism/parser.h +23 -25
  16. data/include/prism/regexp.h +17 -8
  17. data/include/prism/static_literals.h +3 -2
  18. data/include/prism/util/pm_char.h +1 -2
  19. data/include/prism/util/pm_constant_pool.h +0 -8
  20. data/include/prism/util/pm_integer.h +16 -9
  21. data/include/prism/util/pm_string.h +0 -8
  22. data/include/prism/version.h +2 -2
  23. data/include/prism.h +0 -11
  24. data/lib/prism/compiler.rb +3 -0
  25. data/lib/prism/desugar_compiler.rb +4 -4
  26. data/lib/prism/dispatcher.rb +14 -0
  27. data/lib/prism/dot_visitor.rb +54 -35
  28. data/lib/prism/dsl.rb +23 -18
  29. data/lib/prism/ffi.rb +25 -4
  30. data/lib/prism/inspect_visitor.rb +26 -24
  31. data/lib/prism/mutation_compiler.rb +6 -1
  32. data/lib/prism/node.rb +314 -389
  33. data/lib/prism/node_ext.rb +175 -17
  34. data/lib/prism/parse_result/comments.rb +1 -8
  35. data/lib/prism/parse_result/newlines.rb +102 -12
  36. data/lib/prism/parse_result.rb +17 -0
  37. data/lib/prism/reflection.rb +11 -9
  38. data/lib/prism/serialize.rb +91 -68
  39. data/lib/prism/translation/parser/compiler.rb +288 -138
  40. data/lib/prism/translation/parser.rb +7 -2
  41. data/lib/prism/translation/ripper.rb +24 -22
  42. data/lib/prism/translation/ruby_parser.rb +32 -14
  43. data/lib/prism/visitor.rb +3 -0
  44. data/lib/prism.rb +0 -4
  45. data/prism.gemspec +2 -4
  46. data/rbi/prism/node.rbi +114 -57
  47. data/rbi/prism/node_ext.rbi +5 -0
  48. data/rbi/prism/parse_result.rbi +1 -1
  49. data/rbi/prism/visitor.rbi +3 -0
  50. data/rbi/prism.rbi +6 -0
  51. data/sig/prism/dsl.rbs +13 -10
  52. data/sig/prism/lex_compat.rbs +10 -0
  53. data/sig/prism/mutation_compiler.rbs +1 -0
  54. data/sig/prism/node.rbs +72 -48
  55. data/sig/prism/node_ext.rbs +4 -0
  56. data/sig/prism/visitor.rbs +1 -0
  57. data/sig/prism.rbs +21 -0
  58. data/src/diagnostic.c +56 -27
  59. data/src/node.c +432 -1690
  60. data/src/prettyprint.c +97 -54
  61. data/src/prism.c +1286 -1196
  62. data/src/regexp.c +133 -68
  63. data/src/serialize.c +22 -17
  64. data/src/static_literals.c +63 -84
  65. data/src/token_type.c +4 -4
  66. data/src/util/pm_constant_pool.c +0 -8
  67. data/src/util/pm_integer.c +39 -11
  68. data/src/util/pm_string.c +0 -12
  69. data/src/util/pm_strpbrk.c +32 -6
  70. metadata +3 -5
  71. data/include/prism/util/pm_string_list.h +0 -44
  72. data/lib/prism/debug.rb +0 -249
  73. data/src/util/pm_string_list.c +0 -28
@@ -3,6 +3,20 @@
3
3
  # Here we are reopening the prism module to provide methods on nodes that aren't
4
4
  # templated and are meant as convenience methods.
5
5
  module Prism
6
+ class Node
7
+ def deprecated(*replacements) # :nodoc:
8
+ location = caller_locations(1, 1)
9
+ location = location[0].label if location
10
+ suggest = replacements.map { |replacement| "#{self.class}##{replacement}" }
11
+
12
+ warn(<<~MSG, category: :deprecated)
13
+ [deprecation]: #{self.class}##{location} is deprecated and will be \
14
+ removed in the next major version. Use #{suggest.join("/")} instead.
15
+ #{(caller(1, 3) || []).join("\n")}
16
+ MSG
17
+ end
18
+ end
19
+
6
20
  module RegularExpressionOptions # :nodoc:
7
21
  # Returns a numeric value that represents the flags that were used to create
8
22
  # the regular expression.
@@ -92,7 +106,19 @@ module Prism
92
106
  class RationalNode < Node
93
107
  # Returns the value of the node as a Ruby Rational.
94
108
  def value
95
- Rational(numeric.is_a?(IntegerNode) ? numeric.value : slice.chomp("r"))
109
+ Rational(numerator, denominator)
110
+ end
111
+
112
+ # Returns the value of the node as an IntegerNode or a FloatNode. This
113
+ # method is deprecated in favor of #value or #numerator/#denominator.
114
+ def numeric
115
+ deprecated("value", "numerator", "denominator")
116
+
117
+ if denominator == 1
118
+ IntegerNode.new(source, flags, numerator, location.chop)
119
+ else
120
+ FloatNode.new(source, numerator.to_f / denominator, location.chop)
121
+ end
96
122
  end
97
123
  end
98
124
 
@@ -168,13 +194,7 @@ module Prism
168
194
  # constant read or a missing node. To not cause a breaking change, we
169
195
  # continue to supply that API.
170
196
  def child
171
- warn(<<~MSG, category: :deprecated)
172
- DEPRECATED: ConstantPathNode#child is deprecated and will be removed \
173
- in the next major version. Use \
174
- ConstantPathNode#name/ConstantPathNode#name_loc instead. Called from \
175
- #{caller(1, 1)&.first}.
176
- MSG
177
-
197
+ deprecated("name", "name_loc")
178
198
  name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location)
179
199
  end
180
200
  end
@@ -210,13 +230,7 @@ module Prism
210
230
  # constant read or a missing node. To not cause a breaking change, we
211
231
  # continue to supply that API.
212
232
  def child
213
- warn(<<~MSG, category: :deprecated)
214
- DEPRECATED: ConstantPathTargetNode#child is deprecated and will be \
215
- removed in the next major version. Use \
216
- ConstantPathTargetNode#name/ConstantPathTargetNode#name_loc instead. \
217
- Called from #{caller(1, 1)&.first}.
218
- MSG
219
-
233
+ deprecated("name", "name_loc")
220
234
  name ? ConstantReadNode.new(source, name, name_loc) : MissingNode.new(source, location)
221
235
  end
222
236
  end
@@ -250,9 +264,10 @@ module Prism
250
264
  end
251
265
 
252
266
  posts.each do |param|
253
- if param.is_a?(MultiTargetNode)
267
+ case param
268
+ when MultiTargetNode
254
269
  names << [:req]
255
- elsif param.is_a?(NoKeywordsParameterNode)
270
+ when NoKeywordsParameterNode, KeywordRestParameterNode, ForwardingParameterNode
256
271
  # Invalid syntax, e.g. "def f(**nil, ...)" moves the NoKeywordsParameterNode to posts
257
272
  raise "Invalid syntax"
258
273
  else
@@ -286,4 +301,147 @@ module Prism
286
301
  names
287
302
  end
288
303
  end
304
+
305
+ class CallNode < Node
306
+ # When a call node has the attribute_write flag set, it means that the call
307
+ # is using the attribute write syntax. This is either a method call to []=
308
+ # or a method call to a method that ends with =. Either way, the = sign is
309
+ # present in the source.
310
+ #
311
+ # Prism returns the message_loc _without_ the = sign attached, because there
312
+ # can be any amount of space between the message and the = sign. However,
313
+ # sometimes you want the location of the full message including the inner
314
+ # space and the = sign. This method provides that.
315
+ def full_message_loc
316
+ attribute_write? ? message_loc&.adjoin("=") : message_loc
317
+ end
318
+ end
319
+
320
+ class CallOperatorWriteNode < Node
321
+ # Returns the binary operator used to modify the receiver. This method is
322
+ # deprecated in favor of #binary_operator.
323
+ def operator
324
+ deprecated("binary_operator")
325
+ binary_operator
326
+ end
327
+
328
+ # Returns the location of the binary operator used to modify the receiver.
329
+ # This method is deprecated in favor of #binary_operator_loc.
330
+ def operator_loc
331
+ deprecated("binary_operator_loc")
332
+ binary_operator_loc
333
+ end
334
+ end
335
+
336
+ class ClassVariableOperatorWriteNode < Node
337
+ # Returns the binary operator used to modify the receiver. This method is
338
+ # deprecated in favor of #binary_operator.
339
+ def operator
340
+ deprecated("binary_operator")
341
+ binary_operator
342
+ end
343
+
344
+ # Returns the location of the binary operator used to modify the receiver.
345
+ # This method is deprecated in favor of #binary_operator_loc.
346
+ def operator_loc
347
+ deprecated("binary_operator_loc")
348
+ binary_operator_loc
349
+ end
350
+ end
351
+
352
+ class ConstantOperatorWriteNode < Node
353
+ # Returns the binary operator used to modify the receiver. This method is
354
+ # deprecated in favor of #binary_operator.
355
+ def operator
356
+ deprecated("binary_operator")
357
+ binary_operator
358
+ end
359
+
360
+ # Returns the location of the binary operator used to modify the receiver.
361
+ # This method is deprecated in favor of #binary_operator_loc.
362
+ def operator_loc
363
+ deprecated("binary_operator_loc")
364
+ binary_operator_loc
365
+ end
366
+ end
367
+
368
+ class ConstantPathOperatorWriteNode < Node
369
+ # Returns the binary operator used to modify the receiver. This method is
370
+ # deprecated in favor of #binary_operator.
371
+ def operator
372
+ deprecated("binary_operator")
373
+ binary_operator
374
+ end
375
+
376
+ # Returns the location of the binary operator used to modify the receiver.
377
+ # This method is deprecated in favor of #binary_operator_loc.
378
+ def operator_loc
379
+ deprecated("binary_operator_loc")
380
+ binary_operator_loc
381
+ end
382
+ end
383
+
384
+ class GlobalVariableOperatorWriteNode < Node
385
+ # Returns the binary operator used to modify the receiver. This method is
386
+ # deprecated in favor of #binary_operator.
387
+ def operator
388
+ deprecated("binary_operator")
389
+ binary_operator
390
+ end
391
+
392
+ # Returns the location of the binary operator used to modify the receiver.
393
+ # This method is deprecated in favor of #binary_operator_loc.
394
+ def operator_loc
395
+ deprecated("binary_operator_loc")
396
+ binary_operator_loc
397
+ end
398
+ end
399
+
400
+ class IndexOperatorWriteNode < Node
401
+ # Returns the binary operator used to modify the receiver. This method is
402
+ # deprecated in favor of #binary_operator.
403
+ def operator
404
+ deprecated("binary_operator")
405
+ binary_operator
406
+ end
407
+
408
+ # Returns the location of the binary operator used to modify the receiver.
409
+ # This method is deprecated in favor of #binary_operator_loc.
410
+ def operator_loc
411
+ deprecated("binary_operator_loc")
412
+ binary_operator_loc
413
+ end
414
+ end
415
+
416
+ class InstanceVariableOperatorWriteNode < Node
417
+ # Returns the binary operator used to modify the receiver. This method is
418
+ # deprecated in favor of #binary_operator.
419
+ def operator
420
+ deprecated("binary_operator")
421
+ binary_operator
422
+ end
423
+
424
+ # Returns the location of the binary operator used to modify the receiver.
425
+ # This method is deprecated in favor of #binary_operator_loc.
426
+ def operator_loc
427
+ deprecated("binary_operator_loc")
428
+ binary_operator_loc
429
+ end
430
+ end
431
+
432
+ class LocalVariableOperatorWriteNode < Node
433
+ # Returns the binary operator used to modify the receiver. This method is
434
+ # deprecated in favor of #binary_operator.
435
+ def operator
436
+ deprecated("binary_operator")
437
+ binary_operator
438
+ end
439
+
440
+ # Returns the location of the binary operator used to modify the receiver.
441
+ # This method is deprecated in favor of #binary_operator_loc.
442
+ def operator_loc
443
+ deprecated("binary_operator_loc")
444
+ binary_operator_loc
445
+ end
446
+ end
289
447
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prism
4
- class ParseResult
4
+ class ParseResult < Result
5
5
  # When we've parsed the source, we have both the syntax tree and the list of
6
6
  # comments that we found in the source. This class is responsible for
7
7
  # walking the tree and finding the nearest location to attach each comment.
@@ -183,12 +183,5 @@ module Prism
183
183
  [preceding, NodeTarget.new(node), following]
184
184
  end
185
185
  end
186
-
187
- private_constant :Comments
188
-
189
- # Attach the list of comments to their respective locations in the tree.
190
- def attach_comments!
191
- Comments.new(self).attach! # steep:ignore
192
- end
193
186
  end
194
187
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prism
4
- class ParseResult
4
+ class ParseResult < Result
5
5
  # The :line tracepoint event gets fired whenever the Ruby VM encounters an
6
6
  # expression on a new line. The types of expressions that can trigger this
7
7
  # event are:
@@ -17,21 +17,27 @@ module Prism
17
17
  # Note that the logic in this file should be kept in sync with the Java
18
18
  # MarkNewlinesVisitor, since that visitor is responsible for marking the
19
19
  # newlines for JRuby/TruffleRuby.
20
+ #
21
+ # This file is autoloaded only when `mark_newlines!` is called, so the
22
+ # re-opening of the various nodes in this file will only be performed in
23
+ # that case. We do that to avoid storing the extra `@newline` instance
24
+ # variable on every node if we don't need it.
20
25
  class Newlines < Visitor
21
26
  # Create a new Newlines visitor with the given newline offsets.
22
- def initialize(newline_marked)
23
- @newline_marked = newline_marked
27
+ def initialize(lines)
28
+ # @type var lines: Integer
29
+ @lines = Array.new(1 + lines, false)
24
30
  end
25
31
 
26
32
  # Permit block/lambda nodes to mark newlines within themselves.
27
33
  def visit_block_node(node)
28
- old_newline_marked = @newline_marked
29
- @newline_marked = Array.new(old_newline_marked.size, false)
34
+ old_lines = @lines
35
+ @lines = Array.new(old_lines.size, false)
30
36
 
31
37
  begin
32
38
  super(node)
33
39
  ensure
34
- @newline_marked = old_newline_marked
40
+ @lines = old_lines
35
41
  end
36
42
  end
37
43
 
@@ -39,7 +45,7 @@ module Prism
39
45
 
40
46
  # Mark if/unless nodes as newlines.
41
47
  def visit_if_node(node)
42
- node.set_newline_flag(@newline_marked)
48
+ node.newline!(@lines)
43
49
  super(node)
44
50
  end
45
51
 
@@ -48,17 +54,101 @@ module Prism
48
54
  # Permit statements lists to mark newlines within themselves.
49
55
  def visit_statements_node(node)
50
56
  node.body.each do |child|
51
- child.set_newline_flag(@newline_marked)
57
+ child.newline!(@lines)
52
58
  end
53
59
  super(node)
54
60
  end
55
61
  end
62
+ end
63
+
64
+ class Node
65
+ def newline? # :nodoc:
66
+ @newline ? true : false
67
+ end
68
+
69
+ def newline!(lines) # :nodoc:
70
+ line = location.start_line
71
+ unless lines[line]
72
+ lines[line] = true
73
+ @newline = true
74
+ end
75
+ end
76
+ end
77
+
78
+ class BeginNode < Node
79
+ def newline!(lines) # :nodoc:
80
+ # Never mark BeginNode with a newline flag, mark children instead.
81
+ end
82
+ end
83
+
84
+ class ParenthesesNode < Node
85
+ def newline!(lines) # :nodoc:
86
+ # Never mark ParenthesesNode with a newline flag, mark children instead.
87
+ end
88
+ end
89
+
90
+ class IfNode < Node
91
+ def newline!(lines) # :nodoc:
92
+ predicate.newline!(lines)
93
+ end
94
+ end
95
+
96
+ class UnlessNode < Node
97
+ def newline!(lines) # :nodoc:
98
+ predicate.newline!(lines)
99
+ end
100
+ end
101
+
102
+ class UntilNode < Node
103
+ def newline!(lines) # :nodoc:
104
+ predicate.newline!(lines)
105
+ end
106
+ end
107
+
108
+ class WhileNode < Node
109
+ def newline!(lines) # :nodoc:
110
+ predicate.newline!(lines)
111
+ end
112
+ end
113
+
114
+ class RescueModifierNode < Node
115
+ def newline!(lines) # :nodoc:
116
+ expression.newline!(lines)
117
+ end
118
+ end
119
+
120
+ class InterpolatedMatchLastLineNode < Node
121
+ def newline!(lines) # :nodoc:
122
+ first = parts.first
123
+ first.newline!(lines) if first
124
+ end
125
+ end
126
+
127
+ class InterpolatedRegularExpressionNode < Node
128
+ def newline!(lines) # :nodoc:
129
+ first = parts.first
130
+ first.newline!(lines) if first
131
+ end
132
+ end
133
+
134
+ class InterpolatedStringNode < Node
135
+ def newline!(lines) # :nodoc:
136
+ first = parts.first
137
+ first.newline!(lines) if first
138
+ end
139
+ end
56
140
 
57
- private_constant :Newlines
141
+ class InterpolatedSymbolNode < Node
142
+ def newline!(lines) # :nodoc:
143
+ first = parts.first
144
+ first.newline!(lines) if first
145
+ end
146
+ end
58
147
 
59
- # Walk the tree and mark nodes that are on a new line.
60
- def mark_newlines!
61
- value.accept(Newlines.new(Array.new(1 + source.offsets.size, false))) # steep:ignore
148
+ class InterpolatedXStringNode < Node
149
+ def newline!(lines) # :nodoc:
150
+ first = parts.first
151
+ first.newline!(lines) if first
62
152
  end
63
153
  end
64
154
  end
@@ -574,6 +574,12 @@ module Prism
574
574
 
575
575
  # This is a result specific to the `parse` and `parse_file` methods.
576
576
  class ParseResult < Result
577
+ autoload :Comments, "prism/parse_result/comments"
578
+ autoload :Newlines, "prism/parse_result/newlines"
579
+
580
+ private_constant :Comments
581
+ private_constant :Newlines
582
+
577
583
  # The syntax tree that was parsed from the source code.
578
584
  attr_reader :value
579
585
 
@@ -587,6 +593,17 @@ module Prism
587
593
  def deconstruct_keys(keys)
588
594
  super.merge!(value: value)
589
595
  end
596
+
597
+ # Attach the list of comments to their respective locations in the tree.
598
+ def attach_comments!
599
+ Comments.new(self).attach! # steep:ignore
600
+ end
601
+
602
+ # Walk the tree and mark nodes that are on a new line, loosely emulating
603
+ # the behavior of CRuby's `:line` tracepoint event.
604
+ def mark_newlines!
605
+ value.accept(Newlines.new(source.offsets.size)) # steep:ignore
606
+ end
590
607
  end
591
608
 
592
609
  # This is a result specific to the `lex` and `lex_file` methods.
@@ -142,7 +142,7 @@ module Prism
142
142
  when :call_node
143
143
  [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), ConstantField.new(:name), OptionalLocationField.new(:message_loc), OptionalLocationField.new(:opening_loc), OptionalNodeField.new(:arguments), OptionalLocationField.new(:closing_loc), OptionalNodeField.new(:block)]
144
144
  when :call_operator_write_node
145
- [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), ConstantField.new(:operator), LocationField.new(:operator_loc), NodeField.new(:value)]
145
+ [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), ConstantField.new(:binary_operator), LocationField.new(:binary_operator_loc), NodeField.new(:value)]
146
146
  when :call_or_write_node
147
147
  [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), OptionalLocationField.new(:message_loc), ConstantField.new(:read_name), ConstantField.new(:write_name), LocationField.new(:operator_loc), NodeField.new(:value)]
148
148
  when :call_target_node
@@ -158,7 +158,7 @@ module Prism
158
158
  when :class_variable_and_write_node
159
159
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
160
160
  when :class_variable_operator_write_node
161
- [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
161
+ [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:binary_operator)]
162
162
  when :class_variable_or_write_node
163
163
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
164
164
  when :class_variable_read_node
@@ -170,7 +170,7 @@ module Prism
170
170
  when :constant_and_write_node
171
171
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
172
172
  when :constant_operator_write_node
173
- [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
173
+ [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:binary_operator)]
174
174
  when :constant_or_write_node
175
175
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
176
176
  when :constant_path_and_write_node
@@ -178,7 +178,7 @@ module Prism
178
178
  when :constant_path_node
179
179
  [OptionalNodeField.new(:parent), OptionalConstantField.new(:name), LocationField.new(:delimiter_loc), LocationField.new(:name_loc)]
180
180
  when :constant_path_operator_write_node
181
- [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
181
+ [NodeField.new(:target), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:binary_operator)]
182
182
  when :constant_path_or_write_node
183
183
  [NodeField.new(:target), LocationField.new(:operator_loc), NodeField.new(:value)]
184
184
  when :constant_path_target_node
@@ -222,7 +222,7 @@ module Prism
222
222
  when :global_variable_and_write_node
223
223
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
224
224
  when :global_variable_operator_write_node
225
- [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
225
+ [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:binary_operator)]
226
226
  when :global_variable_or_write_node
227
227
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
228
228
  when :global_variable_read_node
@@ -248,7 +248,7 @@ module Prism
248
248
  when :index_and_write_node
249
249
  [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), LocationField.new(:operator_loc), NodeField.new(:value)]
250
250
  when :index_operator_write_node
251
- [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), ConstantField.new(:operator), LocationField.new(:operator_loc), NodeField.new(:value)]
251
+ [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), ConstantField.new(:binary_operator), LocationField.new(:binary_operator_loc), NodeField.new(:value)]
252
252
  when :index_or_write_node
253
253
  [FlagsField.new(:flags, [:safe_navigation?, :variable_call?, :attribute_write?, :ignore_visibility?]), OptionalNodeField.new(:receiver), OptionalLocationField.new(:call_operator_loc), LocationField.new(:opening_loc), OptionalNodeField.new(:arguments), LocationField.new(:closing_loc), OptionalNodeField.new(:block), LocationField.new(:operator_loc), NodeField.new(:value)]
254
254
  when :index_target_node
@@ -256,7 +256,7 @@ module Prism
256
256
  when :instance_variable_and_write_node
257
257
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
258
258
  when :instance_variable_operator_write_node
259
- [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:operator)]
259
+ [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:binary_operator)]
260
260
  when :instance_variable_or_write_node
261
261
  [ConstantField.new(:name), LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value)]
262
262
  when :instance_variable_read_node
@@ -277,6 +277,8 @@ module Prism
277
277
  [OptionalLocationField.new(:opening_loc), NodeListField.new(:parts), OptionalLocationField.new(:closing_loc)]
278
278
  when :interpolated_x_string_node
279
279
  [LocationField.new(:opening_loc), NodeListField.new(:parts), LocationField.new(:closing_loc)]
280
+ when :it_local_variable_read_node
281
+ []
280
282
  when :it_parameters_node
281
283
  []
282
284
  when :keyword_hash_node
@@ -288,7 +290,7 @@ module Prism
288
290
  when :local_variable_and_write_node
289
291
  [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), IntegerField.new(:depth)]
290
292
  when :local_variable_operator_write_node
291
- [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), ConstantField.new(:operator), IntegerField.new(:depth)]
293
+ [LocationField.new(:name_loc), LocationField.new(:binary_operator_loc), NodeField.new(:value), ConstantField.new(:name), ConstantField.new(:binary_operator), IntegerField.new(:depth)]
292
294
  when :local_variable_or_write_node
293
295
  [LocationField.new(:name_loc), LocationField.new(:operator_loc), NodeField.new(:value), ConstantField.new(:name), IntegerField.new(:depth)]
294
296
  when :local_variable_read_node
@@ -346,7 +348,7 @@ module Prism
346
348
  when :range_node
347
349
  [FlagsField.new(:flags, [:exclude_end?]), OptionalNodeField.new(:left), OptionalNodeField.new(:right), LocationField.new(:operator_loc)]
348
350
  when :rational_node
349
- [NodeField.new(:numeric)]
351
+ [FlagsField.new(:flags, [:binary?, :decimal?, :octal?, :hexadecimal?]), IntegerField.new(:numerator), IntegerField.new(:denominator)]
350
352
  when :redo_node
351
353
  []
352
354
  when :regular_expression_node