ed-precompiled_prism 1.5.2

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 (154) hide show
  1. checksums.yaml +7 -0
  2. data/BSDmakefile +58 -0
  3. data/CHANGELOG.md +723 -0
  4. data/CODE_OF_CONDUCT.md +76 -0
  5. data/CONTRIBUTING.md +58 -0
  6. data/LICENSE.md +7 -0
  7. data/Makefile +110 -0
  8. data/README.md +143 -0
  9. data/config.yml +4714 -0
  10. data/docs/build_system.md +119 -0
  11. data/docs/configuration.md +68 -0
  12. data/docs/cruby_compilation.md +27 -0
  13. data/docs/design.md +53 -0
  14. data/docs/encoding.md +121 -0
  15. data/docs/fuzzing.md +88 -0
  16. data/docs/heredocs.md +36 -0
  17. data/docs/javascript.md +118 -0
  18. data/docs/local_variable_depth.md +229 -0
  19. data/docs/mapping.md +117 -0
  20. data/docs/parser_translation.md +24 -0
  21. data/docs/parsing_rules.md +22 -0
  22. data/docs/releasing.md +98 -0
  23. data/docs/relocation.md +34 -0
  24. data/docs/ripper_translation.md +72 -0
  25. data/docs/ruby_api.md +44 -0
  26. data/docs/ruby_parser_translation.md +19 -0
  27. data/docs/serialization.md +233 -0
  28. data/docs/testing.md +55 -0
  29. data/ext/prism/api_node.c +6941 -0
  30. data/ext/prism/api_pack.c +276 -0
  31. data/ext/prism/extconf.rb +127 -0
  32. data/ext/prism/extension.c +1419 -0
  33. data/ext/prism/extension.h +19 -0
  34. data/include/prism/ast.h +8220 -0
  35. data/include/prism/defines.h +260 -0
  36. data/include/prism/diagnostic.h +456 -0
  37. data/include/prism/encoding.h +283 -0
  38. data/include/prism/node.h +129 -0
  39. data/include/prism/options.h +482 -0
  40. data/include/prism/pack.h +163 -0
  41. data/include/prism/parser.h +933 -0
  42. data/include/prism/prettyprint.h +34 -0
  43. data/include/prism/regexp.h +43 -0
  44. data/include/prism/static_literals.h +121 -0
  45. data/include/prism/util/pm_buffer.h +236 -0
  46. data/include/prism/util/pm_char.h +204 -0
  47. data/include/prism/util/pm_constant_pool.h +218 -0
  48. data/include/prism/util/pm_integer.h +130 -0
  49. data/include/prism/util/pm_list.h +103 -0
  50. data/include/prism/util/pm_memchr.h +29 -0
  51. data/include/prism/util/pm_newline_list.h +113 -0
  52. data/include/prism/util/pm_string.h +200 -0
  53. data/include/prism/util/pm_strncasecmp.h +32 -0
  54. data/include/prism/util/pm_strpbrk.h +46 -0
  55. data/include/prism/version.h +29 -0
  56. data/include/prism.h +408 -0
  57. data/lib/prism/compiler.rb +801 -0
  58. data/lib/prism/desugar_compiler.rb +392 -0
  59. data/lib/prism/dispatcher.rb +2210 -0
  60. data/lib/prism/dot_visitor.rb +4762 -0
  61. data/lib/prism/dsl.rb +1003 -0
  62. data/lib/prism/ffi.rb +570 -0
  63. data/lib/prism/inspect_visitor.rb +2392 -0
  64. data/lib/prism/lex_compat.rb +928 -0
  65. data/lib/prism/mutation_compiler.rb +772 -0
  66. data/lib/prism/node.rb +18816 -0
  67. data/lib/prism/node_ext.rb +511 -0
  68. data/lib/prism/pack.rb +230 -0
  69. data/lib/prism/parse_result/comments.rb +188 -0
  70. data/lib/prism/parse_result/errors.rb +66 -0
  71. data/lib/prism/parse_result/newlines.rb +155 -0
  72. data/lib/prism/parse_result.rb +911 -0
  73. data/lib/prism/pattern.rb +269 -0
  74. data/lib/prism/polyfill/append_as_bytes.rb +15 -0
  75. data/lib/prism/polyfill/byteindex.rb +13 -0
  76. data/lib/prism/polyfill/scan_byte.rb +14 -0
  77. data/lib/prism/polyfill/unpack1.rb +14 -0
  78. data/lib/prism/polyfill/warn.rb +36 -0
  79. data/lib/prism/reflection.rb +416 -0
  80. data/lib/prism/relocation.rb +505 -0
  81. data/lib/prism/serialize.rb +2398 -0
  82. data/lib/prism/string_query.rb +31 -0
  83. data/lib/prism/translation/parser/builder.rb +62 -0
  84. data/lib/prism/translation/parser/compiler.rb +2234 -0
  85. data/lib/prism/translation/parser/lexer.rb +820 -0
  86. data/lib/prism/translation/parser.rb +374 -0
  87. data/lib/prism/translation/parser33.rb +13 -0
  88. data/lib/prism/translation/parser34.rb +13 -0
  89. data/lib/prism/translation/parser35.rb +13 -0
  90. data/lib/prism/translation/parser_current.rb +24 -0
  91. data/lib/prism/translation/ripper/sexp.rb +126 -0
  92. data/lib/prism/translation/ripper/shim.rb +5 -0
  93. data/lib/prism/translation/ripper.rb +3474 -0
  94. data/lib/prism/translation/ruby_parser.rb +1929 -0
  95. data/lib/prism/translation.rb +16 -0
  96. data/lib/prism/visitor.rb +813 -0
  97. data/lib/prism.rb +97 -0
  98. data/prism.gemspec +174 -0
  99. data/rbi/prism/compiler.rbi +12 -0
  100. data/rbi/prism/dsl.rbi +524 -0
  101. data/rbi/prism/inspect_visitor.rbi +12 -0
  102. data/rbi/prism/node.rbi +8734 -0
  103. data/rbi/prism/node_ext.rbi +107 -0
  104. data/rbi/prism/parse_result.rbi +404 -0
  105. data/rbi/prism/reflection.rbi +58 -0
  106. data/rbi/prism/string_query.rbi +12 -0
  107. data/rbi/prism/translation/parser.rbi +11 -0
  108. data/rbi/prism/translation/parser33.rbi +6 -0
  109. data/rbi/prism/translation/parser34.rbi +6 -0
  110. data/rbi/prism/translation/parser35.rbi +6 -0
  111. data/rbi/prism/translation/ripper.rbi +15 -0
  112. data/rbi/prism/visitor.rbi +473 -0
  113. data/rbi/prism.rbi +66 -0
  114. data/sig/prism/compiler.rbs +9 -0
  115. data/sig/prism/dispatcher.rbs +19 -0
  116. data/sig/prism/dot_visitor.rbs +6 -0
  117. data/sig/prism/dsl.rbs +351 -0
  118. data/sig/prism/inspect_visitor.rbs +22 -0
  119. data/sig/prism/lex_compat.rbs +10 -0
  120. data/sig/prism/mutation_compiler.rbs +159 -0
  121. data/sig/prism/node.rbs +4028 -0
  122. data/sig/prism/node_ext.rbs +149 -0
  123. data/sig/prism/pack.rbs +43 -0
  124. data/sig/prism/parse_result/comments.rbs +38 -0
  125. data/sig/prism/parse_result.rbs +196 -0
  126. data/sig/prism/pattern.rbs +13 -0
  127. data/sig/prism/reflection.rbs +50 -0
  128. data/sig/prism/relocation.rbs +185 -0
  129. data/sig/prism/serialize.rbs +8 -0
  130. data/sig/prism/string_query.rbs +11 -0
  131. data/sig/prism/visitor.rbs +169 -0
  132. data/sig/prism.rbs +254 -0
  133. data/src/diagnostic.c +850 -0
  134. data/src/encoding.c +5235 -0
  135. data/src/node.c +8676 -0
  136. data/src/options.c +328 -0
  137. data/src/pack.c +509 -0
  138. data/src/prettyprint.c +8941 -0
  139. data/src/prism.c +23361 -0
  140. data/src/regexp.c +790 -0
  141. data/src/serialize.c +2268 -0
  142. data/src/static_literals.c +617 -0
  143. data/src/token_type.c +703 -0
  144. data/src/util/pm_buffer.c +357 -0
  145. data/src/util/pm_char.c +318 -0
  146. data/src/util/pm_constant_pool.c +342 -0
  147. data/src/util/pm_integer.c +670 -0
  148. data/src/util/pm_list.c +49 -0
  149. data/src/util/pm_memchr.c +35 -0
  150. data/src/util/pm_newline_list.c +125 -0
  151. data/src/util/pm_string.c +381 -0
  152. data/src/util/pm_strncasecmp.c +36 -0
  153. data/src/util/pm_strpbrk.c +206 -0
  154. metadata +195 -0
