prism 1.9.0 → 2.0.0.rc1

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -0
  3. data/Makefile +41 -12
  4. data/README.md +35 -97
  5. data/config.yml +174 -161
  6. data/docs/build_system.md +2 -2
  7. data/docs/configuration.md +5 -4
  8. data/docs/encoding.md +2 -2
  9. data/docs/fuzzing.md +4 -11
  10. data/docs/javascript.md +19 -4
  11. data/docs/mapping.md +1 -1
  12. data/docs/releasing.md +77 -5
  13. data/docs/relocation.md +2 -4
  14. data/docs/serialization.md +21 -24
  15. data/docs/testing.md +46 -29
  16. data/ext/prism/api_node.c +1461 -1401
  17. data/ext/prism/extconf.rb +3 -4
  18. data/ext/prism/extension.c +778 -422
  19. data/ext/prism/extension.h +3 -3
  20. data/include/prism/arena.h +37 -0
  21. data/include/prism/ast.h +2727 -610
  22. data/include/prism/buffer.h +52 -0
  23. data/include/prism/comments.h +55 -0
  24. data/include/prism/compiler/accel.h +24 -0
  25. data/include/prism/compiler/align.h +36 -0
  26. data/include/prism/compiler/assume.h +25 -0
  27. data/include/prism/compiler/exported.h +24 -0
  28. data/include/prism/compiler/fallthrough.h +22 -0
  29. data/include/prism/compiler/filesystem.h +32 -0
  30. data/include/prism/compiler/flex_array.h +19 -0
  31. data/include/prism/compiler/force_inline.h +21 -0
  32. data/include/prism/compiler/format.h +25 -0
  33. data/include/prism/compiler/inline.h +17 -0
  34. data/include/prism/compiler/nodiscard.h +22 -0
  35. data/include/prism/compiler/nonnull.h +18 -0
  36. data/include/prism/compiler/unused.h +18 -0
  37. data/include/prism/constant_pool.h +81 -0
  38. data/include/prism/diagnostic.h +38 -403
  39. data/include/prism/errors_format.h +53 -0
  40. data/include/prism/excludes.h +29 -0
  41. data/include/prism/integer.h +41 -0
  42. data/include/prism/internal/allocator.h +68 -0
  43. data/include/prism/internal/allocator_debug.h +88 -0
  44. data/include/prism/internal/arena.h +108 -0
  45. data/include/prism/internal/bit.h +42 -0
  46. data/include/prism/internal/buffer.h +91 -0
  47. data/include/prism/internal/char.h +145 -0
  48. data/include/prism/internal/comments.h +53 -0
  49. data/include/prism/internal/constant_pool.h +152 -0
  50. data/include/prism/internal/diagnostic.h +389 -0
  51. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  52. data/include/prism/internal/integer.h +68 -0
  53. data/include/prism/internal/isinf.h +16 -0
  54. data/include/prism/internal/line_offset_list.h +34 -0
  55. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  56. data/include/prism/internal/magic_comments.h +23 -0
  57. data/include/prism/internal/memchr.h +15 -0
  58. data/include/prism/internal/node.h +38 -0
  59. data/include/prism/internal/options.h +232 -0
  60. data/include/prism/internal/parser.h +984 -0
  61. data/include/prism/internal/regexp.h +26 -0
  62. data/include/prism/internal/serialize.h +39 -0
  63. data/include/prism/internal/source.h +72 -0
  64. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  65. data/include/prism/internal/stringy.h +35 -0
  66. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  67. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  68. data/include/prism/internal/tokens.h +11 -0
  69. data/include/prism/json.h +32 -0
  70. data/include/prism/line_offset_list.h +61 -0
  71. data/include/prism/magic_comments.h +35 -0
  72. data/include/prism/node.h +18 -53
  73. data/include/prism/options.h +146 -280
  74. data/include/prism/parser.h +336 -868
  75. data/include/prism/prettyprint.h +6 -9
  76. data/include/prism/serialize.h +115 -0
  77. data/include/prism/source.h +155 -0
  78. data/include/prism/stream.h +28 -0
  79. data/include/prism/string_query.h +63 -0
  80. data/include/prism/stringy.h +72 -0
  81. data/include/prism/version.h +12 -3
  82. data/include/prism.h +43 -320
  83. data/lib/prism/compiler.rb +319 -305
  84. data/lib/prism/desugar_compiler.rb +105 -34
  85. data/lib/prism/dispatcher.rb +646 -473
  86. data/lib/prism/dot_visitor.rb +592 -511
  87. data/lib/prism/dsl.rb +391 -25
  88. data/lib/prism/ffi.rb +252 -90
  89. data/lib/prism/inspect_visitor.rb +357 -325
  90. data/lib/prism/lex_compat.rb +254 -212
  91. data/lib/prism/mutation_compiler.rb +313 -305
  92. data/lib/prism/node.rb +20268 -7030
  93. data/lib/prism/node_ext.rb +180 -187
  94. data/lib/prism/node_find.rb +215 -0
  95. data/lib/prism/parse_result/errors.rb +7 -1
  96. data/lib/prism/parse_result/newlines.rb +276 -8
  97. data/lib/prism/parse_result.rb +453 -139
  98. data/lib/prism/pattern.rb +65 -20
  99. data/lib/prism/reflection.rb +23 -12
  100. data/lib/prism/relocation.rb +149 -87
  101. data/lib/prism/serialize.rb +3443 -535
  102. data/lib/prism/string_query.rb +16 -1
  103. data/lib/prism/translation/parser/builder.rb +10 -2
  104. data/lib/prism/translation/parser/compiler.rb +44 -52
  105. data/lib/prism/translation/parser/lexer.rb +41 -92
  106. data/lib/prism/translation/parser.rb +1 -1
  107. data/lib/prism/translation/parser_current.rb +1 -1
  108. data/lib/prism/translation/ripper/lexer.rb +8 -10
  109. data/lib/prism/translation/ripper/sexp.rb +2 -10
  110. data/lib/prism/translation/ripper/shim.rb +2 -0
  111. data/lib/prism/translation/ripper.rb +967 -209
  112. data/lib/prism/translation/ruby_parser.rb +73 -316
  113. data/lib/prism/translation.rb +2 -0
  114. data/lib/prism/visitor.rb +632 -5
  115. data/lib/prism.rb +79 -9
  116. data/prism.gemspec +122 -60
  117. data/rbi/generated/prism/compiler.rbi +489 -0
  118. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  119. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  120. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  121. data/rbi/generated/prism/dsl.rbi +751 -0
  122. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  123. data/rbi/generated/prism/lex_compat.rbi +162 -0
  124. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  125. data/rbi/generated/prism/node.rbi +13681 -0
  126. data/rbi/generated/prism/node_ext.rbi +259 -0
  127. data/rbi/generated/prism/node_find.rbi +79 -0
  128. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  129. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  130. data/rbi/generated/prism/parse_result.rbi +764 -0
  131. data/rbi/generated/prism/pattern.rbi +134 -0
  132. data/rbi/generated/prism/reflection.rbi +89 -0
  133. data/rbi/generated/prism/relocation.rbi +329 -0
  134. data/rbi/generated/prism/serialize.rbi +181 -0
  135. data/rbi/generated/prism/string_query.rbi +36 -0
  136. data/rbi/generated/prism/translation.rbi +7 -0
  137. data/rbi/generated/prism/visitor.rbi +650 -0
  138. data/rbi/generated/prism.rbi +86 -0
  139. data/rbi/prism/translation/parser_versions.rbi +5 -0
  140. data/rbi/rubyvm/node_find.rbi +14 -0
  141. data/sig/generated/prism/compiler.rbs +492 -0
  142. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  143. data/sig/generated/prism/dispatcher.rbs +1292 -0
  144. data/sig/generated/prism/dot_visitor.rbs +635 -0
  145. data/sig/generated/prism/dsl.rbs +928 -0
  146. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  147. data/sig/generated/prism/lex_compat.rbs +166 -0
  148. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  149. data/sig/generated/prism/node.rbs +20160 -0
  150. data/sig/generated/prism/node_ext.rbs +290 -0
  151. data/sig/generated/prism/node_find.rbs +90 -0
  152. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  153. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  154. data/sig/generated/prism/parse_result.rbs +859 -0
  155. data/sig/generated/prism/pattern.rbs +156 -0
  156. data/sig/generated/prism/reflection.rbs +101 -0
  157. data/sig/generated/prism/relocation.rbs +428 -0
  158. data/sig/generated/prism/serialize.rbs +195 -0
  159. data/sig/generated/prism/string_query.rbs +36 -0
  160. data/sig/generated/prism/translation.rbs +8 -0
  161. data/sig/generated/prism/visitor.rbs +1111 -0
  162. data/sig/generated/prism.rbs +84 -0
  163. data/sig/manifest.yaml +2 -0
  164. data/src/arena.c +117 -0
  165. data/src/{util/pm_buffer.c → buffer.c} +44 -21
  166. data/src/{util/pm_char.c → char.c} +28 -57
  167. data/src/comments.c +454 -0
  168. data/src/constant_pool.c +406 -0
  169. data/src/diagnostic.c +97 -65
  170. data/src/encoding.c +8 -3
  171. data/src/errors_format.c +519 -0
  172. data/src/{util/pm_integer.c → integer.c} +33 -22
  173. data/src/json.c +5733 -0
  174. data/src/line_offset_list.c +100 -0
  175. data/src/list.c +24 -0
  176. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  177. data/src/node.c +3504 -7674
  178. data/src/options.c +162 -49
  179. data/src/parser.c +349 -0
  180. data/src/prettyprint.c +421 -354
  181. data/src/prism.c +8030 -6970
  182. data/src/regexp.c +961 -45
  183. data/src/serialize.c +459 -424
  184. data/src/source.c +518 -0
  185. data/src/static_literals.c +111 -43
  186. data/src/string_query.c +166 -0
  187. data/src/stringy.c +91 -0
  188. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  189. data/src/strpbrk.c +447 -0
  190. data/src/{token_type.c → tokens.c} +39 -18
  191. metadata +122 -61
  192. data/ext/prism/api_pack.c +0 -276
  193. data/include/prism/defines.h +0 -260
  194. data/include/prism/pack.h +0 -163
  195. data/include/prism/regexp.h +0 -43
  196. data/include/prism/util/pm_buffer.h +0 -236
  197. data/include/prism/util/pm_char.h +0 -204
  198. data/include/prism/util/pm_constant_pool.h +0 -218
  199. data/include/prism/util/pm_integer.h +0 -130
  200. data/include/prism/util/pm_memchr.h +0 -29
  201. data/include/prism/util/pm_newline_list.h +0 -113
  202. data/include/prism/util/pm_string.h +0 -200
  203. data/lib/prism/pack.rb +0 -230
  204. data/lib/prism/parse_result/comments.rb +0 -188
  205. data/rbi/prism/compiler.rbi +0 -12
  206. data/rbi/prism/dsl.rbi +0 -524
  207. data/rbi/prism/inspect_visitor.rbi +0 -12
  208. data/rbi/prism/node.rbi +0 -8750
  209. data/rbi/prism/node_ext.rbi +0 -107
  210. data/rbi/prism/parse_result.rbi +0 -404
  211. data/rbi/prism/reflection.rbi +0 -58
  212. data/rbi/prism/string_query.rbi +0 -12
  213. data/rbi/prism/visitor.rbi +0 -473
  214. data/rbi/prism.rbi +0 -63
  215. data/sig/prism/compiler.rbs +0 -9
  216. data/sig/prism/dispatcher.rbs +0 -19
  217. data/sig/prism/dot_visitor.rbs +0 -6
  218. data/sig/prism/dsl.rbs +0 -351
  219. data/sig/prism/inspect_visitor.rbs +0 -22
  220. data/sig/prism/lex_compat.rbs +0 -10
  221. data/sig/prism/node.rbs +0 -4042
  222. data/sig/prism/node_ext.rbs +0 -149
  223. data/sig/prism/pack.rbs +0 -43
  224. data/sig/prism/parse_result/comments.rbs +0 -38
  225. data/sig/prism/parse_result.rbs +0 -197
  226. data/sig/prism/pattern.rbs +0 -13
  227. data/sig/prism/reflection.rbs +0 -50
  228. data/sig/prism/relocation.rbs +0 -185
  229. data/sig/prism/serialize.rbs +0 -8
  230. data/sig/prism/string_query.rbs +0 -11
  231. data/sig/prism/visitor.rbs +0 -169
  232. data/sig/prism.rbs +0 -272
  233. data/src/pack.c +0 -509
  234. data/src/util/pm_constant_pool.c +0 -342
  235. data/src/util/pm_list.c +0 -49
  236. data/src/util/pm_newline_list.c +0 -125
  237. data/src/util/pm_string.c +0 -381
  238. data/src/util/pm_strpbrk.c +0 -206
