rbs-inline 0.5.0 → 0.7.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/lib/rbs/inline/ast/annotations.rb +6 -0
- data/lib/rbs/inline/ast/declarations.rb +253 -1
- data/lib/rbs/inline/ast/members.rb +1 -6
- data/lib/rbs/inline/parser.rb +31 -2
- data/lib/rbs/inline/version.rb +1 -1
- data/lib/rbs/inline/writer.rb +205 -4
- data/rbs_collection.lock.yaml +2 -2
- data/sig/generated/rbs/inline/ast/annotations.rbs +2 -0
- data/sig/generated/rbs/inline/ast/declarations.rbs +110 -1
- data/sig/generated/rbs/inline/writer.rbs +8 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae1ebe5ac15f3f5c12c3b162fbcdc754de5544867fbc2d455af7a2028bfc12c7
|
4
|
+
data.tar.gz: aecd4c155a61ff168e9dea24d22cd9772566b26d973ffe9857e85f369e716a32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffb76bf31d5c65a4e50edc61bd5538214d15fca1c4bcf0be83a86c32fbb22f27f5947279bec2919aee94928c236605f3998395a9c4b8f2329f0fe933bdff4e87
|
7
|
+
data.tar.gz: 7dd187fd1519420e823133a84abb6fc858ac6e8024b899b96a0e6cd6c581b42c332e161e9af67067224d9b95d939e32900eeeb5e61b3c5d405b94433e0c19d17
|
@@ -404,6 +404,12 @@ module RBS
|
|
404
404
|
token[1]
|
405
405
|
end
|
406
406
|
end
|
407
|
+
|
408
|
+
def annotations #: Array[RBS::AST::Annotation]
|
409
|
+
contents.map do |content|
|
410
|
+
RBS::AST::Annotation.new(string: content[3..-2] || raise, location: nil)
|
411
|
+
end
|
412
|
+
end
|
407
413
|
end
|
408
414
|
|
409
415
|
# `# @rbs skip`
|
@@ -13,10 +13,22 @@ module RBS
|
|
13
13
|
TypeName(node.full_name)
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
# @rbs (Prism::Node) -> Prism::Node?
|
18
|
+
def value_node(node)
|
19
|
+
case node
|
20
|
+
when Prism::ConstantWriteNode
|
21
|
+
value_node(node.value)
|
22
|
+
when Prism::LocalVariableWriteNode
|
23
|
+
value_node(node.value)
|
24
|
+
else
|
25
|
+
node
|
26
|
+
end
|
27
|
+
end
|
16
28
|
end
|
17
29
|
|
18
30
|
# @rbs!
|
19
|
-
# type t = ClassDecl | ModuleDecl | ConstantDecl | SingletonClassDecl | BlockDecl
|
31
|
+
# type t = ClassDecl | ModuleDecl | ConstantDecl | SingletonClassDecl | BlockDecl | DataAssignDecl | StructAssignDecl
|
20
32
|
#
|
21
33
|
# interface _WithComments
|
22
34
|
# def comments: () -> AnnotationParser::ParsingResult?
|
@@ -229,6 +241,21 @@ module RBS
|
|
229
241
|
end
|
230
242
|
|
231
243
|
class SingletonClassDecl < ModuleOrClass #[Prism::SingletonClassNode]
|
244
|
+
# @rbs (AST::Members::RubyDef) -> (:private | nil)
|
245
|
+
def visibility(def_member)
|
246
|
+
current_visibility = nil
|
247
|
+
members.each do |member|
|
248
|
+
case member
|
249
|
+
when AST::Members::RubyPublic
|
250
|
+
current_visibility = nil
|
251
|
+
when AST::Members::RubyPrivate
|
252
|
+
current_visibility = :private
|
253
|
+
end
|
254
|
+
|
255
|
+
break if member == def_member
|
256
|
+
end
|
257
|
+
current_visibility
|
258
|
+
end
|
232
259
|
end
|
233
260
|
|
234
261
|
class BlockDecl < Base
|
@@ -266,6 +293,231 @@ module RBS
|
|
266
293
|
end
|
267
294
|
end
|
268
295
|
end
|
296
|
+
|
297
|
+
# @rbs module-self _WithTypeDecls
|
298
|
+
module DataStructUtil
|
299
|
+
# @rbs!
|
300
|
+
# interface _WithTypeDecls
|
301
|
+
# def type_decls: () -> Hash[Integer, Annotations::TypeAssertion]
|
302
|
+
#
|
303
|
+
# def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
304
|
+
#
|
305
|
+
# def comments: %a{pure} () -> AnnotationParser::ParsingResult?
|
306
|
+
# end
|
307
|
+
|
308
|
+
# @rbs %a{pure}
|
309
|
+
# @rbs () { ([Symbol, Annotations::TypeAssertion?]) -> void } -> void
|
310
|
+
# | () -> Enumerator[[Symbol, Annotations::TypeAssertion?], void]
|
311
|
+
def each_attribute(&block)
|
312
|
+
if block
|
313
|
+
each_attribute_argument do |arg|
|
314
|
+
if arg.is_a?(Prism::SymbolNode)
|
315
|
+
if name = arg.value
|
316
|
+
type = type_decls.fetch(arg.location.start_line, nil)
|
317
|
+
yield [name.to_sym, type]
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
else
|
322
|
+
enum_for :each_attribute
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def class_annotations #: Array[RBS::AST::Annotation]
|
327
|
+
annotations = [] #: Array[RBS::AST::Annotation]
|
328
|
+
|
329
|
+
comments&.each_annotation do |annotation|
|
330
|
+
if annotation.is_a?(Annotations::RBSAnnotation)
|
331
|
+
annotations.concat annotation.annotations
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
annotations
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
class DataAssignDecl < Base
|
340
|
+
extend ConstantUtil
|
341
|
+
|
342
|
+
include DataStructUtil
|
343
|
+
|
344
|
+
attr_reader :node #: Prism::ConstantWriteNode
|
345
|
+
|
346
|
+
attr_reader :comments #: AnnotationParser::ParsingResult?
|
347
|
+
|
348
|
+
attr_reader :type_decls #: Hash[Integer, Annotations::TypeAssertion]
|
349
|
+
|
350
|
+
attr_reader :data_define_node #: Prism::CallNode
|
351
|
+
|
352
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
353
|
+
def initialize(node, data_define_node, comments, type_decls)
|
354
|
+
@node = node
|
355
|
+
@comments = comments
|
356
|
+
@type_decls = type_decls
|
357
|
+
@data_define_node = data_define_node
|
358
|
+
end
|
359
|
+
|
360
|
+
def start_line #: Integer
|
361
|
+
node.location.start_line
|
362
|
+
end
|
363
|
+
|
364
|
+
# @rbs %a{pure}
|
365
|
+
# @rbs () -> TypeName?
|
366
|
+
def constant_name
|
367
|
+
TypeName.new(name: node.name, namespace: Namespace.empty)
|
368
|
+
end
|
369
|
+
|
370
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
371
|
+
def self.data_define?(node)
|
372
|
+
value = value_node(node)
|
373
|
+
|
374
|
+
if value.is_a?(Prism::CallNode)
|
375
|
+
if value.receiver.is_a?(Prism::ConstantReadNode)
|
376
|
+
if value.receiver.full_name.delete_prefix("::") == "Data"
|
377
|
+
if value.name == :define
|
378
|
+
return value
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
386
|
+
def each_attribute_argument(&block)
|
387
|
+
if args = data_define_node.arguments
|
388
|
+
args.arguments.each(&block)
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
class StructAssignDecl < Base
|
394
|
+
extend ConstantUtil
|
395
|
+
|
396
|
+
include DataStructUtil
|
397
|
+
|
398
|
+
attr_reader :node #: Prism::ConstantWriteNode
|
399
|
+
|
400
|
+
attr_reader :comments #: AnnotationParser::ParsingResult?
|
401
|
+
|
402
|
+
attr_reader :type_decls #: Hash[Integer, Annotations::TypeAssertion]
|
403
|
+
|
404
|
+
attr_reader :struct_new_node #: Prism::CallNode
|
405
|
+
|
406
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
407
|
+
def initialize(node, struct_new_node, comments, type_decls)
|
408
|
+
@node = node
|
409
|
+
@comments = comments
|
410
|
+
@type_decls = type_decls
|
411
|
+
@struct_new_node = struct_new_node
|
412
|
+
end
|
413
|
+
|
414
|
+
def start_line #: Integer
|
415
|
+
node.location.start_line
|
416
|
+
end
|
417
|
+
|
418
|
+
# @rbs %a{pure}
|
419
|
+
# @rbs () -> TypeName?
|
420
|
+
def constant_name
|
421
|
+
TypeName.new(name: node.name, namespace: Namespace.empty)
|
422
|
+
end
|
423
|
+
|
424
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
425
|
+
def each_attribute_argument(&block)
|
426
|
+
if args = struct_new_node.arguments
|
427
|
+
args.arguments.each do |arg|
|
428
|
+
next if arg.is_a?(Prism::KeywordHashNode)
|
429
|
+
next if arg.is_a?(Prism::StringNode)
|
430
|
+
|
431
|
+
yield arg
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
437
|
+
def self.struct_new?(node)
|
438
|
+
value = value_node(node)
|
439
|
+
|
440
|
+
if value.is_a?(Prism::CallNode)
|
441
|
+
if value.receiver.is_a?(Prism::ConstantReadNode)
|
442
|
+
if value.receiver.full_name.delete_prefix("::") == "Struct"
|
443
|
+
if value.name == :new
|
444
|
+
return value
|
445
|
+
end
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
# @rbs %a{pure}
|
452
|
+
def keyword_init? #: bool
|
453
|
+
if args = struct_new_node.arguments
|
454
|
+
args.arguments.each do |arg|
|
455
|
+
if arg.is_a?(Prism::KeywordHashNode)
|
456
|
+
arg.elements.each do |assoc|
|
457
|
+
if assoc.is_a?(Prism::AssocNode)
|
458
|
+
if (key = assoc.key).is_a?(Prism::SymbolNode)
|
459
|
+
if key.value == "keyword_init"
|
460
|
+
value = assoc.value
|
461
|
+
if value.is_a?(Prism::FalseNode)
|
462
|
+
return false
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
true
|
473
|
+
end
|
474
|
+
|
475
|
+
# @rbs %a{pure}
|
476
|
+
def positional_init? #: bool
|
477
|
+
if args = struct_new_node.arguments
|
478
|
+
args.arguments.each do |arg|
|
479
|
+
if arg.is_a?(Prism::KeywordHashNode)
|
480
|
+
arg.elements.each do |assoc|
|
481
|
+
if assoc.is_a?(Prism::AssocNode)
|
482
|
+
if (key = assoc.key).is_a?(Prism::SymbolNode)
|
483
|
+
if key.value == "keyword_init"
|
484
|
+
value = assoc.value
|
485
|
+
if value.is_a?(Prism::TrueNode)
|
486
|
+
return false
|
487
|
+
end
|
488
|
+
end
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
true
|
497
|
+
end
|
498
|
+
|
499
|
+
# Returns `true` is annotation is given to make all attributes *readonly*
|
500
|
+
#
|
501
|
+
# Add `# @rbs %a{rbs-inline:readonly-attributes=true}` to the class to make all attributes `attr_reader`, instead of `attr_accessor`.
|
502
|
+
#
|
503
|
+
# @rbs %a{pure}
|
504
|
+
def readonly_attributes? #: bool
|
505
|
+
class_annotations.any? do |annotation|
|
506
|
+
annotation.string == "rbs-inline:readonly-attributes=true"
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
# Returns `true` if annotation is given to make all `.new` arguments required
|
511
|
+
#
|
512
|
+
# Add `# @rbs %a{rbs-inline:new-args=required}` to the class to make all of the parameters required.
|
513
|
+
#
|
514
|
+
# @rbs %a{pure}
|
515
|
+
def required_new_args? #: bool
|
516
|
+
class_annotations.any? do |annotation|
|
517
|
+
annotation.string == "rbs-inline:new-args=required"
|
518
|
+
end
|
519
|
+
end
|
520
|
+
end
|
269
521
|
end
|
270
522
|
end
|
271
523
|
end
|
@@ -277,12 +277,7 @@ module RBS
|
|
277
277
|
if comments
|
278
278
|
comments.each_annotation.flat_map do |annotation|
|
279
279
|
if annotation.is_a?(AST::Annotations::RBSAnnotation)
|
280
|
-
annotation.
|
281
|
-
RBS::AST::Annotation.new(
|
282
|
-
string: string[3...-1] || "",
|
283
|
-
location: nil
|
284
|
-
)
|
285
|
-
end
|
280
|
+
annotation.annotations
|
286
281
|
else
|
287
282
|
[]
|
288
283
|
end
|
data/lib/rbs/inline/parser.rb
CHANGED
@@ -417,9 +417,38 @@ module RBS
|
|
417
417
|
return if ignored_node?(node)
|
418
418
|
|
419
419
|
comment = comments.delete(node.location.start_line - 1)
|
420
|
-
assertion = assertion_annotation(node)
|
421
420
|
|
422
|
-
|
421
|
+
case
|
422
|
+
when data_node = AST::Declarations::DataAssignDecl.data_define?(node)
|
423
|
+
type_decls = {} #: Hash[Integer, AST::Annotations::TypeAssertion]
|
424
|
+
|
425
|
+
inner_annotations(node.location.start_line, node.location.end_line).flat_map do |comment|
|
426
|
+
comment.each_annotation do |annotation|
|
427
|
+
if annotation.is_a?(AST::Annotations::TypeAssertion)
|
428
|
+
start_line = annotation.source.comments[0].location.start_line
|
429
|
+
type_decls[start_line] = annotation
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
decl = AST::Declarations::DataAssignDecl.new(node, data_node, comment, type_decls)
|
435
|
+
when struct_node = AST::Declarations::StructAssignDecl.struct_new?(node)
|
436
|
+
type_decls = {} #: Hash[Integer, AST::Annotations::TypeAssertion]
|
437
|
+
|
438
|
+
inner_annotations(node.location.start_line, node.location.end_line).flat_map do |comment|
|
439
|
+
comment.each_annotation do |annotation|
|
440
|
+
if annotation.is_a?(AST::Annotations::TypeAssertion)
|
441
|
+
start_line = annotation.source.comments[0].location.start_line
|
442
|
+
type_decls[start_line] = annotation
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
decl = AST::Declarations::StructAssignDecl.new(node, struct_node, comment, type_decls)
|
448
|
+
else
|
449
|
+
assertion = assertion_annotation(node)
|
450
|
+
decl = AST::Declarations::ConstantDecl.new(node, comment, assertion)
|
451
|
+
end
|
423
452
|
|
424
453
|
if current = current_class_module_decl
|
425
454
|
current.members << decl
|
data/lib/rbs/inline/version.rb
CHANGED
data/lib/rbs/inline/writer.rb
CHANGED
@@ -77,6 +77,10 @@ module RBS
|
|
77
77
|
translate_module_decl(decl, rbs)
|
78
78
|
when AST::Declarations::ConstantDecl
|
79
79
|
translate_constant_decl(decl, rbs)
|
80
|
+
when AST::Declarations::DataAssignDecl
|
81
|
+
translate_data_assign_decl(decl, rbs)
|
82
|
+
when AST::Declarations::StructAssignDecl
|
83
|
+
translate_struct_assign_decl(decl, rbs)
|
80
84
|
when AST::Declarations::BlockDecl
|
81
85
|
if decl.module_class_annotation
|
82
86
|
case decl.module_class_annotation
|
@@ -131,7 +135,7 @@ module RBS
|
|
131
135
|
else
|
132
136
|
translate_members(member.members, decl, rbs)
|
133
137
|
end
|
134
|
-
when AST::Declarations::ClassDecl, AST::Declarations::ModuleDecl, AST::Declarations::ConstantDecl
|
138
|
+
when AST::Declarations::ClassDecl, AST::Declarations::ModuleDecl, AST::Declarations::ConstantDecl, AST::Declarations::DataAssignDecl, AST::Declarations::StructAssignDecl
|
135
139
|
translate_decl(member, rbs)
|
136
140
|
end
|
137
141
|
end
|
@@ -182,6 +186,202 @@ module RBS
|
|
182
186
|
)
|
183
187
|
end
|
184
188
|
|
189
|
+
# @rbs decl: AST::Declarations::DataAssignDecl
|
190
|
+
# @rbs rbs: _Content
|
191
|
+
def translate_data_assign_decl(decl, rbs) #: void
|
192
|
+
return unless decl.constant_name
|
193
|
+
|
194
|
+
if decl.comments
|
195
|
+
comment = RBS::AST::Comment.new(string: decl.comments.content(trim: true), location: nil)
|
196
|
+
end
|
197
|
+
|
198
|
+
attributes = decl.each_attribute.map do |name, type|
|
199
|
+
RBS::AST::Members::AttrReader.new(
|
200
|
+
name: name,
|
201
|
+
type: type&.type || Types::Bases::Any.new(location: nil),
|
202
|
+
ivar_name: false,
|
203
|
+
comment: nil,
|
204
|
+
kind: :instance,
|
205
|
+
annotations: [],
|
206
|
+
visibility: nil,
|
207
|
+
location: nil
|
208
|
+
)
|
209
|
+
end
|
210
|
+
|
211
|
+
new = RBS::AST::Members::MethodDefinition.new(
|
212
|
+
name: :new,
|
213
|
+
kind: :singleton,
|
214
|
+
overloads: [
|
215
|
+
RBS::AST::Members::MethodDefinition::Overload.new(
|
216
|
+
method_type: RBS::MethodType.new(
|
217
|
+
type_params: [],
|
218
|
+
type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
|
219
|
+
required_positionals: decl.each_attribute.map do |name, attr|
|
220
|
+
RBS::Types::Function::Param.new(
|
221
|
+
type: attr&.type || Types::Bases::Any.new(location: nil),
|
222
|
+
name: name,
|
223
|
+
location: nil
|
224
|
+
)
|
225
|
+
end
|
226
|
+
),
|
227
|
+
block: nil,
|
228
|
+
location: nil
|
229
|
+
),
|
230
|
+
annotations: []
|
231
|
+
),
|
232
|
+
RBS::AST::Members::MethodDefinition::Overload.new(
|
233
|
+
method_type: RBS::MethodType.new(
|
234
|
+
type_params: [],
|
235
|
+
type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
|
236
|
+
required_keywords: decl.each_attribute.map do |name, attr|
|
237
|
+
[
|
238
|
+
name,
|
239
|
+
RBS::Types::Function::Param.new(
|
240
|
+
type: attr&.type || Types::Bases::Any.new(location: nil),
|
241
|
+
name: nil,
|
242
|
+
location: nil
|
243
|
+
)
|
244
|
+
]
|
245
|
+
end.to_h
|
246
|
+
),
|
247
|
+
block: nil,
|
248
|
+
location: nil
|
249
|
+
),
|
250
|
+
annotations: []
|
251
|
+
)
|
252
|
+
],
|
253
|
+
annotations: [],
|
254
|
+
location: nil,
|
255
|
+
comment: nil,
|
256
|
+
overloading: false,
|
257
|
+
visibility: nil
|
258
|
+
)
|
259
|
+
|
260
|
+
rbs << RBS::AST::Declarations::Class.new(
|
261
|
+
name: decl.constant_name,
|
262
|
+
type_params: [],
|
263
|
+
members: [*attributes, new],
|
264
|
+
super_class: RBS::AST::Declarations::Class::Super.new(
|
265
|
+
name: RBS::TypeName.new(name: :Data, namespace: RBS::Namespace.empty),
|
266
|
+
args: [],
|
267
|
+
location: nil
|
268
|
+
),
|
269
|
+
annotations: decl.class_annotations,
|
270
|
+
location: nil,
|
271
|
+
comment: comment
|
272
|
+
)
|
273
|
+
end
|
274
|
+
|
275
|
+
# @rbs decl: AST::Declarations::StructAssignDecl
|
276
|
+
# @rbs rbs: _Content
|
277
|
+
def translate_struct_assign_decl(decl, rbs) #: void
|
278
|
+
return unless decl.constant_name
|
279
|
+
|
280
|
+
if decl.comments
|
281
|
+
comment = RBS::AST::Comment.new(string: decl.comments.content(trim: true), location: nil)
|
282
|
+
end
|
283
|
+
|
284
|
+
attributes = decl.each_attribute.map do |name, type|
|
285
|
+
if decl.readonly_attributes?
|
286
|
+
RBS::AST::Members::AttrReader.new(
|
287
|
+
name: name,
|
288
|
+
type: type&.type || Types::Bases::Any.new(location: nil),
|
289
|
+
ivar_name: false,
|
290
|
+
comment: nil,
|
291
|
+
kind: :instance,
|
292
|
+
annotations: [],
|
293
|
+
visibility: nil,
|
294
|
+
location: nil
|
295
|
+
)
|
296
|
+
else
|
297
|
+
RBS::AST::Members::AttrAccessor.new(
|
298
|
+
name: name,
|
299
|
+
type: type&.type || Types::Bases::Any.new(location: nil),
|
300
|
+
ivar_name: false,
|
301
|
+
comment: nil,
|
302
|
+
kind: :instance,
|
303
|
+
annotations: [],
|
304
|
+
visibility: nil,
|
305
|
+
location: nil
|
306
|
+
)
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
new = RBS::AST::Members::MethodDefinition.new(
|
311
|
+
name: :new,
|
312
|
+
kind: :singleton,
|
313
|
+
overloads: [],
|
314
|
+
annotations: [],
|
315
|
+
location: nil,
|
316
|
+
comment: nil,
|
317
|
+
overloading: false,
|
318
|
+
visibility: nil
|
319
|
+
)
|
320
|
+
|
321
|
+
if decl.positional_init?
|
322
|
+
attr_params = decl.each_attribute.map do |name, attr|
|
323
|
+
RBS::Types::Function::Param.new(
|
324
|
+
type: attr&.type || Types::Bases::Any.new(location: nil),
|
325
|
+
name: name,
|
326
|
+
location: nil
|
327
|
+
)
|
328
|
+
end
|
329
|
+
|
330
|
+
method_type = Types::Function.empty(Types::Bases::Instance.new(location: nil))
|
331
|
+
if decl.required_new_args?
|
332
|
+
method_type = method_type.update(required_positionals: attr_params)
|
333
|
+
else
|
334
|
+
method_type = method_type.update(optional_positionals: attr_params)
|
335
|
+
end
|
336
|
+
|
337
|
+
new.overloads <<
|
338
|
+
RBS::AST::Members::MethodDefinition::Overload.new(
|
339
|
+
method_type: RBS::MethodType.new(type_params: [], type: method_type, block: nil, location: nil),
|
340
|
+
annotations: []
|
341
|
+
)
|
342
|
+
end
|
343
|
+
|
344
|
+
if decl.keyword_init?
|
345
|
+
attr_keywords = decl.each_attribute.map do |name, attr|
|
346
|
+
[
|
347
|
+
name,
|
348
|
+
RBS::Types::Function::Param.new(
|
349
|
+
type: attr&.type || Types::Bases::Any.new(location: nil),
|
350
|
+
name: nil,
|
351
|
+
location: nil
|
352
|
+
)
|
353
|
+
]
|
354
|
+
end.to_h #: Hash[Symbol, RBS::Types::Function::Param]
|
355
|
+
|
356
|
+
method_type = Types::Function.empty(Types::Bases::Instance.new(location: nil))
|
357
|
+
if decl.required_new_args?
|
358
|
+
method_type = method_type.update(required_keywords: attr_keywords)
|
359
|
+
else
|
360
|
+
method_type = method_type.update(optional_keywords: attr_keywords)
|
361
|
+
end
|
362
|
+
|
363
|
+
new.overloads <<
|
364
|
+
RBS::AST::Members::MethodDefinition::Overload.new(
|
365
|
+
method_type: RBS::MethodType.new(type_params: [], type: method_type, block: nil, location: nil),
|
366
|
+
annotations: []
|
367
|
+
)
|
368
|
+
end
|
369
|
+
|
370
|
+
rbs << RBS::AST::Declarations::Class.new(
|
371
|
+
name: decl.constant_name,
|
372
|
+
type_params: [],
|
373
|
+
members: [*attributes, new],
|
374
|
+
super_class: RBS::AST::Declarations::Class::Super.new(
|
375
|
+
name: RBS::TypeName.new(name: :Struct, namespace: RBS::Namespace.empty),
|
376
|
+
args: [RBS::Types::Bases::Any.new(location: nil)],
|
377
|
+
location: nil
|
378
|
+
),
|
379
|
+
annotations: decl.class_annotations,
|
380
|
+
location: nil,
|
381
|
+
comment: comment
|
382
|
+
)
|
383
|
+
end
|
384
|
+
|
185
385
|
# @rbs decl: AST::Declarations::SingletonClassDecl
|
186
386
|
# @rbs rbs: _Content
|
187
387
|
# @rbs return: void
|
@@ -221,6 +421,7 @@ module RBS
|
|
221
421
|
return
|
222
422
|
end
|
223
423
|
|
424
|
+
visibility = member.visibility || decl&.visibility(member)
|
224
425
|
rbs << RBS::AST::Members::MethodDefinition.new(
|
225
426
|
name: member.method_name,
|
226
427
|
kind: kind,
|
@@ -229,7 +430,7 @@ module RBS
|
|
229
430
|
location: nil,
|
230
431
|
comment: comment,
|
231
432
|
overloading: member.overloading?,
|
232
|
-
visibility:
|
433
|
+
visibility: visibility
|
233
434
|
)
|
234
435
|
when AST::Members::RubyAlias
|
235
436
|
if member.comments
|
@@ -253,9 +454,9 @@ module RBS
|
|
253
454
|
rbs.concat m
|
254
455
|
end
|
255
456
|
when AST::Members::RubyPrivate
|
256
|
-
rbs << RBS::AST::Members::Private.new(location: nil)
|
457
|
+
rbs << RBS::AST::Members::Private.new(location: nil) unless decl
|
257
458
|
when AST::Members::RubyPublic
|
258
|
-
rbs << RBS::AST::Members::Public.new(location: nil)
|
459
|
+
rbs << RBS::AST::Members::Public.new(location: nil) unless decl
|
259
460
|
when AST::Members::RBSIvar
|
260
461
|
if m = member.rbs
|
261
462
|
rbs << m
|
data/rbs_collection.lock.yaml
CHANGED
@@ -42,11 +42,11 @@ gems:
|
|
42
42
|
source:
|
43
43
|
type: git
|
44
44
|
name: ruby/gem_rbs_collection
|
45
|
-
revision:
|
45
|
+
revision: 03121e6bbf2340e3b179edcc351deac45476f4d0
|
46
46
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
47
47
|
repo_dir: gems
|
48
48
|
- name: rbs
|
49
|
-
version: 3.5.
|
49
|
+
version: 3.5.3
|
50
50
|
source:
|
51
51
|
type: rubygems
|
52
52
|
- name: rdoc
|
@@ -8,9 +8,12 @@ module RBS
|
|
8
8
|
# @rbs node: Prism::Node
|
9
9
|
# @rbs return: TypeName?
|
10
10
|
def type_name: (Prism::Node node) -> TypeName?
|
11
|
+
|
12
|
+
# @rbs (Prism::Node) -> Prism::Node?
|
13
|
+
def value_node: (Prism::Node) -> Prism::Node?
|
11
14
|
end
|
12
15
|
|
13
|
-
type t = ClassDecl | ModuleDecl | ConstantDecl | SingletonClassDecl | BlockDecl
|
16
|
+
type t = ClassDecl | ModuleDecl | ConstantDecl | SingletonClassDecl | BlockDecl | DataAssignDecl | StructAssignDecl
|
14
17
|
|
15
18
|
interface _WithComments
|
16
19
|
def comments: () -> AnnotationParser::ParsingResult?
|
@@ -112,6 +115,8 @@ module RBS
|
|
112
115
|
end
|
113
116
|
|
114
117
|
class SingletonClassDecl < ModuleOrClass[Prism::SingletonClassNode]
|
118
|
+
# @rbs (AST::Members::RubyDef) -> (:private | nil)
|
119
|
+
def visibility: (AST::Members::RubyDef) -> (:private | nil)
|
115
120
|
end
|
116
121
|
|
117
122
|
class BlockDecl < Base
|
@@ -129,6 +134,110 @@ module RBS
|
|
129
134
|
|
130
135
|
def module_class_annotation: () -> (Annotations::ModuleDecl | Annotations::ClassDecl | nil)
|
131
136
|
end
|
137
|
+
|
138
|
+
# @rbs module-self _WithTypeDecls
|
139
|
+
module DataStructUtil : _WithTypeDecls
|
140
|
+
interface _WithTypeDecls
|
141
|
+
def type_decls: () -> Hash[Integer, Annotations::TypeAssertion]
|
142
|
+
|
143
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
144
|
+
|
145
|
+
def comments: %a{pure} () -> AnnotationParser::ParsingResult?
|
146
|
+
end
|
147
|
+
|
148
|
+
# @rbs %a{pure}
|
149
|
+
# @rbs () { ([Symbol, Annotations::TypeAssertion?]) -> void } -> void
|
150
|
+
# | () -> Enumerator[[Symbol, Annotations::TypeAssertion?], void]
|
151
|
+
%a{pure}
|
152
|
+
def each_attribute: () { ([ Symbol, Annotations::TypeAssertion? ]) -> void } -> void
|
153
|
+
| () -> Enumerator[[ Symbol, Annotations::TypeAssertion? ], void]
|
154
|
+
|
155
|
+
def class_annotations: () -> Array[RBS::AST::Annotation]
|
156
|
+
end
|
157
|
+
|
158
|
+
class DataAssignDecl < Base
|
159
|
+
extend ConstantUtil
|
160
|
+
|
161
|
+
include DataStructUtil
|
162
|
+
|
163
|
+
attr_reader node: Prism::ConstantWriteNode
|
164
|
+
|
165
|
+
attr_reader comments: AnnotationParser::ParsingResult?
|
166
|
+
|
167
|
+
attr_reader type_decls: Hash[Integer, Annotations::TypeAssertion]
|
168
|
+
|
169
|
+
attr_reader data_define_node: Prism::CallNode
|
170
|
+
|
171
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
172
|
+
def initialize: (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
173
|
+
|
174
|
+
def start_line: () -> Integer
|
175
|
+
|
176
|
+
# @rbs %a{pure}
|
177
|
+
# @rbs () -> TypeName?
|
178
|
+
%a{pure}
|
179
|
+
def constant_name: () -> TypeName?
|
180
|
+
|
181
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
182
|
+
def self.data_define?: (Prism::ConstantWriteNode) -> Prism::CallNode?
|
183
|
+
|
184
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
185
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
186
|
+
end
|
187
|
+
|
188
|
+
class StructAssignDecl < Base
|
189
|
+
extend ConstantUtil
|
190
|
+
|
191
|
+
include DataStructUtil
|
192
|
+
|
193
|
+
attr_reader node: Prism::ConstantWriteNode
|
194
|
+
|
195
|
+
attr_reader comments: AnnotationParser::ParsingResult?
|
196
|
+
|
197
|
+
attr_reader type_decls: Hash[Integer, Annotations::TypeAssertion]
|
198
|
+
|
199
|
+
attr_reader struct_new_node: Prism::CallNode
|
200
|
+
|
201
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
202
|
+
def initialize: (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
203
|
+
|
204
|
+
def start_line: () -> Integer
|
205
|
+
|
206
|
+
# @rbs %a{pure}
|
207
|
+
# @rbs () -> TypeName?
|
208
|
+
%a{pure}
|
209
|
+
def constant_name: () -> TypeName?
|
210
|
+
|
211
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
212
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
213
|
+
|
214
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
215
|
+
def self.struct_new?: (Prism::ConstantWriteNode) -> Prism::CallNode?
|
216
|
+
|
217
|
+
# @rbs %a{pure}
|
218
|
+
%a{pure}
|
219
|
+
def keyword_init?: () -> bool
|
220
|
+
|
221
|
+
# @rbs %a{pure}
|
222
|
+
%a{pure}
|
223
|
+
def positional_init?: () -> bool
|
224
|
+
|
225
|
+
# Returns `true` is annotation is given to make all attributes *readonly*
|
226
|
+
#
|
227
|
+
# Add `# @rbs %a{rbs-inline:readonly-attributes=true}` to the class to make all attributes `attr_reader`, instead of `attr_accessor`.
|
228
|
+
#
|
229
|
+
# @rbs %a{pure}
|
230
|
+
%a{pure}
|
231
|
+
def readonly_attributes?: () -> bool
|
232
|
+
|
233
|
+
# Returns `true` if annotation is given to make all `.new` arguments required
|
234
|
+
#
|
235
|
+
# Add `# @rbs %a{rbs-inline:new-args=required}` to the class to make all of the parameters required.
|
236
|
+
#
|
237
|
+
# @rbs %a{pure}
|
238
|
+
%a{pure}
|
239
|
+
def required_new_args?: () -> bool
|
240
|
+
end
|
132
241
|
end
|
133
242
|
end
|
134
243
|
end
|
@@ -58,6 +58,14 @@ module RBS
|
|
58
58
|
# @rbs return: void
|
59
59
|
def translate_constant_decl: (AST::Declarations::ConstantDecl decl, _Content rbs) -> void
|
60
60
|
|
61
|
+
# @rbs decl: AST::Declarations::DataAssignDecl
|
62
|
+
# @rbs rbs: _Content
|
63
|
+
def translate_data_assign_decl: (AST::Declarations::DataAssignDecl decl, _Content rbs) -> void
|
64
|
+
|
65
|
+
# @rbs decl: AST::Declarations::StructAssignDecl
|
66
|
+
# @rbs rbs: _Content
|
67
|
+
def translate_struct_assign_decl: (AST::Declarations::StructAssignDecl decl, _Content rbs) -> void
|
68
|
+
|
61
69
|
# @rbs decl: AST::Declarations::SingletonClassDecl
|
62
70
|
# @rbs rbs: _Content
|
63
71
|
# @rbs return: void
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbs-inline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prism
|
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
requirements: []
|
113
|
-
rubygems_version: 3.5.
|
113
|
+
rubygems_version: 3.5.17
|
114
114
|
signing_key:
|
115
115
|
specification_version: 4
|
116
116
|
summary: Inline RBS type declaration.
|