rbi 0.2.4 → 0.3.1
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 +2 -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 +66 -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 +3612 -0
- metadata +21 -3
data/lib/rbi/parser.rb
CHANGED
@@ -5,12 +5,10 @@ require "prism"
|
|
5
5
|
|
6
6
|
module RBI
|
7
7
|
class ParseError < Error
|
8
|
-
|
9
|
-
|
10
|
-
sig { returns(Loc) }
|
8
|
+
#: Loc
|
11
9
|
attr_reader :location
|
12
10
|
|
13
|
-
|
11
|
+
#: (String message, Loc location) -> void
|
14
12
|
def initialize(message, location)
|
15
13
|
super(message)
|
16
14
|
@location = location
|
@@ -18,19 +16,17 @@ module RBI
|
|
18
16
|
end
|
19
17
|
|
20
18
|
class UnexpectedParserError < Error
|
21
|
-
|
22
|
-
|
23
|
-
sig { returns(Loc) }
|
19
|
+
#: Loc
|
24
20
|
attr_reader :last_location
|
25
21
|
|
26
|
-
|
22
|
+
#: (Exception parent_exception, Loc last_location) -> void
|
27
23
|
def initialize(parent_exception, last_location)
|
28
24
|
super(parent_exception)
|
29
25
|
set_backtrace(parent_exception.backtrace)
|
30
26
|
@last_location = last_location
|
31
27
|
end
|
32
28
|
|
33
|
-
|
29
|
+
#: (?io: (IO | StringIO)) -> void
|
34
30
|
def print_debug(io: $stderr)
|
35
31
|
io.puts ""
|
36
32
|
io.puts "##################################"
|
@@ -51,47 +47,43 @@ module RBI
|
|
51
47
|
end
|
52
48
|
|
53
49
|
class Parser
|
54
|
-
extend T::Sig
|
55
|
-
|
56
50
|
class << self
|
57
|
-
|
58
|
-
|
59
|
-
sig { params(string: String).returns(Tree) }
|
51
|
+
#: (String string) -> Tree
|
60
52
|
def parse_string(string)
|
61
53
|
Parser.new.parse_string(string)
|
62
54
|
end
|
63
55
|
|
64
|
-
|
56
|
+
#: (String path) -> Tree
|
65
57
|
def parse_file(path)
|
66
58
|
Parser.new.parse_file(path)
|
67
59
|
end
|
68
60
|
|
69
|
-
|
61
|
+
#: (Array[String] paths) -> Array[Tree]
|
70
62
|
def parse_files(paths)
|
71
63
|
parser = Parser.new
|
72
64
|
paths.map { |path| parser.parse_file(path) }
|
73
65
|
end
|
74
66
|
|
75
|
-
|
67
|
+
#: (Array[String] strings) -> Array[Tree]
|
76
68
|
def parse_strings(strings)
|
77
69
|
parser = Parser.new
|
78
70
|
strings.map { |string| parser.parse_string(string) }
|
79
71
|
end
|
80
72
|
end
|
81
73
|
|
82
|
-
|
74
|
+
#: (String string) -> Tree
|
83
75
|
def parse_string(string)
|
84
76
|
parse(string, file: "-")
|
85
77
|
end
|
86
78
|
|
87
|
-
|
79
|
+
#: (String path) -> Tree
|
88
80
|
def parse_file(path)
|
89
81
|
parse(::File.read(path), file: path)
|
90
82
|
end
|
91
83
|
|
92
84
|
private
|
93
85
|
|
94
|
-
|
86
|
+
#: (String source, file: String) -> Tree
|
95
87
|
def parse(source, file:)
|
96
88
|
result = Prism.parse(source)
|
97
89
|
unless result.success?
|
@@ -120,9 +112,7 @@ module RBI
|
|
120
112
|
end
|
121
113
|
|
122
114
|
class Visitor < Prism::Visitor
|
123
|
-
|
124
|
-
|
125
|
-
sig { params(source: String, file: String).void }
|
115
|
+
#: (String source, file: String) -> void
|
126
116
|
def initialize(source, file:)
|
127
117
|
super()
|
128
118
|
|
@@ -132,34 +122,32 @@ module RBI
|
|
132
122
|
|
133
123
|
private
|
134
124
|
|
135
|
-
|
125
|
+
#: (Prism::Node node) -> Loc
|
136
126
|
def node_loc(node)
|
137
127
|
Loc.from_prism(@file, node.location)
|
138
128
|
end
|
139
129
|
|
140
|
-
|
130
|
+
#: (Prism::Node? node) -> String?
|
141
131
|
def node_string(node)
|
142
132
|
return unless node
|
143
133
|
|
144
134
|
node.slice
|
145
135
|
end
|
146
136
|
|
147
|
-
|
137
|
+
#: (Prism::Node node) -> String
|
148
138
|
def node_string!(node)
|
149
139
|
T.must(node_string(node))
|
150
140
|
end
|
151
141
|
end
|
152
142
|
|
153
143
|
class TreeBuilder < Visitor
|
154
|
-
|
155
|
-
|
156
|
-
sig { returns(Tree) }
|
144
|
+
#: Tree
|
157
145
|
attr_reader :tree
|
158
146
|
|
159
|
-
|
147
|
+
#: Prism::Node?
|
160
148
|
attr_reader :last_node
|
161
149
|
|
162
|
-
|
150
|
+
#: (String source, comments: Array[Prism::Comment], file: String) -> void
|
163
151
|
def initialize(source, comments:, file:)
|
164
152
|
super(source, file: file)
|
165
153
|
|
@@ -171,7 +159,8 @@ module RBI
|
|
171
159
|
@last_sigs = T.let([], T::Array[RBI::Sig])
|
172
160
|
end
|
173
161
|
|
174
|
-
|
162
|
+
# @override
|
163
|
+
#: (Prism::ClassNode node) -> void
|
175
164
|
def visit_class_node(node)
|
176
165
|
@last_node = node
|
177
166
|
superclass_name = node_string(node.superclass)
|
@@ -206,21 +195,23 @@ module RBI
|
|
206
195
|
@last_node = nil
|
207
196
|
end
|
208
197
|
|
209
|
-
|
198
|
+
# @override
|
199
|
+
#: (Prism::ConstantWriteNode node) -> void
|
210
200
|
def visit_constant_write_node(node)
|
211
201
|
@last_node = node
|
212
202
|
visit_constant_assign(node)
|
213
203
|
@last_node = nil
|
214
204
|
end
|
215
205
|
|
216
|
-
|
206
|
+
# @override
|
207
|
+
#: (Prism::ConstantPathWriteNode node) -> void
|
217
208
|
def visit_constant_path_write_node(node)
|
218
209
|
@last_node = node
|
219
210
|
visit_constant_assign(node)
|
220
211
|
@last_node = nil
|
221
212
|
end
|
222
213
|
|
223
|
-
|
214
|
+
#: ((Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) node) -> void
|
224
215
|
def visit_constant_assign(node)
|
225
216
|
struct = parse_struct(node)
|
226
217
|
|
@@ -253,7 +244,8 @@ module RBI
|
|
253
244
|
end
|
254
245
|
end
|
255
246
|
|
256
|
-
|
247
|
+
# @override
|
248
|
+
#: (Prism::DefNode node) -> void
|
257
249
|
def visit_def_node(node)
|
258
250
|
@last_node = node
|
259
251
|
|
@@ -274,7 +266,8 @@ module RBI
|
|
274
266
|
@last_node = nil
|
275
267
|
end
|
276
268
|
|
277
|
-
|
269
|
+
# @override
|
270
|
+
#: (Prism::ModuleNode node) -> void
|
278
271
|
def visit_module_node(node)
|
279
272
|
@last_node = node
|
280
273
|
scope = Module.new(
|
@@ -292,7 +285,8 @@ module RBI
|
|
292
285
|
@last_node = nil
|
293
286
|
end
|
294
287
|
|
295
|
-
|
288
|
+
# @override
|
289
|
+
#: (Prism::ProgramNode node) -> void
|
296
290
|
def visit_program_node(node)
|
297
291
|
@last_node = node
|
298
292
|
super
|
@@ -303,7 +297,8 @@ module RBI
|
|
303
297
|
@last_node = nil
|
304
298
|
end
|
305
299
|
|
306
|
-
|
300
|
+
# @override
|
301
|
+
#: (Prism::SingletonClassNode node) -> void
|
307
302
|
def visit_singleton_class_node(node)
|
308
303
|
@last_node = node
|
309
304
|
scope = SingletonClass.new(
|
@@ -320,7 +315,7 @@ module RBI
|
|
320
315
|
@last_node = nil
|
321
316
|
end
|
322
317
|
|
323
|
-
|
318
|
+
#: (Prism::CallNode node) -> void
|
324
319
|
def visit_call_node(node)
|
325
320
|
@last_node = node
|
326
321
|
message = node.name.to_s
|
@@ -494,7 +489,7 @@ module RBI
|
|
494
489
|
private
|
495
490
|
|
496
491
|
# Collect all the remaining comments within a node
|
497
|
-
|
492
|
+
#: (Prism::Node node) -> void
|
498
493
|
def collect_dangling_comments(node)
|
499
494
|
first_line = node.location.start_line
|
500
495
|
last_line = node.location.end_line
|
@@ -512,7 +507,7 @@ module RBI
|
|
512
507
|
end
|
513
508
|
|
514
509
|
# Collect all the remaining comments after visiting the tree
|
515
|
-
|
510
|
+
#: -> void
|
516
511
|
def collect_orphan_comments
|
517
512
|
last_line = T.let(nil, T.nilable(Integer))
|
518
513
|
last_node_end = @tree.nodes.last&.loc&.end_line
|
@@ -535,19 +530,19 @@ module RBI
|
|
535
530
|
end
|
536
531
|
end
|
537
532
|
|
538
|
-
|
533
|
+
#: -> Tree
|
539
534
|
def current_scope
|
540
535
|
T.must(@scopes_stack.last) # Should never be nil since we create a Tree as the root
|
541
536
|
end
|
542
537
|
|
543
|
-
|
538
|
+
#: -> Array[Sig]
|
544
539
|
def current_sigs
|
545
540
|
sigs = @last_sigs.dup
|
546
541
|
@last_sigs.clear
|
547
542
|
sigs
|
548
543
|
end
|
549
544
|
|
550
|
-
|
545
|
+
#: (Array[Sig] sigs) -> Array[Comment]
|
551
546
|
def detach_comments_from_sigs(sigs)
|
552
547
|
comments = T.let([], T::Array[Comment])
|
553
548
|
|
@@ -559,7 +554,7 @@ module RBI
|
|
559
554
|
comments
|
560
555
|
end
|
561
556
|
|
562
|
-
|
557
|
+
#: (Prism::Node node) -> Array[Comment]
|
563
558
|
def node_comments(node)
|
564
559
|
comments = []
|
565
560
|
|
@@ -577,12 +572,20 @@ module RBI
|
|
577
572
|
comments
|
578
573
|
end
|
579
574
|
|
580
|
-
|
575
|
+
#: (Prism::Comment node) -> Comment
|
581
576
|
def parse_comment(node)
|
582
|
-
|
577
|
+
loc = Loc.from_prism(@file, node.location)
|
578
|
+
string = node.location.slice
|
579
|
+
# We also ignore RDoc directives such as `:nodoc:`
|
580
|
+
# See https://ruby.github.io/rdoc/RDoc/MarkupReference.html#class-RDoc::MarkupReference-label-Directives
|
581
|
+
if string.start_with?("#:") && !(string =~ /^#:[a-z_]+:/)
|
582
|
+
RBSComment.new(string.gsub(/^#: ?/, "").rstrip, loc: loc)
|
583
|
+
else
|
584
|
+
Comment.new(string.gsub(/^# ?/, "").rstrip, loc: loc)
|
585
|
+
end
|
583
586
|
end
|
584
587
|
|
585
|
-
|
588
|
+
#: (Prism::Node? node) -> Array[Arg]
|
586
589
|
def parse_send_args(node)
|
587
590
|
args = T.let([], T::Array[Arg])
|
588
591
|
return args unless node.is_a?(Prism::ArgumentsNode)
|
@@ -606,7 +609,7 @@ module RBI
|
|
606
609
|
args
|
607
610
|
end
|
608
611
|
|
609
|
-
|
612
|
+
#: (Prism::Node? node) -> Array[Param]
|
610
613
|
def parse_params(node)
|
611
614
|
params = []
|
612
615
|
return params unless node.is_a?(Prism::ParametersNode)
|
@@ -680,7 +683,7 @@ module RBI
|
|
680
683
|
params
|
681
684
|
end
|
682
685
|
|
683
|
-
|
686
|
+
#: (Prism::CallNode node) -> Sig
|
684
687
|
def parse_sig(node)
|
685
688
|
builder = SigBuilder.new(@source, file: @file)
|
686
689
|
builder.current.loc = node_loc(node)
|
@@ -689,7 +692,7 @@ module RBI
|
|
689
692
|
builder.current
|
690
693
|
end
|
691
694
|
|
692
|
-
|
695
|
+
#: ((Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) node) -> Struct?
|
693
696
|
def parse_struct(node)
|
694
697
|
send = node.value
|
695
698
|
return unless send.is_a?(Prism::CallNode)
|
@@ -737,7 +740,7 @@ module RBI
|
|
737
740
|
struct
|
738
741
|
end
|
739
742
|
|
740
|
-
|
743
|
+
#: (Prism::CallNode send) -> void
|
741
744
|
def parse_tstruct_field(send)
|
742
745
|
args = send.arguments
|
743
746
|
return unless args.is_a?(Prism::ArgumentsNode)
|
@@ -774,7 +777,7 @@ module RBI
|
|
774
777
|
end
|
775
778
|
end
|
776
779
|
|
777
|
-
|
780
|
+
#: (String name, Prism::Node node) -> Visibility
|
778
781
|
def parse_visibility(name, node)
|
779
782
|
case name
|
780
783
|
when "public"
|
@@ -788,7 +791,7 @@ module RBI
|
|
788
791
|
end
|
789
792
|
end
|
790
793
|
|
791
|
-
|
794
|
+
#: -> void
|
792
795
|
def separate_header_comments
|
793
796
|
current_scope.nodes.dup.each do |child_node|
|
794
797
|
break unless child_node.is_a?(Comment) || child_node.is_a?(BlankLine)
|
@@ -798,7 +801,7 @@ module RBI
|
|
798
801
|
end
|
799
802
|
end
|
800
803
|
|
801
|
-
|
804
|
+
#: -> void
|
802
805
|
def set_root_tree_loc
|
803
806
|
first_loc = tree.nodes.first&.loc
|
804
807
|
last_loc = tree.nodes.last&.loc
|
@@ -812,26 +815,25 @@ module RBI
|
|
812
815
|
)
|
813
816
|
end
|
814
817
|
|
815
|
-
|
818
|
+
#: (Prism::Node? node) -> bool
|
816
819
|
def type_variable_definition?(node)
|
817
820
|
node.is_a?(Prism::CallNode) && (node.message == "type_member" || node.message == "type_template")
|
818
821
|
end
|
819
822
|
end
|
820
823
|
|
821
824
|
class SigBuilder < Visitor
|
822
|
-
|
823
|
-
|
824
|
-
sig { returns(Sig) }
|
825
|
+
#: Sig
|
825
826
|
attr_reader :current
|
826
827
|
|
827
|
-
|
828
|
+
#: (String content, file: String) -> void
|
828
829
|
def initialize(content, file:)
|
829
830
|
super
|
830
831
|
|
831
832
|
@current = T.let(Sig.new, Sig)
|
832
833
|
end
|
833
834
|
|
834
|
-
|
835
|
+
# @override
|
836
|
+
#: (Prism::CallNode node) -> void
|
835
837
|
def visit_call_node(node)
|
836
838
|
case node.message
|
837
839
|
when "sig"
|
@@ -892,7 +894,8 @@ module RBI
|
|
892
894
|
visit(node.block)
|
893
895
|
end
|
894
896
|
|
895
|
-
|
897
|
+
# @override
|
898
|
+
#: (Prism::AssocNode node) -> void
|
896
899
|
def visit_assoc_node(node)
|
897
900
|
@current.params << SigParam.new(
|
898
901
|
node_string!(node.key).delete_suffix(":"),
|