@@ -0,0 +1,306 @@
1
+ # typed: true
2
+
3
+ module Prism
4
+ class DesugarAndWriteNode
5
+ include DSL
6
+
7
+ sig { returns(::T.any(ClassVariableAndWriteNode, ConstantAndWriteNode, GlobalVariableAndWriteNode, InstanceVariableAndWriteNode, LocalVariableAndWriteNode)) }
8
+ attr_reader :node
9
+
10
+ sig { returns(Source) }
11
+ attr_reader :default_source
12
+
13
+ sig { returns(Symbol) }
14
+ attr_reader :read_class
15
+
16
+ sig { returns(Symbol) }
17
+ attr_reader :write_class
18
+
19
+ sig { returns(T::Hash[Symbol, ::T.untyped]) }
20
+ attr_reader :arguments
21
+
22
+ sig { params(node: ::T.any(ClassVariableAndWriteNode, ConstantAndWriteNode, GlobalVariableAndWriteNode, InstanceVariableAndWriteNode, LocalVariableAndWriteNode), default_source: Source, read_class: Symbol, write_class: Symbol, arguments: ::T.untyped).void }
23
+ def initialize(node, default_source, read_class, write_class, **arguments); end
24
+
25
+ # Desugar `x &&= y` to `x && x = y`
26
+ sig { returns(Node) }
27
+ def compile; end
28
+ end
29
+
30
+ class DesugarOrWriteDefinedNode
31
+ include DSL
32
+
33
+ sig { returns(::T.any(ClassVariableOrWriteNode, ConstantOrWriteNode, GlobalVariableOrWriteNode)) }
34
+ attr_reader :node
35
+
36
+ sig { returns(Source) }
37
+ attr_reader :default_source
38
+
39
+ sig { returns(Symbol) }
40
+ attr_reader :read_class
41
+
42
+ sig { returns(Symbol) }
43
+ attr_reader :write_class
44
+
45
+ sig { returns(T::Hash[Symbol, ::T.untyped]) }
46
+ attr_reader :arguments
47
+
48
+ sig { params(node: ::T.any(ClassVariableOrWriteNode, ConstantOrWriteNode, GlobalVariableOrWriteNode), default_source: Source, read_class: Symbol, write_class: Symbol, arguments: ::T.untyped).void }
49
+ def initialize(node, default_source, read_class, write_class, **arguments); end
50
+
51
+ # Desugar `x ||= y` to `defined?(x) ? x : x = y`
52
+ sig { returns(Node) }
53
+ def compile; end
54
+ end
55
+
56
+ class DesugarOperatorWriteNode
57
+ include DSL
58
+
59
+ sig { returns(::T.any(ClassVariableOperatorWriteNode, ConstantOperatorWriteNode, GlobalVariableOperatorWriteNode, InstanceVariableOperatorWriteNode, LocalVariableOperatorWriteNode)) }
60
+ attr_reader :node
61
+
62
+ sig { returns(Source) }
63
+ attr_reader :default_source
64
+
65
+ sig { returns(Symbol) }
66
+ attr_reader :read_class
67
+
68
+ sig { returns(Symbol) }
69
+ attr_reader :write_class
70
+
71
+ sig { returns(T::Hash[Symbol, ::T.untyped]) }
72
+ attr_reader :arguments
73
+
74
+ sig { params(node: ::T.any(ClassVariableOperatorWriteNode, ConstantOperatorWriteNode, GlobalVariableOperatorWriteNode, InstanceVariableOperatorWriteNode, LocalVariableOperatorWriteNode), default_source: Source, read_class: Symbol, write_class: Symbol, arguments: ::T.untyped).void }
75
+ def initialize(node, default_source, read_class, write_class, **arguments); end
76
+
77
+ # Desugar `x += y` to `x = x + y`
78
+ sig { returns(Node) }
79
+ def compile; end
80
+ end
81
+
82
+ class DesugarOrWriteNode
83
+ include DSL
84
+
85
+ sig { returns(::T.any(InstanceVariableOrWriteNode, LocalVariableOrWriteNode)) }
86
+ attr_reader :node
87
+
88
+ sig { returns(Source) }
89
+ attr_reader :default_source
90
+
91
+ sig { returns(Symbol) }
92
+ attr_reader :read_class
93
+
94
+ sig { returns(Symbol) }
95
+ attr_reader :write_class
96
+
97
+ sig { returns(T::Hash[Symbol, ::T.untyped]) }
98
+ attr_reader :arguments
99
+
100
+ sig { params(node: ::T.any(InstanceVariableOrWriteNode, LocalVariableOrWriteNode), default_source: Source, read_class: Symbol, write_class: Symbol, arguments: ::T.untyped).void }
101
+ def initialize(node, default_source, read_class, write_class, **arguments); end
102
+
103
+ # Desugar `x ||= y` to `x || x = y`
104
+ sig { returns(Node) }
105
+ def compile; end
106
+ end
107
+
108
+ class ClassVariableAndWriteNode
109
+ sig { returns(Node) }
110
+ def desugar; end
111
+ end
112
+
113
+ class ClassVariableOrWriteNode
114
+ sig { returns(Node) }
115
+ def desugar; end
116
+ end
117
+
118
+ class ClassVariableOperatorWriteNode
119
+ sig { returns(Node) }
120
+ def desugar; end
121
+ end
122
+
123
+ class ConstantAndWriteNode
124
+ sig { returns(Node) }
125
+ def desugar; end
126
+ end
127
+
128
+ class ConstantOrWriteNode
129
+ sig { returns(Node) }
130
+ def desugar; end
131
+ end
132
+
133
+ class ConstantOperatorWriteNode
134
+ sig { returns(Node) }
135
+ def desugar; end
136
+ end
137
+
138
+ class GlobalVariableAndWriteNode
139
+ sig { returns(Node) }
140
+ def desugar; end
141
+ end
142
+
143
+ class GlobalVariableOrWriteNode
144
+ sig { returns(Node) }
145
+ def desugar; end
146
+ end
147
+
148
+ class GlobalVariableOperatorWriteNode
149
+ sig { returns(Node) }
150
+ def desugar; end
151
+ end
152
+
153
+ class InstanceVariableAndWriteNode
154
+ sig { returns(Node) }
155
+ def desugar; end
156
+ end
157
+
158
+ class InstanceVariableOrWriteNode
159
+ sig { returns(Node) }
160
+ def desugar; end
161
+ end
162
+
163
+ class InstanceVariableOperatorWriteNode
164
+ sig { returns(Node) }
165
+ def desugar; end
166
+ end
167
+
168
+ class LocalVariableAndWriteNode
169
+ sig { returns(Node) }
170
+ def desugar; end
171
+ end
172
+
173
+ class LocalVariableOrWriteNode
174
+ sig { returns(Node) }
175
+ def desugar; end
176
+ end
177
+
178
+ class LocalVariableOperatorWriteNode
179
+ sig { returns(Node) }
180
+ def desugar; end
181
+ end
182
+
183
+ # DesugarCompiler is a compiler that desugars Ruby code into a more primitive
184
+ # form. This is useful for consumers that want to deal with fewer node types.
185
+ class DesugarCompiler < MutationCompiler
186
+ # `@@foo &&= bar`
187
+ #
188
+ # becomes
189
+ #
190
+ # `@@foo && @@foo = bar`
191
+ sig { params(node: ClassVariableAndWriteNode).returns(Node) }
192
+ def visit_class_variable_and_write_node(node); end
193
+
194
+ # `@@foo ||= bar`
195
+ #
196
+ # becomes
197
+ #
198
+ # `defined?(@@foo) ? @@foo : @@foo = bar`
199
+ sig { params(node: ClassVariableOrWriteNode).returns(Node) }
200
+ def visit_class_variable_or_write_node(node); end
201
+
202
+ # `@@foo += bar`
203
+ #
204
+ # becomes
205
+ #
206
+ # `@@foo = @@foo + bar`
207
+ sig { params(node: ClassVariableOperatorWriteNode).returns(Node) }
208
+ def visit_class_variable_operator_write_node(node); end
209
+
210
+ # `Foo &&= bar`
211
+ #
212
+ # becomes
213
+ #
214
+ # `Foo && Foo = bar`
215
+ sig { params(node: ConstantAndWriteNode).returns(Node) }
216
+ def visit_constant_and_write_node(node); end
217
+
218
+ # `Foo ||= bar`
219
+ #
220
+ # becomes
221
+ #
222
+ # `defined?(Foo) ? Foo : Foo = bar`
223
+ sig { params(node: ConstantOrWriteNode).returns(Node) }
224
+ def visit_constant_or_write_node(node); end
225
+
226
+ # `Foo += bar`
227
+ #
228
+ # becomes
229
+ #
230
+ # `Foo = Foo + bar`
231
+ sig { params(node: ConstantOperatorWriteNode).returns(Node) }
232
+ def visit_constant_operator_write_node(node); end
233
+
234
+ # `$foo &&= bar`
235
+ #
236
+ # becomes
237
+ #
238
+ # `$foo && $foo = bar`
239
+ sig { params(node: GlobalVariableAndWriteNode).returns(Node) }
240
+ def visit_global_variable_and_write_node(node); end
241
+
242
+ # `$foo ||= bar`
243
+ #
244
+ # becomes
245
+ #
246
+ # `defined?($foo) ? $foo : $foo = bar`
247
+ sig { params(node: GlobalVariableOrWriteNode).returns(Node) }
248
+ def visit_global_variable_or_write_node(node); end
249
+
250
+ # `$foo += bar`
251
+ #
252
+ # becomes
253
+ #
254
+ # `$foo = $foo + bar`
255
+ sig { params(node: GlobalVariableOperatorWriteNode).returns(Node) }
256
+ def visit_global_variable_operator_write_node(node); end
257
+
258
+ # `@foo &&= bar`
259
+ #
260
+ # becomes
261
+ #
262
+ # `@foo && @foo = bar`
263
+ sig { params(node: InstanceVariableAndWriteNode).returns(Node) }
264
+ def visit_instance_variable_and_write_node(node); end
265
+
266
+ # `@foo ||= bar`
267
+ #
268
+ # becomes
269
+ #
270
+ # `@foo || @foo = bar`
271
+ sig { params(node: InstanceVariableOrWriteNode).returns(Node) }
272
+ def visit_instance_variable_or_write_node(node); end
273
+
274
+ # `@foo += bar`
275
+ #
276
+ # becomes
277
+ #
278
+ # `@foo = @foo + bar`
279
+ sig { params(node: InstanceVariableOperatorWriteNode).returns(Node) }
280
+ def visit_instance_variable_operator_write_node(node); end
281
+
282
+ # `foo &&= bar`
283
+ #
284
+ # becomes
285
+ #
286
+ # `foo && foo = bar`
287
+ sig { params(node: LocalVariableAndWriteNode).returns(Node) }
288
+ def visit_local_variable_and_write_node(node); end
289
+
290
+ # `foo ||= bar`
291
+ #
292
+ # becomes
293
+ #
294
+ # `foo || foo = bar`
295
+ sig { params(node: LocalVariableOrWriteNode).returns(Node) }
296
+ def visit_local_variable_or_write_node(node); end
297
+
298
+ # `foo += bar`
299
+ #
300
+ # becomes
301
+ #
302
+ # `foo = foo + bar`
303
+ sig { params(node: LocalVariableOperatorWriteNode).returns(Node) }
304
+ def visit_local_variable_operator_write_node(node); end
305
+ end
306
+ end