rbi 0.1.13 → 0.1.14
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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/rbi/formatter.rb +0 -12
- data/lib/rbi/index.rb +1 -1
- data/lib/rbi/model.rb +4 -2
- data/lib/rbi/parser.rb +3 -3
- data/lib/rbi/printer.rb +512 -610
- data/lib/rbi/rewriters/attr_to_methods.rb +169 -0
- data/lib/rbi/rewriters/group_nodes.rb +46 -47
- data/lib/rbi/rewriters/merge_trees.rb +9 -31
- data/lib/rbi/version.rb +1 -1
- data/lib/rbi/visitor.rb +228 -2
- data/lib/rbi.rb +8 -0
- metadata +8 -7
data/lib/rbi/printer.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module RBI
|
5
|
+
class PrinterError < Error; end
|
6
|
+
|
5
7
|
class Printer < Visitor
|
6
8
|
extend T::Sig
|
7
9
|
|
@@ -74,18 +76,6 @@ module RBI
|
|
74
76
|
printn(string)
|
75
77
|
end
|
76
78
|
|
77
|
-
sig { params(file: File).void }
|
78
|
-
def visit_file(file)
|
79
|
-
file.accept_printer(self)
|
80
|
-
end
|
81
|
-
|
82
|
-
sig { override.params(node: T.nilable(Node)).void }
|
83
|
-
def visit(node)
|
84
|
-
return unless node
|
85
|
-
|
86
|
-
node.accept_printer(self)
|
87
|
-
end
|
88
|
-
|
89
79
|
sig { override.params(nodes: T::Array[Node]).void }
|
90
80
|
def visit_all(nodes)
|
91
81
|
previous_node = @previous_node
|
@@ -96,783 +86,695 @@ module RBI
|
|
96
86
|
end
|
97
87
|
@previous_node = previous_node
|
98
88
|
end
|
99
|
-
end
|
100
|
-
|
101
|
-
class File
|
102
|
-
extend T::Sig
|
103
89
|
|
104
|
-
sig { params(
|
105
|
-
def
|
106
|
-
strictness =
|
90
|
+
sig { override.params(file: File).void }
|
91
|
+
def visit_file(file)
|
92
|
+
strictness = file.strictness
|
107
93
|
if strictness
|
108
|
-
|
94
|
+
printl("# typed: #{strictness}")
|
109
95
|
end
|
110
|
-
unless comments.empty?
|
111
|
-
|
112
|
-
|
96
|
+
unless file.comments.empty?
|
97
|
+
printn if strictness
|
98
|
+
visit_all(file.comments)
|
113
99
|
end
|
114
100
|
|
115
|
-
unless root.empty? && root.comments.empty?
|
116
|
-
|
117
|
-
|
101
|
+
unless file.root.empty? && file.root.comments.empty?
|
102
|
+
printn if strictness || !file.comments.empty?
|
103
|
+
visit(file.root)
|
118
104
|
end
|
119
105
|
end
|
120
106
|
|
121
|
-
|
122
|
-
params(
|
123
|
-
out: T.any(IO, StringIO),
|
124
|
-
indent: Integer,
|
125
|
-
print_locs: T::Boolean,
|
126
|
-
max_line_length: T.nilable(Integer),
|
127
|
-
).void
|
128
|
-
end
|
129
|
-
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
130
|
-
p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
131
|
-
p.visit_file(self)
|
132
|
-
end
|
133
|
-
|
134
|
-
sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
|
135
|
-
def string(indent: 0, print_locs: false, max_line_length: nil)
|
136
|
-
out = StringIO.new
|
137
|
-
print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
138
|
-
out.string
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
class Node
|
143
|
-
extend T::Sig
|
144
|
-
|
145
|
-
sig { abstract.params(v: Printer).void }
|
146
|
-
def accept_printer(v); end
|
147
|
-
|
148
|
-
sig do
|
149
|
-
params(
|
150
|
-
out: T.any(IO, StringIO),
|
151
|
-
indent: Integer,
|
152
|
-
print_locs: T::Boolean,
|
153
|
-
max_line_length: T.nilable(Integer),
|
154
|
-
).void
|
155
|
-
end
|
156
|
-
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
157
|
-
p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
158
|
-
p.visit(self)
|
159
|
-
end
|
160
|
-
|
161
|
-
sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
|
162
|
-
def string(indent: 0, print_locs: false, max_line_length: nil)
|
163
|
-
out = StringIO.new
|
164
|
-
print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
165
|
-
out.string
|
166
|
-
end
|
167
|
-
|
168
|
-
sig { params(v: Printer).void }
|
169
|
-
def print_blank_line_before(v)
|
170
|
-
previous_node = v.previous_node
|
171
|
-
return unless previous_node
|
172
|
-
return if previous_node.is_a?(BlankLine)
|
173
|
-
return if previous_node.oneline? && oneline?
|
174
|
-
|
175
|
-
v.printn
|
176
|
-
end
|
177
|
-
|
178
|
-
sig { returns(T::Boolean) }
|
179
|
-
def oneline?
|
180
|
-
true
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
class NodeWithComments
|
185
|
-
extend T::Sig
|
186
|
-
|
187
|
-
sig { override.returns(T::Boolean) }
|
188
|
-
def oneline?
|
189
|
-
comments.empty?
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
class Comment
|
194
|
-
extend T::Sig
|
107
|
+
private
|
195
108
|
|
196
|
-
sig { override.params(
|
197
|
-
def
|
198
|
-
lines = text.lines
|
109
|
+
sig { override.params(node: Comment).void }
|
110
|
+
def visit_comment(node)
|
111
|
+
lines = node.text.lines
|
199
112
|
|
200
113
|
if lines.empty?
|
201
|
-
|
114
|
+
printl("#")
|
202
115
|
end
|
203
116
|
|
204
117
|
lines.each do |line|
|
205
118
|
text = line.rstrip
|
206
|
-
|
207
|
-
|
208
|
-
|
119
|
+
printt("#")
|
120
|
+
print(" #{text}") unless text.empty?
|
121
|
+
printn
|
209
122
|
end
|
210
123
|
end
|
211
|
-
end
|
212
124
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
sig { override.params(v: Printer).void }
|
217
|
-
def accept_printer(v)
|
218
|
-
v.printn
|
125
|
+
sig { override.params(node: BlankLine).void }
|
126
|
+
def visit_blank_line(node)
|
127
|
+
printn
|
219
128
|
end
|
220
|
-
end
|
221
|
-
|
222
|
-
class Tree
|
223
|
-
extend T::Sig
|
224
129
|
|
225
|
-
sig { override.params(
|
226
|
-
def
|
227
|
-
|
228
|
-
|
229
|
-
|
130
|
+
sig { override.params(node: Tree).void }
|
131
|
+
def visit_tree(node)
|
132
|
+
visit_all(node.comments)
|
133
|
+
printn if !node.comments.empty? && !node.empty?
|
134
|
+
visit_all(node.nodes)
|
230
135
|
end
|
231
136
|
|
232
|
-
sig { override.
|
233
|
-
def
|
234
|
-
|
137
|
+
sig { override.params(node: Module).void }
|
138
|
+
def visit_module(node)
|
139
|
+
visit_scope(node)
|
235
140
|
end
|
236
|
-
end
|
237
|
-
|
238
|
-
class Scope
|
239
|
-
extend T::Sig
|
240
|
-
|
241
|
-
sig { override.params(v: Printer).void }
|
242
|
-
def accept_printer(v)
|
243
|
-
print_blank_line_before(v)
|
244
141
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
print_header(v)
|
249
|
-
print_body(v)
|
142
|
+
sig { override.params(node: Class).void }
|
143
|
+
def visit_class(node)
|
144
|
+
visit_scope(node)
|
250
145
|
end
|
251
146
|
|
252
|
-
sig {
|
253
|
-
def
|
147
|
+
sig { override.params(node: Struct).void }
|
148
|
+
def visit_struct(node)
|
149
|
+
visit_scope(node)
|
150
|
+
end
|
254
151
|
|
255
|
-
sig { params(
|
256
|
-
def
|
257
|
-
|
258
|
-
v.indent
|
259
|
-
v.visit_all(nodes)
|
260
|
-
v.dedent
|
261
|
-
v.printl("end")
|
262
|
-
end
|
152
|
+
sig { override.params(node: SingletonClass).void }
|
153
|
+
def visit_singleton_class(node)
|
154
|
+
visit_scope(node)
|
263
155
|
end
|
264
|
-
end
|
265
156
|
|
266
|
-
|
267
|
-
|
157
|
+
sig { params(node: Scope).void }
|
158
|
+
def visit_scope(node)
|
159
|
+
print_blank_line_before(node)
|
160
|
+
print_loc(node)
|
161
|
+
visit_all(node.comments)
|
268
162
|
|
269
|
-
|
270
|
-
|
271
|
-
v.printt("module #{name}")
|
272
|
-
if empty?
|
273
|
-
v.printn("; end")
|
274
|
-
else
|
275
|
-
v.printn
|
276
|
-
end
|
163
|
+
visit_scope_header(node)
|
164
|
+
visit_scope_body(node)
|
277
165
|
end
|
278
|
-
end
|
279
166
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
167
|
+
sig { params(node: Scope).void }
|
168
|
+
def visit_scope_header(node)
|
169
|
+
case node
|
170
|
+
when Module
|
171
|
+
printt("module #{node.name}")
|
172
|
+
when Class
|
173
|
+
printt("class #{node.name}")
|
174
|
+
superclass = node.superclass_name
|
175
|
+
print(" < #{superclass}") if superclass
|
176
|
+
when Struct
|
177
|
+
printt("#{node.name} = ::Struct.new")
|
178
|
+
if !node.members.empty? || node.keyword_init
|
179
|
+
print("(")
|
180
|
+
args = node.members.map { |member| ":#{member}" }
|
181
|
+
args << "keyword_init: true" if node.keyword_init
|
182
|
+
print(args.join(", "))
|
183
|
+
print(")")
|
184
|
+
end
|
185
|
+
when SingletonClass
|
186
|
+
printt("class << self")
|
187
|
+
when TStruct
|
188
|
+
printt("class #{node.name} < T::Struct")
|
189
|
+
when TEnum
|
190
|
+
printt("class #{node.name} < T::Enum")
|
290
191
|
else
|
291
|
-
|
192
|
+
raise PrinterError, "Unhandled node: #{node.class}"
|
292
193
|
end
|
194
|
+
if node.empty? && !node.is_a?(Struct)
|
195
|
+
print("; end")
|
196
|
+
elsif !node.empty? && node.is_a?(Struct)
|
197
|
+
print(" do")
|
198
|
+
end
|
199
|
+
printn
|
293
200
|
end
|
294
|
-
end
|
295
201
|
|
296
|
-
|
297
|
-
|
202
|
+
sig { params(node: Scope).void }
|
203
|
+
def visit_scope_body(node)
|
204
|
+
return if node.empty?
|
298
205
|
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
v.print("(")
|
304
|
-
args = members.map { |member| ":#{member}" }
|
305
|
-
args << "keyword_init: true" if keyword_init
|
306
|
-
v.print(args.join(", "))
|
307
|
-
v.print(")")
|
308
|
-
end
|
309
|
-
if empty?
|
310
|
-
v.printn
|
311
|
-
else
|
312
|
-
v.printn(" do")
|
313
|
-
end
|
206
|
+
indent
|
207
|
+
visit_all(node.nodes)
|
208
|
+
dedent
|
209
|
+
printl("end")
|
314
210
|
end
|
315
|
-
end
|
316
211
|
|
317
|
-
|
318
|
-
|
212
|
+
sig { override.params(node: Const).void }
|
213
|
+
def visit_const(node)
|
214
|
+
print_blank_line_before(node)
|
215
|
+
print_loc(node)
|
216
|
+
visit_all(node.comments)
|
319
217
|
|
320
|
-
|
321
|
-
def print_header(v)
|
322
|
-
v.printt("class << self")
|
323
|
-
if empty?
|
324
|
-
v.printn("; end")
|
325
|
-
else
|
326
|
-
v.printn
|
327
|
-
end
|
218
|
+
printl("#{node.name} = #{node.value}")
|
328
219
|
end
|
329
|
-
end
|
330
220
|
|
331
|
-
|
332
|
-
|
221
|
+
sig { override.params(node: AttrAccessor).void }
|
222
|
+
def visit_attr_accessor(node)
|
223
|
+
visit_attr(node)
|
224
|
+
end
|
333
225
|
|
334
|
-
sig { override.params(
|
335
|
-
def
|
336
|
-
|
226
|
+
sig { override.params(node: AttrReader).void }
|
227
|
+
def visit_attr_reader(node)
|
228
|
+
visit_attr(node)
|
229
|
+
end
|
337
230
|
|
338
|
-
|
339
|
-
|
340
|
-
|
231
|
+
sig { override.params(node: AttrWriter).void }
|
232
|
+
def visit_attr_writer(node)
|
233
|
+
visit_attr(node)
|
341
234
|
end
|
342
|
-
end
|
343
235
|
|
344
|
-
|
345
|
-
|
236
|
+
sig { params(node: Attr).void }
|
237
|
+
def visit_attr(node)
|
238
|
+
print_blank_line_before(node)
|
239
|
+
|
240
|
+
visit_all(node.comments)
|
241
|
+
node.sigs.each { |sig| visit(sig) }
|
346
242
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
sigs.each { |sig| v.visit(sig) }
|
353
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
354
|
-
v.printt
|
355
|
-
unless v.in_visibility_group || visibility.public?
|
356
|
-
v.print(visibility.visibility.to_s)
|
357
|
-
v.print(" ")
|
243
|
+
print_loc(node)
|
244
|
+
printt
|
245
|
+
unless in_visibility_group || node.visibility.public?
|
246
|
+
self.print(node.visibility.visibility.to_s)
|
247
|
+
print(" ")
|
358
248
|
end
|
359
|
-
case
|
249
|
+
case node
|
360
250
|
when AttrAccessor
|
361
|
-
|
251
|
+
print("attr_accessor")
|
362
252
|
when AttrReader
|
363
|
-
|
253
|
+
print("attr_reader")
|
364
254
|
when AttrWriter
|
365
|
-
|
255
|
+
print("attr_writer")
|
366
256
|
end
|
367
|
-
unless names.empty?
|
368
|
-
|
369
|
-
|
257
|
+
unless node.names.empty?
|
258
|
+
print(" ")
|
259
|
+
print(node.names.map { |name| ":#{name}" }.join(", "))
|
370
260
|
end
|
371
|
-
|
261
|
+
printn
|
372
262
|
end
|
373
263
|
|
374
|
-
sig { override.
|
375
|
-
def
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
class Method
|
381
|
-
extend T::Sig
|
264
|
+
sig { override.params(node: Method).void }
|
265
|
+
def visit_method(node)
|
266
|
+
print_blank_line_before(node)
|
267
|
+
visit_all(node.comments)
|
268
|
+
visit_all(node.sigs)
|
382
269
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
v.visit_all(sigs)
|
389
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
390
|
-
v.printt
|
391
|
-
unless v.in_visibility_group || visibility.public?
|
392
|
-
v.print(visibility.visibility.to_s)
|
393
|
-
v.print(" ")
|
270
|
+
print_loc(node)
|
271
|
+
printt
|
272
|
+
unless in_visibility_group || node.visibility.public?
|
273
|
+
self.print(node.visibility.visibility.to_s)
|
274
|
+
print(" ")
|
394
275
|
end
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
unless params.empty?
|
399
|
-
|
400
|
-
if
|
401
|
-
params.each_with_index do |param, index|
|
402
|
-
|
403
|
-
|
276
|
+
print("def ")
|
277
|
+
print("self.") if node.is_singleton
|
278
|
+
print(node.name)
|
279
|
+
unless node.params.empty?
|
280
|
+
print("(")
|
281
|
+
if node.params.all? { |p| p.comments.empty? }
|
282
|
+
node.params.each_with_index do |param, index|
|
283
|
+
print(", ") if index > 0
|
284
|
+
visit(param)
|
404
285
|
end
|
405
286
|
else
|
406
|
-
|
407
|
-
|
408
|
-
params.each_with_index do |param, pindex|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
param.
|
287
|
+
printn
|
288
|
+
indent
|
289
|
+
node.params.each_with_index do |param, pindex|
|
290
|
+
printt
|
291
|
+
visit(param)
|
292
|
+
print(",") if pindex < node.params.size - 1
|
293
|
+
|
294
|
+
comment_lines = param.comments.flat_map { |comment| comment.text.lines.map(&:rstrip) }
|
295
|
+
comment_lines.each_with_index do |comment, cindex|
|
414
296
|
if cindex > 0
|
415
|
-
param
|
297
|
+
print_param_comment_leading_space(param, last: pindex == node.params.size - 1)
|
416
298
|
else
|
417
|
-
|
299
|
+
print(" ")
|
418
300
|
end
|
419
|
-
|
301
|
+
print("# #{comment}")
|
420
302
|
end
|
421
|
-
|
303
|
+
printn
|
422
304
|
end
|
423
|
-
|
305
|
+
dedent
|
424
306
|
end
|
425
|
-
|
307
|
+
print(")")
|
426
308
|
end
|
427
|
-
|
428
|
-
|
309
|
+
print("; end")
|
310
|
+
printn
|
429
311
|
end
|
430
312
|
|
431
|
-
sig { override.
|
432
|
-
def
|
433
|
-
|
313
|
+
sig { override.params(node: ReqParam).void }
|
314
|
+
def visit_req_param(node)
|
315
|
+
print(node.name)
|
434
316
|
end
|
435
317
|
|
436
|
-
sig {
|
437
|
-
def
|
438
|
-
|
318
|
+
sig { override.params(node: OptParam).void }
|
319
|
+
def visit_opt_param(node)
|
320
|
+
print("#{node.name} = #{node.value}")
|
439
321
|
end
|
440
|
-
end
|
441
322
|
|
442
|
-
|
443
|
-
|
323
|
+
sig { override.params(node: RestParam).void }
|
324
|
+
def visit_rest_param(node)
|
325
|
+
print("*#{node.name}")
|
326
|
+
end
|
444
327
|
|
445
|
-
sig { override.params(
|
446
|
-
def
|
447
|
-
|
328
|
+
sig { override.params(node: KwParam).void }
|
329
|
+
def visit_kw_param(node)
|
330
|
+
print("#{node.name}:")
|
448
331
|
end
|
449
332
|
|
450
|
-
sig { params(
|
451
|
-
def
|
452
|
-
|
453
|
-
v.printt
|
454
|
-
v.print(" " * (name.size + 1))
|
455
|
-
v.print(" ") unless last
|
333
|
+
sig { override.params(node: KwOptParam).void }
|
334
|
+
def visit_kw_opt_param(node)
|
335
|
+
print("#{node.name}: #{node.value}")
|
456
336
|
end
|
457
337
|
|
458
|
-
sig {
|
459
|
-
def
|
460
|
-
|
338
|
+
sig { override.params(node: KwRestParam).void }
|
339
|
+
def visit_kw_rest_param(node)
|
340
|
+
print("**#{node.name}")
|
461
341
|
end
|
462
|
-
end
|
463
342
|
|
464
|
-
|
465
|
-
|
343
|
+
sig { override.params(node: BlockParam).void }
|
344
|
+
def visit_block_param(node)
|
345
|
+
print("&#{node.name}")
|
346
|
+
end
|
466
347
|
|
467
|
-
sig { override.params(
|
468
|
-
def
|
469
|
-
|
348
|
+
sig { override.params(node: Include).void }
|
349
|
+
def visit_include(node)
|
350
|
+
visit_mixin(node)
|
470
351
|
end
|
471
352
|
|
472
|
-
sig { override.params(
|
473
|
-
def
|
474
|
-
|
475
|
-
v.print(" " * (value.size + 3))
|
353
|
+
sig { override.params(node: Extend).void }
|
354
|
+
def visit_extend(node)
|
355
|
+
visit_mixin(node)
|
476
356
|
end
|
477
|
-
end
|
478
357
|
|
479
|
-
|
480
|
-
|
358
|
+
sig { params(node: Mixin).void }
|
359
|
+
def visit_mixin(node)
|
360
|
+
print_blank_line_before(node)
|
361
|
+
print_loc(node)
|
362
|
+
visit_all(node.comments)
|
481
363
|
|
482
|
-
|
483
|
-
|
484
|
-
|
364
|
+
case node
|
365
|
+
when Include
|
366
|
+
printt("include")
|
367
|
+
when Extend
|
368
|
+
printt("extend")
|
369
|
+
when MixesInClassMethods
|
370
|
+
printt("mixes_in_class_methods")
|
371
|
+
end
|
372
|
+
printn(" #{node.names.join(", ")}")
|
485
373
|
end
|
486
374
|
|
487
|
-
sig { override.params(
|
488
|
-
def
|
489
|
-
|
490
|
-
v.print(" ")
|
375
|
+
sig { override.params(node: Public).void }
|
376
|
+
def visit_public(node)
|
377
|
+
visit_visibility(node)
|
491
378
|
end
|
492
|
-
end
|
493
|
-
|
494
|
-
class KwParam
|
495
|
-
extend T::Sig
|
496
379
|
|
497
|
-
sig { override.params(
|
498
|
-
def
|
499
|
-
|
380
|
+
sig { override.params(node: Protected).void }
|
381
|
+
def visit_protected(node)
|
382
|
+
visit_visibility(node)
|
500
383
|
end
|
501
384
|
|
502
|
-
sig { override.params(
|
503
|
-
def
|
504
|
-
|
505
|
-
v.print(" ")
|
385
|
+
sig { override.params(node: Private).void }
|
386
|
+
def visit_private(node)
|
387
|
+
visit_visibility(node)
|
506
388
|
end
|
507
|
-
end
|
508
389
|
|
509
|
-
|
510
|
-
|
390
|
+
sig { params(node: Visibility).void }
|
391
|
+
def visit_visibility(node)
|
392
|
+
print_blank_line_before(node)
|
393
|
+
print_loc(node)
|
394
|
+
visit_all(node.comments)
|
511
395
|
|
512
|
-
|
513
|
-
def accept_printer(v)
|
514
|
-
v.print("#{name}: #{value}")
|
396
|
+
printl(node.visibility.to_s)
|
515
397
|
end
|
516
398
|
|
517
|
-
sig { override.params(
|
518
|
-
def
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
end
|
399
|
+
sig { override.params(node: Send).void }
|
400
|
+
def visit_send(node)
|
401
|
+
print_blank_line_before(node)
|
402
|
+
print_loc(node)
|
403
|
+
visit_all(node.comments)
|
523
404
|
|
524
|
-
|
525
|
-
|
405
|
+
printt(node.method)
|
406
|
+
unless node.args.empty?
|
407
|
+
print(" ")
|
408
|
+
node.args.each_with_index do |arg, index|
|
409
|
+
visit(arg)
|
410
|
+
print(", ") if index < node.args.size - 1
|
411
|
+
end
|
412
|
+
end
|
413
|
+
printn
|
414
|
+
end
|
526
415
|
|
527
|
-
sig { override.params(
|
528
|
-
def
|
529
|
-
|
416
|
+
sig { override.params(node: Arg).void }
|
417
|
+
def visit_arg(node)
|
418
|
+
print(node.value)
|
530
419
|
end
|
531
420
|
|
532
|
-
sig { override.params(
|
533
|
-
def
|
534
|
-
|
535
|
-
v.print(" ")
|
421
|
+
sig { override.params(node: KwArg).void }
|
422
|
+
def visit_kw_arg(node)
|
423
|
+
print("#{node.keyword}: #{node.value}")
|
536
424
|
end
|
537
|
-
end
|
538
425
|
|
539
|
-
|
540
|
-
|
426
|
+
sig { override.params(node: Sig).void }
|
427
|
+
def visit_sig(node)
|
428
|
+
print_loc(node)
|
541
429
|
|
542
|
-
|
543
|
-
|
544
|
-
|
430
|
+
max_line_length = self.max_line_length
|
431
|
+
if oneline?(node) && max_line_length.nil?
|
432
|
+
print_sig_as_line(node)
|
433
|
+
elsif max_line_length
|
434
|
+
line = node.string(indent: current_indent)
|
435
|
+
if line.length <= max_line_length
|
436
|
+
print(line)
|
437
|
+
else
|
438
|
+
print_sig_as_block(node)
|
439
|
+
end
|
440
|
+
else
|
441
|
+
print_sig_as_block(node)
|
442
|
+
end
|
545
443
|
end
|
546
444
|
|
547
|
-
sig { override.params(
|
548
|
-
def
|
549
|
-
|
550
|
-
v.print(" ")
|
445
|
+
sig { override.params(node: SigParam).void }
|
446
|
+
def visit_sig_param(node)
|
447
|
+
print("#{node.name}: #{node.type}")
|
551
448
|
end
|
552
|
-
end
|
553
449
|
|
554
|
-
|
555
|
-
|
450
|
+
sig { override.params(node: TStruct).void }
|
451
|
+
def visit_tstruct(node)
|
452
|
+
visit_scope(node)
|
453
|
+
end
|
556
454
|
|
557
|
-
sig { override.params(
|
558
|
-
def
|
559
|
-
|
455
|
+
sig { override.params(node: TStructConst).void }
|
456
|
+
def visit_tstruct_const(node)
|
457
|
+
visit_t_struct_field(node)
|
458
|
+
end
|
560
459
|
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
when Include
|
565
|
-
v.printt("include")
|
566
|
-
when Extend
|
567
|
-
v.printt("extend")
|
568
|
-
when MixesInClassMethods
|
569
|
-
v.printt("mixes_in_class_methods")
|
570
|
-
end
|
571
|
-
v.printn(" #{names.join(", ")}")
|
460
|
+
sig { override.params(node: TStructProp).void }
|
461
|
+
def visit_tstruct_prop(node)
|
462
|
+
visit_t_struct_field(node)
|
572
463
|
end
|
573
|
-
end
|
574
464
|
|
575
|
-
|
576
|
-
|
465
|
+
sig { params(node: TStructField).void }
|
466
|
+
def visit_t_struct_field(node)
|
467
|
+
print_blank_line_before(node)
|
468
|
+
print_loc(node)
|
469
|
+
visit_all(node.comments)
|
577
470
|
|
578
|
-
|
579
|
-
|
580
|
-
|
471
|
+
case node
|
472
|
+
when TStructProp
|
473
|
+
printt("prop")
|
474
|
+
when TStructConst
|
475
|
+
printt("const")
|
476
|
+
end
|
477
|
+
print(" :#{node.name}, #{node.type}")
|
478
|
+
default = node.default
|
479
|
+
print(", default: #{default}") if default
|
480
|
+
printn
|
481
|
+
end
|
581
482
|
|
582
|
-
|
583
|
-
|
584
|
-
|
483
|
+
sig { override.params(node: TEnum).void }
|
484
|
+
def visit_tenum(node)
|
485
|
+
visit_scope(node)
|
585
486
|
end
|
586
|
-
end
|
587
487
|
|
588
|
-
|
589
|
-
|
488
|
+
sig { override.params(node: TEnumBlock).void }
|
489
|
+
def visit_tenum_block(node)
|
490
|
+
print_loc(node)
|
491
|
+
visit_all(node.comments)
|
590
492
|
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
596
|
-
v.visit_all(comments)
|
597
|
-
v.printt(method)
|
598
|
-
unless args.empty?
|
599
|
-
v.print(" ")
|
600
|
-
args.each_with_index do |arg, index|
|
601
|
-
v.visit(arg)
|
602
|
-
v.print(", ") if index < args.size - 1
|
603
|
-
end
|
493
|
+
printl("enums do")
|
494
|
+
indent
|
495
|
+
node.names.each do |name|
|
496
|
+
printl("#{name} = new")
|
604
497
|
end
|
605
|
-
|
498
|
+
dedent
|
499
|
+
printl("end")
|
606
500
|
end
|
607
|
-
end
|
608
501
|
|
609
|
-
|
610
|
-
|
502
|
+
sig { override.params(node: TypeMember).void }
|
503
|
+
def visit_type_member(node)
|
504
|
+
print_blank_line_before(node)
|
505
|
+
print_loc(node)
|
506
|
+
visit_all(node.comments)
|
611
507
|
|
612
|
-
|
613
|
-
def accept_printer(v)
|
614
|
-
v.print(value)
|
508
|
+
printl("#{node.name} = #{node.value}")
|
615
509
|
end
|
616
|
-
end
|
617
510
|
|
618
|
-
|
619
|
-
|
511
|
+
sig { override.params(node: Helper).void }
|
512
|
+
def visit_helper(node)
|
513
|
+
print_blank_line_before(node)
|
514
|
+
print_loc(node)
|
515
|
+
visit_all(node.comments)
|
620
516
|
|
621
|
-
|
622
|
-
def accept_printer(v)
|
623
|
-
v.print(keyword)
|
624
|
-
v.print(": ")
|
625
|
-
v.print(value)
|
517
|
+
printl("#{node.name}!")
|
626
518
|
end
|
627
|
-
end
|
628
519
|
|
629
|
-
|
630
|
-
|
520
|
+
sig { override.params(node: MixesInClassMethods).void }
|
521
|
+
def visit_mixes_in_class_methods(node)
|
522
|
+
visit_mixin(node)
|
523
|
+
end
|
631
524
|
|
632
|
-
sig { override.params(
|
633
|
-
def
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
print_as_block(v)
|
644
|
-
end
|
525
|
+
sig { override.params(node: Group).void }
|
526
|
+
def visit_group(node)
|
527
|
+
printn unless previous_node.nil?
|
528
|
+
visit_all(node.nodes)
|
529
|
+
end
|
530
|
+
|
531
|
+
sig { override.params(node: VisibilityGroup).void }
|
532
|
+
def visit_visibility_group(node)
|
533
|
+
self.in_visibility_group = true
|
534
|
+
if node.visibility.public?
|
535
|
+
printn unless previous_node.nil?
|
645
536
|
else
|
646
|
-
|
537
|
+
visit(node.visibility)
|
538
|
+
printn
|
647
539
|
end
|
540
|
+
visit_all(node.nodes)
|
541
|
+
self.in_visibility_group = false
|
648
542
|
end
|
649
543
|
|
650
|
-
sig { override.
|
651
|
-
def
|
652
|
-
|
544
|
+
sig { override.params(node: RequiresAncestor).void }
|
545
|
+
def visit_requires_ancestor(node)
|
546
|
+
print_blank_line_before(node)
|
547
|
+
print_loc(node)
|
548
|
+
visit_all(node.comments)
|
549
|
+
|
550
|
+
printl("requires_ancestor { #{node.name} }")
|
653
551
|
end
|
654
552
|
|
655
|
-
sig {
|
656
|
-
def
|
657
|
-
|
553
|
+
sig { override.params(node: ConflictTree).void }
|
554
|
+
def visit_conflict_tree(node)
|
555
|
+
printl("<<<<<<< #{node.left_name}")
|
556
|
+
visit(node.left)
|
557
|
+
printl("=======")
|
558
|
+
visit(node.right)
|
559
|
+
printl(">>>>>>> #{node.right_name}")
|
658
560
|
end
|
659
561
|
|
660
|
-
|
562
|
+
sig { override.params(node: ScopeConflict).void }
|
563
|
+
def visit_scope_conflict(node)
|
564
|
+
print_blank_line_before(node)
|
565
|
+
print_loc(node)
|
566
|
+
visit_all(node.comments)
|
661
567
|
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
568
|
+
printl("<<<<<<< #{node.left_name}")
|
569
|
+
visit_scope_header(node.left)
|
570
|
+
printl("=======")
|
571
|
+
visit_scope_header(node.right)
|
572
|
+
printl(">>>>>>> #{node.right_name}")
|
573
|
+
visit_scope_body(node.left)
|
574
|
+
end
|
575
|
+
|
576
|
+
sig { params(node: Node).void }
|
577
|
+
def print_blank_line_before(node)
|
578
|
+
previous_node = self.previous_node
|
579
|
+
return unless previous_node
|
580
|
+
return if previous_node.is_a?(BlankLine)
|
581
|
+
return if oneline?(previous_node) && oneline?(node)
|
582
|
+
|
583
|
+
printn
|
584
|
+
end
|
585
|
+
|
586
|
+
sig { params(node: Node).void }
|
587
|
+
def print_loc(node)
|
588
|
+
loc = node.loc
|
589
|
+
printl("# #{loc}") if loc && print_locs
|
671
590
|
end
|
672
591
|
|
673
|
-
sig { params(
|
674
|
-
def
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
592
|
+
sig { params(node: Param, last: T::Boolean).void }
|
593
|
+
def print_param_comment_leading_space(node, last:)
|
594
|
+
printn
|
595
|
+
printt
|
596
|
+
print(" " * (node.name.size + 1))
|
597
|
+
print(" ") unless last
|
598
|
+
case node
|
599
|
+
when OptParam
|
600
|
+
print(" " * (node.value.size + 3))
|
601
|
+
when RestParam, KwParam, BlockParam
|
602
|
+
print(" ")
|
603
|
+
when KwRestParam
|
604
|
+
print(" ")
|
605
|
+
when KwOptParam
|
606
|
+
print(" " * (node.value.size + 2))
|
680
607
|
end
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
608
|
+
end
|
609
|
+
|
610
|
+
sig { params(node: SigParam, last: T::Boolean).void }
|
611
|
+
def print_sig_param_comment_leading_space(node, last:)
|
612
|
+
printn
|
613
|
+
printt
|
614
|
+
print(" " * (node.name.size + node.type.size + 3))
|
615
|
+
print(" ") unless last
|
616
|
+
end
|
617
|
+
|
618
|
+
sig { params(node: Node).returns(T::Boolean) }
|
619
|
+
def oneline?(node)
|
620
|
+
case node
|
621
|
+
when ScopeConflict
|
622
|
+
oneline?(node.left)
|
623
|
+
when Tree
|
624
|
+
node.comments.empty? && node.empty?
|
625
|
+
when Attr
|
626
|
+
node.comments.empty? && node.sigs.empty?
|
627
|
+
when Method
|
628
|
+
node.comments.empty? && node.sigs.empty? && node.params.all? { |p| p.comments.empty? }
|
629
|
+
when Sig
|
630
|
+
node.params.all? { |p| p.comments.empty? }
|
631
|
+
when NodeWithComments
|
632
|
+
node.comments.empty?
|
633
|
+
when VisibilityGroup
|
634
|
+
false
|
635
|
+
else
|
636
|
+
true
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
sig { params(node: Sig).void }
|
641
|
+
def print_sig_as_line(node)
|
642
|
+
printt("sig")
|
643
|
+
print("(:final)") if node.is_final
|
644
|
+
print(" { ")
|
645
|
+
sig_modifiers(node).each do |modifier|
|
646
|
+
print("#{modifier}.")
|
647
|
+
end
|
648
|
+
unless node.params.empty?
|
649
|
+
print("params(")
|
650
|
+
node.params.each_with_index do |param, index|
|
651
|
+
print(", ") if index > 0
|
652
|
+
visit(param)
|
686
653
|
end
|
687
|
-
|
654
|
+
print(").")
|
688
655
|
end
|
689
|
-
|
690
|
-
|
656
|
+
return_type = node.return_type
|
657
|
+
if node.return_type && node.return_type != "void"
|
658
|
+
print("returns(#{return_type})")
|
691
659
|
else
|
692
|
-
|
660
|
+
print("void")
|
693
661
|
end
|
694
|
-
|
662
|
+
printn(" }")
|
695
663
|
end
|
696
664
|
|
697
|
-
sig { params(
|
698
|
-
def
|
699
|
-
modifiers = sig_modifiers
|
665
|
+
sig { params(node: Sig).void }
|
666
|
+
def print_sig_as_block(node)
|
667
|
+
modifiers = sig_modifiers(node)
|
700
668
|
|
701
|
-
|
702
|
-
|
669
|
+
printt("sig")
|
670
|
+
print("(:final)") if node.is_final
|
671
|
+
printn(" do")
|
672
|
+
indent
|
703
673
|
if modifiers.any?
|
704
|
-
|
705
|
-
|
674
|
+
printl(T.must(modifiers.first))
|
675
|
+
indent
|
706
676
|
modifiers[1..]&.each do |modifier|
|
707
|
-
|
677
|
+
printl(".#{modifier}")
|
708
678
|
end
|
709
679
|
end
|
710
680
|
|
681
|
+
params = node.params
|
711
682
|
if params.any?
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
683
|
+
printt
|
684
|
+
print(".") if modifiers.any?
|
685
|
+
printn("params(")
|
686
|
+
indent
|
716
687
|
params.each_with_index do |param, pindex|
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
688
|
+
printt
|
689
|
+
visit(param)
|
690
|
+
print(",") if pindex < params.size - 1
|
691
|
+
|
692
|
+
comment_lines = param.comments.flat_map { |comment| comment.text.lines.map(&:rstrip) }
|
693
|
+
comment_lines.each_with_index do |comment, cindex|
|
721
694
|
if cindex == 0
|
722
|
-
|
695
|
+
print(" ")
|
723
696
|
else
|
724
|
-
param
|
697
|
+
print_sig_param_comment_leading_space(param, last: pindex == params.size - 1)
|
725
698
|
end
|
726
|
-
|
699
|
+
print("# #{comment}")
|
727
700
|
end
|
728
|
-
|
701
|
+
printn
|
729
702
|
end
|
730
|
-
|
731
|
-
|
703
|
+
dedent
|
704
|
+
printt(")")
|
732
705
|
end
|
733
|
-
|
734
|
-
|
706
|
+
printt if params.empty?
|
707
|
+
print(".") if modifiers.any? || params.any?
|
708
|
+
|
709
|
+
return_type = node.return_type
|
735
710
|
if return_type && return_type != "void"
|
736
|
-
|
711
|
+
print("returns(#{return_type})")
|
737
712
|
else
|
738
|
-
|
713
|
+
print("void")
|
739
714
|
end
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
715
|
+
printn
|
716
|
+
dedent
|
717
|
+
dedent if modifiers.any?
|
718
|
+
printl("end")
|
744
719
|
end
|
745
|
-
end
|
746
|
-
|
747
|
-
class SigParam
|
748
|
-
extend T::Sig
|
749
720
|
|
750
|
-
sig {
|
751
|
-
def
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
v.print(" " * (name.size + type.size + 3))
|
760
|
-
v.print(" ") unless last
|
761
|
-
end
|
762
|
-
|
763
|
-
sig { returns(T::Array[String]) }
|
764
|
-
def comments_lines
|
765
|
-
comments.flat_map { |comment| comment.text.lines.map(&:rstrip) }
|
766
|
-
end
|
767
|
-
end
|
768
|
-
|
769
|
-
class TStructField
|
770
|
-
extend T::Sig
|
771
|
-
|
772
|
-
sig { override.params(v: Printer).void }
|
773
|
-
def accept_printer(v)
|
774
|
-
print_blank_line_before(v)
|
775
|
-
|
776
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
777
|
-
v.visit_all(comments)
|
778
|
-
case self
|
779
|
-
when TStructProp
|
780
|
-
v.printt("prop")
|
781
|
-
when TStructConst
|
782
|
-
v.printt("const")
|
783
|
-
end
|
784
|
-
v.print(" :#{name}, #{type}")
|
785
|
-
default = self.default
|
786
|
-
v.print(", default: #{default}") if default
|
787
|
-
v.printn
|
788
|
-
end
|
789
|
-
end
|
790
|
-
|
791
|
-
class TEnumBlock
|
792
|
-
extend T::Sig
|
793
|
-
|
794
|
-
sig { override.params(v: Printer).void }
|
795
|
-
def accept_printer(v)
|
796
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
797
|
-
v.visit_all(comments)
|
798
|
-
v.printl("enums do")
|
799
|
-
v.indent
|
800
|
-
names.each do |name|
|
801
|
-
v.printl("#{name} = new")
|
802
|
-
end
|
803
|
-
v.dedent
|
804
|
-
v.printl("end")
|
721
|
+
sig { params(node: Sig).returns(T::Array[String]) }
|
722
|
+
def sig_modifiers(node)
|
723
|
+
modifiers = T.let([], T::Array[String])
|
724
|
+
modifiers << "abstract" if node.is_abstract
|
725
|
+
modifiers << "override" if node.is_override
|
726
|
+
modifiers << "overridable" if node.is_overridable
|
727
|
+
modifiers << "type_parameters(#{node.type_params.map { |type| ":#{type}" }.join(", ")})" if node.type_params.any?
|
728
|
+
modifiers << "checked(:#{node.checked})" if node.checked
|
729
|
+
modifiers
|
805
730
|
end
|
806
731
|
end
|
807
732
|
|
808
|
-
class
|
733
|
+
class File
|
809
734
|
extend T::Sig
|
810
735
|
|
811
|
-
sig
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
736
|
+
sig do
|
737
|
+
params(
|
738
|
+
out: T.any(IO, StringIO),
|
739
|
+
indent: Integer,
|
740
|
+
print_locs: T::Boolean,
|
741
|
+
max_line_length: T.nilable(Integer),
|
742
|
+
).void
|
818
743
|
end
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
extend T::Sig
|
823
|
-
|
824
|
-
sig { override.params(v: Printer).void }
|
825
|
-
def accept_printer(v)
|
826
|
-
print_blank_line_before(v)
|
827
|
-
|
828
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
829
|
-
v.visit_all(comments)
|
830
|
-
v.printl("#{name}!")
|
744
|
+
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
745
|
+
p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
746
|
+
p.visit_file(self)
|
831
747
|
end
|
832
|
-
end
|
833
748
|
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
v.printn unless v.previous_node.nil?
|
840
|
-
v.visit_all(nodes)
|
749
|
+
sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
|
750
|
+
def string(indent: 0, print_locs: false, max_line_length: nil)
|
751
|
+
out = StringIO.new
|
752
|
+
print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
753
|
+
out.string
|
841
754
|
end
|
842
755
|
end
|
843
756
|
|
844
|
-
class
|
757
|
+
class Node
|
845
758
|
extend T::Sig
|
846
759
|
|
847
|
-
sig
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
v.printn
|
855
|
-
end
|
856
|
-
v.visit_all(nodes)
|
857
|
-
v.in_visibility_group = false
|
760
|
+
sig do
|
761
|
+
params(
|
762
|
+
out: T.any(IO, StringIO),
|
763
|
+
indent: Integer,
|
764
|
+
print_locs: T::Boolean,
|
765
|
+
max_line_length: T.nilable(Integer),
|
766
|
+
).void
|
858
767
|
end
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
false
|
768
|
+
def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
|
769
|
+
p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
770
|
+
p.visit(self)
|
863
771
|
end
|
864
|
-
end
|
865
772
|
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
print_blank_line_before(v)
|
872
|
-
|
873
|
-
v.printl("# #{loc}") if loc && v.print_locs
|
874
|
-
v.visit_all(comments)
|
875
|
-
v.printl("requires_ancestor { #{name} }")
|
773
|
+
sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
|
774
|
+
def string(indent: 0, print_locs: false, max_line_length: nil)
|
775
|
+
out = StringIO.new
|
776
|
+
print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
|
777
|
+
out.string
|
876
778
|
end
|
877
779
|
end
|
878
780
|
end
|