rbi 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/rbi/printer.rb CHANGED
@@ -5,28 +5,19 @@ module RBI
5
5
  class PrinterError < Error; end
6
6
 
7
7
  class Printer < Visitor
8
- extend T::Sig
9
-
10
- sig { returns(T::Boolean) }
8
+ #: bool
11
9
  attr_accessor :print_locs, :in_visibility_group
12
10
 
13
- sig { returns(T.nilable(Node)) }
11
+ #: Node?
14
12
  attr_reader :previous_node
15
13
 
16
- sig { returns(Integer) }
14
+ #: Integer
17
15
  attr_reader :current_indent
18
16
 
19
- sig { returns(T.nilable(Integer)) }
17
+ #: Integer?
20
18
  attr_reader :max_line_length
21
19
 
22
- sig do
23
- params(
24
- out: T.any(IO, StringIO),
25
- indent: Integer,
26
- print_locs: T::Boolean,
27
- max_line_length: T.nilable(Integer),
28
- ).void
29
- end
20
+ #: (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> void
30
21
  def initialize(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
31
22
  super()
32
23
  @out = out
@@ -39,44 +30,45 @@ module RBI
39
30
 
40
31
  # Printing
41
32
 
42
- sig { void }
33
+ #: -> void
43
34
  def indent
44
35
  @current_indent += 2
45
36
  end
46
37
 
47
- sig { void }
38
+ #: -> void
48
39
  def dedent
49
40
  @current_indent -= 2
50
41
  end
51
42
 
52
43
  # Print a string without indentation nor `\n` at the end.
53
- sig { params(string: String).void }
44
+ #: (String string) -> void
54
45
  def print(string)
55
46
  @out.print(string)
56
47
  end
57
48
 
58
49
  # Print a string without indentation but with a `\n` at the end.
59
- sig { params(string: T.nilable(String)).void }
50
+ #: (?String? string) -> void
60
51
  def printn(string = nil)
61
52
  print(string) if string
62
53
  print("\n")
63
54
  end
64
55
 
65
56
  # Print a string with indentation but without a `\n` at the end.
66
- sig { params(string: T.nilable(String)).void }
57
+ #: (?String? string) -> void
67
58
  def printt(string = nil)
68
59
  print(" " * @current_indent)
69
60
  print(string) if string
70
61
  end
71
62
 
72
63
  # Print a string with indentation and `\n` at the end.
73
- sig { params(string: String).void }
64
+ #: (String string) -> void
74
65
  def printl(string)
75
66
  printt
76
67
  printn(string)
77
68
  end
78
69
 
79
- sig { override.params(nodes: T::Array[Node]).void }
70
+ # @override
71
+ #: (Array[Node] nodes) -> void
80
72
  def visit_all(nodes)
81
73
  previous_node = @previous_node
82
74
  @previous_node = nil
@@ -87,7 +79,8 @@ module RBI
87
79
  @previous_node = previous_node
88
80
  end
89
81
 
90
- sig { override.params(file: File).void }
82
+ # @override
83
+ #: (File file) -> void
91
84
  def visit_file(file)
92
85
  strictness = file.strictness
93
86
  if strictness
@@ -106,7 +99,25 @@ module RBI
106
99
 
107
100
  private
108
101
 
109
- sig { override.params(node: Comment).void }
102
+ # @override
103
+ #: (RBSComment node) -> void
104
+ def visit_rbs_comment(node)
105
+ lines = node.text.lines
106
+
107
+ if lines.empty?
108
+ printl("#:")
109
+ end
110
+
111
+ lines.each do |line|
112
+ text = line.rstrip
113
+ printt("#:")
114
+ print(" #{text}") unless text.empty?
115
+ printn
116
+ end
117
+ end
118
+
119
+ # @override
120
+ #: (Comment node) -> void
110
121
  def visit_comment(node)
111
122
  lines = node.text.lines
112
123
 
@@ -122,39 +133,45 @@ module RBI
122
133
  end
123
134
  end
124
135
 
125
- sig { override.params(node: BlankLine).void }
136
+ # @override
137
+ #: (BlankLine node) -> void
126
138
  def visit_blank_line(node)
127
139
  printn
128
140
  end
129
141
 
130
- sig { override.params(node: Tree).void }
142
+ # @override
143
+ #: (Tree node) -> void
131
144
  def visit_tree(node)
132
145
  visit_all(node.comments)
133
146
  printn if !node.comments.empty? && !node.empty?
134
147
  visit_all(node.nodes)
135
148
  end
136
149
 
137
- sig { override.params(node: Module).void }
150
+ # @override
151
+ #: (Module node) -> void
138
152
  def visit_module(node)
139
153
  visit_scope(node)
140
154
  end
141
155
 
142
- sig { override.params(node: Class).void }
156
+ # @override
157
+ #: (Class node) -> void
143
158
  def visit_class(node)
144
159
  visit_scope(node)
145
160
  end
146
161
 
147
- sig { override.params(node: Struct).void }
162
+ # @override
163
+ #: (Struct node) -> void
148
164
  def visit_struct(node)
149
165
  visit_scope(node)
150
166
  end
151
167
 
152
- sig { override.params(node: SingletonClass).void }
168
+ # @override
169
+ #: (SingletonClass node) -> void
153
170
  def visit_singleton_class(node)
154
171
  visit_scope(node)
155
172
  end
156
173
 
157
- sig { params(node: Scope).void }
174
+ #: (Scope node) -> void
158
175
  def visit_scope(node)
159
176
  print_blank_line_before(node)
160
177
  print_loc(node)
@@ -164,7 +181,7 @@ module RBI
164
181
  visit_scope_body(node)
165
182
  end
166
183
 
167
- sig { params(node: Scope).void }
184
+ #: (Scope node) -> void
168
185
  def visit_scope_header(node)
169
186
  case node
170
187
  when Module
@@ -199,7 +216,7 @@ module RBI
199
216
  printn
200
217
  end
201
218
 
202
- sig { params(node: Scope).void }
219
+ #: (Scope node) -> void
203
220
  def visit_scope_body(node)
204
221
  return if node.empty?
205
222
 
@@ -209,7 +226,8 @@ module RBI
209
226
  printl("end")
210
227
  end
211
228
 
212
- sig { override.params(node: Const).void }
229
+ # @override
230
+ #: (Const node) -> void
213
231
  def visit_const(node)
214
232
  print_blank_line_before(node)
215
233
  print_loc(node)
@@ -218,22 +236,25 @@ module RBI
218
236
  printl("#{node.name} = #{node.value}")
219
237
  end
220
238
 
221
- sig { override.params(node: AttrAccessor).void }
239
+ # @override
240
+ #: (AttrAccessor node) -> void
222
241
  def visit_attr_accessor(node)
223
242
  visit_attr(node)
224
243
  end
225
244
 
226
- sig { override.params(node: AttrReader).void }
245
+ # @override
246
+ #: (AttrReader node) -> void
227
247
  def visit_attr_reader(node)
228
248
  visit_attr(node)
229
249
  end
230
250
 
231
- sig { override.params(node: AttrWriter).void }
251
+ # @override
252
+ #: (AttrWriter node) -> void
232
253
  def visit_attr_writer(node)
233
254
  visit_attr(node)
234
255
  end
235
256
 
236
- sig { params(node: Attr).void }
257
+ #: (Attr node) -> void
237
258
  def visit_attr(node)
238
259
  print_blank_line_before(node)
239
260
 
@@ -261,7 +282,8 @@ module RBI
261
282
  printn
262
283
  end
263
284
 
264
- sig { override.params(node: Method).void }
285
+ # @override
286
+ #: (Method node) -> void
265
287
  def visit_method(node)
266
288
  print_blank_line_before(node)
267
289
  visit_all(node.comments)
@@ -310,52 +332,61 @@ module RBI
310
332
  printn
311
333
  end
312
334
 
313
- sig { override.params(node: ReqParam).void }
335
+ # @override
336
+ #: (ReqParam node) -> void
314
337
  def visit_req_param(node)
315
338
  print(node.name)
316
339
  end
317
340
 
318
- sig { override.params(node: OptParam).void }
341
+ # @override
342
+ #: (OptParam node) -> void
319
343
  def visit_opt_param(node)
320
344
  print("#{node.name} = #{node.value}")
321
345
  end
322
346
 
323
- sig { override.params(node: RestParam).void }
347
+ # @override
348
+ #: (RestParam node) -> void
324
349
  def visit_rest_param(node)
325
350
  print("*#{node.name}")
326
351
  end
327
352
 
328
- sig { override.params(node: KwParam).void }
353
+ # @override
354
+ #: (KwParam node) -> void
329
355
  def visit_kw_param(node)
330
356
  print("#{node.name}:")
331
357
  end
332
358
 
333
- sig { override.params(node: KwOptParam).void }
359
+ # @override
360
+ #: (KwOptParam node) -> void
334
361
  def visit_kw_opt_param(node)
335
362
  print("#{node.name}: #{node.value}")
336
363
  end
337
364
 
338
- sig { override.params(node: KwRestParam).void }
365
+ # @override
366
+ #: (KwRestParam node) -> void
339
367
  def visit_kw_rest_param(node)
340
368
  print("**#{node.name}")
341
369
  end
342
370
 
343
- sig { override.params(node: BlockParam).void }
371
+ # @override
372
+ #: (BlockParam node) -> void
344
373
  def visit_block_param(node)
345
374
  print("&#{node.name}")
346
375
  end
347
376
 
348
- sig { override.params(node: Include).void }
377
+ # @override
378
+ #: (Include node) -> void
349
379
  def visit_include(node)
350
380
  visit_mixin(node)
351
381
  end
352
382
 
353
- sig { override.params(node: Extend).void }
383
+ # @override
384
+ #: (Extend node) -> void
354
385
  def visit_extend(node)
355
386
  visit_mixin(node)
356
387
  end
357
388
 
358
- sig { params(node: Mixin).void }
389
+ #: (Mixin node) -> void
359
390
  def visit_mixin(node)
360
391
  print_blank_line_before(node)
361
392
  print_loc(node)
@@ -372,22 +403,25 @@ module RBI
372
403
  printn(" #{node.names.join(", ")}")
373
404
  end
374
405
 
375
- sig { override.params(node: Public).void }
406
+ # @override
407
+ #: (Public node) -> void
376
408
  def visit_public(node)
377
409
  visit_visibility(node)
378
410
  end
379
411
 
380
- sig { override.params(node: Protected).void }
412
+ # @override
413
+ #: (Protected node) -> void
381
414
  def visit_protected(node)
382
415
  visit_visibility(node)
383
416
  end
384
417
 
385
- sig { override.params(node: Private).void }
418
+ # @override
419
+ #: (Private node) -> void
386
420
  def visit_private(node)
387
421
  visit_visibility(node)
388
422
  end
389
423
 
390
- sig { params(node: Visibility).void }
424
+ #: (Visibility node) -> void
391
425
  def visit_visibility(node)
392
426
  print_blank_line_before(node)
393
427
  print_loc(node)
@@ -396,7 +430,8 @@ module RBI
396
430
  printl(node.visibility.to_s)
397
431
  end
398
432
 
399
- sig { override.params(node: Send).void }
433
+ # @override
434
+ #: (Send node) -> void
400
435
  def visit_send(node)
401
436
  print_blank_line_before(node)
402
437
  print_loc(node)
@@ -413,17 +448,20 @@ module RBI
413
448
  printn
414
449
  end
415
450
 
416
- sig { override.params(node: Arg).void }
451
+ # @override
452
+ #: (Arg node) -> void
417
453
  def visit_arg(node)
418
454
  print(node.value)
419
455
  end
420
456
 
421
- sig { override.params(node: KwArg).void }
457
+ # @override
458
+ #: (KwArg node) -> void
422
459
  def visit_kw_arg(node)
423
460
  print("#{node.keyword}: #{node.value}")
424
461
  end
425
462
 
426
- sig { override.params(node: Sig).void }
463
+ # @override
464
+ #: (Sig node) -> void
427
465
  def visit_sig(node)
428
466
  print_loc(node)
429
467
  visit_all(node.comments)
@@ -443,27 +481,31 @@ module RBI
443
481
  end
444
482
  end
445
483
 
446
- sig { override.params(node: SigParam).void }
484
+ # @override
485
+ #: (SigParam node) -> void
447
486
  def visit_sig_param(node)
448
487
  print("#{node.name}: #{node.type}")
449
488
  end
450
489
 
451
- sig { override.params(node: TStruct).void }
490
+ # @override
491
+ #: (TStruct node) -> void
452
492
  def visit_tstruct(node)
453
493
  visit_scope(node)
454
494
  end
455
495
 
456
- sig { override.params(node: TStructConst).void }
496
+ # @override
497
+ #: (TStructConst node) -> void
457
498
  def visit_tstruct_const(node)
458
499
  visit_t_struct_field(node)
459
500
  end
460
501
 
461
- sig { override.params(node: TStructProp).void }
502
+ # @override
503
+ #: (TStructProp node) -> void
462
504
  def visit_tstruct_prop(node)
463
505
  visit_t_struct_field(node)
464
506
  end
465
507
 
466
- sig { params(node: TStructField).void }
508
+ #: (TStructField node) -> void
467
509
  def visit_t_struct_field(node)
468
510
  print_blank_line_before(node)
469
511
  print_loc(node)
@@ -481,12 +523,14 @@ module RBI
481
523
  printn
482
524
  end
483
525
 
484
- sig { override.params(node: TEnum).void }
526
+ # @override
527
+ #: (TEnum node) -> void
485
528
  def visit_tenum(node)
486
529
  visit_scope(node)
487
530
  end
488
531
 
489
- sig { override.params(node: TEnumBlock).void }
532
+ # @override
533
+ #: (TEnumBlock node) -> void
490
534
  def visit_tenum_block(node)
491
535
  print_loc(node)
492
536
  visit_all(node.comments)
@@ -498,7 +542,8 @@ module RBI
498
542
  printl("end")
499
543
  end
500
544
 
501
- sig { override.params(node: TypeMember).void }
545
+ # @override
546
+ #: (TypeMember node) -> void
502
547
  def visit_type_member(node)
503
548
  print_blank_line_before(node)
504
549
  print_loc(node)
@@ -507,7 +552,8 @@ module RBI
507
552
  printl("#{node.name} = #{node.value}")
508
553
  end
509
554
 
510
- sig { override.params(node: Helper).void }
555
+ # @override
556
+ #: (Helper node) -> void
511
557
  def visit_helper(node)
512
558
  print_blank_line_before(node)
513
559
  print_loc(node)
@@ -516,18 +562,21 @@ module RBI
516
562
  printl("#{node.name}!")
517
563
  end
518
564
 
519
- sig { override.params(node: MixesInClassMethods).void }
565
+ # @override
566
+ #: (MixesInClassMethods node) -> void
520
567
  def visit_mixes_in_class_methods(node)
521
568
  visit_mixin(node)
522
569
  end
523
570
 
524
- sig { override.params(node: Group).void }
571
+ # @override
572
+ #: (Group node) -> void
525
573
  def visit_group(node)
526
574
  printn unless previous_node.nil?
527
575
  visit_all(node.nodes)
528
576
  end
529
577
 
530
- sig { override.params(node: VisibilityGroup).void }
578
+ # @override
579
+ #: (VisibilityGroup node) -> void
531
580
  def visit_visibility_group(node)
532
581
  self.in_visibility_group = true
533
582
  if node.visibility.public?
@@ -540,7 +589,8 @@ module RBI
540
589
  self.in_visibility_group = false
541
590
  end
542
591
 
543
- sig { override.params(node: RequiresAncestor).void }
592
+ # @override
593
+ #: (RequiresAncestor node) -> void
544
594
  def visit_requires_ancestor(node)
545
595
  print_blank_line_before(node)
546
596
  print_loc(node)
@@ -549,7 +599,8 @@ module RBI
549
599
  printl("requires_ancestor { #{node.name} }")
550
600
  end
551
601
 
552
- sig { override.params(node: ConflictTree).void }
602
+ # @override
603
+ #: (ConflictTree node) -> void
553
604
  def visit_conflict_tree(node)
554
605
  printl("<<<<<<< #{node.left_name}")
555
606
  visit(node.left)
@@ -558,7 +609,8 @@ module RBI
558
609
  printl(">>>>>>> #{node.right_name}")
559
610
  end
560
611
 
561
- sig { override.params(node: ScopeConflict).void }
612
+ # @override
613
+ #: (ScopeConflict node) -> void
562
614
  def visit_scope_conflict(node)
563
615
  print_blank_line_before(node)
564
616
  print_loc(node)
@@ -572,7 +624,7 @@ module RBI
572
624
  visit_scope_body(node.left)
573
625
  end
574
626
 
575
- sig { params(node: Node).void }
627
+ #: (Node node) -> void
576
628
  def print_blank_line_before(node)
577
629
  previous_node = self.previous_node
578
630
  return unless previous_node
@@ -582,13 +634,13 @@ module RBI
582
634
  printn
583
635
  end
584
636
 
585
- sig { params(node: Node).void }
637
+ #: (Node node) -> void
586
638
  def print_loc(node)
587
639
  loc = node.loc
588
640
  printl("# #{loc}") if loc && print_locs
589
641
  end
590
642
 
591
- sig { params(node: Param, last: T::Boolean).void }
643
+ #: (Param node, last: bool) -> void
592
644
  def print_param_comment_leading_space(node, last:)
593
645
  printn
594
646
  printt
@@ -606,7 +658,7 @@ module RBI
606
658
  end
607
659
  end
608
660
 
609
- sig { params(node: SigParam, last: T::Boolean).void }
661
+ #: (SigParam node, last: bool) -> void
610
662
  def print_sig_param_comment_leading_space(node, last:)
611
663
  printn
612
664
  printt
@@ -614,7 +666,7 @@ module RBI
614
666
  print(" ") unless last
615
667
  end
616
668
 
617
- sig { params(node: Node).returns(T::Boolean) }
669
+ #: (Node node) -> bool
618
670
  def oneline?(node)
619
671
  case node
620
672
  when ScopeConflict
@@ -636,7 +688,7 @@ module RBI
636
688
  end
637
689
  end
638
690
 
639
- sig { params(node: Sig).void }
691
+ #: (Sig node) -> void
640
692
  def print_sig_as_line(node)
641
693
  printt("sig")
642
694
  print("(:final)") if node.is_final
@@ -661,7 +713,7 @@ module RBI
661
713
  printn(" }")
662
714
  end
663
715
 
664
- sig { params(node: Sig).void }
716
+ #: (Sig node) -> void
665
717
  def print_sig_as_block(node)
666
718
  modifiers = sig_modifiers(node)
667
719
 
@@ -717,7 +769,7 @@ module RBI
717
769
  printl("end")
718
770
  end
719
771
 
720
- sig { params(node: Sig).returns(T::Array[String]) }
772
+ #: (Sig node) -> Array[String]
721
773
  def sig_modifiers(node)
722
774
  modifiers = T.let([], T::Array[String])
723
775
  modifiers << "abstract" if node.is_abstract
@@ -738,22 +790,13 @@ module RBI
738
790
  end
739
791
 
740
792
  class File
741
- extend T::Sig
742
-
743
- sig do
744
- params(
745
- out: T.any(IO, StringIO),
746
- indent: Integer,
747
- print_locs: T::Boolean,
748
- max_line_length: T.nilable(Integer),
749
- ).void
750
- end
793
+ #: (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> void
751
794
  def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
752
795
  p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
753
796
  p.visit_file(self)
754
797
  end
755
798
 
756
- sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
799
+ #: (?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> String
757
800
  def string(indent: 0, print_locs: false, max_line_length: nil)
758
801
  out = StringIO.new
759
802
  print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
@@ -762,22 +805,13 @@ module RBI
762
805
  end
763
806
 
764
807
  class Node
765
- extend T::Sig
766
-
767
- sig do
768
- params(
769
- out: T.any(IO, StringIO),
770
- indent: Integer,
771
- print_locs: T::Boolean,
772
- max_line_length: T.nilable(Integer),
773
- ).void
774
- end
808
+ #: (?out: (IO | StringIO), ?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> void
775
809
  def print(out: $stdout, indent: 0, print_locs: false, max_line_length: nil)
776
810
  p = Printer.new(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)
777
811
  p.visit(self)
778
812
  end
779
813
 
780
- sig { params(indent: Integer, print_locs: T::Boolean, max_line_length: T.nilable(Integer)).returns(String) }
814
+ #: (?indent: Integer, ?print_locs: bool, ?max_line_length: Integer?) -> String
781
815
  def string(indent: 0, print_locs: false, max_line_length: nil)
782
816
  out = StringIO.new
783
817
  print(out: out, indent: indent, print_locs: print_locs, max_line_length: max_line_length)