@@ -0,0 +1,2392 @@
1
+ # frozen_string_literal: true
2
+ # :markup: markdown
3
+
4
+ =begin
5
+ --
6
+ This file is generated by the templates/template.rb script and should not be
7
+ modified manually. See templates/lib/prism/inspect_visitor.rb.erb
8
+ if you are looking to modify the template
9
+ ++
10
+ =end
11
+
12
+ module Prism
13
+ # This visitor is responsible for composing the strings that get returned by
14
+ # the various #inspect methods defined on each of the nodes.
15
+ class InspectVisitor < Visitor
16
+ # Most of the time, we can simply pass down the indent to the next node.
17
+ # However, when we are inside a list we want some extra special formatting
18
+ # when we hit an element in that list. In this case, we have a special
19
+ # command that replaces the subsequent indent with the given value.
20
+ class Replace # :nodoc:
21
+ attr_reader :value
22
+
23
+ def initialize(value)
24
+ @value = value
25
+ end
26
+ end
27
+
28
+ private_constant :Replace
29
+
30
+ # The current prefix string.
31
+ attr_reader :indent
32
+
33
+ # The list of commands that we need to execute in order to compose the
34
+ # final string.
35
+ attr_reader :commands
36
+
37
+ # Initializes a new instance of the InspectVisitor.
38
+ def initialize(indent = +"")
39
+ @indent = indent
40
+ @commands = []
41
+ end
42
+
43
+ # Compose an inspect string for the given node.
44
+ def self.compose(node)
45
+ visitor = new
46
+ node.accept(visitor)
47
+ visitor.compose
48
+ end
49
+
50
+ # Compose the final string.
51
+ def compose
52
+ buffer = +""
53
+ replace = nil
54
+
55
+ until commands.empty?
56
+ # @type var command: String | node | Replace
57
+ # @type var indent: String
58
+ command, indent = *commands.shift
59
+
60
+ case command
61
+ when String
62
+ buffer << (replace || indent)
63
+ buffer << command
64
+ replace = nil
65
+ when Node
66
+ visitor = InspectVisitor.new(indent)
67
+ command.accept(visitor)
68
+ @commands = [*visitor.commands, *@commands]
69
+ when Replace
70
+ replace = command.value
71
+ else
72
+ raise "Unknown command: #{command.inspect}"
73
+ end
74
+ end
75
+
76
+ buffer
77
+ end
78
+
79
+ # Inspect a AliasGlobalVariableNode node.
80
+ def visit_alias_global_variable_node(node)
81
+ commands << [inspect_node("AliasGlobalVariableNode", node), indent]
82
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
83
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
84
+ commands << ["├── new_name:\n", indent]
85
+ commands << [node.new_name, "#{indent}│ "]
86
+ commands << ["├── old_name:\n", indent]
87
+ commands << [node.old_name, "#{indent}│ "]
88
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
89
+ end
90
+
91
+ # Inspect a AliasMethodNode node.
92
+ def visit_alias_method_node(node)
93
+ commands << [inspect_node("AliasMethodNode", node), indent]
94
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
95
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
96
+ commands << ["├── new_name:\n", indent]
97
+ commands << [node.new_name, "#{indent}│ "]
98
+ commands << ["├── old_name:\n", indent]
99
+ commands << [node.old_name, "#{indent}│ "]
100
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
101
+ end
102
+
103
+ # Inspect a AlternationPatternNode node.
104
+ def visit_alternation_pattern_node(node)
105
+ commands << [inspect_node("AlternationPatternNode", node), indent]
106
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
107
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
108
+ commands << ["├── left:\n", indent]
109
+ commands << [node.left, "#{indent}│ "]
110
+ commands << ["├── right:\n", indent]
111
+ commands << [node.right, "#{indent}│ "]
112
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
113
+ end
114
+
115
+ # Inspect a AndNode node.
116
+ def visit_and_node(node)
117
+ commands << [inspect_node("AndNode", node), indent]
118
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
119
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
120
+ commands << ["├── left:\n", indent]
121
+ commands << [node.left, "#{indent}│ "]
122
+ commands << ["├── right:\n", indent]
123
+ commands << [node.right, "#{indent}│ "]
124
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
125
+ end
126
+
127
+ # Inspect a ArgumentsNode node.
128
+ def visit_arguments_node(node)
129
+ commands << [inspect_node("ArgumentsNode", node), indent]
130
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("contains_forwarding" if node.contains_forwarding?), ("contains_keywords" if node.contains_keywords?), ("contains_keyword_splat" if node.contains_keyword_splat?), ("contains_splat" if node.contains_splat?), ("contains_multiple_splats" if node.contains_multiple_splats?)].compact
131
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
132
+ commands << ["└── arguments: (length: #{(arguments = node.arguments).length})\n", indent]
133
+ if arguments.any?
134
+ arguments[0...-1].each do |child|
135
+ commands << [Replace.new("#{indent} ├── "), indent]
136
+ commands << [child, "#{indent} │ "]
137
+ end
138
+ commands << [Replace.new("#{indent} └── "), indent]
139
+ commands << [arguments[-1], "#{indent} "]
140
+ end
141
+ end
142
+
143
+ # Inspect a ArrayNode node.
144
+ def visit_array_node(node)
145
+ commands << [inspect_node("ArrayNode", node), indent]
146
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("contains_splat" if node.contains_splat?)].compact
147
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
148
+ commands << ["├── elements: (length: #{(elements = node.elements).length})\n", indent]
149
+ if elements.any?
150
+ elements[0...-1].each do |child|
151
+ commands << [Replace.new("#{indent}│ ├── "), indent]
152
+ commands << [child, "#{indent}│ │ "]
153
+ end
154
+ commands << [Replace.new("#{indent}│ └── "), indent]
155
+ commands << [elements[-1], "#{indent}│ "]
156
+ end
157
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
158
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
159
+ end
160
+
161
+ # Inspect a ArrayPatternNode node.
162
+ def visit_array_pattern_node(node)
163
+ commands << [inspect_node("ArrayPatternNode", node), indent]
164
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
165
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
166
+ if (constant = node.constant).nil?
167
+ commands << ["├── constant: ∅\n", indent]
168
+ else
169
+ commands << ["├── constant:\n", indent]
170
+ commands << [constant, "#{indent}│ "]
171
+ end
172
+ commands << ["├── requireds: (length: #{(requireds = node.requireds).length})\n", indent]
173
+ if requireds.any?
174
+ requireds[0...-1].each do |child|
175
+ commands << [Replace.new("#{indent}│ ├── "), indent]
176
+ commands << [child, "#{indent}│ │ "]
177
+ end
178
+ commands << [Replace.new("#{indent}│ └── "), indent]
179
+ commands << [requireds[-1], "#{indent}│ "]
180
+ end
181
+ if (rest = node.rest).nil?
182
+ commands << ["├── rest: ∅\n", indent]
183
+ else
184
+ commands << ["├── rest:\n", indent]
185
+ commands << [rest, "#{indent}│ "]
186
+ end
187
+ commands << ["├── posts: (length: #{(posts = node.posts).length})\n", indent]
188
+ if posts.any?
189
+ posts[0...-1].each do |child|
190
+ commands << [Replace.new("#{indent}│ ├── "), indent]
191
+ commands << [child, "#{indent}│ │ "]
192
+ end
193
+ commands << [Replace.new("#{indent}│ └── "), indent]
194
+ commands << [posts[-1], "#{indent}│ "]
195
+ end
196
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
197
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
198
+ end
199
+
200
+ # Inspect a AssocNode node.
201
+ def visit_assoc_node(node)
202
+ commands << [inspect_node("AssocNode", node), indent]
203
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
204
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
205
+ commands << ["├── key:\n", indent]
206
+ commands << [node.key, "#{indent}│ "]
207
+ commands << ["├── value:\n", indent]
208
+ commands << [node.value, "#{indent}│ "]
209
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
210
+ end
211
+
212
+ # Inspect a AssocSplatNode node.
213
+ def visit_assoc_splat_node(node)
214
+ commands << [inspect_node("AssocSplatNode", node), indent]
215
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
216
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
217
+ if (value = node.value).nil?
218
+ commands << ["├── value: ∅\n", indent]
219
+ else
220
+ commands << ["├── value:\n", indent]
221
+ commands << [value, "#{indent}│ "]
222
+ end
223
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
224
+ end
225
+
226
+ # Inspect a BackReferenceReadNode node.
227
+ def visit_back_reference_read_node(node)
228
+ commands << [inspect_node("BackReferenceReadNode", node), indent]
229
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
230
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
231
+ commands << ["└── name: #{node.name.inspect}\n", indent]
232
+ end
233
+
234
+ # Inspect a BeginNode node.
235
+ def visit_begin_node(node)
236
+ commands << [inspect_node("BeginNode", node), indent]
237
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
238
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
239
+ commands << ["├── begin_keyword_loc: #{inspect_location(node.begin_keyword_loc)}\n", indent]
240
+ if (statements = node.statements).nil?
241
+ commands << ["├── statements: ∅\n", indent]
242
+ else
243
+ commands << ["├── statements:\n", indent]
244
+ commands << [statements, "#{indent}│ "]
245
+ end
246
+ if (rescue_clause = node.rescue_clause).nil?
247
+ commands << ["├── rescue_clause: ∅\n", indent]
248
+ else
249
+ commands << ["├── rescue_clause:\n", indent]
250
+ commands << [rescue_clause, "#{indent}│ "]
251
+ end
252
+ if (else_clause = node.else_clause).nil?
253
+ commands << ["├── else_clause: ∅\n", indent]
254
+ else
255
+ commands << ["├── else_clause:\n", indent]
256
+ commands << [else_clause, "#{indent}│ "]
257
+ end
258
+ if (ensure_clause = node.ensure_clause).nil?
259
+ commands << ["├── ensure_clause: ∅\n", indent]
260
+ else
261
+ commands << ["├── ensure_clause:\n", indent]
262
+ commands << [ensure_clause, "#{indent}│ "]
263
+ end
264
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
265
+ end
266
+
267
+ # Inspect a BlockArgumentNode node.
268
+ def visit_block_argument_node(node)
269
+ commands << [inspect_node("BlockArgumentNode", node), indent]
270
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
271
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
272
+ if (expression = node.expression).nil?
273
+ commands << ["├── expression: ∅\n", indent]
274
+ else
275
+ commands << ["├── expression:\n", indent]
276
+ commands << [expression, "#{indent}│ "]
277
+ end
278
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
279
+ end
280
+
281
+ # Inspect a BlockLocalVariableNode node.
282
+ def visit_block_local_variable_node(node)
283
+ commands << [inspect_node("BlockLocalVariableNode", node), indent]
284
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
285
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
286
+ commands << ["└── name: #{node.name.inspect}\n", indent]
287
+ end
288
+
289
+ # Inspect a BlockNode node.
290
+ def visit_block_node(node)
291
+ commands << [inspect_node("BlockNode", node), indent]
292
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
293
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
294
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
295
+ if (parameters = node.parameters).nil?
296
+ commands << ["├── parameters: ∅\n", indent]
297
+ else
298
+ commands << ["├── parameters:\n", indent]
299
+ commands << [parameters, "#{indent}│ "]
300
+ end
301
+ if (body = node.body).nil?
302
+ commands << ["├── body: ∅\n", indent]
303
+ else
304
+ commands << ["├── body:\n", indent]
305
+ commands << [body, "#{indent}│ "]
306
+ end
307
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
308
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
309
+ end
310
+
311
+ # Inspect a BlockParameterNode node.
312
+ def visit_block_parameter_node(node)
313
+ commands << [inspect_node("BlockParameterNode", node), indent]
314
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
315
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
316
+ if (name = node.name).nil?
317
+ commands << ["├── name: ∅\n", indent]
318
+ else
319
+ commands << ["├── name: #{name.inspect}\n", indent]
320
+ end
321
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
322
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
323
+ end
324
+
325
+ # Inspect a BlockParametersNode node.
326
+ def visit_block_parameters_node(node)
327
+ commands << [inspect_node("BlockParametersNode", node), indent]
328
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
329
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
330
+ if (parameters = node.parameters).nil?
331
+ commands << ["├── parameters: ∅\n", indent]
332
+ else
333
+ commands << ["├── parameters:\n", indent]
334
+ commands << [parameters, "#{indent}│ "]
335
+ end
336
+ commands << ["├── locals: (length: #{(locals = node.locals).length})\n", indent]
337
+ if locals.any?
338
+ locals[0...-1].each do |child|
339
+ commands << [Replace.new("#{indent}│ ├── "), indent]
340
+ commands << [child, "#{indent}│ │ "]
341
+ end
342
+ commands << [Replace.new("#{indent}│ └── "), indent]
343
+ commands << [locals[-1], "#{indent}│ "]
344
+ end
345
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
346
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
347
+ end
348
+
349
+ # Inspect a BreakNode node.
350
+ def visit_break_node(node)
351
+ commands << [inspect_node("BreakNode", node), indent]
352
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
353
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
354
+ if (arguments = node.arguments).nil?
355
+ commands << ["├── arguments: ∅\n", indent]
356
+ else
357
+ commands << ["├── arguments:\n", indent]
358
+ commands << [arguments, "#{indent}│ "]
359
+ end
360
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
361
+ end
362
+
363
+ # Inspect a CallAndWriteNode node.
364
+ def visit_call_and_write_node(node)
365
+ commands << [inspect_node("CallAndWriteNode", node), indent]
366
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
367
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
368
+ if (receiver = node.receiver).nil?
369
+ commands << ["├── receiver: ∅\n", indent]
370
+ else
371
+ commands << ["├── receiver:\n", indent]
372
+ commands << [receiver, "#{indent}│ "]
373
+ end
374
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
375
+ commands << ["├── message_loc: #{inspect_location(node.message_loc)}\n", indent]
376
+ commands << ["├── read_name: #{node.read_name.inspect}\n", indent]
377
+ commands << ["├── write_name: #{node.write_name.inspect}\n", indent]
378
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
379
+ commands << ["└── value:\n", indent]
380
+ commands << [node.value, "#{indent} "]
381
+ end
382
+
383
+ # Inspect a CallNode node.
384
+ def visit_call_node(node)
385
+ commands << [inspect_node("CallNode", node), indent]
386
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
387
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
388
+ if (receiver = node.receiver).nil?
389
+ commands << ["├── receiver: ∅\n", indent]
390
+ else
391
+ commands << ["├── receiver:\n", indent]
392
+ commands << [receiver, "#{indent}│ "]
393
+ end
394
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
395
+ commands << ["├── name: #{node.name.inspect}\n", indent]
396
+ commands << ["├── message_loc: #{inspect_location(node.message_loc)}\n", indent]
397
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
398
+ if (arguments = node.arguments).nil?
399
+ commands << ["├── arguments: ∅\n", indent]
400
+ else
401
+ commands << ["├── arguments:\n", indent]
402
+ commands << [arguments, "#{indent}│ "]
403
+ end
404
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
405
+ if (block = node.block).nil?
406
+ commands << ["└── block: ∅\n", indent]
407
+ else
408
+ commands << ["└── block:\n", indent]
409
+ commands << [block, "#{indent} "]
410
+ end
411
+ end
412
+
413
+ # Inspect a CallOperatorWriteNode node.
414
+ def visit_call_operator_write_node(node)
415
+ commands << [inspect_node("CallOperatorWriteNode", node), indent]
416
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
417
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
418
+ if (receiver = node.receiver).nil?
419
+ commands << ["├── receiver: ∅\n", indent]
420
+ else
421
+ commands << ["├── receiver:\n", indent]
422
+ commands << [receiver, "#{indent}│ "]
423
+ end
424
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
425
+ commands << ["├── message_loc: #{inspect_location(node.message_loc)}\n", indent]
426
+ commands << ["├── read_name: #{node.read_name.inspect}\n", indent]
427
+ commands << ["├── write_name: #{node.write_name.inspect}\n", indent]
428
+ commands << ["├── binary_operator: #{node.binary_operator.inspect}\n", indent]
429
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
430
+ commands << ["└── value:\n", indent]
431
+ commands << [node.value, "#{indent} "]
432
+ end
433
+
434
+ # Inspect a CallOrWriteNode node.
435
+ def visit_call_or_write_node(node)
436
+ commands << [inspect_node("CallOrWriteNode", node), indent]
437
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
438
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
439
+ if (receiver = node.receiver).nil?
440
+ commands << ["├── receiver: ∅\n", indent]
441
+ else
442
+ commands << ["├── receiver:\n", indent]
443
+ commands << [receiver, "#{indent}│ "]
444
+ end
445
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
446
+ commands << ["├── message_loc: #{inspect_location(node.message_loc)}\n", indent]
447
+ commands << ["├── read_name: #{node.read_name.inspect}\n", indent]
448
+ commands << ["├── write_name: #{node.write_name.inspect}\n", indent]
449
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
450
+ commands << ["└── value:\n", indent]
451
+ commands << [node.value, "#{indent} "]
452
+ end
453
+
454
+ # Inspect a CallTargetNode node.
455
+ def visit_call_target_node(node)
456
+ commands << [inspect_node("CallTargetNode", node), indent]
457
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
458
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
459
+ commands << ["├── receiver:\n", indent]
460
+ commands << [node.receiver, "#{indent}│ "]
461
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
462
+ commands << ["├── name: #{node.name.inspect}\n", indent]
463
+ commands << ["└── message_loc: #{inspect_location(node.message_loc)}\n", indent]
464
+ end
465
+
466
+ # Inspect a CapturePatternNode node.
467
+ def visit_capture_pattern_node(node)
468
+ commands << [inspect_node("CapturePatternNode", node), indent]
469
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
470
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
471
+ commands << ["├── value:\n", indent]
472
+ commands << [node.value, "#{indent}│ "]
473
+ commands << ["├── target:\n", indent]
474
+ commands << [node.target, "#{indent}│ "]
475
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
476
+ end
477
+
478
+ # Inspect a CaseMatchNode node.
479
+ def visit_case_match_node(node)
480
+ commands << [inspect_node("CaseMatchNode", node), indent]
481
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
482
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
483
+ if (predicate = node.predicate).nil?
484
+ commands << ["├── predicate: ∅\n", indent]
485
+ else
486
+ commands << ["├── predicate:\n", indent]
487
+ commands << [predicate, "#{indent}│ "]
488
+ end
489
+ commands << ["├── conditions: (length: #{(conditions = node.conditions).length})\n", indent]
490
+ if conditions.any?
491
+ conditions[0...-1].each do |child|
492
+ commands << [Replace.new("#{indent}│ ├── "), indent]
493
+ commands << [child, "#{indent}│ │ "]
494
+ end
495
+ commands << [Replace.new("#{indent}│ └── "), indent]
496
+ commands << [conditions[-1], "#{indent}│ "]
497
+ end
498
+ if (else_clause = node.else_clause).nil?
499
+ commands << ["├── else_clause: ∅\n", indent]
500
+ else
501
+ commands << ["├── else_clause:\n", indent]
502
+ commands << [else_clause, "#{indent}│ "]
503
+ end
504
+ commands << ["├── case_keyword_loc: #{inspect_location(node.case_keyword_loc)}\n", indent]
505
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
506
+ end
507
+
508
+ # Inspect a CaseNode node.
509
+ def visit_case_node(node)
510
+ commands << [inspect_node("CaseNode", node), indent]
511
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
512
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
513
+ if (predicate = node.predicate).nil?
514
+ commands << ["├── predicate: ∅\n", indent]
515
+ else
516
+ commands << ["├── predicate:\n", indent]
517
+ commands << [predicate, "#{indent}│ "]
518
+ end
519
+ commands << ["├── conditions: (length: #{(conditions = node.conditions).length})\n", indent]
520
+ if conditions.any?
521
+ conditions[0...-1].each do |child|
522
+ commands << [Replace.new("#{indent}│ ├── "), indent]
523
+ commands << [child, "#{indent}│ │ "]
524
+ end
525
+ commands << [Replace.new("#{indent}│ └── "), indent]
526
+ commands << [conditions[-1], "#{indent}│ "]
527
+ end
528
+ if (else_clause = node.else_clause).nil?
529
+ commands << ["├── else_clause: ∅\n", indent]
530
+ else
531
+ commands << ["├── else_clause:\n", indent]
532
+ commands << [else_clause, "#{indent}│ "]
533
+ end
534
+ commands << ["├── case_keyword_loc: #{inspect_location(node.case_keyword_loc)}\n", indent]
535
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
536
+ end
537
+
538
+ # Inspect a ClassNode node.
539
+ def visit_class_node(node)
540
+ commands << [inspect_node("ClassNode", node), indent]
541
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
542
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
543
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
544
+ commands << ["├── class_keyword_loc: #{inspect_location(node.class_keyword_loc)}\n", indent]
545
+ commands << ["├── constant_path:\n", indent]
546
+ commands << [node.constant_path, "#{indent}│ "]
547
+ commands << ["├── inheritance_operator_loc: #{inspect_location(node.inheritance_operator_loc)}\n", indent]
548
+ if (superclass = node.superclass).nil?
549
+ commands << ["├── superclass: ∅\n", indent]
550
+ else
551
+ commands << ["├── superclass:\n", indent]
552
+ commands << [superclass, "#{indent}│ "]
553
+ end
554
+ if (body = node.body).nil?
555
+ commands << ["├── body: ∅\n", indent]
556
+ else
557
+ commands << ["├── body:\n", indent]
558
+ commands << [body, "#{indent}│ "]
559
+ end
560
+ commands << ["├── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
561
+ commands << ["└── name: #{node.name.inspect}\n", indent]
562
+ end
563
+
564
+ # Inspect a ClassVariableAndWriteNode node.
565
+ def visit_class_variable_and_write_node(node)
566
+ commands << [inspect_node("ClassVariableAndWriteNode", node), indent]
567
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
568
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
569
+ commands << ["├── name: #{node.name.inspect}\n", indent]
570
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
571
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
572
+ commands << ["└── value:\n", indent]
573
+ commands << [node.value, "#{indent} "]
574
+ end
575
+
576
+ # Inspect a ClassVariableOperatorWriteNode node.
577
+ def visit_class_variable_operator_write_node(node)
578
+ commands << [inspect_node("ClassVariableOperatorWriteNode", node), indent]
579
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
580
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
581
+ commands << ["├── name: #{node.name.inspect}\n", indent]
582
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
583
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
584
+ commands << ["├── value:\n", indent]
585
+ commands << [node.value, "#{indent}│ "]
586
+ commands << ["└── binary_operator: #{node.binary_operator.inspect}\n", indent]
587
+ end
588
+
589
+ # Inspect a ClassVariableOrWriteNode node.
590
+ def visit_class_variable_or_write_node(node)
591
+ commands << [inspect_node("ClassVariableOrWriteNode", node), indent]
592
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
593
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
594
+ commands << ["├── name: #{node.name.inspect}\n", indent]
595
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
596
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
597
+ commands << ["└── value:\n", indent]
598
+ commands << [node.value, "#{indent} "]
599
+ end
600
+
601
+ # Inspect a ClassVariableReadNode node.
602
+ def visit_class_variable_read_node(node)
603
+ commands << [inspect_node("ClassVariableReadNode", node), indent]
604
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
605
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
606
+ commands << ["└── name: #{node.name.inspect}\n", indent]
607
+ end
608
+
609
+ # Inspect a ClassVariableTargetNode node.
610
+ def visit_class_variable_target_node(node)
611
+ commands << [inspect_node("ClassVariableTargetNode", node), indent]
612
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
613
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
614
+ commands << ["└── name: #{node.name.inspect}\n", indent]
615
+ end
616
+
617
+ # Inspect a ClassVariableWriteNode node.
618
+ def visit_class_variable_write_node(node)
619
+ commands << [inspect_node("ClassVariableWriteNode", node), indent]
620
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
621
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
622
+ commands << ["├── name: #{node.name.inspect}\n", indent]
623
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
624
+ commands << ["├── value:\n", indent]
625
+ commands << [node.value, "#{indent}│ "]
626
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
627
+ end
628
+
629
+ # Inspect a ConstantAndWriteNode node.
630
+ def visit_constant_and_write_node(node)
631
+ commands << [inspect_node("ConstantAndWriteNode", node), indent]
632
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
633
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
634
+ commands << ["├── name: #{node.name.inspect}\n", indent]
635
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
636
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
637
+ commands << ["└── value:\n", indent]
638
+ commands << [node.value, "#{indent} "]
639
+ end
640
+
641
+ # Inspect a ConstantOperatorWriteNode node.
642
+ def visit_constant_operator_write_node(node)
643
+ commands << [inspect_node("ConstantOperatorWriteNode", node), indent]
644
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
645
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
646
+ commands << ["├── name: #{node.name.inspect}\n", indent]
647
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
648
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
649
+ commands << ["├── value:\n", indent]
650
+ commands << [node.value, "#{indent}│ "]
651
+ commands << ["└── binary_operator: #{node.binary_operator.inspect}\n", indent]
652
+ end
653
+
654
+ # Inspect a ConstantOrWriteNode node.
655
+ def visit_constant_or_write_node(node)
656
+ commands << [inspect_node("ConstantOrWriteNode", node), indent]
657
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
658
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
659
+ commands << ["├── name: #{node.name.inspect}\n", indent]
660
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
661
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
662
+ commands << ["└── value:\n", indent]
663
+ commands << [node.value, "#{indent} "]
664
+ end
665
+
666
+ # Inspect a ConstantPathAndWriteNode node.
667
+ def visit_constant_path_and_write_node(node)
668
+ commands << [inspect_node("ConstantPathAndWriteNode", node), indent]
669
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
670
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
671
+ commands << ["├── target:\n", indent]
672
+ commands << [node.target, "#{indent}│ "]
673
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
674
+ commands << ["└── value:\n", indent]
675
+ commands << [node.value, "#{indent} "]
676
+ end
677
+
678
+ # Inspect a ConstantPathNode node.
679
+ def visit_constant_path_node(node)
680
+ commands << [inspect_node("ConstantPathNode", node), indent]
681
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
682
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
683
+ if (parent = node.parent).nil?
684
+ commands << ["├── parent: ∅\n", indent]
685
+ else
686
+ commands << ["├── parent:\n", indent]
687
+ commands << [parent, "#{indent}│ "]
688
+ end
689
+ if (name = node.name).nil?
690
+ commands << ["├── name: ∅\n", indent]
691
+ else
692
+ commands << ["├── name: #{name.inspect}\n", indent]
693
+ end
694
+ commands << ["├── delimiter_loc: #{inspect_location(node.delimiter_loc)}\n", indent]
695
+ commands << ["└── name_loc: #{inspect_location(node.name_loc)}\n", indent]
696
+ end
697
+
698
+ # Inspect a ConstantPathOperatorWriteNode node.
699
+ def visit_constant_path_operator_write_node(node)
700
+ commands << [inspect_node("ConstantPathOperatorWriteNode", node), indent]
701
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
702
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
703
+ commands << ["├── target:\n", indent]
704
+ commands << [node.target, "#{indent}│ "]
705
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
706
+ commands << ["├── value:\n", indent]
707
+ commands << [node.value, "#{indent}│ "]
708
+ commands << ["└── binary_operator: #{node.binary_operator.inspect}\n", indent]
709
+ end
710
+
711
+ # Inspect a ConstantPathOrWriteNode node.
712
+ def visit_constant_path_or_write_node(node)
713
+ commands << [inspect_node("ConstantPathOrWriteNode", node), indent]
714
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
715
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
716
+ commands << ["├── target:\n", indent]
717
+ commands << [node.target, "#{indent}│ "]
718
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
719
+ commands << ["└── value:\n", indent]
720
+ commands << [node.value, "#{indent} "]
721
+ end
722
+
723
+ # Inspect a ConstantPathTargetNode node.
724
+ def visit_constant_path_target_node(node)
725
+ commands << [inspect_node("ConstantPathTargetNode", node), indent]
726
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
727
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
728
+ if (parent = node.parent).nil?
729
+ commands << ["├── parent: ∅\n", indent]
730
+ else
731
+ commands << ["├── parent:\n", indent]
732
+ commands << [parent, "#{indent}│ "]
733
+ end
734
+ if (name = node.name).nil?
735
+ commands << ["├── name: ∅\n", indent]
736
+ else
737
+ commands << ["├── name: #{name.inspect}\n", indent]
738
+ end
739
+ commands << ["├── delimiter_loc: #{inspect_location(node.delimiter_loc)}\n", indent]
740
+ commands << ["└── name_loc: #{inspect_location(node.name_loc)}\n", indent]
741
+ end
742
+
743
+ # Inspect a ConstantPathWriteNode node.
744
+ def visit_constant_path_write_node(node)
745
+ commands << [inspect_node("ConstantPathWriteNode", node), indent]
746
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
747
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
748
+ commands << ["├── target:\n", indent]
749
+ commands << [node.target, "#{indent}│ "]
750
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
751
+ commands << ["└── value:\n", indent]
752
+ commands << [node.value, "#{indent} "]
753
+ end
754
+
755
+ # Inspect a ConstantReadNode node.
756
+ def visit_constant_read_node(node)
757
+ commands << [inspect_node("ConstantReadNode", node), indent]
758
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
759
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
760
+ commands << ["└── name: #{node.name.inspect}\n", indent]
761
+ end
762
+
763
+ # Inspect a ConstantTargetNode node.
764
+ def visit_constant_target_node(node)
765
+ commands << [inspect_node("ConstantTargetNode", node), indent]
766
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
767
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
768
+ commands << ["└── name: #{node.name.inspect}\n", indent]
769
+ end
770
+
771
+ # Inspect a ConstantWriteNode node.
772
+ def visit_constant_write_node(node)
773
+ commands << [inspect_node("ConstantWriteNode", node), indent]
774
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
775
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
776
+ commands << ["├── name: #{node.name.inspect}\n", indent]
777
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
778
+ commands << ["├── value:\n", indent]
779
+ commands << [node.value, "#{indent}│ "]
780
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
781
+ end
782
+
783
+ # Inspect a DefNode node.
784
+ def visit_def_node(node)
785
+ commands << [inspect_node("DefNode", node), indent]
786
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
787
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
788
+ commands << ["├── name: #{node.name.inspect}\n", indent]
789
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
790
+ if (receiver = node.receiver).nil?
791
+ commands << ["├── receiver: ∅\n", indent]
792
+ else
793
+ commands << ["├── receiver:\n", indent]
794
+ commands << [receiver, "#{indent}│ "]
795
+ end
796
+ if (parameters = node.parameters).nil?
797
+ commands << ["├── parameters: ∅\n", indent]
798
+ else
799
+ commands << ["├── parameters:\n", indent]
800
+ commands << [parameters, "#{indent}│ "]
801
+ end
802
+ if (body = node.body).nil?
803
+ commands << ["├── body: ∅\n", indent]
804
+ else
805
+ commands << ["├── body:\n", indent]
806
+ commands << [body, "#{indent}│ "]
807
+ end
808
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
809
+ commands << ["├── def_keyword_loc: #{inspect_location(node.def_keyword_loc)}\n", indent]
810
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
811
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
812
+ commands << ["├── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
813
+ commands << ["├── equal_loc: #{inspect_location(node.equal_loc)}\n", indent]
814
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
815
+ end
816
+
817
+ # Inspect a DefinedNode node.
818
+ def visit_defined_node(node)
819
+ commands << [inspect_node("DefinedNode", node), indent]
820
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
821
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
822
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
823
+ commands << ["├── value:\n", indent]
824
+ commands << [node.value, "#{indent}│ "]
825
+ commands << ["├── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
826
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
827
+ end
828
+
829
+ # Inspect a ElseNode node.
830
+ def visit_else_node(node)
831
+ commands << [inspect_node("ElseNode", node), indent]
832
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
833
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
834
+ commands << ["├── else_keyword_loc: #{inspect_location(node.else_keyword_loc)}\n", indent]
835
+ if (statements = node.statements).nil?
836
+ commands << ["├── statements: ∅\n", indent]
837
+ else
838
+ commands << ["├── statements:\n", indent]
839
+ commands << [statements, "#{indent}│ "]
840
+ end
841
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
842
+ end
843
+
844
+ # Inspect a EmbeddedStatementsNode node.
845
+ def visit_embedded_statements_node(node)
846
+ commands << [inspect_node("EmbeddedStatementsNode", node), indent]
847
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
848
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
849
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
850
+ if (statements = node.statements).nil?
851
+ commands << ["├── statements: ∅\n", indent]
852
+ else
853
+ commands << ["├── statements:\n", indent]
854
+ commands << [statements, "#{indent}│ "]
855
+ end
856
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
857
+ end
858
+
859
+ # Inspect a EmbeddedVariableNode node.
860
+ def visit_embedded_variable_node(node)
861
+ commands << [inspect_node("EmbeddedVariableNode", node), indent]
862
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
863
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
864
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
865
+ commands << ["└── variable:\n", indent]
866
+ commands << [node.variable, "#{indent} "]
867
+ end
868
+
869
+ # Inspect a EnsureNode node.
870
+ def visit_ensure_node(node)
871
+ commands << [inspect_node("EnsureNode", node), indent]
872
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
873
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
874
+ commands << ["├── ensure_keyword_loc: #{inspect_location(node.ensure_keyword_loc)}\n", indent]
875
+ if (statements = node.statements).nil?
876
+ commands << ["├── statements: ∅\n", indent]
877
+ else
878
+ commands << ["├── statements:\n", indent]
879
+ commands << [statements, "#{indent}│ "]
880
+ end
881
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
882
+ end
883
+
884
+ # Inspect a FalseNode node.
885
+ def visit_false_node(node)
886
+ commands << [inspect_node("FalseNode", node), indent]
887
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
888
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
889
+ end
890
+
891
+ # Inspect a FindPatternNode node.
892
+ def visit_find_pattern_node(node)
893
+ commands << [inspect_node("FindPatternNode", node), indent]
894
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
895
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
896
+ if (constant = node.constant).nil?
897
+ commands << ["├── constant: ∅\n", indent]
898
+ else
899
+ commands << ["├── constant:\n", indent]
900
+ commands << [constant, "#{indent}│ "]
901
+ end
902
+ commands << ["├── left:\n", indent]
903
+ commands << [node.left, "#{indent}│ "]
904
+ commands << ["├── requireds: (length: #{(requireds = node.requireds).length})\n", indent]
905
+ if requireds.any?
906
+ requireds[0...-1].each do |child|
907
+ commands << [Replace.new("#{indent}│ ├── "), indent]
908
+ commands << [child, "#{indent}│ │ "]
909
+ end
910
+ commands << [Replace.new("#{indent}│ └── "), indent]
911
+ commands << [requireds[-1], "#{indent}│ "]
912
+ end
913
+ commands << ["├── right:\n", indent]
914
+ commands << [node.right, "#{indent}│ "]
915
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
916
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
917
+ end
918
+
919
+ # Inspect a FlipFlopNode node.
920
+ def visit_flip_flop_node(node)
921
+ commands << [inspect_node("FlipFlopNode", node), indent]
922
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("exclude_end" if node.exclude_end?)].compact
923
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
924
+ if (left = node.left).nil?
925
+ commands << ["├── left: ∅\n", indent]
926
+ else
927
+ commands << ["├── left:\n", indent]
928
+ commands << [left, "#{indent}│ "]
929
+ end
930
+ if (right = node.right).nil?
931
+ commands << ["├── right: ∅\n", indent]
932
+ else
933
+ commands << ["├── right:\n", indent]
934
+ commands << [right, "#{indent}│ "]
935
+ end
936
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
937
+ end
938
+
939
+ # Inspect a FloatNode node.
940
+ def visit_float_node(node)
941
+ commands << [inspect_node("FloatNode", node), indent]
942
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
943
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
944
+ commands << ["└── value: #{node.value.inspect}\n", indent]
945
+ end
946
+
947
+ # Inspect a ForNode node.
948
+ def visit_for_node(node)
949
+ commands << [inspect_node("ForNode", node), indent]
950
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
951
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
952
+ commands << ["├── index:\n", indent]
953
+ commands << [node.index, "#{indent}│ "]
954
+ commands << ["├── collection:\n", indent]
955
+ commands << [node.collection, "#{indent}│ "]
956
+ if (statements = node.statements).nil?
957
+ commands << ["├── statements: ∅\n", indent]
958
+ else
959
+ commands << ["├── statements:\n", indent]
960
+ commands << [statements, "#{indent}│ "]
961
+ end
962
+ commands << ["├── for_keyword_loc: #{inspect_location(node.for_keyword_loc)}\n", indent]
963
+ commands << ["├── in_keyword_loc: #{inspect_location(node.in_keyword_loc)}\n", indent]
964
+ commands << ["├── do_keyword_loc: #{inspect_location(node.do_keyword_loc)}\n", indent]
965
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
966
+ end
967
+
968
+ # Inspect a ForwardingArgumentsNode node.
969
+ def visit_forwarding_arguments_node(node)
970
+ commands << [inspect_node("ForwardingArgumentsNode", node), indent]
971
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
972
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
973
+ end
974
+
975
+ # Inspect a ForwardingParameterNode node.
976
+ def visit_forwarding_parameter_node(node)
977
+ commands << [inspect_node("ForwardingParameterNode", node), indent]
978
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
979
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
980
+ end
981
+
982
+ # Inspect a ForwardingSuperNode node.
983
+ def visit_forwarding_super_node(node)
984
+ commands << [inspect_node("ForwardingSuperNode", node), indent]
985
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
986
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
987
+ if (block = node.block).nil?
988
+ commands << ["└── block: ∅\n", indent]
989
+ else
990
+ commands << ["└── block:\n", indent]
991
+ commands << [block, "#{indent} "]
992
+ end
993
+ end
994
+
995
+ # Inspect a GlobalVariableAndWriteNode node.
996
+ def visit_global_variable_and_write_node(node)
997
+ commands << [inspect_node("GlobalVariableAndWriteNode", node), indent]
998
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
999
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1000
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1001
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1002
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1003
+ commands << ["└── value:\n", indent]
1004
+ commands << [node.value, "#{indent} "]
1005
+ end
1006
+
1007
+ # Inspect a GlobalVariableOperatorWriteNode node.
1008
+ def visit_global_variable_operator_write_node(node)
1009
+ commands << [inspect_node("GlobalVariableOperatorWriteNode", node), indent]
1010
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1011
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1012
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1013
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1014
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
1015
+ commands << ["├── value:\n", indent]
1016
+ commands << [node.value, "#{indent}│ "]
1017
+ commands << ["└── binary_operator: #{node.binary_operator.inspect}\n", indent]
1018
+ end
1019
+
1020
+ # Inspect a GlobalVariableOrWriteNode node.
1021
+ def visit_global_variable_or_write_node(node)
1022
+ commands << [inspect_node("GlobalVariableOrWriteNode", node), indent]
1023
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1024
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1025
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1026
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1027
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1028
+ commands << ["└── value:\n", indent]
1029
+ commands << [node.value, "#{indent} "]
1030
+ end
1031
+
1032
+ # Inspect a GlobalVariableReadNode node.
1033
+ def visit_global_variable_read_node(node)
1034
+ commands << [inspect_node("GlobalVariableReadNode", node), indent]
1035
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1036
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1037
+ commands << ["└── name: #{node.name.inspect}\n", indent]
1038
+ end
1039
+
1040
+ # Inspect a GlobalVariableTargetNode node.
1041
+ def visit_global_variable_target_node(node)
1042
+ commands << [inspect_node("GlobalVariableTargetNode", node), indent]
1043
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1044
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1045
+ commands << ["└── name: #{node.name.inspect}\n", indent]
1046
+ end
1047
+
1048
+ # Inspect a GlobalVariableWriteNode node.
1049
+ def visit_global_variable_write_node(node)
1050
+ commands << [inspect_node("GlobalVariableWriteNode", node), indent]
1051
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1052
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1053
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1054
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1055
+ commands << ["├── value:\n", indent]
1056
+ commands << [node.value, "#{indent}│ "]
1057
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1058
+ end
1059
+
1060
+ # Inspect a HashNode node.
1061
+ def visit_hash_node(node)
1062
+ commands << [inspect_node("HashNode", node), indent]
1063
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1064
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1065
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1066
+ commands << ["├── elements: (length: #{(elements = node.elements).length})\n", indent]
1067
+ if elements.any?
1068
+ elements[0...-1].each do |child|
1069
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1070
+ commands << [child, "#{indent}│ │ "]
1071
+ end
1072
+ commands << [Replace.new("#{indent}│ └── "), indent]
1073
+ commands << [elements[-1], "#{indent}│ "]
1074
+ end
1075
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1076
+ end
1077
+
1078
+ # Inspect a HashPatternNode node.
1079
+ def visit_hash_pattern_node(node)
1080
+ commands << [inspect_node("HashPatternNode", node), indent]
1081
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1082
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1083
+ if (constant = node.constant).nil?
1084
+ commands << ["├── constant: ∅\n", indent]
1085
+ else
1086
+ commands << ["├── constant:\n", indent]
1087
+ commands << [constant, "#{indent}│ "]
1088
+ end
1089
+ commands << ["├── elements: (length: #{(elements = node.elements).length})\n", indent]
1090
+ if elements.any?
1091
+ elements[0...-1].each do |child|
1092
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1093
+ commands << [child, "#{indent}│ │ "]
1094
+ end
1095
+ commands << [Replace.new("#{indent}│ └── "), indent]
1096
+ commands << [elements[-1], "#{indent}│ "]
1097
+ end
1098
+ if (rest = node.rest).nil?
1099
+ commands << ["├── rest: ∅\n", indent]
1100
+ else
1101
+ commands << ["├── rest:\n", indent]
1102
+ commands << [rest, "#{indent}│ "]
1103
+ end
1104
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1105
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1106
+ end
1107
+
1108
+ # Inspect a IfNode node.
1109
+ def visit_if_node(node)
1110
+ commands << [inspect_node("IfNode", node), indent]
1111
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1112
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1113
+ commands << ["├── if_keyword_loc: #{inspect_location(node.if_keyword_loc)}\n", indent]
1114
+ commands << ["├── predicate:\n", indent]
1115
+ commands << [node.predicate, "#{indent}│ "]
1116
+ commands << ["├── then_keyword_loc: #{inspect_location(node.then_keyword_loc)}\n", indent]
1117
+ if (statements = node.statements).nil?
1118
+ commands << ["├── statements: ∅\n", indent]
1119
+ else
1120
+ commands << ["├── statements:\n", indent]
1121
+ commands << [statements, "#{indent}│ "]
1122
+ end
1123
+ if (subsequent = node.subsequent).nil?
1124
+ commands << ["├── subsequent: ∅\n", indent]
1125
+ else
1126
+ commands << ["├── subsequent:\n", indent]
1127
+ commands << [subsequent, "#{indent}│ "]
1128
+ end
1129
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
1130
+ end
1131
+
1132
+ # Inspect a ImaginaryNode node.
1133
+ def visit_imaginary_node(node)
1134
+ commands << [inspect_node("ImaginaryNode", node), indent]
1135
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1136
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1137
+ commands << ["└── numeric:\n", indent]
1138
+ commands << [node.numeric, "#{indent} "]
1139
+ end
1140
+
1141
+ # Inspect a ImplicitNode node.
1142
+ def visit_implicit_node(node)
1143
+ commands << [inspect_node("ImplicitNode", node), indent]
1144
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1145
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1146
+ commands << ["└── value:\n", indent]
1147
+ commands << [node.value, "#{indent} "]
1148
+ end
1149
+
1150
+ # Inspect a ImplicitRestNode node.
1151
+ def visit_implicit_rest_node(node)
1152
+ commands << [inspect_node("ImplicitRestNode", node), indent]
1153
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1154
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1155
+ end
1156
+
1157
+ # Inspect a InNode node.
1158
+ def visit_in_node(node)
1159
+ commands << [inspect_node("InNode", node), indent]
1160
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1161
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1162
+ commands << ["├── pattern:\n", indent]
1163
+ commands << [node.pattern, "#{indent}│ "]
1164
+ if (statements = node.statements).nil?
1165
+ commands << ["├── statements: ∅\n", indent]
1166
+ else
1167
+ commands << ["├── statements:\n", indent]
1168
+ commands << [statements, "#{indent}│ "]
1169
+ end
1170
+ commands << ["├── in_loc: #{inspect_location(node.in_loc)}\n", indent]
1171
+ commands << ["└── then_loc: #{inspect_location(node.then_loc)}\n", indent]
1172
+ end
1173
+
1174
+ # Inspect a IndexAndWriteNode node.
1175
+ def visit_index_and_write_node(node)
1176
+ commands << [inspect_node("IndexAndWriteNode", node), indent]
1177
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
1178
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1179
+ if (receiver = node.receiver).nil?
1180
+ commands << ["├── receiver: ∅\n", indent]
1181
+ else
1182
+ commands << ["├── receiver:\n", indent]
1183
+ commands << [receiver, "#{indent}│ "]
1184
+ end
1185
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
1186
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1187
+ if (arguments = node.arguments).nil?
1188
+ commands << ["├── arguments: ∅\n", indent]
1189
+ else
1190
+ commands << ["├── arguments:\n", indent]
1191
+ commands << [arguments, "#{indent}│ "]
1192
+ end
1193
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1194
+ if (block = node.block).nil?
1195
+ commands << ["├── block: ∅\n", indent]
1196
+ else
1197
+ commands << ["├── block:\n", indent]
1198
+ commands << [block, "#{indent}│ "]
1199
+ end
1200
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1201
+ commands << ["└── value:\n", indent]
1202
+ commands << [node.value, "#{indent} "]
1203
+ end
1204
+
1205
+ # Inspect a IndexOperatorWriteNode node.
1206
+ def visit_index_operator_write_node(node)
1207
+ commands << [inspect_node("IndexOperatorWriteNode", node), indent]
1208
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
1209
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1210
+ if (receiver = node.receiver).nil?
1211
+ commands << ["├── receiver: ∅\n", indent]
1212
+ else
1213
+ commands << ["├── receiver:\n", indent]
1214
+ commands << [receiver, "#{indent}│ "]
1215
+ end
1216
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
1217
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1218
+ if (arguments = node.arguments).nil?
1219
+ commands << ["├── arguments: ∅\n", indent]
1220
+ else
1221
+ commands << ["├── arguments:\n", indent]
1222
+ commands << [arguments, "#{indent}│ "]
1223
+ end
1224
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1225
+ if (block = node.block).nil?
1226
+ commands << ["├── block: ∅\n", indent]
1227
+ else
1228
+ commands << ["├── block:\n", indent]
1229
+ commands << [block, "#{indent}│ "]
1230
+ end
1231
+ commands << ["├── binary_operator: #{node.binary_operator.inspect}\n", indent]
1232
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
1233
+ commands << ["└── value:\n", indent]
1234
+ commands << [node.value, "#{indent} "]
1235
+ end
1236
+
1237
+ # Inspect a IndexOrWriteNode node.
1238
+ def visit_index_or_write_node(node)
1239
+ commands << [inspect_node("IndexOrWriteNode", node), indent]
1240
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
1241
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1242
+ if (receiver = node.receiver).nil?
1243
+ commands << ["├── receiver: ∅\n", indent]
1244
+ else
1245
+ commands << ["├── receiver:\n", indent]
1246
+ commands << [receiver, "#{indent}│ "]
1247
+ end
1248
+ commands << ["├── call_operator_loc: #{inspect_location(node.call_operator_loc)}\n", indent]
1249
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1250
+ if (arguments = node.arguments).nil?
1251
+ commands << ["├── arguments: ∅\n", indent]
1252
+ else
1253
+ commands << ["├── arguments:\n", indent]
1254
+ commands << [arguments, "#{indent}│ "]
1255
+ end
1256
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1257
+ if (block = node.block).nil?
1258
+ commands << ["├── block: ∅\n", indent]
1259
+ else
1260
+ commands << ["├── block:\n", indent]
1261
+ commands << [block, "#{indent}│ "]
1262
+ end
1263
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1264
+ commands << ["└── value:\n", indent]
1265
+ commands << [node.value, "#{indent} "]
1266
+ end
1267
+
1268
+ # Inspect a IndexTargetNode node.
1269
+ def visit_index_target_node(node)
1270
+ commands << [inspect_node("IndexTargetNode", node), indent]
1271
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("safe_navigation" if node.safe_navigation?), ("variable_call" if node.variable_call?), ("attribute_write" if node.attribute_write?), ("ignore_visibility" if node.ignore_visibility?)].compact
1272
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1273
+ commands << ["├── receiver:\n", indent]
1274
+ commands << [node.receiver, "#{indent}│ "]
1275
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1276
+ if (arguments = node.arguments).nil?
1277
+ commands << ["├── arguments: ∅\n", indent]
1278
+ else
1279
+ commands << ["├── arguments:\n", indent]
1280
+ commands << [arguments, "#{indent}│ "]
1281
+ end
1282
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1283
+ if (block = node.block).nil?
1284
+ commands << ["└── block: ∅\n", indent]
1285
+ else
1286
+ commands << ["└── block:\n", indent]
1287
+ commands << [block, "#{indent} "]
1288
+ end
1289
+ end
1290
+
1291
+ # Inspect a InstanceVariableAndWriteNode node.
1292
+ def visit_instance_variable_and_write_node(node)
1293
+ commands << [inspect_node("InstanceVariableAndWriteNode", node), indent]
1294
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1295
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1296
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1297
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1298
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1299
+ commands << ["└── value:\n", indent]
1300
+ commands << [node.value, "#{indent} "]
1301
+ end
1302
+
1303
+ # Inspect a InstanceVariableOperatorWriteNode node.
1304
+ def visit_instance_variable_operator_write_node(node)
1305
+ commands << [inspect_node("InstanceVariableOperatorWriteNode", node), indent]
1306
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1307
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1308
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1309
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1310
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
1311
+ commands << ["├── value:\n", indent]
1312
+ commands << [node.value, "#{indent}│ "]
1313
+ commands << ["└── binary_operator: #{node.binary_operator.inspect}\n", indent]
1314
+ end
1315
+
1316
+ # Inspect a InstanceVariableOrWriteNode node.
1317
+ def visit_instance_variable_or_write_node(node)
1318
+ commands << [inspect_node("InstanceVariableOrWriteNode", node), indent]
1319
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1320
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1321
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1322
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1323
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1324
+ commands << ["└── value:\n", indent]
1325
+ commands << [node.value, "#{indent} "]
1326
+ end
1327
+
1328
+ # Inspect a InstanceVariableReadNode node.
1329
+ def visit_instance_variable_read_node(node)
1330
+ commands << [inspect_node("InstanceVariableReadNode", node), indent]
1331
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1332
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1333
+ commands << ["└── name: #{node.name.inspect}\n", indent]
1334
+ end
1335
+
1336
+ # Inspect a InstanceVariableTargetNode node.
1337
+ def visit_instance_variable_target_node(node)
1338
+ commands << [inspect_node("InstanceVariableTargetNode", node), indent]
1339
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1340
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1341
+ commands << ["└── name: #{node.name.inspect}\n", indent]
1342
+ end
1343
+
1344
+ # Inspect a InstanceVariableWriteNode node.
1345
+ def visit_instance_variable_write_node(node)
1346
+ commands << [inspect_node("InstanceVariableWriteNode", node), indent]
1347
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1348
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1349
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1350
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1351
+ commands << ["├── value:\n", indent]
1352
+ commands << [node.value, "#{indent}│ "]
1353
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1354
+ end
1355
+
1356
+ # Inspect a IntegerNode node.
1357
+ def visit_integer_node(node)
1358
+ commands << [inspect_node("IntegerNode", node), indent]
1359
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("binary" if node.binary?), ("decimal" if node.decimal?), ("octal" if node.octal?), ("hexadecimal" if node.hexadecimal?)].compact
1360
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1361
+ commands << ["└── value: #{node.value.inspect}\n", indent]
1362
+ end
1363
+
1364
+ # Inspect a InterpolatedMatchLastLineNode node.
1365
+ def visit_interpolated_match_last_line_node(node)
1366
+ commands << [inspect_node("InterpolatedMatchLastLineNode", node), indent]
1367
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("ignore_case" if node.ignore_case?), ("extended" if node.extended?), ("multi_line" if node.multi_line?), ("once" if node.once?), ("euc_jp" if node.euc_jp?), ("ascii_8bit" if node.ascii_8bit?), ("windows_31j" if node.windows_31j?), ("utf_8" if node.utf_8?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("forced_us_ascii_encoding" if node.forced_us_ascii_encoding?)].compact
1368
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1369
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1370
+ commands << ["├── parts: (length: #{(parts = node.parts).length})\n", indent]
1371
+ if parts.any?
1372
+ parts[0...-1].each do |child|
1373
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1374
+ commands << [child, "#{indent}│ │ "]
1375
+ end
1376
+ commands << [Replace.new("#{indent}│ └── "), indent]
1377
+ commands << [parts[-1], "#{indent}│ "]
1378
+ end
1379
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1380
+ end
1381
+
1382
+ # Inspect a InterpolatedRegularExpressionNode node.
1383
+ def visit_interpolated_regular_expression_node(node)
1384
+ commands << [inspect_node("InterpolatedRegularExpressionNode", node), indent]
1385
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("ignore_case" if node.ignore_case?), ("extended" if node.extended?), ("multi_line" if node.multi_line?), ("once" if node.once?), ("euc_jp" if node.euc_jp?), ("ascii_8bit" if node.ascii_8bit?), ("windows_31j" if node.windows_31j?), ("utf_8" if node.utf_8?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("forced_us_ascii_encoding" if node.forced_us_ascii_encoding?)].compact
1386
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1387
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1388
+ commands << ["├── parts: (length: #{(parts = node.parts).length})\n", indent]
1389
+ if parts.any?
1390
+ parts[0...-1].each do |child|
1391
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1392
+ commands << [child, "#{indent}│ │ "]
1393
+ end
1394
+ commands << [Replace.new("#{indent}│ └── "), indent]
1395
+ commands << [parts[-1], "#{indent}│ "]
1396
+ end
1397
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1398
+ end
1399
+
1400
+ # Inspect a InterpolatedStringNode node.
1401
+ def visit_interpolated_string_node(node)
1402
+ commands << [inspect_node("InterpolatedStringNode", node), indent]
1403
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("frozen" if node.frozen?), ("mutable" if node.mutable?)].compact
1404
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1405
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1406
+ commands << ["├── parts: (length: #{(parts = node.parts).length})\n", indent]
1407
+ if parts.any?
1408
+ parts[0...-1].each do |child|
1409
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1410
+ commands << [child, "#{indent}│ │ "]
1411
+ end
1412
+ commands << [Replace.new("#{indent}│ └── "), indent]
1413
+ commands << [parts[-1], "#{indent}│ "]
1414
+ end
1415
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1416
+ end
1417
+
1418
+ # Inspect a InterpolatedSymbolNode node.
1419
+ def visit_interpolated_symbol_node(node)
1420
+ commands << [inspect_node("InterpolatedSymbolNode", node), indent]
1421
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1422
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1423
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1424
+ commands << ["├── parts: (length: #{(parts = node.parts).length})\n", indent]
1425
+ if parts.any?
1426
+ parts[0...-1].each do |child|
1427
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1428
+ commands << [child, "#{indent}│ │ "]
1429
+ end
1430
+ commands << [Replace.new("#{indent}│ └── "), indent]
1431
+ commands << [parts[-1], "#{indent}│ "]
1432
+ end
1433
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1434
+ end
1435
+
1436
+ # Inspect a InterpolatedXStringNode node.
1437
+ def visit_interpolated_x_string_node(node)
1438
+ commands << [inspect_node("InterpolatedXStringNode", node), indent]
1439
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1440
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1441
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1442
+ commands << ["├── parts: (length: #{(parts = node.parts).length})\n", indent]
1443
+ if parts.any?
1444
+ parts[0...-1].each do |child|
1445
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1446
+ commands << [child, "#{indent}│ │ "]
1447
+ end
1448
+ commands << [Replace.new("#{indent}│ └── "), indent]
1449
+ commands << [parts[-1], "#{indent}│ "]
1450
+ end
1451
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1452
+ end
1453
+
1454
+ # Inspect a ItLocalVariableReadNode node.
1455
+ def visit_it_local_variable_read_node(node)
1456
+ commands << [inspect_node("ItLocalVariableReadNode", node), indent]
1457
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1458
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1459
+ end
1460
+
1461
+ # Inspect a ItParametersNode node.
1462
+ def visit_it_parameters_node(node)
1463
+ commands << [inspect_node("ItParametersNode", node), indent]
1464
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1465
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1466
+ end
1467
+
1468
+ # Inspect a KeywordHashNode node.
1469
+ def visit_keyword_hash_node(node)
1470
+ commands << [inspect_node("KeywordHashNode", node), indent]
1471
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("symbol_keys" if node.symbol_keys?)].compact
1472
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1473
+ commands << ["└── elements: (length: #{(elements = node.elements).length})\n", indent]
1474
+ if elements.any?
1475
+ elements[0...-1].each do |child|
1476
+ commands << [Replace.new("#{indent} ├── "), indent]
1477
+ commands << [child, "#{indent} │ "]
1478
+ end
1479
+ commands << [Replace.new("#{indent} └── "), indent]
1480
+ commands << [elements[-1], "#{indent} "]
1481
+ end
1482
+ end
1483
+
1484
+ # Inspect a KeywordRestParameterNode node.
1485
+ def visit_keyword_rest_parameter_node(node)
1486
+ commands << [inspect_node("KeywordRestParameterNode", node), indent]
1487
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
1488
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1489
+ if (name = node.name).nil?
1490
+ commands << ["├── name: ∅\n", indent]
1491
+ else
1492
+ commands << ["├── name: #{name.inspect}\n", indent]
1493
+ end
1494
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1495
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1496
+ end
1497
+
1498
+ # Inspect a LambdaNode node.
1499
+ def visit_lambda_node(node)
1500
+ commands << [inspect_node("LambdaNode", node), indent]
1501
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1502
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1503
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
1504
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1505
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1506
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1507
+ if (parameters = node.parameters).nil?
1508
+ commands << ["├── parameters: ∅\n", indent]
1509
+ else
1510
+ commands << ["├── parameters:\n", indent]
1511
+ commands << [parameters, "#{indent}│ "]
1512
+ end
1513
+ if (body = node.body).nil?
1514
+ commands << ["└── body: ∅\n", indent]
1515
+ else
1516
+ commands << ["└── body:\n", indent]
1517
+ commands << [body, "#{indent} "]
1518
+ end
1519
+ end
1520
+
1521
+ # Inspect a LocalVariableAndWriteNode node.
1522
+ def visit_local_variable_and_write_node(node)
1523
+ commands << [inspect_node("LocalVariableAndWriteNode", node), indent]
1524
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1525
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1526
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1527
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1528
+ commands << ["├── value:\n", indent]
1529
+ commands << [node.value, "#{indent}│ "]
1530
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1531
+ commands << ["└── depth: #{node.depth.inspect}\n", indent]
1532
+ end
1533
+
1534
+ # Inspect a LocalVariableOperatorWriteNode node.
1535
+ def visit_local_variable_operator_write_node(node)
1536
+ commands << [inspect_node("LocalVariableOperatorWriteNode", node), indent]
1537
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1538
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1539
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1540
+ commands << ["├── binary_operator_loc: #{inspect_location(node.binary_operator_loc)}\n", indent]
1541
+ commands << ["├── value:\n", indent]
1542
+ commands << [node.value, "#{indent}│ "]
1543
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1544
+ commands << ["├── binary_operator: #{node.binary_operator.inspect}\n", indent]
1545
+ commands << ["└── depth: #{node.depth.inspect}\n", indent]
1546
+ end
1547
+
1548
+ # Inspect a LocalVariableOrWriteNode node.
1549
+ def visit_local_variable_or_write_node(node)
1550
+ commands << [inspect_node("LocalVariableOrWriteNode", node), indent]
1551
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1552
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1553
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1554
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1555
+ commands << ["├── value:\n", indent]
1556
+ commands << [node.value, "#{indent}│ "]
1557
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1558
+ commands << ["└── depth: #{node.depth.inspect}\n", indent]
1559
+ end
1560
+
1561
+ # Inspect a LocalVariableReadNode node.
1562
+ def visit_local_variable_read_node(node)
1563
+ commands << [inspect_node("LocalVariableReadNode", node), indent]
1564
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1565
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1566
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1567
+ commands << ["└── depth: #{node.depth.inspect}\n", indent]
1568
+ end
1569
+
1570
+ # Inspect a LocalVariableTargetNode node.
1571
+ def visit_local_variable_target_node(node)
1572
+ commands << [inspect_node("LocalVariableTargetNode", node), indent]
1573
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1574
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1575
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1576
+ commands << ["└── depth: #{node.depth.inspect}\n", indent]
1577
+ end
1578
+
1579
+ # Inspect a LocalVariableWriteNode node.
1580
+ def visit_local_variable_write_node(node)
1581
+ commands << [inspect_node("LocalVariableWriteNode", node), indent]
1582
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1583
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1584
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1585
+ commands << ["├── depth: #{node.depth.inspect}\n", indent]
1586
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1587
+ commands << ["├── value:\n", indent]
1588
+ commands << [node.value, "#{indent}│ "]
1589
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1590
+ end
1591
+
1592
+ # Inspect a MatchLastLineNode node.
1593
+ def visit_match_last_line_node(node)
1594
+ commands << [inspect_node("MatchLastLineNode", node), indent]
1595
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("ignore_case" if node.ignore_case?), ("extended" if node.extended?), ("multi_line" if node.multi_line?), ("once" if node.once?), ("euc_jp" if node.euc_jp?), ("ascii_8bit" if node.ascii_8bit?), ("windows_31j" if node.windows_31j?), ("utf_8" if node.utf_8?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("forced_us_ascii_encoding" if node.forced_us_ascii_encoding?)].compact
1596
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1597
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1598
+ commands << ["├── content_loc: #{inspect_location(node.content_loc)}\n", indent]
1599
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1600
+ commands << ["└── unescaped: #{node.unescaped.inspect}\n", indent]
1601
+ end
1602
+
1603
+ # Inspect a MatchPredicateNode node.
1604
+ def visit_match_predicate_node(node)
1605
+ commands << [inspect_node("MatchPredicateNode", node), indent]
1606
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1607
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1608
+ commands << ["├── value:\n", indent]
1609
+ commands << [node.value, "#{indent}│ "]
1610
+ commands << ["├── pattern:\n", indent]
1611
+ commands << [node.pattern, "#{indent}│ "]
1612
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1613
+ end
1614
+
1615
+ # Inspect a MatchRequiredNode node.
1616
+ def visit_match_required_node(node)
1617
+ commands << [inspect_node("MatchRequiredNode", node), indent]
1618
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1619
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1620
+ commands << ["├── value:\n", indent]
1621
+ commands << [node.value, "#{indent}│ "]
1622
+ commands << ["├── pattern:\n", indent]
1623
+ commands << [node.pattern, "#{indent}│ "]
1624
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1625
+ end
1626
+
1627
+ # Inspect a MatchWriteNode node.
1628
+ def visit_match_write_node(node)
1629
+ commands << [inspect_node("MatchWriteNode", node), indent]
1630
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1631
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1632
+ commands << ["├── call:\n", indent]
1633
+ commands << [node.call, "#{indent}│ "]
1634
+ commands << ["└── targets: (length: #{(targets = node.targets).length})\n", indent]
1635
+ if targets.any?
1636
+ targets[0...-1].each do |child|
1637
+ commands << [Replace.new("#{indent} ├── "), indent]
1638
+ commands << [child, "#{indent} │ "]
1639
+ end
1640
+ commands << [Replace.new("#{indent} └── "), indent]
1641
+ commands << [targets[-1], "#{indent} "]
1642
+ end
1643
+ end
1644
+
1645
+ # Inspect a MissingNode node.
1646
+ def visit_missing_node(node)
1647
+ commands << [inspect_node("MissingNode", node), indent]
1648
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1649
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1650
+ end
1651
+
1652
+ # Inspect a ModuleNode node.
1653
+ def visit_module_node(node)
1654
+ commands << [inspect_node("ModuleNode", node), indent]
1655
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1656
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1657
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
1658
+ commands << ["├── module_keyword_loc: #{inspect_location(node.module_keyword_loc)}\n", indent]
1659
+ commands << ["├── constant_path:\n", indent]
1660
+ commands << [node.constant_path, "#{indent}│ "]
1661
+ if (body = node.body).nil?
1662
+ commands << ["├── body: ∅\n", indent]
1663
+ else
1664
+ commands << ["├── body:\n", indent]
1665
+ commands << [body, "#{indent}│ "]
1666
+ end
1667
+ commands << ["├── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
1668
+ commands << ["└── name: #{node.name.inspect}\n", indent]
1669
+ end
1670
+
1671
+ # Inspect a MultiTargetNode node.
1672
+ def visit_multi_target_node(node)
1673
+ commands << [inspect_node("MultiTargetNode", node), indent]
1674
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1675
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1676
+ commands << ["├── lefts: (length: #{(lefts = node.lefts).length})\n", indent]
1677
+ if lefts.any?
1678
+ lefts[0...-1].each do |child|
1679
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1680
+ commands << [child, "#{indent}│ │ "]
1681
+ end
1682
+ commands << [Replace.new("#{indent}│ └── "), indent]
1683
+ commands << [lefts[-1], "#{indent}│ "]
1684
+ end
1685
+ if (rest = node.rest).nil?
1686
+ commands << ["├── rest: ∅\n", indent]
1687
+ else
1688
+ commands << ["├── rest:\n", indent]
1689
+ commands << [rest, "#{indent}│ "]
1690
+ end
1691
+ commands << ["├── rights: (length: #{(rights = node.rights).length})\n", indent]
1692
+ if rights.any?
1693
+ rights[0...-1].each do |child|
1694
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1695
+ commands << [child, "#{indent}│ │ "]
1696
+ end
1697
+ commands << [Replace.new("#{indent}│ └── "), indent]
1698
+ commands << [rights[-1], "#{indent}│ "]
1699
+ end
1700
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
1701
+ commands << ["└── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
1702
+ end
1703
+
1704
+ # Inspect a MultiWriteNode node.
1705
+ def visit_multi_write_node(node)
1706
+ commands << [inspect_node("MultiWriteNode", node), indent]
1707
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1708
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1709
+ commands << ["├── lefts: (length: #{(lefts = node.lefts).length})\n", indent]
1710
+ if lefts.any?
1711
+ lefts[0...-1].each do |child|
1712
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1713
+ commands << [child, "#{indent}│ │ "]
1714
+ end
1715
+ commands << [Replace.new("#{indent}│ └── "), indent]
1716
+ commands << [lefts[-1], "#{indent}│ "]
1717
+ end
1718
+ if (rest = node.rest).nil?
1719
+ commands << ["├── rest: ∅\n", indent]
1720
+ else
1721
+ commands << ["├── rest:\n", indent]
1722
+ commands << [rest, "#{indent}│ "]
1723
+ end
1724
+ commands << ["├── rights: (length: #{(rights = node.rights).length})\n", indent]
1725
+ if rights.any?
1726
+ rights[0...-1].each do |child|
1727
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1728
+ commands << [child, "#{indent}│ │ "]
1729
+ end
1730
+ commands << [Replace.new("#{indent}│ └── "), indent]
1731
+ commands << [rights[-1], "#{indent}│ "]
1732
+ end
1733
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
1734
+ commands << ["├── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
1735
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1736
+ commands << ["└── value:\n", indent]
1737
+ commands << [node.value, "#{indent} "]
1738
+ end
1739
+
1740
+ # Inspect a NextNode node.
1741
+ def visit_next_node(node)
1742
+ commands << [inspect_node("NextNode", node), indent]
1743
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1744
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1745
+ if (arguments = node.arguments).nil?
1746
+ commands << ["├── arguments: ∅\n", indent]
1747
+ else
1748
+ commands << ["├── arguments:\n", indent]
1749
+ commands << [arguments, "#{indent}│ "]
1750
+ end
1751
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
1752
+ end
1753
+
1754
+ # Inspect a NilNode node.
1755
+ def visit_nil_node(node)
1756
+ commands << [inspect_node("NilNode", node), indent]
1757
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1758
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1759
+ end
1760
+
1761
+ # Inspect a NoKeywordsParameterNode node.
1762
+ def visit_no_keywords_parameter_node(node)
1763
+ commands << [inspect_node("NoKeywordsParameterNode", node), indent]
1764
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1765
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1766
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1767
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
1768
+ end
1769
+
1770
+ # Inspect a NumberedParametersNode node.
1771
+ def visit_numbered_parameters_node(node)
1772
+ commands << [inspect_node("NumberedParametersNode", node), indent]
1773
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1774
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1775
+ commands << ["└── maximum: #{node.maximum.inspect}\n", indent]
1776
+ end
1777
+
1778
+ # Inspect a NumberedReferenceReadNode node.
1779
+ def visit_numbered_reference_read_node(node)
1780
+ commands << [inspect_node("NumberedReferenceReadNode", node), indent]
1781
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1782
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1783
+ commands << ["└── number: #{node.number.inspect}\n", indent]
1784
+ end
1785
+
1786
+ # Inspect a OptionalKeywordParameterNode node.
1787
+ def visit_optional_keyword_parameter_node(node)
1788
+ commands << [inspect_node("OptionalKeywordParameterNode", node), indent]
1789
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
1790
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1791
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1792
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1793
+ commands << ["└── value:\n", indent]
1794
+ commands << [node.value, "#{indent} "]
1795
+ end
1796
+
1797
+ # Inspect a OptionalParameterNode node.
1798
+ def visit_optional_parameter_node(node)
1799
+ commands << [inspect_node("OptionalParameterNode", node), indent]
1800
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
1801
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1802
+ commands << ["├── name: #{node.name.inspect}\n", indent]
1803
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
1804
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1805
+ commands << ["└── value:\n", indent]
1806
+ commands << [node.value, "#{indent} "]
1807
+ end
1808
+
1809
+ # Inspect a OrNode node.
1810
+ def visit_or_node(node)
1811
+ commands << [inspect_node("OrNode", node), indent]
1812
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1813
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1814
+ commands << ["├── left:\n", indent]
1815
+ commands << [node.left, "#{indent}│ "]
1816
+ commands << ["├── right:\n", indent]
1817
+ commands << [node.right, "#{indent}│ "]
1818
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1819
+ end
1820
+
1821
+ # Inspect a ParametersNode node.
1822
+ def visit_parameters_node(node)
1823
+ commands << [inspect_node("ParametersNode", node), indent]
1824
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1825
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1826
+ commands << ["├── requireds: (length: #{(requireds = node.requireds).length})\n", indent]
1827
+ if requireds.any?
1828
+ requireds[0...-1].each do |child|
1829
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1830
+ commands << [child, "#{indent}│ │ "]
1831
+ end
1832
+ commands << [Replace.new("#{indent}│ └── "), indent]
1833
+ commands << [requireds[-1], "#{indent}│ "]
1834
+ end
1835
+ commands << ["├── optionals: (length: #{(optionals = node.optionals).length})\n", indent]
1836
+ if optionals.any?
1837
+ optionals[0...-1].each do |child|
1838
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1839
+ commands << [child, "#{indent}│ │ "]
1840
+ end
1841
+ commands << [Replace.new("#{indent}│ └── "), indent]
1842
+ commands << [optionals[-1], "#{indent}│ "]
1843
+ end
1844
+ if (rest = node.rest).nil?
1845
+ commands << ["├── rest: ∅\n", indent]
1846
+ else
1847
+ commands << ["├── rest:\n", indent]
1848
+ commands << [rest, "#{indent}│ "]
1849
+ end
1850
+ commands << ["├── posts: (length: #{(posts = node.posts).length})\n", indent]
1851
+ if posts.any?
1852
+ posts[0...-1].each do |child|
1853
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1854
+ commands << [child, "#{indent}│ │ "]
1855
+ end
1856
+ commands << [Replace.new("#{indent}│ └── "), indent]
1857
+ commands << [posts[-1], "#{indent}│ "]
1858
+ end
1859
+ commands << ["├── keywords: (length: #{(keywords = node.keywords).length})\n", indent]
1860
+ if keywords.any?
1861
+ keywords[0...-1].each do |child|
1862
+ commands << [Replace.new("#{indent}│ ├── "), indent]
1863
+ commands << [child, "#{indent}│ │ "]
1864
+ end
1865
+ commands << [Replace.new("#{indent}│ └── "), indent]
1866
+ commands << [keywords[-1], "#{indent}│ "]
1867
+ end
1868
+ if (keyword_rest = node.keyword_rest).nil?
1869
+ commands << ["├── keyword_rest: ∅\n", indent]
1870
+ else
1871
+ commands << ["├── keyword_rest:\n", indent]
1872
+ commands << [keyword_rest, "#{indent}│ "]
1873
+ end
1874
+ if (block = node.block).nil?
1875
+ commands << ["└── block: ∅\n", indent]
1876
+ else
1877
+ commands << ["└── block:\n", indent]
1878
+ commands << [block, "#{indent} "]
1879
+ end
1880
+ end
1881
+
1882
+ # Inspect a ParenthesesNode node.
1883
+ def visit_parentheses_node(node)
1884
+ commands << [inspect_node("ParenthesesNode", node), indent]
1885
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("multiple_statements" if node.multiple_statements?)].compact
1886
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1887
+ if (body = node.body).nil?
1888
+ commands << ["├── body: ∅\n", indent]
1889
+ else
1890
+ commands << ["├── body:\n", indent]
1891
+ commands << [body, "#{indent}│ "]
1892
+ end
1893
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1894
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1895
+ end
1896
+
1897
+ # Inspect a PinnedExpressionNode node.
1898
+ def visit_pinned_expression_node(node)
1899
+ commands << [inspect_node("PinnedExpressionNode", node), indent]
1900
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1901
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1902
+ commands << ["├── expression:\n", indent]
1903
+ commands << [node.expression, "#{indent}│ "]
1904
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1905
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
1906
+ commands << ["└── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
1907
+ end
1908
+
1909
+ # Inspect a PinnedVariableNode node.
1910
+ def visit_pinned_variable_node(node)
1911
+ commands << [inspect_node("PinnedVariableNode", node), indent]
1912
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1913
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1914
+ commands << ["├── variable:\n", indent]
1915
+ commands << [node.variable, "#{indent}│ "]
1916
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1917
+ end
1918
+
1919
+ # Inspect a PostExecutionNode node.
1920
+ def visit_post_execution_node(node)
1921
+ commands << [inspect_node("PostExecutionNode", node), indent]
1922
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1923
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1924
+ if (statements = node.statements).nil?
1925
+ commands << ["├── statements: ∅\n", indent]
1926
+ else
1927
+ commands << ["├── statements:\n", indent]
1928
+ commands << [statements, "#{indent}│ "]
1929
+ end
1930
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
1931
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1932
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1933
+ end
1934
+
1935
+ # Inspect a PreExecutionNode node.
1936
+ def visit_pre_execution_node(node)
1937
+ commands << [inspect_node("PreExecutionNode", node), indent]
1938
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1939
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1940
+ if (statements = node.statements).nil?
1941
+ commands << ["├── statements: ∅\n", indent]
1942
+ else
1943
+ commands << ["├── statements:\n", indent]
1944
+ commands << [statements, "#{indent}│ "]
1945
+ end
1946
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
1947
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
1948
+ commands << ["└── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
1949
+ end
1950
+
1951
+ # Inspect a ProgramNode node.
1952
+ def visit_program_node(node)
1953
+ commands << [inspect_node("ProgramNode", node), indent]
1954
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1955
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1956
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
1957
+ commands << ["└── statements:\n", indent]
1958
+ commands << [node.statements, "#{indent} "]
1959
+ end
1960
+
1961
+ # Inspect a RangeNode node.
1962
+ def visit_range_node(node)
1963
+ commands << [inspect_node("RangeNode", node), indent]
1964
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("exclude_end" if node.exclude_end?)].compact
1965
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1966
+ if (left = node.left).nil?
1967
+ commands << ["├── left: ∅\n", indent]
1968
+ else
1969
+ commands << ["├── left:\n", indent]
1970
+ commands << [left, "#{indent}│ "]
1971
+ end
1972
+ if (right = node.right).nil?
1973
+ commands << ["├── right: ∅\n", indent]
1974
+ else
1975
+ commands << ["├── right:\n", indent]
1976
+ commands << [right, "#{indent}│ "]
1977
+ end
1978
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
1979
+ end
1980
+
1981
+ # Inspect a RationalNode node.
1982
+ def visit_rational_node(node)
1983
+ commands << [inspect_node("RationalNode", node), indent]
1984
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("binary" if node.binary?), ("decimal" if node.decimal?), ("octal" if node.octal?), ("hexadecimal" if node.hexadecimal?)].compact
1985
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1986
+ commands << ["├── numerator: #{node.numerator.inspect}\n", indent]
1987
+ commands << ["└── denominator: #{node.denominator.inspect}\n", indent]
1988
+ end
1989
+
1990
+ # Inspect a RedoNode node.
1991
+ def visit_redo_node(node)
1992
+ commands << [inspect_node("RedoNode", node), indent]
1993
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
1994
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
1995
+ end
1996
+
1997
+ # Inspect a RegularExpressionNode node.
1998
+ def visit_regular_expression_node(node)
1999
+ commands << [inspect_node("RegularExpressionNode", node), indent]
2000
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("ignore_case" if node.ignore_case?), ("extended" if node.extended?), ("multi_line" if node.multi_line?), ("once" if node.once?), ("euc_jp" if node.euc_jp?), ("ascii_8bit" if node.ascii_8bit?), ("windows_31j" if node.windows_31j?), ("utf_8" if node.utf_8?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("forced_us_ascii_encoding" if node.forced_us_ascii_encoding?)].compact
2001
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2002
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
2003
+ commands << ["├── content_loc: #{inspect_location(node.content_loc)}\n", indent]
2004
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2005
+ commands << ["└── unescaped: #{node.unescaped.inspect}\n", indent]
2006
+ end
2007
+
2008
+ # Inspect a RequiredKeywordParameterNode node.
2009
+ def visit_required_keyword_parameter_node(node)
2010
+ commands << [inspect_node("RequiredKeywordParameterNode", node), indent]
2011
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
2012
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2013
+ commands << ["├── name: #{node.name.inspect}\n", indent]
2014
+ commands << ["└── name_loc: #{inspect_location(node.name_loc)}\n", indent]
2015
+ end
2016
+
2017
+ # Inspect a RequiredParameterNode node.
2018
+ def visit_required_parameter_node(node)
2019
+ commands << [inspect_node("RequiredParameterNode", node), indent]
2020
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
2021
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2022
+ commands << ["└── name: #{node.name.inspect}\n", indent]
2023
+ end
2024
+
2025
+ # Inspect a RescueModifierNode node.
2026
+ def visit_rescue_modifier_node(node)
2027
+ commands << [inspect_node("RescueModifierNode", node), indent]
2028
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2029
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2030
+ commands << ["├── expression:\n", indent]
2031
+ commands << [node.expression, "#{indent}│ "]
2032
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2033
+ commands << ["└── rescue_expression:\n", indent]
2034
+ commands << [node.rescue_expression, "#{indent} "]
2035
+ end
2036
+
2037
+ # Inspect a RescueNode node.
2038
+ def visit_rescue_node(node)
2039
+ commands << [inspect_node("RescueNode", node), indent]
2040
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2041
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2042
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2043
+ commands << ["├── exceptions: (length: #{(exceptions = node.exceptions).length})\n", indent]
2044
+ if exceptions.any?
2045
+ exceptions[0...-1].each do |child|
2046
+ commands << [Replace.new("#{indent}│ ├── "), indent]
2047
+ commands << [child, "#{indent}│ │ "]
2048
+ end
2049
+ commands << [Replace.new("#{indent}│ └── "), indent]
2050
+ commands << [exceptions[-1], "#{indent}│ "]
2051
+ end
2052
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
2053
+ if (reference = node.reference).nil?
2054
+ commands << ["├── reference: ∅\n", indent]
2055
+ else
2056
+ commands << ["├── reference:\n", indent]
2057
+ commands << [reference, "#{indent}│ "]
2058
+ end
2059
+ commands << ["├── then_keyword_loc: #{inspect_location(node.then_keyword_loc)}\n", indent]
2060
+ if (statements = node.statements).nil?
2061
+ commands << ["├── statements: ∅\n", indent]
2062
+ else
2063
+ commands << ["├── statements:\n", indent]
2064
+ commands << [statements, "#{indent}│ "]
2065
+ end
2066
+ if (subsequent = node.subsequent).nil?
2067
+ commands << ["└── subsequent: ∅\n", indent]
2068
+ else
2069
+ commands << ["└── subsequent:\n", indent]
2070
+ commands << [subsequent, "#{indent} "]
2071
+ end
2072
+ end
2073
+
2074
+ # Inspect a RestParameterNode node.
2075
+ def visit_rest_parameter_node(node)
2076
+ commands << [inspect_node("RestParameterNode", node), indent]
2077
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("repeated_parameter" if node.repeated_parameter?)].compact
2078
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2079
+ if (name = node.name).nil?
2080
+ commands << ["├── name: ∅\n", indent]
2081
+ else
2082
+ commands << ["├── name: #{name.inspect}\n", indent]
2083
+ end
2084
+ commands << ["├── name_loc: #{inspect_location(node.name_loc)}\n", indent]
2085
+ commands << ["└── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
2086
+ end
2087
+
2088
+ # Inspect a RetryNode node.
2089
+ def visit_retry_node(node)
2090
+ commands << [inspect_node("RetryNode", node), indent]
2091
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2092
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2093
+ end
2094
+
2095
+ # Inspect a ReturnNode node.
2096
+ def visit_return_node(node)
2097
+ commands << [inspect_node("ReturnNode", node), indent]
2098
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2099
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2100
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2101
+ if (arguments = node.arguments).nil?
2102
+ commands << ["└── arguments: ∅\n", indent]
2103
+ else
2104
+ commands << ["└── arguments:\n", indent]
2105
+ commands << [arguments, "#{indent} "]
2106
+ end
2107
+ end
2108
+
2109
+ # Inspect a SelfNode node.
2110
+ def visit_self_node(node)
2111
+ commands << [inspect_node("SelfNode", node), indent]
2112
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2113
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2114
+ end
2115
+
2116
+ # Inspect a ShareableConstantNode node.
2117
+ def visit_shareable_constant_node(node)
2118
+ commands << [inspect_node("ShareableConstantNode", node), indent]
2119
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("literal" if node.literal?), ("experimental_everything" if node.experimental_everything?), ("experimental_copy" if node.experimental_copy?)].compact
2120
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2121
+ commands << ["└── write:\n", indent]
2122
+ commands << [node.write, "#{indent} "]
2123
+ end
2124
+
2125
+ # Inspect a SingletonClassNode node.
2126
+ def visit_singleton_class_node(node)
2127
+ commands << [inspect_node("SingletonClassNode", node), indent]
2128
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2129
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2130
+ commands << ["├── locals: #{node.locals.inspect}\n", indent]
2131
+ commands << ["├── class_keyword_loc: #{inspect_location(node.class_keyword_loc)}\n", indent]
2132
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
2133
+ commands << ["├── expression:\n", indent]
2134
+ commands << [node.expression, "#{indent}│ "]
2135
+ if (body = node.body).nil?
2136
+ commands << ["├── body: ∅\n", indent]
2137
+ else
2138
+ commands << ["├── body:\n", indent]
2139
+ commands << [body, "#{indent}│ "]
2140
+ end
2141
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
2142
+ end
2143
+
2144
+ # Inspect a SourceEncodingNode node.
2145
+ def visit_source_encoding_node(node)
2146
+ commands << [inspect_node("SourceEncodingNode", node), indent]
2147
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2148
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2149
+ end
2150
+
2151
+ # Inspect a SourceFileNode node.
2152
+ def visit_source_file_node(node)
2153
+ commands << [inspect_node("SourceFileNode", node), indent]
2154
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("frozen" if node.frozen?), ("mutable" if node.mutable?)].compact
2155
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2156
+ commands << ["└── filepath: #{node.filepath.inspect}\n", indent]
2157
+ end
2158
+
2159
+ # Inspect a SourceLineNode node.
2160
+ def visit_source_line_node(node)
2161
+ commands << [inspect_node("SourceLineNode", node), indent]
2162
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2163
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2164
+ end
2165
+
2166
+ # Inspect a SplatNode node.
2167
+ def visit_splat_node(node)
2168
+ commands << [inspect_node("SplatNode", node), indent]
2169
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2170
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2171
+ commands << ["├── operator_loc: #{inspect_location(node.operator_loc)}\n", indent]
2172
+ if (expression = node.expression).nil?
2173
+ commands << ["└── expression: ∅\n", indent]
2174
+ else
2175
+ commands << ["└── expression:\n", indent]
2176
+ commands << [expression, "#{indent} "]
2177
+ end
2178
+ end
2179
+
2180
+ # Inspect a StatementsNode node.
2181
+ def visit_statements_node(node)
2182
+ commands << [inspect_node("StatementsNode", node), indent]
2183
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2184
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2185
+ commands << ["└── body: (length: #{(body = node.body).length})\n", indent]
2186
+ if body.any?
2187
+ body[0...-1].each do |child|
2188
+ commands << [Replace.new("#{indent} ├── "), indent]
2189
+ commands << [child, "#{indent} │ "]
2190
+ end
2191
+ commands << [Replace.new("#{indent} └── "), indent]
2192
+ commands << [body[-1], "#{indent} "]
2193
+ end
2194
+ end
2195
+
2196
+ # Inspect a StringNode node.
2197
+ def visit_string_node(node)
2198
+ commands << [inspect_node("StringNode", node), indent]
2199
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("frozen" if node.frozen?), ("mutable" if node.mutable?)].compact
2200
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2201
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
2202
+ commands << ["├── content_loc: #{inspect_location(node.content_loc)}\n", indent]
2203
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2204
+ commands << ["└── unescaped: #{node.unescaped.inspect}\n", indent]
2205
+ end
2206
+
2207
+ # Inspect a SuperNode node.
2208
+ def visit_super_node(node)
2209
+ commands << [inspect_node("SuperNode", node), indent]
2210
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2211
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2212
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2213
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
2214
+ if (arguments = node.arguments).nil?
2215
+ commands << ["├── arguments: ∅\n", indent]
2216
+ else
2217
+ commands << ["├── arguments:\n", indent]
2218
+ commands << [arguments, "#{indent}│ "]
2219
+ end
2220
+ commands << ["├── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
2221
+ if (block = node.block).nil?
2222
+ commands << ["└── block: ∅\n", indent]
2223
+ else
2224
+ commands << ["└── block:\n", indent]
2225
+ commands << [block, "#{indent} "]
2226
+ end
2227
+ end
2228
+
2229
+ # Inspect a SymbolNode node.
2230
+ def visit_symbol_node(node)
2231
+ commands << [inspect_node("SymbolNode", node), indent]
2232
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?), ("forced_us_ascii_encoding" if node.forced_us_ascii_encoding?)].compact
2233
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2234
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
2235
+ commands << ["├── value_loc: #{inspect_location(node.value_loc)}\n", indent]
2236
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2237
+ commands << ["└── unescaped: #{node.unescaped.inspect}\n", indent]
2238
+ end
2239
+
2240
+ # Inspect a TrueNode node.
2241
+ def visit_true_node(node)
2242
+ commands << [inspect_node("TrueNode", node), indent]
2243
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2244
+ commands << ["└── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2245
+ end
2246
+
2247
+ # Inspect a UndefNode node.
2248
+ def visit_undef_node(node)
2249
+ commands << [inspect_node("UndefNode", node), indent]
2250
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2251
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2252
+ commands << ["├── names: (length: #{(names = node.names).length})\n", indent]
2253
+ if names.any?
2254
+ names[0...-1].each do |child|
2255
+ commands << [Replace.new("#{indent}│ ├── "), indent]
2256
+ commands << [child, "#{indent}│ │ "]
2257
+ end
2258
+ commands << [Replace.new("#{indent}│ └── "), indent]
2259
+ commands << [names[-1], "#{indent}│ "]
2260
+ end
2261
+ commands << ["└── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2262
+ end
2263
+
2264
+ # Inspect a UnlessNode node.
2265
+ def visit_unless_node(node)
2266
+ commands << [inspect_node("UnlessNode", node), indent]
2267
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2268
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2269
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2270
+ commands << ["├── predicate:\n", indent]
2271
+ commands << [node.predicate, "#{indent}│ "]
2272
+ commands << ["├── then_keyword_loc: #{inspect_location(node.then_keyword_loc)}\n", indent]
2273
+ if (statements = node.statements).nil?
2274
+ commands << ["├── statements: ∅\n", indent]
2275
+ else
2276
+ commands << ["├── statements:\n", indent]
2277
+ commands << [statements, "#{indent}│ "]
2278
+ end
2279
+ if (else_clause = node.else_clause).nil?
2280
+ commands << ["├── else_clause: ∅\n", indent]
2281
+ else
2282
+ commands << ["├── else_clause:\n", indent]
2283
+ commands << [else_clause, "#{indent}│ "]
2284
+ end
2285
+ commands << ["└── end_keyword_loc: #{inspect_location(node.end_keyword_loc)}\n", indent]
2286
+ end
2287
+
2288
+ # Inspect a UntilNode node.
2289
+ def visit_until_node(node)
2290
+ commands << [inspect_node("UntilNode", node), indent]
2291
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("begin_modifier" if node.begin_modifier?)].compact
2292
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2293
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2294
+ commands << ["├── do_keyword_loc: #{inspect_location(node.do_keyword_loc)}\n", indent]
2295
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2296
+ commands << ["├── predicate:\n", indent]
2297
+ commands << [node.predicate, "#{indent}│ "]
2298
+ if (statements = node.statements).nil?
2299
+ commands << ["└── statements: ∅\n", indent]
2300
+ else
2301
+ commands << ["└── statements:\n", indent]
2302
+ commands << [statements, "#{indent} "]
2303
+ end
2304
+ end
2305
+
2306
+ # Inspect a WhenNode node.
2307
+ def visit_when_node(node)
2308
+ commands << [inspect_node("WhenNode", node), indent]
2309
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2310
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2311
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2312
+ commands << ["├── conditions: (length: #{(conditions = node.conditions).length})\n", indent]
2313
+ if conditions.any?
2314
+ conditions[0...-1].each do |child|
2315
+ commands << [Replace.new("#{indent}│ ├── "), indent]
2316
+ commands << [child, "#{indent}│ │ "]
2317
+ end
2318
+ commands << [Replace.new("#{indent}│ └── "), indent]
2319
+ commands << [conditions[-1], "#{indent}│ "]
2320
+ end
2321
+ commands << ["├── then_keyword_loc: #{inspect_location(node.then_keyword_loc)}\n", indent]
2322
+ if (statements = node.statements).nil?
2323
+ commands << ["└── statements: ∅\n", indent]
2324
+ else
2325
+ commands << ["└── statements:\n", indent]
2326
+ commands << [statements, "#{indent} "]
2327
+ end
2328
+ end
2329
+
2330
+ # Inspect a WhileNode node.
2331
+ def visit_while_node(node)
2332
+ commands << [inspect_node("WhileNode", node), indent]
2333
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("begin_modifier" if node.begin_modifier?)].compact
2334
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2335
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2336
+ commands << ["├── do_keyword_loc: #{inspect_location(node.do_keyword_loc)}\n", indent]
2337
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2338
+ commands << ["├── predicate:\n", indent]
2339
+ commands << [node.predicate, "#{indent}│ "]
2340
+ if (statements = node.statements).nil?
2341
+ commands << ["└── statements: ∅\n", indent]
2342
+ else
2343
+ commands << ["└── statements:\n", indent]
2344
+ commands << [statements, "#{indent} "]
2345
+ end
2346
+ end
2347
+
2348
+ # Inspect a XStringNode node.
2349
+ def visit_x_string_node(node)
2350
+ commands << [inspect_node("XStringNode", node), indent]
2351
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ("forced_utf8_encoding" if node.forced_utf8_encoding?), ("forced_binary_encoding" if node.forced_binary_encoding?)].compact
2352
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2353
+ commands << ["├── opening_loc: #{inspect_location(node.opening_loc)}\n", indent]
2354
+ commands << ["├── content_loc: #{inspect_location(node.content_loc)}\n", indent]
2355
+ commands << ["├── closing_loc: #{inspect_location(node.closing_loc)}\n", indent]
2356
+ commands << ["└── unescaped: #{node.unescaped.inspect}\n", indent]
2357
+ end
2358
+
2359
+ # Inspect a YieldNode node.
2360
+ def visit_yield_node(node)
2361
+ commands << [inspect_node("YieldNode", node), indent]
2362
+ flags = [("newline" if node.newline?), ("static_literal" if node.static_literal?), ].compact
2363
+ commands << ["├── flags: #{flags.empty? ? "∅" : flags.join(", ")}\n", indent]
2364
+ commands << ["├── keyword_loc: #{inspect_location(node.keyword_loc)}\n", indent]
2365
+ commands << ["├── lparen_loc: #{inspect_location(node.lparen_loc)}\n", indent]
2366
+ if (arguments = node.arguments).nil?
2367
+ commands << ["├── arguments: ∅\n", indent]
2368
+ else
2369
+ commands << ["├── arguments:\n", indent]
2370
+ commands << [arguments, "#{indent}│ "]
2371
+ end
2372
+ commands << ["└── rparen_loc: #{inspect_location(node.rparen_loc)}\n", indent]
2373
+ end
2374
+
2375
+ private
2376
+
2377
+ # Compose a header for the given node.
2378
+ def inspect_node(name, node)
2379
+ location = node.location
2380
+ "@ #{name} (location: (#{location.start_line},#{location.start_column})-(#{location.end_line},#{location.end_column}))\n"
2381
+ end
2382
+
2383
+ # Compose a string representing the given inner location field.
2384
+ def inspect_location(location)
2385
+ if location
2386
+ "(#{location.start_line},#{location.start_column})-(#{location.end_line},#{location.end_column}) = #{location.slice.inspect}"
2387
+ else
2388
+ "∅"
2389
+ end
2390
+ end
2391
+ end
2392
+ end