prism 0.19.0 → 0.24.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +102 -1
  3. data/Makefile +5 -0
  4. data/README.md +9 -6
  5. data/config.yml +236 -38
  6. data/docs/build_system.md +19 -2
  7. data/docs/cruby_compilation.md +27 -0
  8. data/docs/parser_translation.md +34 -0
  9. data/docs/parsing_rules.md +19 -0
  10. data/docs/releasing.md +84 -16
  11. data/docs/ruby_api.md +1 -1
  12. data/docs/ruby_parser_translation.md +19 -0
  13. data/docs/serialization.md +19 -5
  14. data/ext/prism/api_node.c +1989 -1525
  15. data/ext/prism/extension.c +130 -30
  16. data/ext/prism/extension.h +2 -2
  17. data/include/prism/ast.h +1700 -505
  18. data/include/prism/defines.h +8 -0
  19. data/include/prism/diagnostic.h +49 -7
  20. data/include/prism/encoding.h +17 -0
  21. data/include/prism/options.h +40 -14
  22. data/include/prism/parser.h +34 -18
  23. data/include/prism/util/pm_buffer.h +9 -0
  24. data/include/prism/util/pm_constant_pool.h +18 -0
  25. data/include/prism/util/pm_newline_list.h +4 -14
  26. data/include/prism/util/pm_strpbrk.h +4 -1
  27. data/include/prism/version.h +2 -2
  28. data/include/prism.h +19 -2
  29. data/lib/prism/debug.rb +11 -5
  30. data/lib/prism/desugar_compiler.rb +225 -80
  31. data/lib/prism/dot_visitor.rb +36 -14
  32. data/lib/prism/dsl.rb +302 -299
  33. data/lib/prism/ffi.rb +107 -76
  34. data/lib/prism/lex_compat.rb +17 -1
  35. data/lib/prism/node.rb +4580 -2607
  36. data/lib/prism/node_ext.rb +27 -4
  37. data/lib/prism/parse_result.rb +75 -29
  38. data/lib/prism/serialize.rb +633 -305
  39. data/lib/prism/translation/parser/compiler.rb +1838 -0
  40. data/lib/prism/translation/parser/lexer.rb +335 -0
  41. data/lib/prism/translation/parser/rubocop.rb +45 -0
  42. data/lib/prism/translation/parser.rb +190 -0
  43. data/lib/prism/translation/parser33.rb +12 -0
  44. data/lib/prism/translation/parser34.rb +12 -0
  45. data/lib/prism/translation/ripper.rb +696 -0
  46. data/lib/prism/translation/ruby_parser.rb +1521 -0
  47. data/lib/prism/translation.rb +11 -0
  48. data/lib/prism.rb +1 -1
  49. data/prism.gemspec +18 -7
  50. data/rbi/prism.rbi +150 -88
  51. data/rbi/prism_static.rbi +15 -3
  52. data/sig/prism.rbs +996 -961
  53. data/sig/prism_static.rbs +123 -46
  54. data/src/diagnostic.c +264 -219
  55. data/src/encoding.c +21 -26
  56. data/src/node.c +2 -6
  57. data/src/options.c +29 -5
  58. data/src/prettyprint.c +176 -44
  59. data/src/prism.c +1499 -564
  60. data/src/serialize.c +35 -21
  61. data/src/token_type.c +353 -4
  62. data/src/util/pm_buffer.c +11 -0
  63. data/src/util/pm_constant_pool.c +37 -11
  64. data/src/util/pm_newline_list.c +6 -15
  65. data/src/util/pm_string.c +0 -7
  66. data/src/util/pm_strpbrk.c +122 -14
  67. metadata +16 -5
  68. data/docs/building.md +0 -29
  69. data/lib/prism/ripper_compat.rb +0 -207
