rbi 0.1.0 → 0.1.2
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/lib/rbi/loc.rb +11 -7
- data/lib/rbi/model.rb +2 -2
- data/lib/rbi/parser.rb +150 -100
- data/lib/rbi/version.rb +1 -1
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3adefb9fc887432fdab8f11a5800c58fe0c4b7a089c1170d67fc5fa6374c475d
|
4
|
+
data.tar.gz: 5259d5132a2b83761a22419c10fca4beff9bb95e2e60c779c3e7b5583230476d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb345c63c449eb4610d826b3a9a2e6da4633ac7f29ceaf0b46af689f956d5a6758939d02b6234f676c6f7ce6f49ccf119e4a6237946e87cd9a7d13b57f014f82
|
7
|
+
data.tar.gz: 674a6fe4acf7b92ea718ed12c0906d5d1b8a1e1942869e0c163060fd107d227a65e0eb58460d694f22c48f3809c37739033a3b806551676ac136fedc360b0750
|
data/lib/rbi/loc.rb
CHANGED
@@ -8,14 +8,14 @@ module RBI
|
|
8
8
|
class << self
|
9
9
|
extend T::Sig
|
10
10
|
|
11
|
-
sig { params(file: String,
|
12
|
-
def
|
11
|
+
sig { params(file: String, prism_location: Prism::Location).returns(Loc) }
|
12
|
+
def from_prism(file, prism_location)
|
13
13
|
new(
|
14
14
|
file: file,
|
15
|
-
begin_line:
|
16
|
-
end_line:
|
17
|
-
begin_column:
|
18
|
-
end_column:
|
15
|
+
begin_line: prism_location.start_line,
|
16
|
+
end_line: prism_location.end_line,
|
17
|
+
begin_column: prism_location.start_column,
|
18
|
+
end_column: prism_location.end_column,
|
19
19
|
)
|
20
20
|
end
|
21
21
|
end
|
@@ -45,7 +45,11 @@ module RBI
|
|
45
45
|
|
46
46
|
sig { returns(String) }
|
47
47
|
def to_s
|
48
|
-
|
48
|
+
if end_line && end_column
|
49
|
+
"#{file}:#{begin_line}:#{begin_column}-#{end_line}:#{end_column}"
|
50
|
+
else
|
51
|
+
"#{file}:#{begin_line}:#{begin_column}"
|
52
|
+
end
|
49
53
|
end
|
50
54
|
|
51
55
|
sig { returns(T.nilable(String)) }
|
data/lib/rbi/model.rb
CHANGED
@@ -353,7 +353,7 @@ module RBI
|
|
353
353
|
abstract!
|
354
354
|
|
355
355
|
sig { returns(T::Array[Symbol]) }
|
356
|
-
|
356
|
+
attr_reader :names
|
357
357
|
|
358
358
|
sig { returns(Visibility) }
|
359
359
|
attr_accessor :visibility
|
@@ -774,7 +774,7 @@ module RBI
|
|
774
774
|
abstract!
|
775
775
|
|
776
776
|
sig { returns(T::Array[String]) }
|
777
|
-
|
777
|
+
attr_reader :names
|
778
778
|
|
779
779
|
sig do
|
780
780
|
params(
|
data/lib/rbi/parser.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require "
|
4
|
+
require "prism"
|
5
5
|
|
6
6
|
module RBI
|
7
7
|
class ParseError < StandardError
|
@@ -93,22 +93,23 @@ module RBI
|
|
93
93
|
|
94
94
|
sig { params(source: String, file: String).returns(Tree) }
|
95
95
|
def parse(source, file:)
|
96
|
-
result =
|
96
|
+
result = Prism.parse(source)
|
97
97
|
unless result.success?
|
98
|
-
|
98
|
+
message = result.errors.map { |e| "#{e.message}." }.join(" ")
|
99
|
+
error = result.errors.first
|
100
|
+
location = Loc.new(file: file, begin_line: error.location.start_line, begin_column: error.location.start_column)
|
101
|
+
raise ParseError.new(message, location)
|
99
102
|
end
|
100
103
|
|
101
104
|
visitor = TreeBuilder.new(source, comments: result.comments, file: file)
|
102
105
|
visitor.visit(result.value)
|
103
106
|
visitor.tree
|
104
|
-
rescue YARP::ParseError => e
|
105
|
-
raise ParseError.new(e.message, Loc.from_yarp(file, e.location))
|
106
107
|
rescue ParseError => e
|
107
108
|
raise e
|
108
109
|
rescue => e
|
109
110
|
last_node = visitor&.last_node
|
110
111
|
last_location = if last_node
|
111
|
-
Loc.
|
112
|
+
Loc.from_prism(file, last_node.location)
|
112
113
|
else
|
113
114
|
Loc.new(file: file)
|
114
115
|
end
|
@@ -118,7 +119,7 @@ module RBI
|
|
118
119
|
raise exception
|
119
120
|
end
|
120
121
|
|
121
|
-
class Visitor <
|
122
|
+
class Visitor < Prism::Visitor
|
122
123
|
extend T::Sig
|
123
124
|
|
124
125
|
sig { params(source: String, file: String).void }
|
@@ -131,19 +132,19 @@ module RBI
|
|
131
132
|
|
132
133
|
private
|
133
134
|
|
134
|
-
sig { params(node:
|
135
|
+
sig { params(node: Prism::Node).returns(Loc) }
|
135
136
|
def node_loc(node)
|
136
|
-
Loc.
|
137
|
+
Loc.from_prism(@file, node.location)
|
137
138
|
end
|
138
139
|
|
139
|
-
sig { params(node: T.nilable(
|
140
|
+
sig { params(node: T.nilable(Prism::Node)).returns(T.nilable(String)) }
|
140
141
|
def node_string(node)
|
141
142
|
return unless node
|
142
143
|
|
143
144
|
node.slice
|
144
145
|
end
|
145
146
|
|
146
|
-
sig { params(node:
|
147
|
+
sig { params(node: Prism::Node).returns(String) }
|
147
148
|
def node_string!(node)
|
148
149
|
T.must(node_string(node))
|
149
150
|
end
|
@@ -155,32 +156,25 @@ module RBI
|
|
155
156
|
sig { returns(Tree) }
|
156
157
|
attr_reader :tree
|
157
158
|
|
158
|
-
sig { returns(T.nilable(
|
159
|
+
sig { returns(T.nilable(Prism::Node)) }
|
159
160
|
attr_reader :last_node
|
160
161
|
|
161
|
-
sig { params(source: String, comments: T::Array[
|
162
|
+
sig { params(source: String, comments: T::Array[Prism::Comment], file: String).void }
|
162
163
|
def initialize(source, comments:, file:)
|
163
164
|
super(source, file: file)
|
164
165
|
|
165
|
-
@comments_by_line = T.let(comments.to_h { |c| [c.location.start_line, c] }, T::Hash[Integer,
|
166
|
+
@comments_by_line = T.let(comments.to_h { |c| [c.location.start_line, c] }, T::Hash[Integer, Prism::Comment])
|
166
167
|
@tree = T.let(Tree.new, Tree)
|
167
168
|
|
168
169
|
@scopes_stack = T.let([@tree], T::Array[Tree])
|
169
|
-
@last_node = T.let(nil, T.nilable(
|
170
|
+
@last_node = T.let(nil, T.nilable(Prism::Node))
|
170
171
|
@last_sigs = T.let([], T::Array[RBI::Sig])
|
171
172
|
@last_sigs_comments = T.let([], T::Array[Comment])
|
172
173
|
end
|
173
174
|
|
174
|
-
sig { override.params(node:
|
175
|
-
def visit(node)
|
176
|
-
return unless node
|
177
|
-
|
178
|
-
@last_node = node
|
179
|
-
super
|
180
|
-
end
|
181
|
-
|
182
|
-
sig { override.params(node: YARP::ClassNode).void }
|
175
|
+
sig { override.params(node: Prism::ClassNode).void }
|
183
176
|
def visit_class_node(node)
|
177
|
+
@last_node = node
|
184
178
|
scope = Class.new(
|
185
179
|
node_string!(node.constant_path),
|
186
180
|
superclass_name: node_string(node.superclass),
|
@@ -193,19 +187,24 @@ module RBI
|
|
193
187
|
visit(node.body)
|
194
188
|
collect_dangling_comments(node)
|
195
189
|
@scopes_stack.pop
|
190
|
+
@last_node = nil
|
196
191
|
end
|
197
192
|
|
198
|
-
sig { override.params(node:
|
193
|
+
sig { override.params(node: Prism::ConstantWriteNode).void }
|
199
194
|
def visit_constant_write_node(node)
|
195
|
+
@last_node = node
|
200
196
|
visit_constant_assign(node)
|
197
|
+
@last_node = nil
|
201
198
|
end
|
202
199
|
|
203
|
-
sig { override.params(node:
|
200
|
+
sig { override.params(node: Prism::ConstantPathWriteNode).void }
|
204
201
|
def visit_constant_path_write_node(node)
|
202
|
+
@last_node = node
|
205
203
|
visit_constant_assign(node)
|
204
|
+
@last_node = nil
|
206
205
|
end
|
207
206
|
|
208
|
-
sig { params(node: T.any(
|
207
|
+
sig { params(node: T.any(Prism::ConstantWriteNode, Prism::ConstantPathWriteNode)).void }
|
209
208
|
def visit_constant_assign(node)
|
210
209
|
struct = parse_struct(node)
|
211
210
|
|
@@ -214,9 +213,9 @@ module RBI
|
|
214
213
|
elsif type_variable_definition?(node.value)
|
215
214
|
TypeMember.new(
|
216
215
|
case node
|
217
|
-
when
|
218
|
-
node.name
|
219
|
-
when
|
216
|
+
when Prism::ConstantWriteNode
|
217
|
+
node.name.to_s
|
218
|
+
when Prism::ConstantPathWriteNode
|
220
219
|
node_string!(node.target)
|
221
220
|
end,
|
222
221
|
node_string!(node.value),
|
@@ -226,9 +225,9 @@ module RBI
|
|
226
225
|
else
|
227
226
|
Const.new(
|
228
227
|
case node
|
229
|
-
when
|
230
|
-
node.name
|
231
|
-
when
|
228
|
+
when Prism::ConstantWriteNode
|
229
|
+
node.name.to_s
|
230
|
+
when Prism::ConstantPathWriteNode
|
232
231
|
node_string!(node.target)
|
233
232
|
end,
|
234
233
|
node_string!(node.value),
|
@@ -238,20 +237,23 @@ module RBI
|
|
238
237
|
end
|
239
238
|
end
|
240
239
|
|
241
|
-
sig { override.params(node:
|
240
|
+
sig { override.params(node: Prism::DefNode).void }
|
242
241
|
def visit_def_node(node)
|
242
|
+
@last_node = node
|
243
243
|
current_scope << Method.new(
|
244
|
-
node.name,
|
244
|
+
node.name.to_s,
|
245
245
|
params: parse_params(node.parameters),
|
246
246
|
sigs: current_sigs,
|
247
247
|
loc: node_loc(node),
|
248
248
|
comments: current_sigs_comments + node_comments(node),
|
249
249
|
is_singleton: !!node.receiver,
|
250
250
|
)
|
251
|
+
@last_node = nil
|
251
252
|
end
|
252
253
|
|
253
|
-
sig { override.params(node:
|
254
|
+
sig { override.params(node: Prism::ModuleNode).void }
|
254
255
|
def visit_module_node(node)
|
256
|
+
@last_node = node
|
255
257
|
scope = Module.new(
|
256
258
|
node_string!(node.constant_path),
|
257
259
|
loc: node_loc(node),
|
@@ -263,19 +265,23 @@ module RBI
|
|
263
265
|
visit(node.body)
|
264
266
|
collect_dangling_comments(node)
|
265
267
|
@scopes_stack.pop
|
268
|
+
@last_node = nil
|
266
269
|
end
|
267
270
|
|
268
|
-
sig { override.params(node:
|
271
|
+
sig { override.params(node: Prism::ProgramNode).void }
|
269
272
|
def visit_program_node(node)
|
273
|
+
@last_node = node
|
270
274
|
super
|
271
275
|
|
272
276
|
collect_orphan_comments
|
273
277
|
separate_header_comments
|
274
278
|
set_root_tree_loc
|
279
|
+
@last_node = nil
|
275
280
|
end
|
276
281
|
|
277
|
-
sig { override.params(node:
|
282
|
+
sig { override.params(node: Prism::SingletonClassNode).void }
|
278
283
|
def visit_singleton_class_node(node)
|
284
|
+
@last_node = node
|
279
285
|
scope = SingletonClass.new(
|
280
286
|
loc: node_loc(node),
|
281
287
|
comments: node_comments(node),
|
@@ -286,11 +292,13 @@ module RBI
|
|
286
292
|
visit(node.body)
|
287
293
|
collect_dangling_comments(node)
|
288
294
|
@scopes_stack.pop
|
295
|
+
@last_node = nil
|
289
296
|
end
|
290
297
|
|
291
|
-
sig { params(node:
|
298
|
+
sig { params(node: Prism::CallNode).void }
|
292
299
|
def visit_call_node(node)
|
293
|
-
|
300
|
+
@last_node = node
|
301
|
+
message = node.name.to_s
|
294
302
|
case message
|
295
303
|
when "abstract!", "sealed!", "interface!"
|
296
304
|
current_scope << Helper.new(
|
@@ -300,7 +308,11 @@ module RBI
|
|
300
308
|
)
|
301
309
|
when "attr_reader"
|
302
310
|
args = node.arguments
|
303
|
-
|
311
|
+
|
312
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
313
|
+
@last_node = nil
|
314
|
+
return
|
315
|
+
end
|
304
316
|
|
305
317
|
current_scope << AttrReader.new(
|
306
318
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg).delete_prefix(":").to_sym }),
|
@@ -310,7 +322,11 @@ module RBI
|
|
310
322
|
)
|
311
323
|
when "attr_writer"
|
312
324
|
args = node.arguments
|
313
|
-
|
325
|
+
|
326
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
327
|
+
@last_node = nil
|
328
|
+
return
|
329
|
+
end
|
314
330
|
|
315
331
|
current_scope << AttrWriter.new(
|
316
332
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg).delete_prefix(":").to_sym }),
|
@@ -320,7 +336,11 @@ module RBI
|
|
320
336
|
)
|
321
337
|
when "attr_accessor"
|
322
338
|
args = node.arguments
|
323
|
-
|
339
|
+
|
340
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
341
|
+
@last_node = nil
|
342
|
+
return
|
343
|
+
end
|
324
344
|
|
325
345
|
current_scope << AttrAccessor.new(
|
326
346
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg).delete_prefix(":").to_sym }),
|
@@ -330,19 +350,31 @@ module RBI
|
|
330
350
|
)
|
331
351
|
when "enums"
|
332
352
|
block = node.block
|
333
|
-
|
353
|
+
|
354
|
+
unless block.is_a?(Prism::BlockNode)
|
355
|
+
@last_node = nil
|
356
|
+
return
|
357
|
+
end
|
334
358
|
|
335
359
|
body = block.body
|
336
|
-
|
360
|
+
|
361
|
+
unless body.is_a?(Prism::StatementsNode)
|
362
|
+
@last_node = nil
|
363
|
+
return
|
364
|
+
end
|
337
365
|
|
338
366
|
current_scope << TEnumBlock.new(
|
339
|
-
body.body.map { |stmt| T.cast(stmt,
|
367
|
+
body.body.map { |stmt| T.cast(stmt, Prism::ConstantWriteNode).name.to_s },
|
340
368
|
loc: node_loc(node),
|
341
369
|
comments: node_comments(node),
|
342
370
|
)
|
343
371
|
when "extend"
|
344
372
|
args = node.arguments
|
345
|
-
|
373
|
+
|
374
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
375
|
+
@last_node = nil
|
376
|
+
return
|
377
|
+
end
|
346
378
|
|
347
379
|
current_scope << Extend.new(
|
348
380
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg) }),
|
@@ -351,7 +383,11 @@ module RBI
|
|
351
383
|
)
|
352
384
|
when "include"
|
353
385
|
args = node.arguments
|
354
|
-
|
386
|
+
|
387
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
388
|
+
@last_node = nil
|
389
|
+
return
|
390
|
+
end
|
355
391
|
|
356
392
|
current_scope << Include.new(
|
357
393
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg) }),
|
@@ -360,7 +396,11 @@ module RBI
|
|
360
396
|
)
|
361
397
|
when "mixes_in_class_methods"
|
362
398
|
args = node.arguments
|
363
|
-
|
399
|
+
|
400
|
+
unless args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
401
|
+
@last_node = nil
|
402
|
+
return
|
403
|
+
end
|
364
404
|
|
365
405
|
current_scope << MixesInClassMethods.new(
|
366
406
|
*T.unsafe(args.arguments.map { |arg| node_string!(arg) }),
|
@@ -369,12 +409,12 @@ module RBI
|
|
369
409
|
)
|
370
410
|
when "private", "protected", "public"
|
371
411
|
args = node.arguments
|
372
|
-
if args.is_a?(
|
412
|
+
if args.is_a?(Prism::ArgumentsNode) && args.arguments.any?
|
373
413
|
visit(node.arguments)
|
374
414
|
last_node = @scopes_stack.last&.nodes&.last
|
375
415
|
case last_node
|
376
416
|
when Method, Attr
|
377
|
-
last_node.visibility = parse_visibility(node.name, node)
|
417
|
+
last_node.visibility = parse_visibility(node.name.to_s, node)
|
378
418
|
else
|
379
419
|
raise ParseError.new(
|
380
420
|
"Unexpected token `#{node.message}` before `#{last_node&.string&.strip}`",
|
@@ -382,16 +422,24 @@ module RBI
|
|
382
422
|
)
|
383
423
|
end
|
384
424
|
else
|
385
|
-
current_scope << parse_visibility(node.name, node)
|
425
|
+
current_scope << parse_visibility(node.name.to_s, node)
|
386
426
|
end
|
387
427
|
when "prop", "const"
|
388
428
|
parse_tstruct_field(node)
|
389
429
|
when "requires_ancestor"
|
390
430
|
block = node.block
|
391
|
-
|
431
|
+
|
432
|
+
unless block.is_a?(Prism::BlockNode)
|
433
|
+
@last_node = nil
|
434
|
+
return
|
435
|
+
end
|
392
436
|
|
393
437
|
body = block.body
|
394
|
-
|
438
|
+
|
439
|
+
unless body.is_a?(Prism::StatementsNode)
|
440
|
+
@last_node = nil
|
441
|
+
return
|
442
|
+
end
|
395
443
|
|
396
444
|
current_scope << RequiresAncestor.new(
|
397
445
|
node_string!(body),
|
@@ -408,12 +456,14 @@ module RBI
|
|
408
456
|
comments: node_comments(node),
|
409
457
|
)
|
410
458
|
end
|
459
|
+
|
460
|
+
@last_node = nil
|
411
461
|
end
|
412
462
|
|
413
463
|
private
|
414
464
|
|
415
465
|
# Collect all the remaining comments within a node
|
416
|
-
sig { params(node:
|
466
|
+
sig { params(node: Prism::Node).void }
|
417
467
|
def collect_dangling_comments(node)
|
418
468
|
first_line = node.location.start_line
|
419
469
|
last_line = node.location.end_line
|
@@ -446,7 +496,7 @@ module RBI
|
|
446
496
|
|
447
497
|
# Preserve blank lines in comments
|
448
498
|
if last_line && line > last_line + 1
|
449
|
-
recv << BlankLine.new(loc: Loc.
|
499
|
+
recv << BlankLine.new(loc: Loc.from_prism(@file, comment.location))
|
450
500
|
end
|
451
501
|
|
452
502
|
recv << parse_comment(comment)
|
@@ -473,7 +523,7 @@ module RBI
|
|
473
523
|
comments
|
474
524
|
end
|
475
525
|
|
476
|
-
sig { params(node:
|
526
|
+
sig { params(node: Prism::Node).returns(T::Array[Comment]) }
|
477
527
|
def node_comments(node)
|
478
528
|
comments = []
|
479
529
|
|
@@ -491,21 +541,21 @@ module RBI
|
|
491
541
|
comments
|
492
542
|
end
|
493
543
|
|
494
|
-
sig { params(node:
|
544
|
+
sig { params(node: Prism::Comment).returns(Comment) }
|
495
545
|
def parse_comment(node)
|
496
|
-
Comment.new(node.location.slice.gsub(/^# ?/, "").rstrip, loc: Loc.
|
546
|
+
Comment.new(node.location.slice.gsub(/^# ?/, "").rstrip, loc: Loc.from_prism(@file, node.location))
|
497
547
|
end
|
498
548
|
|
499
|
-
sig { params(node: T.nilable(
|
549
|
+
sig { params(node: T.nilable(Prism::Node)).returns(T::Array[Arg]) }
|
500
550
|
def parse_send_args(node)
|
501
551
|
args = T.let([], T::Array[Arg])
|
502
|
-
return args unless node.is_a?(
|
552
|
+
return args unless node.is_a?(Prism::ArgumentsNode)
|
503
553
|
|
504
554
|
node.arguments.each do |arg|
|
505
555
|
case arg
|
506
|
-
when
|
556
|
+
when Prism::KeywordHashNode
|
507
557
|
arg.elements.each do |assoc|
|
508
|
-
next unless assoc.is_a?(
|
558
|
+
next unless assoc.is_a?(Prism::AssocNode)
|
509
559
|
|
510
560
|
args << KwArg.new(
|
511
561
|
node_string!(assoc.key).delete_suffix(":"),
|
@@ -520,13 +570,13 @@ module RBI
|
|
520
570
|
args
|
521
571
|
end
|
522
572
|
|
523
|
-
sig { params(node: T.nilable(
|
573
|
+
sig { params(node: T.nilable(Prism::Node)).returns(T::Array[Param]) }
|
524
574
|
def parse_params(node)
|
525
575
|
params = []
|
526
|
-
return params unless node.is_a?(
|
576
|
+
return params unless node.is_a?(Prism::ParametersNode)
|
527
577
|
|
528
578
|
node.requireds.each do |param|
|
529
|
-
next unless param.is_a?(
|
579
|
+
next unless param.is_a?(Prism::RequiredParameterNode)
|
530
580
|
|
531
581
|
params << ReqParam.new(
|
532
582
|
param.name.to_s,
|
@@ -536,7 +586,7 @@ module RBI
|
|
536
586
|
end
|
537
587
|
|
538
588
|
node.optionals.each do |param|
|
539
|
-
next unless param.is_a?(
|
589
|
+
next unless param.is_a?(Prism::OptionalParameterNode)
|
540
590
|
|
541
591
|
params << OptParam.new(
|
542
592
|
param.name.to_s,
|
@@ -547,28 +597,28 @@ module RBI
|
|
547
597
|
end
|
548
598
|
|
549
599
|
rest = node.rest
|
550
|
-
if rest.is_a?(
|
600
|
+
if rest.is_a?(Prism::RestParameterNode)
|
551
601
|
params << RestParam.new(
|
552
|
-
rest.name || "*args",
|
602
|
+
rest.name&.to_s || "*args",
|
553
603
|
loc: node_loc(rest),
|
554
604
|
comments: node_comments(rest),
|
555
605
|
)
|
556
606
|
end
|
557
607
|
|
558
608
|
node.keywords.each do |param|
|
559
|
-
next unless param.is_a?(
|
609
|
+
next unless param.is_a?(Prism::KeywordParameterNode)
|
560
610
|
|
561
611
|
value = param.value
|
562
612
|
params << if value
|
563
613
|
KwOptParam.new(
|
564
|
-
param.name.delete_suffix(":"),
|
614
|
+
param.name.to_s.delete_suffix(":"),
|
565
615
|
node_string!(value),
|
566
616
|
loc: node_loc(param),
|
567
617
|
comments: node_comments(param),
|
568
618
|
)
|
569
619
|
else
|
570
620
|
KwParam.new(
|
571
|
-
param.name.delete_suffix(":"),
|
621
|
+
param.name.to_s.delete_suffix(":"),
|
572
622
|
loc: node_loc(param),
|
573
623
|
comments: node_comments(param),
|
574
624
|
)
|
@@ -576,18 +626,18 @@ module RBI
|
|
576
626
|
end
|
577
627
|
|
578
628
|
rest_kw = node.keyword_rest
|
579
|
-
if rest_kw.is_a?(
|
629
|
+
if rest_kw.is_a?(Prism::KeywordRestParameterNode)
|
580
630
|
params << KwRestParam.new(
|
581
|
-
rest_kw.name || "**kwargs",
|
631
|
+
rest_kw.name&.to_s || "**kwargs",
|
582
632
|
loc: node_loc(rest_kw),
|
583
633
|
comments: node_comments(rest_kw),
|
584
634
|
)
|
585
635
|
end
|
586
636
|
|
587
637
|
block = node.block
|
588
|
-
if block.is_a?(
|
638
|
+
if block.is_a?(Prism::BlockParameterNode)
|
589
639
|
params << BlockParam.new(
|
590
|
-
block.name || "&block",
|
640
|
+
block.name&.to_s || "&block",
|
591
641
|
loc: node_loc(block),
|
592
642
|
comments: node_comments(block),
|
593
643
|
)
|
@@ -596,7 +646,7 @@ module RBI
|
|
596
646
|
params
|
597
647
|
end
|
598
648
|
|
599
|
-
sig { params(node:
|
649
|
+
sig { params(node: Prism::CallNode).returns(Sig) }
|
600
650
|
def parse_sig(node)
|
601
651
|
@last_sigs_comments = node_comments(node)
|
602
652
|
|
@@ -606,10 +656,10 @@ module RBI
|
|
606
656
|
builder.current
|
607
657
|
end
|
608
658
|
|
609
|
-
sig { params(node: T.any(
|
659
|
+
sig { params(node: T.any(Prism::ConstantWriteNode, Prism::ConstantPathWriteNode)).returns(T.nilable(Struct)) }
|
610
660
|
def parse_struct(node)
|
611
661
|
send = node.value
|
612
|
-
return unless send.is_a?(
|
662
|
+
return unless send.is_a?(Prism::CallNode)
|
613
663
|
return unless send.message == "new"
|
614
664
|
|
615
665
|
recv = send.receiver
|
@@ -620,14 +670,14 @@ module RBI
|
|
620
670
|
keyword_init = T.let(false, T::Boolean)
|
621
671
|
|
622
672
|
args = send.arguments
|
623
|
-
if args.is_a?(
|
673
|
+
if args.is_a?(Prism::ArgumentsNode)
|
624
674
|
args.arguments.each do |arg|
|
625
675
|
case arg
|
626
|
-
when
|
676
|
+
when Prism::SymbolNode
|
627
677
|
members << arg.value
|
628
|
-
when
|
678
|
+
when Prism::KeywordHashNode
|
629
679
|
arg.elements.each do |assoc|
|
630
|
-
next unless assoc.is_a?(
|
680
|
+
next unless assoc.is_a?(Prism::AssocNode)
|
631
681
|
|
632
682
|
key = node_string!(assoc.key)
|
633
683
|
val = node_string(assoc.value)
|
@@ -641,9 +691,9 @@ module RBI
|
|
641
691
|
end
|
642
692
|
|
643
693
|
name = case node
|
644
|
-
when
|
645
|
-
node.name
|
646
|
-
when
|
694
|
+
when Prism::ConstantWriteNode
|
695
|
+
node.name.to_s
|
696
|
+
when Prism::ConstantPathWriteNode
|
647
697
|
node_string!(node.target)
|
648
698
|
end
|
649
699
|
|
@@ -656,10 +706,10 @@ module RBI
|
|
656
706
|
struct
|
657
707
|
end
|
658
708
|
|
659
|
-
sig { params(send:
|
709
|
+
sig { params(send: Prism::CallNode).void }
|
660
710
|
def parse_tstruct_field(send)
|
661
711
|
args = send.arguments
|
662
|
-
return unless args.is_a?(
|
712
|
+
return unless args.is_a?(Prism::ArgumentsNode)
|
663
713
|
|
664
714
|
name_arg, type_arg, *rest = args.arguments
|
665
715
|
return unless name_arg
|
@@ -672,10 +722,10 @@ module RBI
|
|
672
722
|
default_value = T.let(nil, T.nilable(String))
|
673
723
|
|
674
724
|
rest&.each do |arg|
|
675
|
-
next unless arg.is_a?(
|
725
|
+
next unless arg.is_a?(Prism::KeywordHashNode)
|
676
726
|
|
677
727
|
arg.elements.each do |assoc|
|
678
|
-
next unless assoc.is_a?(
|
728
|
+
next unless assoc.is_a?(Prism::AssocNode)
|
679
729
|
|
680
730
|
if node_string(assoc.key) == "default:"
|
681
731
|
default_value = node_string(assoc.value)
|
@@ -693,7 +743,7 @@ module RBI
|
|
693
743
|
end
|
694
744
|
end
|
695
745
|
|
696
|
-
sig { params(name: String, node:
|
746
|
+
sig { params(name: String, node: Prism::Node).returns(Visibility) }
|
697
747
|
def parse_visibility(name, node)
|
698
748
|
case name
|
699
749
|
when "public"
|
@@ -731,9 +781,9 @@ module RBI
|
|
731
781
|
)
|
732
782
|
end
|
733
783
|
|
734
|
-
sig { params(node: T.nilable(
|
784
|
+
sig { params(node: T.nilable(Prism::Node)).returns(T::Boolean) }
|
735
785
|
def type_variable_definition?(node)
|
736
|
-
return false unless node.is_a?(
|
786
|
+
return false unless node.is_a?(Prism::CallNode)
|
737
787
|
return false unless node.block
|
738
788
|
|
739
789
|
node.message == "type_member" || node.message == "type_template"
|
@@ -744,7 +794,7 @@ module RBI
|
|
744
794
|
extend T::Sig
|
745
795
|
|
746
796
|
sig { returns(Sig) }
|
747
|
-
|
797
|
+
attr_reader :current
|
748
798
|
|
749
799
|
sig { params(content: String, file: String).void }
|
750
800
|
def initialize(content, file:)
|
@@ -753,12 +803,12 @@ module RBI
|
|
753
803
|
@current = T.let(Sig.new, Sig)
|
754
804
|
end
|
755
805
|
|
756
|
-
sig { override.params(node:
|
806
|
+
sig { override.params(node: Prism::CallNode).void }
|
757
807
|
def visit_call_node(node)
|
758
808
|
case node.message
|
759
809
|
when "sig"
|
760
810
|
args = node.arguments
|
761
|
-
if args.is_a?(
|
811
|
+
if args.is_a?(Prism::ArgumentsNode)
|
762
812
|
args.arguments.each do |arg|
|
763
813
|
@current.is_final = node_string(arg) == ":final"
|
764
814
|
end
|
@@ -767,7 +817,7 @@ module RBI
|
|
767
817
|
@current.is_abstract = true
|
768
818
|
when "checked"
|
769
819
|
args = node.arguments
|
770
|
-
if args.is_a?(
|
820
|
+
if args.is_a?(Prism::ArgumentsNode)
|
771
821
|
arg = node_string(args.arguments.first)
|
772
822
|
@current.checked = arg&.delete_prefix(":")&.to_sym
|
773
823
|
end
|
@@ -779,13 +829,13 @@ module RBI
|
|
779
829
|
visit(node.arguments)
|
780
830
|
when "returns"
|
781
831
|
args = node.arguments
|
782
|
-
if args.is_a?(
|
832
|
+
if args.is_a?(Prism::ArgumentsNode)
|
783
833
|
first = args.arguments.first
|
784
834
|
@current.return_type = node_string!(first) if first
|
785
835
|
end
|
786
836
|
when "type_parameters"
|
787
837
|
args = node.arguments
|
788
|
-
if args.is_a?(
|
838
|
+
if args.is_a?(Prism::ArgumentsNode)
|
789
839
|
args.arguments.each do |arg|
|
790
840
|
@current.type_params << node_string!(arg).delete_prefix(":")
|
791
841
|
end
|
@@ -798,7 +848,7 @@ module RBI
|
|
798
848
|
visit(node.block)
|
799
849
|
end
|
800
850
|
|
801
|
-
sig { override.params(node:
|
851
|
+
sig { override.params(node: Prism::AssocNode).void }
|
802
852
|
def visit_assoc_node(node)
|
803
853
|
@current.params << SigParam.new(
|
804
854
|
node_string!(node.key).delete_suffix(":"),
|
data/lib/rbi/version.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexandre Terrasa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: prism
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.15.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.15.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: sorbet-runtime
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.5.9204
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.5.9204
|
41
41
|
description:
|
42
42
|
email:
|
43
43
|
- ruby@shopify.com
|
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
86
|
- !ruby/object:Gem::Version
|
87
87
|
version: '0'
|
88
88
|
requirements: []
|
89
|
-
rubygems_version: 3.4.
|
89
|
+
rubygems_version: 3.4.21
|
90
90
|
signing_key:
|
91
91
|
specification_version: 4
|
92
92
|
summary: RBI generation framework
|