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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/rbi/formatter.rb +5 -16
- data/lib/rbi/index.rb +37 -41
- data/lib/rbi/loc.rb +6 -18
- data/lib/rbi/model.rb +207 -575
- data/lib/rbi/parser.rb +64 -63
- data/lib/rbi/printer.rb +135 -101
- data/lib/rbi/rbs/method_type_translator.rb +120 -0
- data/lib/rbi/rbs/type_translator.rb +181 -0
- data/lib/rbi/rbs_printer.rb +178 -116
- data/lib/rbi/rewriters/add_sig_templates.rb +7 -10
- data/lib/rbi/rewriters/annotate.rb +6 -9
- data/lib/rbi/rewriters/attr_to_methods.rb +16 -32
- data/lib/rbi/rewriters/deannotate.rb +5 -8
- data/lib/rbi/rewriters/filter_versions.rb +7 -12
- data/lib/rbi/rewriters/flatten_singleton_methods.rb +3 -6
- data/lib/rbi/rewriters/flatten_visibilities.rb +4 -7
- data/lib/rbi/rewriters/group_nodes.rb +6 -11
- data/lib/rbi/rewriters/merge_trees.rb +74 -122
- data/lib/rbi/rewriters/nest_non_public_members.rb +5 -10
- data/lib/rbi/rewriters/nest_singleton_methods.rb +3 -6
- data/lib/rbi/rewriters/nest_top_level_members.rb +4 -7
- data/lib/rbi/rewriters/remove_known_definitions.rb +10 -20
- data/lib/rbi/rewriters/sort_nodes.rb +7 -10
- data/lib/rbi/rewriters/translate_rbs_sigs.rb +87 -0
- data/lib/rbi/type.rb +127 -129
- data/lib/rbi/type_parser.rb +15 -15
- data/lib/rbi/type_visitor.rb +19 -21
- data/lib/rbi/version.rb +1 -1
- data/lib/rbi/visitor.rb +50 -46
- data/lib/rbi.rb +7 -3
- data/rbi/rbi.rbi +4686 -0
- metadata +21 -3
@@ -37,8 +37,6 @@ module RBI
|
|
37
37
|
# end
|
38
38
|
# ~~~
|
39
39
|
class Merge
|
40
|
-
extend T::Sig
|
41
|
-
|
42
40
|
class Keep < ::T::Enum
|
43
41
|
enums do
|
44
42
|
NONE = new
|
@@ -48,9 +46,7 @@ module RBI
|
|
48
46
|
end
|
49
47
|
|
50
48
|
class << self
|
51
|
-
|
52
|
-
|
53
|
-
sig { params(left: Tree, right: Tree, left_name: String, right_name: String, keep: Keep).returns(MergeTree) }
|
49
|
+
#: (Tree left, Tree right, ?left_name: String, ?right_name: String, ?keep: Keep) -> MergeTree
|
54
50
|
def merge_trees(left, right, left_name: "left", right_name: "right", keep: Keep::NONE)
|
55
51
|
left.nest_singleton_methods!
|
56
52
|
right.nest_singleton_methods!
|
@@ -63,10 +59,10 @@ module RBI
|
|
63
59
|
end
|
64
60
|
end
|
65
61
|
|
66
|
-
|
62
|
+
#: MergeTree
|
67
63
|
attr_reader :tree
|
68
64
|
|
69
|
-
|
65
|
+
#: (?left_name: String, ?right_name: String, ?keep: Keep) -> void
|
70
66
|
def initialize(left_name: "left", right_name: "right", keep: Keep::NONE)
|
71
67
|
@left_name = left_name
|
72
68
|
@right_name = right_name
|
@@ -75,7 +71,7 @@ module RBI
|
|
75
71
|
@scope_stack = T.let([@tree], T::Array[Tree])
|
76
72
|
end
|
77
73
|
|
78
|
-
|
74
|
+
#: (Tree tree) -> void
|
79
75
|
def merge(tree)
|
80
76
|
v = TreeMerger.new(@tree, left_name: @left_name, right_name: @right_name, keep: @keep)
|
81
77
|
v.visit(tree)
|
@@ -84,26 +80,22 @@ module RBI
|
|
84
80
|
|
85
81
|
# Used for logging / error displaying purpose
|
86
82
|
class Conflict < T::Struct
|
87
|
-
extend T::Sig
|
88
|
-
|
89
83
|
const :left, Node
|
90
84
|
const :right, Node
|
91
85
|
const :left_name, String
|
92
86
|
const :right_name, String
|
93
87
|
|
94
|
-
|
88
|
+
#: -> String
|
95
89
|
def to_s
|
96
90
|
"Conflicting definitions for `#{left}`"
|
97
91
|
end
|
98
92
|
end
|
99
93
|
|
100
94
|
class TreeMerger < Visitor
|
101
|
-
|
102
|
-
|
103
|
-
sig { returns(T::Array[Conflict]) }
|
95
|
+
#: Array[Conflict]
|
104
96
|
attr_reader :conflicts
|
105
97
|
|
106
|
-
|
98
|
+
#: (Tree output, ?left_name: String, ?right_name: String, ?keep: Keep) -> void
|
107
99
|
def initialize(output, left_name: "left", right_name: "right", keep: Keep::NONE)
|
108
100
|
super()
|
109
101
|
@tree = output
|
@@ -115,7 +107,8 @@ module RBI
|
|
115
107
|
@conflicts = T.let([], T::Array[Conflict])
|
116
108
|
end
|
117
109
|
|
118
|
-
|
110
|
+
# @override
|
111
|
+
#: (Node? node) -> void
|
119
112
|
def visit(node)
|
120
113
|
return unless node
|
121
114
|
|
@@ -164,12 +157,12 @@ module RBI
|
|
164
157
|
|
165
158
|
private
|
166
159
|
|
167
|
-
|
160
|
+
#: -> Tree
|
168
161
|
def current_scope
|
169
162
|
T.must(@scope_stack.last)
|
170
163
|
end
|
171
164
|
|
172
|
-
|
165
|
+
#: (Node node) -> Node?
|
173
166
|
def previous_definition(node)
|
174
167
|
case node
|
175
168
|
when Indexable
|
@@ -181,14 +174,14 @@ module RBI
|
|
181
174
|
nil
|
182
175
|
end
|
183
176
|
|
184
|
-
|
177
|
+
#: (Scope left, Scope right) -> void
|
185
178
|
def make_conflict_scope(left, right)
|
186
179
|
@conflicts << Conflict.new(left: left, right: right, left_name: @left_name, right_name: @right_name)
|
187
180
|
scope_conflict = ScopeConflict.new(left: left, right: right, left_name: @left_name, right_name: @right_name)
|
188
181
|
left.replace(scope_conflict)
|
189
182
|
end
|
190
183
|
|
191
|
-
|
184
|
+
#: (Node left, Node right) -> void
|
192
185
|
def make_conflict_tree(left, right)
|
193
186
|
@conflicts << Conflict.new(left: left, right: right, left_name: @left_name, right_name: @right_name)
|
194
187
|
tree = left.parent_conflict_tree
|
@@ -200,7 +193,7 @@ module RBI
|
|
200
193
|
tree.right << right
|
201
194
|
end
|
202
195
|
|
203
|
-
|
196
|
+
#: (Scope left, Scope right) -> Scope
|
204
197
|
def replace_scope_header(left, right)
|
205
198
|
right_copy = right.dup_empty
|
206
199
|
left.replace(right_copy)
|
@@ -243,12 +236,14 @@ module RBI
|
|
243
236
|
# end
|
244
237
|
# ~~~
|
245
238
|
class ConflictTreeMerger < Visitor
|
246
|
-
|
239
|
+
# @override
|
240
|
+
#: (Node? node) -> void
|
247
241
|
def visit(node)
|
248
242
|
visit_all(node.nodes) if node.is_a?(Tree)
|
249
243
|
end
|
250
244
|
|
251
|
-
|
245
|
+
# @override
|
246
|
+
#: (Array[Node] nodes) -> void
|
252
247
|
def visit_all(nodes)
|
253
248
|
last_conflict_tree = T.let(nil, T.nilable(ConflictTree))
|
254
249
|
nodes.dup.each do |node|
|
@@ -269,7 +264,7 @@ module RBI
|
|
269
264
|
|
270
265
|
private
|
271
266
|
|
272
|
-
|
267
|
+
#: (Tree left, Tree right) -> void
|
273
268
|
def merge_conflict_trees(left, right)
|
274
269
|
right.nodes.dup.each do |node|
|
275
270
|
left << node
|
@@ -280,19 +275,17 @@ module RBI
|
|
280
275
|
end
|
281
276
|
|
282
277
|
class Node
|
283
|
-
extend T::Sig
|
284
|
-
|
285
278
|
# Can `self` and `_other` be merged into a single definition?
|
286
|
-
|
279
|
+
#: (Node _other) -> bool
|
287
280
|
def compatible_with?(_other)
|
288
281
|
true
|
289
282
|
end
|
290
283
|
|
291
284
|
# Merge `self` and `other` into a single definition
|
292
|
-
|
285
|
+
#: (Node other) -> void
|
293
286
|
def merge_with(other); end
|
294
287
|
|
295
|
-
|
288
|
+
#: -> ConflictTree?
|
296
289
|
def parent_conflict_tree
|
297
290
|
parent = T.let(parent_tree, T.nilable(Node))
|
298
291
|
while parent
|
@@ -305,9 +298,8 @@ module RBI
|
|
305
298
|
end
|
306
299
|
|
307
300
|
class NodeWithComments
|
308
|
-
|
309
|
-
|
310
|
-
sig { override.params(other: Node).void }
|
301
|
+
# @override
|
302
|
+
#: (Node other) -> void
|
311
303
|
def merge_with(other)
|
312
304
|
return unless other.is_a?(NodeWithComments)
|
313
305
|
|
@@ -318,9 +310,7 @@ module RBI
|
|
318
310
|
end
|
319
311
|
|
320
312
|
class Tree
|
321
|
-
|
322
|
-
|
323
|
-
sig { params(other: Tree, left_name: String, right_name: String, keep: Rewriters::Merge::Keep).returns(MergeTree) }
|
313
|
+
#: (Tree other, ?left_name: String, ?right_name: String, ?keep: Rewriters::Merge::Keep) -> MergeTree
|
324
314
|
def merge(other, left_name: "left", right_name: "right", keep: Rewriters::Merge::Keep::NONE)
|
325
315
|
Rewriters::Merge.merge_trees(self, other, left_name: left_name, right_name: right_name, keep: keep)
|
326
316
|
end
|
@@ -328,19 +318,10 @@ module RBI
|
|
328
318
|
|
329
319
|
# A tree that _might_ contain conflicts
|
330
320
|
class MergeTree < Tree
|
331
|
-
|
332
|
-
|
333
|
-
sig { returns(T::Array[Rewriters::Merge::Conflict]) }
|
321
|
+
#: Array[Rewriters::Merge::Conflict]
|
334
322
|
attr_reader :conflicts
|
335
323
|
|
336
|
-
|
337
|
-
params(
|
338
|
-
loc: T.nilable(Loc),
|
339
|
-
comments: T::Array[Comment],
|
340
|
-
conflicts: T::Array[Rewriters::Merge::Conflict],
|
341
|
-
block: T.nilable(T.proc.params(node: Tree).void),
|
342
|
-
).void
|
343
|
-
end
|
324
|
+
#: (?loc: Loc?, ?comments: Array[Comment], ?conflicts: Array[Rewriters::Merge::Conflict]) ?{ (Tree node) -> void } -> void
|
344
325
|
def initialize(loc: nil, comments: [], conflicts: [], &block)
|
345
326
|
super(loc: loc, comments: comments)
|
346
327
|
@conflicts = conflicts
|
@@ -351,10 +332,8 @@ module RBI
|
|
351
332
|
class DuplicateNodeError < Error; end
|
352
333
|
|
353
334
|
class Scope
|
354
|
-
extend T::Sig
|
355
|
-
|
356
335
|
# Duplicate `self` scope without its body
|
357
|
-
|
336
|
+
#: -> self
|
358
337
|
def dup_empty
|
359
338
|
case self
|
360
339
|
when Module
|
@@ -378,45 +357,40 @@ module RBI
|
|
378
357
|
end
|
379
358
|
|
380
359
|
class Class
|
381
|
-
|
382
|
-
|
383
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
360
|
+
# @override
|
361
|
+
#: (Node other) -> bool
|
384
362
|
def compatible_with?(other)
|
385
363
|
other.is_a?(Class) && superclass_name == other.superclass_name
|
386
364
|
end
|
387
365
|
end
|
388
366
|
|
389
367
|
class Module
|
390
|
-
|
391
|
-
|
392
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
368
|
+
# @override
|
369
|
+
#: (Node other) -> bool
|
393
370
|
def compatible_with?(other)
|
394
371
|
other.is_a?(Module)
|
395
372
|
end
|
396
373
|
end
|
397
374
|
|
398
375
|
class Struct
|
399
|
-
|
400
|
-
|
401
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
376
|
+
# @override
|
377
|
+
#: (Node other) -> bool
|
402
378
|
def compatible_with?(other)
|
403
379
|
other.is_a?(Struct) && members == other.members && keyword_init == other.keyword_init
|
404
380
|
end
|
405
381
|
end
|
406
382
|
|
407
383
|
class Const
|
408
|
-
|
409
|
-
|
410
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
384
|
+
# @override
|
385
|
+
#: (Node other) -> bool
|
411
386
|
def compatible_with?(other)
|
412
387
|
other.is_a?(Const) && name == other.name && value == other.value
|
413
388
|
end
|
414
389
|
end
|
415
390
|
|
416
391
|
class Attr
|
417
|
-
|
418
|
-
|
419
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
392
|
+
# @override
|
393
|
+
#: (Node other) -> bool
|
420
394
|
def compatible_with?(other)
|
421
395
|
return false unless other.is_a?(Attr)
|
422
396
|
return false unless names == other.names
|
@@ -424,7 +398,8 @@ module RBI
|
|
424
398
|
sigs.empty? || other.sigs.empty? || sigs == other.sigs
|
425
399
|
end
|
426
400
|
|
427
|
-
|
401
|
+
# @override
|
402
|
+
#: (Node other) -> void
|
428
403
|
def merge_with(other)
|
429
404
|
return unless other.is_a?(Attr)
|
430
405
|
|
@@ -436,36 +411,32 @@ module RBI
|
|
436
411
|
end
|
437
412
|
|
438
413
|
class AttrReader
|
439
|
-
|
440
|
-
|
441
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
414
|
+
# @override
|
415
|
+
#: (Node other) -> bool
|
442
416
|
def compatible_with?(other)
|
443
417
|
other.is_a?(AttrReader) && super
|
444
418
|
end
|
445
419
|
end
|
446
420
|
|
447
421
|
class AttrWriter
|
448
|
-
|
449
|
-
|
450
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
422
|
+
# @override
|
423
|
+
#: (Node other) -> bool
|
451
424
|
def compatible_with?(other)
|
452
425
|
other.is_a?(AttrWriter) && super
|
453
426
|
end
|
454
427
|
end
|
455
428
|
|
456
429
|
class AttrAccessor
|
457
|
-
|
458
|
-
|
459
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
430
|
+
# @override
|
431
|
+
#: (Node other) -> bool
|
460
432
|
def compatible_with?(other)
|
461
433
|
other.is_a?(AttrAccessor) && super
|
462
434
|
end
|
463
435
|
end
|
464
436
|
|
465
437
|
class Method
|
466
|
-
|
467
|
-
|
468
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
438
|
+
# @override
|
439
|
+
#: (Node other) -> bool
|
469
440
|
def compatible_with?(other)
|
470
441
|
return false unless other.is_a?(Method)
|
471
442
|
return false unless name == other.name
|
@@ -474,7 +445,8 @@ module RBI
|
|
474
445
|
sigs.empty? || other.sigs.empty? || sigs == other.sigs
|
475
446
|
end
|
476
447
|
|
477
|
-
|
448
|
+
# @override
|
449
|
+
#: (Node other) -> void
|
478
450
|
def merge_with(other)
|
479
451
|
return unless other.is_a?(Method)
|
480
452
|
|
@@ -486,81 +458,72 @@ module RBI
|
|
486
458
|
end
|
487
459
|
|
488
460
|
class Mixin
|
489
|
-
|
490
|
-
|
491
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
461
|
+
# @override
|
462
|
+
#: (Node other) -> bool
|
492
463
|
def compatible_with?(other)
|
493
464
|
other.is_a?(Mixin) && names == other.names
|
494
465
|
end
|
495
466
|
end
|
496
467
|
|
497
468
|
class Include
|
498
|
-
|
499
|
-
|
500
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
469
|
+
# @override
|
470
|
+
#: (Node other) -> bool
|
501
471
|
def compatible_with?(other)
|
502
472
|
other.is_a?(Include) && super
|
503
473
|
end
|
504
474
|
end
|
505
475
|
|
506
476
|
class Extend
|
507
|
-
|
508
|
-
|
509
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
477
|
+
# @override
|
478
|
+
#: (Node other) -> bool
|
510
479
|
def compatible_with?(other)
|
511
480
|
other.is_a?(Extend) && super
|
512
481
|
end
|
513
482
|
end
|
514
483
|
|
515
484
|
class MixesInClassMethods
|
516
|
-
|
517
|
-
|
518
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
485
|
+
# @override
|
486
|
+
#: (Node other) -> bool
|
519
487
|
def compatible_with?(other)
|
520
488
|
other.is_a?(MixesInClassMethods) && super
|
521
489
|
end
|
522
490
|
end
|
523
491
|
|
524
492
|
class Helper
|
525
|
-
|
526
|
-
|
527
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
493
|
+
# @override
|
494
|
+
#: (Node other) -> bool
|
528
495
|
def compatible_with?(other)
|
529
496
|
other.is_a?(Helper) && name == other.name
|
530
497
|
end
|
531
498
|
end
|
532
499
|
|
533
500
|
class Send
|
534
|
-
|
535
|
-
|
536
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
501
|
+
# @override
|
502
|
+
#: (Node other) -> bool
|
537
503
|
def compatible_with?(other)
|
538
504
|
other.is_a?(Send) && method == other.method && args == other.args
|
539
505
|
end
|
540
506
|
end
|
541
507
|
|
542
508
|
class TStructField
|
543
|
-
|
544
|
-
|
545
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
509
|
+
# @override
|
510
|
+
#: (Node other) -> bool
|
546
511
|
def compatible_with?(other)
|
547
512
|
other.is_a?(TStructField) && name == other.name && type == other.type && default == other.default
|
548
513
|
end
|
549
514
|
end
|
550
515
|
|
551
516
|
class TStructConst
|
552
|
-
|
553
|
-
|
554
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
517
|
+
# @override
|
518
|
+
#: (Node other) -> bool
|
555
519
|
def compatible_with?(other)
|
556
520
|
other.is_a?(TStructConst) && super
|
557
521
|
end
|
558
522
|
end
|
559
523
|
|
560
524
|
class TStructProp
|
561
|
-
|
562
|
-
|
563
|
-
sig { override.params(other: Node).returns(T::Boolean) }
|
525
|
+
# @override
|
526
|
+
#: (Node other) -> bool
|
564
527
|
def compatible_with?(other)
|
565
528
|
other.is_a?(TStructProp) && super
|
566
529
|
end
|
@@ -581,15 +544,13 @@ module RBI
|
|
581
544
|
# end
|
582
545
|
# ~~~
|
583
546
|
class ConflictTree < Tree
|
584
|
-
|
585
|
-
|
586
|
-
sig { returns(Tree) }
|
547
|
+
#: Tree
|
587
548
|
attr_reader :left, :right
|
588
549
|
|
589
|
-
|
550
|
+
#: String
|
590
551
|
attr_reader :left_name, :right_name
|
591
552
|
|
592
|
-
|
553
|
+
#: (?left_name: String, ?right_name: String) -> void
|
593
554
|
def initialize(left_name: "left", right_name: "right")
|
594
555
|
super()
|
595
556
|
@left_name = left_name
|
@@ -614,22 +575,13 @@ module RBI
|
|
614
575
|
# end
|
615
576
|
# ~~~
|
616
577
|
class ScopeConflict < Tree
|
617
|
-
|
618
|
-
|
619
|
-
sig { returns(Scope) }
|
578
|
+
#: Scope
|
620
579
|
attr_reader :left, :right
|
621
580
|
|
622
|
-
|
581
|
+
#: String
|
623
582
|
attr_reader :left_name, :right_name
|
624
583
|
|
625
|
-
|
626
|
-
params(
|
627
|
-
left: Scope,
|
628
|
-
right: Scope,
|
629
|
-
left_name: String,
|
630
|
-
right_name: String,
|
631
|
-
).void
|
632
|
-
end
|
584
|
+
#: (left: Scope, right: Scope, ?left_name: String, ?right_name: String) -> void
|
633
585
|
def initialize(left:, right:, left_name: "left", right_name: "right")
|
634
586
|
super()
|
635
587
|
@left = left
|
@@ -4,9 +4,8 @@
|
|
4
4
|
module RBI
|
5
5
|
module Rewriters
|
6
6
|
class NestNonPublicMembers < Visitor
|
7
|
-
|
8
|
-
|
9
|
-
sig { override.params(node: T.nilable(Node)).void }
|
7
|
+
# @override
|
8
|
+
#: (Node? node) -> void
|
10
9
|
def visit(node)
|
11
10
|
return unless node
|
12
11
|
|
@@ -40,9 +39,7 @@ module RBI
|
|
40
39
|
end
|
41
40
|
|
42
41
|
class Tree
|
43
|
-
|
44
|
-
|
45
|
-
sig { void }
|
42
|
+
#: -> void
|
46
43
|
def nest_non_public_members!
|
47
44
|
visitor = Rewriters::NestNonPublicMembers.new
|
48
45
|
visitor.visit(self)
|
@@ -50,12 +47,10 @@ module RBI
|
|
50
47
|
end
|
51
48
|
|
52
49
|
class VisibilityGroup < Tree
|
53
|
-
|
54
|
-
|
55
|
-
sig { returns(Visibility) }
|
50
|
+
#: Visibility
|
56
51
|
attr_reader :visibility
|
57
52
|
|
58
|
-
|
53
|
+
#: (Visibility visibility) -> void
|
59
54
|
def initialize(visibility)
|
60
55
|
super()
|
61
56
|
@visibility = visibility
|
@@ -4,9 +4,8 @@
|
|
4
4
|
module RBI
|
5
5
|
module Rewriters
|
6
6
|
class NestSingletonMethods < Visitor
|
7
|
-
|
8
|
-
|
9
|
-
sig { override.params(node: T.nilable(Node)).void }
|
7
|
+
# @override
|
8
|
+
#: (Node? node) -> void
|
10
9
|
def visit(node)
|
11
10
|
return unless node
|
12
11
|
|
@@ -30,9 +29,7 @@ module RBI
|
|
30
29
|
end
|
31
30
|
|
32
31
|
class Tree
|
33
|
-
|
34
|
-
|
35
|
-
sig { void }
|
32
|
+
#: -> void
|
36
33
|
def nest_singleton_methods!
|
37
34
|
visitor = Rewriters::NestSingletonMethods.new
|
38
35
|
visitor.visit(self)
|
@@ -20,16 +20,15 @@ module RBI
|
|
20
20
|
# end
|
21
21
|
# ~~~
|
22
22
|
class NestTopLevelMembers < Visitor
|
23
|
-
|
24
|
-
|
25
|
-
sig { void }
|
23
|
+
#: -> void
|
26
24
|
def initialize
|
27
25
|
super
|
28
26
|
|
29
27
|
@top_level_object_class = T.let(nil, T.nilable(Class))
|
30
28
|
end
|
31
29
|
|
32
|
-
|
30
|
+
# @override
|
31
|
+
#: (Node? node) -> void
|
33
32
|
def visit(node)
|
34
33
|
return unless node
|
35
34
|
|
@@ -57,9 +56,7 @@ module RBI
|
|
57
56
|
end
|
58
57
|
|
59
58
|
class Tree
|
60
|
-
|
61
|
-
|
62
|
-
sig { void }
|
59
|
+
#: -> void
|
63
60
|
def nest_top_level_members!
|
64
61
|
visitor = Rewriters::NestTopLevelMembers.new
|
65
62
|
visitor.visit(self)
|
@@ -46,12 +46,10 @@ module RBI
|
|
46
46
|
# OPERATIONS
|
47
47
|
# ~~~
|
48
48
|
class RemoveKnownDefinitions < Visitor
|
49
|
-
|
50
|
-
|
51
|
-
sig { returns(T::Array[Operation]) }
|
49
|
+
#: Array[Operation]
|
52
50
|
attr_reader :operations
|
53
51
|
|
54
|
-
|
52
|
+
#: (Index index) -> void
|
55
53
|
def initialize(index)
|
56
54
|
super()
|
57
55
|
@index = index
|
@@ -59,14 +57,7 @@ module RBI
|
|
59
57
|
end
|
60
58
|
|
61
59
|
class << self
|
62
|
-
|
63
|
-
|
64
|
-
sig do
|
65
|
-
params(
|
66
|
-
tree: Tree,
|
67
|
-
index: Index,
|
68
|
-
).returns([Tree, T::Array[Operation]])
|
69
|
-
end
|
60
|
+
#: (Tree tree, Index index) -> [Tree, Array[Operation]]
|
70
61
|
def remove(tree, index)
|
71
62
|
v = RemoveKnownDefinitions.new(index)
|
72
63
|
v.visit(tree)
|
@@ -74,12 +65,13 @@ module RBI
|
|
74
65
|
end
|
75
66
|
end
|
76
67
|
|
77
|
-
|
68
|
+
#: (Array[Node] nodes) -> void
|
78
69
|
def visit_all(nodes)
|
79
70
|
nodes.dup.each { |node| visit(node) }
|
80
71
|
end
|
81
72
|
|
82
|
-
|
73
|
+
# @override
|
74
|
+
#: (Node? node) -> void
|
83
75
|
def visit(node)
|
84
76
|
return unless node
|
85
77
|
|
@@ -98,7 +90,7 @@ module RBI
|
|
98
90
|
|
99
91
|
private
|
100
92
|
|
101
|
-
|
93
|
+
#: (Indexable node) -> Node?
|
102
94
|
def previous_definition_for(node)
|
103
95
|
node.index_ids.each do |id|
|
104
96
|
previous = @index[id].first
|
@@ -107,7 +99,7 @@ module RBI
|
|
107
99
|
nil
|
108
100
|
end
|
109
101
|
|
110
|
-
|
102
|
+
#: (Node node, Node previous) -> bool
|
111
103
|
def can_delete_node?(node, previous)
|
112
104
|
return false unless node.class == previous.class
|
113
105
|
|
@@ -125,19 +117,17 @@ module RBI
|
|
125
117
|
end
|
126
118
|
end
|
127
119
|
|
128
|
-
|
120
|
+
#: (Node node, Node previous) -> void
|
129
121
|
def delete_node(node, previous)
|
130
122
|
node.detach
|
131
123
|
@operations << Operation.new(deleted_node: node, duplicate_of: previous)
|
132
124
|
end
|
133
125
|
|
134
126
|
class Operation < T::Struct
|
135
|
-
extend T::Sig
|
136
|
-
|
137
127
|
const :deleted_node, Node
|
138
128
|
const :duplicate_of, Node
|
139
129
|
|
140
|
-
|
130
|
+
#: -> String
|
141
131
|
def to_s
|
142
132
|
"Deleted #{duplicate_of} at #{deleted_node.loc} (duplicate from #{duplicate_of.loc})"
|
143
133
|
end
|