@@ -1,6 +1,216 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Prism
4
+ class DesugarAndWriteNode # :nodoc:
5
+ attr_reader :node, :source, :read_class, :write_class, :arguments
6
+
7
+ def initialize(node, source, read_class, write_class, *arguments)
8
+ @node = node
9
+ @source = source
10
+ @read_class = read_class
11
+ @write_class = write_class
12
+ @arguments = arguments
13
+ end
14
+
15
+ # Desugar `x &&= y` to `x && x = y`
16
+ def compile
17
+ AndNode.new(
18
+ source,
19
+ read_class.new(source, *arguments, node.name_loc),
20
+ write_class.new(source, *arguments, node.name_loc, node.value, node.operator_loc, node.location),
21
+ node.operator_loc,
22
+ node.location
23
+ )
24
+ end
25
+ end
26
+
27
+ class DesugarOrWriteDefinedNode # :nodoc:
28
+ attr_reader :node, :source, :read_class, :write_class, :arguments
29
+
30
+ def initialize(node, source, read_class, write_class, *arguments)
31
+ @node = node
32
+ @source = source
33
+ @read_class = read_class
34
+ @write_class = write_class
35
+ @arguments = arguments
36
+ end
37
+
38
+ # Desugar `x ||= y` to `defined?(x) ? x : x = y`
39
+ def compile
40
+ IfNode.new(
41
+ source,
42
+ node.operator_loc,
43
+ DefinedNode.new(source, nil, read_class.new(source, *arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
44
+ node.operator_loc,
45
+ StatementsNode.new(source, [read_class.new(source, *arguments, node.name_loc)], node.location),
46
+ ElseNode.new(
47
+ source,
48
+ node.operator_loc,
49
+ StatementsNode.new(
50
+ source,
51
+ [write_class.new(source, *arguments, node.name_loc, node.value, node.operator_loc, node.location)],
52
+ node.location
53
+ ),
54
+ node.operator_loc,
55
+ node.location
56
+ ),
57
+ node.operator_loc,
58
+ node.location
59
+ )
60
+ end
61
+ end
62
+
63
+ class DesugarOperatorWriteNode # :nodoc:
64
+ attr_reader :node, :source, :read_class, :write_class, :arguments
65
+
66
+ def initialize(node, source, read_class, write_class, *arguments)
67
+ @node = node
68
+ @source = source
69
+ @read_class = read_class
70
+ @write_class = write_class
71
+ @arguments = arguments
72
+ end
73
+
74
+ # Desugar `x += y` to `x = x + y`
75
+ def compile
76
+ write_class.new(
77
+ source,
78
+ *arguments,
79
+ node.name_loc,
80
+ CallNode.new(
81
+ source,
82
+ 0,
83
+ read_class.new(source, *arguments, node.name_loc),
84
+ nil,
85
+ node.operator_loc.slice.chomp("="),
86
+ node.operator_loc.copy(length: node.operator_loc.length - 1),
87
+ nil,
88
+ ArgumentsNode.new(source, 0, [node.value], node.value.location),
89
+ nil,
90
+ nil,
91
+ node.location
92
+ ),
93
+ node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
94
+ node.location
95
+ )
96
+ end
97
+ end
98
+
99
+ class DesugarOrWriteNode # :nodoc:
100
+ attr_reader :node, :source, :read_class, :write_class, :arguments
101
+
102
+ def initialize(node, source, read_class, write_class, *arguments)
103
+ @node = node
104
+ @source = source
105
+ @read_class = read_class
106
+ @write_class = write_class
107
+ @arguments = arguments
108
+ end
109
+
110
+ # Desugar `x ||= y` to `x || x = y`
111
+ def compile
112
+ OrNode.new(
113
+ source,
114
+ read_class.new(source, *arguments, node.name_loc),
115
+ write_class.new(source, *arguments, node.name_loc, node.value, node.operator_loc, node.location),
116
+ node.operator_loc,
117
+ node.location
118
+ )
119
+ end
120
+ end
121
+
122
+ private_constant :DesugarAndWriteNode, :DesugarOrWriteNode, :DesugarOrWriteDefinedNode, :DesugarOperatorWriteNode
123
+
124
+ class ClassVariableAndWriteNode
125
+ def desugar # :nodoc:
126
+ DesugarAndWriteNode.new(self, source, ClassVariableReadNode, ClassVariableWriteNode, name).compile
127
+ end
128
+ end
129
+
130
+ class ClassVariableOrWriteNode
131
+ def desugar # :nodoc:
132
+ DesugarOrWriteDefinedNode.new(self, source, ClassVariableReadNode, ClassVariableWriteNode, name).compile
133
+ end
134
+ end
135
+
136
+ class ClassVariableOperatorWriteNode
137
+ def desugar # :nodoc:
138
+ DesugarOperatorWriteNode.new(self, source, ClassVariableReadNode, ClassVariableWriteNode, name).compile
139
+ end
140
+ end
141
+
142
+ class ConstantAndWriteNode
143
+ def desugar # :nodoc:
144
+ DesugarAndWriteNode.new(self, source, ConstantReadNode, ConstantWriteNode, name).compile
145
+ end
146
+ end
147
+
148
+ class ConstantOrWriteNode
149
+ def desugar # :nodoc:
150
+ DesugarOrWriteDefinedNode.new(self, source, ConstantReadNode, ConstantWriteNode, name).compile
151
+ end
152
+ end
153
+
154
+ class ConstantOperatorWriteNode
155
+ def desugar # :nodoc:
156
+ DesugarOperatorWriteNode.new(self, source, ConstantReadNode, ConstantWriteNode, name).compile
157
+ end
158
+ end
159
+
160
+ class GlobalVariableAndWriteNode
161
+ def desugar # :nodoc:
162
+ DesugarAndWriteNode.new(self, source, GlobalVariableReadNode, GlobalVariableWriteNode, name).compile
163
+ end
164
+ end
165
+
166
+ class GlobalVariableOrWriteNode
167
+ def desugar # :nodoc:
168
+ DesugarOrWriteDefinedNode.new(self, source, GlobalVariableReadNode, GlobalVariableWriteNode, name).compile
169
+ end
170
+ end
171
+
172
+ class GlobalVariableOperatorWriteNode
173
+ def desugar # :nodoc:
174
+ DesugarOperatorWriteNode.new(self, source, GlobalVariableReadNode, GlobalVariableWriteNode, name).compile
175
+ end
176
+ end
177
+
178
+ class InstanceVariableAndWriteNode
179
+ def desugar # :nodoc:
180
+ DesugarAndWriteNode.new(self, source, InstanceVariableReadNode, InstanceVariableWriteNode, name).compile
181
+ end
182
+ end
183
+
184
+ class InstanceVariableOrWriteNode
185
+ def desugar # :nodoc:
186
+ DesugarOrWriteNode.new(self, source, InstanceVariableReadNode, InstanceVariableWriteNode, name).compile
187
+ end
188
+ end
189
+
190
+ class InstanceVariableOperatorWriteNode
191
+ def desugar # :nodoc:
192
+ DesugarOperatorWriteNode.new(self, source, InstanceVariableReadNode, InstanceVariableWriteNode, name).compile
193
+ end
194
+ end
195
+
196
+ class LocalVariableAndWriteNode
197
+ def desugar # :nodoc:
198
+ DesugarAndWriteNode.new(self, source, LocalVariableReadNode, LocalVariableWriteNode, name, depth).compile
199
+ end
200
+ end
201
+
202
+ class LocalVariableOrWriteNode
203
+ def desugar # :nodoc:
204
+ DesugarOrWriteNode.new(self, source, LocalVariableReadNode, LocalVariableWriteNode, name, depth).compile
205
+ end
206
+ end
207
+
208
+ class LocalVariableOperatorWriteNode
209
+ def desugar # :nodoc:
210
+ DesugarOperatorWriteNode.new(self, source, LocalVariableReadNode, LocalVariableWriteNode, name, depth).compile
211
+ end
212
+ end
213
+
4
214
  # DesugarCompiler is a compiler that desugars Ruby code into a more primitive
5
215
  # form. This is useful for consumers that want to deal with fewer node types.
6
216
  class DesugarCompiler < MutationCompiler
@@ -10,7 +220,7 @@ module Prism
10
220
  #
11
221
  # @@foo && @@foo = bar
12
222
  def visit_class_variable_and_write_node(node)
13
- desugar_and_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
223
+ node.desugar
14
224
  end
15
225
 
16
226
  # @@foo ||= bar
@@ -19,7 +229,7 @@ module Prism
19
229
  #
20
230
  # defined?(@@foo) ? @@foo : @@foo = bar
21
231
  def visit_class_variable_or_write_node(node)
22
- desugar_or_write_defined_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
232
+ node.desugar
23
233
  end
24
234
 
25
235
  # @@foo += bar
@@ -28,7 +238,7 @@ module Prism
28
238
  #
29
239
  # @@foo = @@foo + bar
30
240
  def visit_class_variable_operator_write_node(node)
31
- desugar_operator_write_node(node, ClassVariableReadNode, ClassVariableWriteNode, node.name)
241
+ node.desugar
32
242
  end
33
243
 
34
244
  # Foo &&= bar
@@ -37,7 +247,7 @@ module Prism
37
247
  #
38
248
  # Foo && Foo = bar
39
249
  def visit_constant_and_write_node(node)
40
- desugar_and_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
250
+ node.desugar
41
251
  end
42
252
 
43
253
  # Foo ||= bar
@@ -46,7 +256,7 @@ module Prism
46
256
  #
47
257
  # defined?(Foo) ? Foo : Foo = bar
48
258
  def visit_constant_or_write_node(node)
49
- desugar_or_write_defined_node(node, ConstantReadNode, ConstantWriteNode, node.name)
259
+ node.desugar
50
260
  end
51
261
 
52
262
  # Foo += bar
@@ -55,7 +265,7 @@ module Prism
55
265
  #
56
266
  # Foo = Foo + bar
57
267
  def visit_constant_operator_write_node(node)
58
- desugar_operator_write_node(node, ConstantReadNode, ConstantWriteNode, node.name)
268
+ node.desugar
59
269
  end
60
270
 
61
271
  # $foo &&= bar
@@ -64,7 +274,7 @@ module Prism
64
274
  #
65
275
  # $foo && $foo = bar
66
276
  def visit_global_variable_and_write_node(node)
67
- desugar_and_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
277
+ node.desugar
68
278
  end
69
279
 
70
280
  # $foo ||= bar
@@ -73,7 +283,7 @@ module Prism
73
283
  #
74
284
  # defined?($foo) ? $foo : $foo = bar
75
285
  def visit_global_variable_or_write_node(node)
76
- desugar_or_write_defined_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
286
+ node.desugar
77
287
  end
78
288
 
79
289
  # $foo += bar
@@ -82,7 +292,7 @@ module Prism
82
292
  #
83
293
  # $foo = $foo + bar
84
294
  def visit_global_variable_operator_write_node(node)
85
- desugar_operator_write_node(node, GlobalVariableReadNode, GlobalVariableWriteNode, node.name)
295
+ node.desugar
86
296
  end
87
297
 
88
298
  # @foo &&= bar
@@ -91,7 +301,7 @@ module Prism
91
301
  #
92
302
  # @foo && @foo = bar
93
303
  def visit_instance_variable_and_write_node(node)
94
- desugar_and_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
304
+ node.desugar
95
305
  end
96
306
 
97
307
  # @foo ||= bar
@@ -100,7 +310,7 @@ module Prism
100
310
  #
101
311
  # @foo || @foo = bar
102
312
  def visit_instance_variable_or_write_node(node)
103
- desugar_or_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
313
+ node.desugar
104
314
  end
105
315
 
106
316
  # @foo += bar
@@ -109,7 +319,7 @@ module Prism
109
319
  #
110
320
  # @foo = @foo + bar
111
321
  def visit_instance_variable_operator_write_node(node)
112
- desugar_operator_write_node(node, InstanceVariableReadNode, InstanceVariableWriteNode, node.name)
322
+ node.desugar
113
323
  end
114
324
 
115
325
  # foo &&= bar
@@ -118,7 +328,7 @@ module Prism
118
328
  #
119
329
  # foo && foo = bar
120
330
  def visit_local_variable_and_write_node(node)
121
- desugar_and_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
331
+ node.desugar
122
332
  end
123
333
 
124
334
  # foo ||= bar
@@ -127,7 +337,7 @@ module Prism
127
337
  #
128
338
  # foo || foo = bar
129
339
  def visit_local_variable_or_write_node(node)
130
- desugar_or_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
340
+ node.desugar
131
341
  end
132
342
 
133
343
  # foo += bar
@@ -136,72 +346,7 @@ module Prism
136
346
  #
137
347
  # foo = foo + bar
138
348
  def visit_local_variable_operator_write_node(node)
139
- desugar_operator_write_node(node, LocalVariableReadNode, LocalVariableWriteNode, node.name, node.depth)
140
- end
141
-
142
- private
143
-
144
- # Desugar `x &&= y` to `x && x = y`
145
- def desugar_and_write_node(node, read_class, write_class, *arguments)
146
- AndNode.new(
147
- read_class.new(*arguments, node.name_loc),
148
- write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
149
- node.operator_loc,
150
- node.location
151
- )
152
- end
153
-
154
- # Desugar `x += y` to `x = x + y`
155
- def desugar_operator_write_node(node, read_class, write_class, *arguments)
156
- write_class.new(
157
- *arguments,
158
- node.name_loc,
159
- CallNode.new(
160
- 0,
161
- read_class.new(*arguments, node.name_loc),
162
- nil,
163
- node.operator_loc.slice.chomp("="),
164
- node.operator_loc.copy(length: node.operator_loc.length - 1),
165
- nil,
166
- ArgumentsNode.new(0, [node.value], node.value.location),
167
- nil,
168
- nil,
169
- node.location
170
- ),
171
- node.operator_loc.copy(start_offset: node.operator_loc.end_offset - 1, length: 1),
172
- node.location
173
- )
174
- end
175
-
176
- # Desugar `x ||= y` to `x || x = y`
177
- def desugar_or_write_node(node, read_class, write_class, *arguments)
178
- OrNode.new(
179
- read_class.new(*arguments, node.name_loc),
180
- write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location),
181
- node.operator_loc,
182
- node.location
183
- )
184
- end
185
-
186
- # Desugar `x ||= y` to `defined?(x) ? x : x = y`
187
- def desugar_or_write_defined_node(node, read_class, write_class, *arguments)
188
- IfNode.new(
189
- node.operator_loc,
190
- DefinedNode.new(nil, read_class.new(*arguments, node.name_loc), nil, node.operator_loc, node.name_loc),
191
- node.operator_loc,
192
- StatementsNode.new([read_class.new(*arguments, node.name_loc)], node.location),
193
- ElseNode.new(
194
- node.operator_loc,
195
- StatementsNode.new(
196
- [write_class.new(*arguments, node.name_loc, node.value, node.operator_loc, node.location)],
197
- node.location
198
- ),
199
- node.operator_loc,
200
- node.location
201
- ),
202
- node.operator_loc,
203
- node.location
204
- )
349
+ node.desugar
205
350
  end
206
351
  end
207
352
  end
@@ -353,10 +353,8 @@ module Prism
353
353
  digraph.edge("#{id}:key -> #{node_id(node.key)};")
354
354
 
355
355
  # value
356
- unless (value = node.value).nil?
357
- table.field("value", port: true)
358
- digraph.edge("#{id}:value -> #{node_id(value)};")
359
- end
356
+ table.field("value", port: true)
357
+ digraph.edge("#{id}:value -> #{node_id(node.value)};")
360
358
 
361
359
  # operator_loc
362
360
  unless (operator_loc = node.operator_loc).nil?
@@ -488,6 +486,9 @@ module Prism
488
486
  table = Table.new("BlockLocalVariableNode")
489
487
  id = node_id(node)
490
488
 
489
+ # flags
490
+ table.field("flags", parameter_flags_inspect(node))
491
+
491
492
  # name
492
493
  table.field("name", node.name.inspect)
493
494
 
@@ -508,9 +509,6 @@ module Prism
508
509
  # locals
509
510
  table.field("locals", node.locals.inspect)
510
511
 
511
- # locals_body_index
512
- table.field("locals_body_index", node.locals_body_index.inspect)
513
-
514
512
  # parameters
515
513
  unless (parameters = node.parameters).nil?
516
514
  table.field("parameters", port: true)
@@ -543,6 +541,9 @@ module Prism
543
541
  table = Table.new("BlockParameterNode")
544
542
  id = node_id(node)
545
543
 
544
+ # flags
545
+ table.field("flags", parameter_flags_inspect(node))
546
+
546
547
  # name
547
548
  table.field("name", node.name.inspect)
548
549
 
@@ -1501,9 +1502,6 @@ module Prism
1501
1502
  # locals
1502
1503
  table.field("locals", node.locals.inspect)
1503
1504
 
1504
- # locals_body_index
1505
- table.field("locals_body_index", node.locals_body_index.inspect)
1506
-
1507
1505
  # def_keyword_loc
1508
1506
  table.field("def_keyword_loc", location_inspect(node.def_keyword_loc))
1509
1507
 
@@ -2805,6 +2803,9 @@ module Prism
2805
2803
  table = Table.new("KeywordRestParameterNode")
2806
2804
  id = node_id(node)
2807
2805
 
2806
+ # flags
2807
+ table.field("flags", parameter_flags_inspect(node))
2808
+
2808
2809
  # name
2809
2810
  table.field("name", node.name.inspect)
2810
2811
 
@@ -2833,9 +2834,6 @@ module Prism
2833
2834
  # locals
2834
2835
  table.field("locals", node.locals.inspect)
2835
2836
 
2836
- # locals_body_index
2837
- table.field("locals_body_index", node.locals_body_index.inspect)
2838
-
2839
2837
  # operator_loc
2840
2838
  table.field("operator_loc", location_inspect(node.operator_loc))
2841
2839
 
@@ -3404,6 +3402,9 @@ module Prism
3404
3402
  table = Table.new("OptionalKeywordParameterNode")
3405
3403
  id = node_id(node)
3406
3404
 
3405
+ # flags
3406
+ table.field("flags", parameter_flags_inspect(node))
3407
+
3407
3408
  # name
3408
3409
  table.field("name", node.name.inspect)
3409
3410
 
@@ -3428,6 +3429,9 @@ module Prism
3428
3429
  table = Table.new("OptionalParameterNode")
3429
3430
  id = node_id(node)
3430
3431
 
3432
+ # flags
3433
+ table.field("flags", parameter_flags_inspect(node))
3434
+
3431
3435
  # name
3432
3436
  table.field("name", node.name.inspect)
3433
3437
 
@@ -3810,6 +3814,9 @@ module Prism
3810
3814
  table = Table.new("RequiredKeywordParameterNode")
3811
3815
  id = node_id(node)
3812
3816
 
3817
+ # flags
3818
+ table.field("flags", parameter_flags_inspect(node))
3819
+
3813
3820
  # name
3814
3821
  table.field("name", node.name.inspect)
3815
3822
 
@@ -3830,6 +3837,9 @@ module Prism
3830
3837
  table = Table.new("RequiredParameterNode")
3831
3838
  id = node_id(node)
3832
3839
 
3840
+ # flags
3841
+ table.field("flags", parameter_flags_inspect(node))
3842
+
3833
3843
  # name
3834
3844
  table.field("name", node.name.inspect)
3835
3845
 
@@ -3925,6 +3935,9 @@ module Prism
3925
3935
  table = Table.new("RestParameterNode")
3926
3936
  id = node_id(node)
3927
3937
 
3938
+ # flags
3939
+ table.field("flags", parameter_flags_inspect(node))
3940
+
3928
3941
  # name
3929
3942
  table.field("name", node.name.inspect)
3930
3943
 
@@ -4524,6 +4537,7 @@ module Prism
4524
4537
  flags << "safe_navigation" if node.safe_navigation?
4525
4538
  flags << "variable_call" if node.variable_call?
4526
4539
  flags << "attribute_write" if node.attribute_write?
4540
+ flags << "ignore_visibility" if node.ignore_visibility?
4527
4541
  flags.join(", ")
4528
4542
  end
4529
4543
 
@@ -4551,7 +4565,7 @@ module Prism
4551
4565
  # comma-separated list.
4552
4566
  def keyword_hash_node_flags_inspect(node)
4553
4567
  flags = []
4554
- flags << "static_keys" if node.static_keys?
4568
+ flags << "symbol_keys" if node.symbol_keys?
4555
4569
  flags.join(", ")
4556
4570
  end
4557
4571
 
@@ -4563,6 +4577,14 @@ module Prism
4563
4577
  flags.join(", ")
4564
4578
  end
4565
4579
 
4580
+ # Inspect a node that has parameter_flags flags to display the flags as a
4581
+ # comma-separated list.
4582
+ def parameter_flags_inspect(node)
4583
+ flags = []
4584
+ flags << "repeated_parameter" if node.repeated_parameter?
4585
+ flags.join(", ")
4586
+ end
4587
+
4566
4588
  # Inspect a node that has range_flags flags to display the flags as a
4567
4589
  # comma-separated list.
4568
4590
  def range_flags_inspect(node)