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
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,18 @@ 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
|
+
if string.start_with?("#:")
|
580
|
+
RBSComment.new(string.gsub(/^#: ?/, "").rstrip, loc: loc)
|
581
|
+
else
|
582
|
+
Comment.new(string.gsub(/^# ?/, "").rstrip, loc: loc)
|
583
|
+
end
|
583
584
|
end
|
584
585
|
|
585
|
-
|
586
|
+
#: (Prism::Node? node) -> Array[Arg]
|
586
587
|
def parse_send_args(node)
|
587
588
|
args = T.let([], T::Array[Arg])
|
588
589
|
return args unless node.is_a?(Prism::ArgumentsNode)
|
@@ -606,7 +607,7 @@ module RBI
|
|
606
607
|
args
|
607
608
|
end
|
608
609
|
|
609
|
-
|
610
|
+
#: (Prism::Node? node) -> Array[Param]
|
610
611
|
def parse_params(node)
|
611
612
|
params = []
|
612
613
|
return params unless node.is_a?(Prism::ParametersNode)
|
@@ -680,7 +681,7 @@ module RBI
|
|
680
681
|
params
|
681
682
|
end
|
682
683
|
|
683
|
-
|
684
|
+
#: (Prism::CallNode node) -> Sig
|
684
685
|
def parse_sig(node)
|
685
686
|
builder = SigBuilder.new(@source, file: @file)
|
686
687
|
builder.current.loc = node_loc(node)
|
@@ -689,7 +690,7 @@ module RBI
|
|
689
690
|
builder.current
|
690
691
|
end
|
691
692
|
|
692
|
-
|
693
|
+
#: ((Prism::ConstantWriteNode | Prism::ConstantPathWriteNode) node) -> Struct?
|
693
694
|
def parse_struct(node)
|
694
695
|
send = node.value
|
695
696
|
return unless send.is_a?(Prism::CallNode)
|
@@ -737,7 +738,7 @@ module RBI
|
|
737
738
|
struct
|
738
739
|
end
|
739
740
|
|
740
|
-
|
741
|
+
#: (Prism::CallNode send) -> void
|
741
742
|
def parse_tstruct_field(send)
|
742
743
|
args = send.arguments
|
743
744
|
return unless args.is_a?(Prism::ArgumentsNode)
|
@@ -774,7 +775,7 @@ module RBI
|
|
774
775
|
end
|
775
776
|
end
|
776
777
|
|
777
|
-
|
778
|
+
#: (String name, Prism::Node node) -> Visibility
|
778
779
|
def parse_visibility(name, node)
|
779
780
|
case name
|
780
781
|
when "public"
|
@@ -788,7 +789,7 @@ module RBI
|
|
788
789
|
end
|
789
790
|
end
|
790
791
|
|
791
|
-
|
792
|
+
#: -> void
|
792
793
|
def separate_header_comments
|
793
794
|
current_scope.nodes.dup.each do |child_node|
|
794
795
|
break unless child_node.is_a?(Comment) || child_node.is_a?(BlankLine)
|
@@ -798,7 +799,7 @@ module RBI
|
|
798
799
|
end
|
799
800
|
end
|
800
801
|
|
801
|
-
|
802
|
+
#: -> void
|
802
803
|
def set_root_tree_loc
|
803
804
|
first_loc = tree.nodes.first&.loc
|
804
805
|
last_loc = tree.nodes.last&.loc
|
@@ -812,26 +813,25 @@ module RBI
|
|
812
813
|
)
|
813
814
|
end
|
814
815
|
|
815
|
-
|
816
|
+
#: (Prism::Node? node) -> bool
|
816
817
|
def type_variable_definition?(node)
|
817
818
|
node.is_a?(Prism::CallNode) && (node.message == "type_member" || node.message == "type_template")
|
818
819
|
end
|
819
820
|
end
|
820
821
|
|
821
822
|
class SigBuilder < Visitor
|
822
|
-
|
823
|
-
|
824
|
-
sig { returns(Sig) }
|
823
|
+
#: Sig
|
825
824
|
attr_reader :current
|
826
825
|
|
827
|
-
|
826
|
+
#: (String content, file: String) -> void
|
828
827
|
def initialize(content, file:)
|
829
828
|
super
|
830
829
|
|
831
830
|
@current = T.let(Sig.new, Sig)
|
832
831
|
end
|
833
832
|
|
834
|
-
|
833
|
+
# @override
|
834
|
+
#: (Prism::CallNode node) -> void
|
835
835
|
def visit_call_node(node)
|
836
836
|
case node.message
|
837
837
|
when "sig"
|
@@ -892,7 +892,8 @@ module RBI
|
|
892
892
|
visit(node.block)
|
893
893
|
end
|
894
894
|
|
895
|
-
|
895
|
+
# @override
|
896
|
+
#: (Prism::AssocNode node) -> void
|
896
897
|
def visit_assoc_node(node)
|
897
898
|
@current.params << SigParam.new(
|
898
899
|
node_string!(node.key).delete_suffix(":"),
|