rbs-inline 0.5.0 → 0.6.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 +238 -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 +201 -1
- 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 +108 -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: 330c5c083c1dda38f3f0263729aea1d39c16484e67deee0717b28881ec22da8a
|
4
|
+
data.tar.gz: 2f1e8f2910669d33f6ed64897b0e5db00285b42626d846402a85c5c294c23155
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad396cb989f857ada7203ca6ab2129dae79f471520d816e791c8be80b9d3d4b3d5301f8360dfe8ccba5fe30d99f92dd56eea81c32b092a946d91aab431f57e26
|
7
|
+
data.tar.gz: 4487616c28a042e68f167ea191b7ab4265704228b6a104e0bf52a15d909b096bb8a8798d273de97cebba72f2a8bf0b2635168cee5e7961a7c37ec0a9f3364c25
|
@@ -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?
|
@@ -266,6 +278,231 @@ module RBS
|
|
266
278
|
end
|
267
279
|
end
|
268
280
|
end
|
281
|
+
|
282
|
+
# @rbs module-self _WithTypeDecls
|
283
|
+
module DataStructUtil
|
284
|
+
# @rbs!
|
285
|
+
# interface _WithTypeDecls
|
286
|
+
# def type_decls: () -> Hash[Integer, Annotations::TypeAssertion]
|
287
|
+
#
|
288
|
+
# def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
289
|
+
#
|
290
|
+
# def comments: %a{pure} () -> AnnotationParser::ParsingResult?
|
291
|
+
# end
|
292
|
+
|
293
|
+
# @rbs %a{pure}
|
294
|
+
# @rbs () { ([Symbol, Annotations::TypeAssertion?]) -> void } -> void
|
295
|
+
# | () -> Enumerator[[Symbol, Annotations::TypeAssertion?], void]
|
296
|
+
def each_attribute(&block)
|
297
|
+
if block
|
298
|
+
each_attribute_argument do |arg|
|
299
|
+
if arg.is_a?(Prism::SymbolNode)
|
300
|
+
if name = arg.value
|
301
|
+
type = type_decls.fetch(arg.location.start_line, nil)
|
302
|
+
yield [name.to_sym, type]
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
else
|
307
|
+
enum_for :each_attribute
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
def class_annotations #: Array[RBS::AST::Annotation]
|
312
|
+
annotations = [] #: Array[RBS::AST::Annotation]
|
313
|
+
|
314
|
+
comments&.each_annotation do |annotation|
|
315
|
+
if annotation.is_a?(Annotations::RBSAnnotation)
|
316
|
+
annotations.concat annotation.annotations
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
annotations
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
class DataAssignDecl < Base
|
325
|
+
extend ConstantUtil
|
326
|
+
|
327
|
+
include DataStructUtil
|
328
|
+
|
329
|
+
attr_reader :node #: Prism::ConstantWriteNode
|
330
|
+
|
331
|
+
attr_reader :comments #: AnnotationParser::ParsingResult?
|
332
|
+
|
333
|
+
attr_reader :type_decls #: Hash[Integer, Annotations::TypeAssertion]
|
334
|
+
|
335
|
+
attr_reader :data_define_node #: Prism::CallNode
|
336
|
+
|
337
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
338
|
+
def initialize(node, data_define_node, comments, type_decls)
|
339
|
+
@node = node
|
340
|
+
@comments = comments
|
341
|
+
@type_decls = type_decls
|
342
|
+
@data_define_node = data_define_node
|
343
|
+
end
|
344
|
+
|
345
|
+
def start_line #: Integer
|
346
|
+
node.location.start_line
|
347
|
+
end
|
348
|
+
|
349
|
+
# @rbs %a{pure}
|
350
|
+
# @rbs () -> TypeName?
|
351
|
+
def constant_name
|
352
|
+
TypeName.new(name: node.name, namespace: Namespace.empty)
|
353
|
+
end
|
354
|
+
|
355
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
356
|
+
def self.data_define?(node)
|
357
|
+
value = value_node(node)
|
358
|
+
|
359
|
+
if value.is_a?(Prism::CallNode)
|
360
|
+
if value.receiver.is_a?(Prism::ConstantReadNode)
|
361
|
+
if value.receiver.full_name.delete_prefix("::") == "Data"
|
362
|
+
if value.name == :define
|
363
|
+
return value
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
371
|
+
def each_attribute_argument(&block)
|
372
|
+
if args = data_define_node.arguments
|
373
|
+
args.arguments.each(&block)
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
class StructAssignDecl < Base
|
379
|
+
extend ConstantUtil
|
380
|
+
|
381
|
+
include DataStructUtil
|
382
|
+
|
383
|
+
attr_reader :node #: Prism::ConstantWriteNode
|
384
|
+
|
385
|
+
attr_reader :comments #: AnnotationParser::ParsingResult?
|
386
|
+
|
387
|
+
attr_reader :type_decls #: Hash[Integer, Annotations::TypeAssertion]
|
388
|
+
|
389
|
+
attr_reader :struct_new_node #: Prism::CallNode
|
390
|
+
|
391
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
392
|
+
def initialize(node, struct_new_node, comments, type_decls)
|
393
|
+
@node = node
|
394
|
+
@comments = comments
|
395
|
+
@type_decls = type_decls
|
396
|
+
@struct_new_node = struct_new_node
|
397
|
+
end
|
398
|
+
|
399
|
+
def start_line #: Integer
|
400
|
+
node.location.start_line
|
401
|
+
end
|
402
|
+
|
403
|
+
# @rbs %a{pure}
|
404
|
+
# @rbs () -> TypeName?
|
405
|
+
def constant_name
|
406
|
+
TypeName.new(name: node.name, namespace: Namespace.empty)
|
407
|
+
end
|
408
|
+
|
409
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
410
|
+
def each_attribute_argument(&block)
|
411
|
+
if args = struct_new_node.arguments
|
412
|
+
args.arguments.each do |arg|
|
413
|
+
next if arg.is_a?(Prism::KeywordHashNode)
|
414
|
+
next if arg.is_a?(Prism::StringNode)
|
415
|
+
|
416
|
+
yield arg
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
422
|
+
def self.struct_new?(node)
|
423
|
+
value = value_node(node)
|
424
|
+
|
425
|
+
if value.is_a?(Prism::CallNode)
|
426
|
+
if value.receiver.is_a?(Prism::ConstantReadNode)
|
427
|
+
if value.receiver.full_name.delete_prefix("::") == "Struct"
|
428
|
+
if value.name == :new
|
429
|
+
return value
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
# @rbs %a{pure}
|
437
|
+
def keyword_init? #: bool
|
438
|
+
if args = struct_new_node.arguments
|
439
|
+
args.arguments.each do |arg|
|
440
|
+
if arg.is_a?(Prism::KeywordHashNode)
|
441
|
+
arg.elements.each do |assoc|
|
442
|
+
if assoc.is_a?(Prism::AssocNode)
|
443
|
+
if (key = assoc.key).is_a?(Prism::SymbolNode)
|
444
|
+
if key.value == "keyword_init"
|
445
|
+
value = assoc.value
|
446
|
+
if value.is_a?(Prism::FalseNode)
|
447
|
+
return false
|
448
|
+
end
|
449
|
+
end
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
true
|
458
|
+
end
|
459
|
+
|
460
|
+
# @rbs %a{pure}
|
461
|
+
def positional_init? #: bool
|
462
|
+
if args = struct_new_node.arguments
|
463
|
+
args.arguments.each do |arg|
|
464
|
+
if arg.is_a?(Prism::KeywordHashNode)
|
465
|
+
arg.elements.each do |assoc|
|
466
|
+
if assoc.is_a?(Prism::AssocNode)
|
467
|
+
if (key = assoc.key).is_a?(Prism::SymbolNode)
|
468
|
+
if key.value == "keyword_init"
|
469
|
+
value = assoc.value
|
470
|
+
if value.is_a?(Prism::TrueNode)
|
471
|
+
return false
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
end
|
477
|
+
end
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
true
|
482
|
+
end
|
483
|
+
|
484
|
+
# Returns `true` is annotation is given to make all attributes *readonly*
|
485
|
+
#
|
486
|
+
# Add `# @rbs %a{rbs-inline:readonly-attributes=true}` to the class to make all attributes `attr_reader`, instead of `attr_accessor`.
|
487
|
+
#
|
488
|
+
# @rbs %a{pure}
|
489
|
+
def readonly_attributes? #: bool
|
490
|
+
class_annotations.any? do |annotation|
|
491
|
+
annotation.string == "rbs-inline:readonly-attributes=true"
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
# Returns `true` if annotation is given to make all `.new` arguments required
|
496
|
+
#
|
497
|
+
# Add `# @rbs %a{rbs-inline:new-args=required}` to the class to make all of the parameters required.
|
498
|
+
#
|
499
|
+
# @rbs %a{pure}
|
500
|
+
def required_new_args? #: bool
|
501
|
+
class_annotations.any? do |annotation|
|
502
|
+
annotation.string == "rbs-inline:new-args=required"
|
503
|
+
end
|
504
|
+
end
|
505
|
+
end
|
269
506
|
end
|
270
507
|
end
|
271
508
|
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
|
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: 3670834268f4ea9c10aefeffae7e072b51256375
|
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.2
|
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?
|
@@ -129,6 +132,110 @@ module RBS
|
|
129
132
|
|
130
133
|
def module_class_annotation: () -> (Annotations::ModuleDecl | Annotations::ClassDecl | nil)
|
131
134
|
end
|
135
|
+
|
136
|
+
# @rbs module-self _WithTypeDecls
|
137
|
+
module DataStructUtil : _WithTypeDecls
|
138
|
+
interface _WithTypeDecls
|
139
|
+
def type_decls: () -> Hash[Integer, Annotations::TypeAssertion]
|
140
|
+
|
141
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
142
|
+
|
143
|
+
def comments: %a{pure} () -> AnnotationParser::ParsingResult?
|
144
|
+
end
|
145
|
+
|
146
|
+
# @rbs %a{pure}
|
147
|
+
# @rbs () { ([Symbol, Annotations::TypeAssertion?]) -> void } -> void
|
148
|
+
# | () -> Enumerator[[Symbol, Annotations::TypeAssertion?], void]
|
149
|
+
%a{pure}
|
150
|
+
def each_attribute: () { ([ Symbol, Annotations::TypeAssertion? ]) -> void } -> void
|
151
|
+
| () -> Enumerator[[ Symbol, Annotations::TypeAssertion? ], void]
|
152
|
+
|
153
|
+
def class_annotations: () -> Array[RBS::AST::Annotation]
|
154
|
+
end
|
155
|
+
|
156
|
+
class DataAssignDecl < Base
|
157
|
+
extend ConstantUtil
|
158
|
+
|
159
|
+
include DataStructUtil
|
160
|
+
|
161
|
+
attr_reader node: Prism::ConstantWriteNode
|
162
|
+
|
163
|
+
attr_reader comments: AnnotationParser::ParsingResult?
|
164
|
+
|
165
|
+
attr_reader type_decls: Hash[Integer, Annotations::TypeAssertion]
|
166
|
+
|
167
|
+
attr_reader data_define_node: Prism::CallNode
|
168
|
+
|
169
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
170
|
+
def initialize: (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
171
|
+
|
172
|
+
def start_line: () -> Integer
|
173
|
+
|
174
|
+
# @rbs %a{pure}
|
175
|
+
# @rbs () -> TypeName?
|
176
|
+
%a{pure}
|
177
|
+
def constant_name: () -> TypeName?
|
178
|
+
|
179
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
180
|
+
def self.data_define?: (Prism::ConstantWriteNode) -> Prism::CallNode?
|
181
|
+
|
182
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
183
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
184
|
+
end
|
185
|
+
|
186
|
+
class StructAssignDecl < Base
|
187
|
+
extend ConstantUtil
|
188
|
+
|
189
|
+
include DataStructUtil
|
190
|
+
|
191
|
+
attr_reader node: Prism::ConstantWriteNode
|
192
|
+
|
193
|
+
attr_reader comments: AnnotationParser::ParsingResult?
|
194
|
+
|
195
|
+
attr_reader type_decls: Hash[Integer, Annotations::TypeAssertion]
|
196
|
+
|
197
|
+
attr_reader struct_new_node: Prism::CallNode
|
198
|
+
|
199
|
+
# @rbs (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
200
|
+
def initialize: (Prism::ConstantWriteNode, Prism::CallNode, AnnotationParser::ParsingResult?, Hash[Integer, Annotations::TypeAssertion]) -> void
|
201
|
+
|
202
|
+
def start_line: () -> Integer
|
203
|
+
|
204
|
+
# @rbs %a{pure}
|
205
|
+
# @rbs () -> TypeName?
|
206
|
+
%a{pure}
|
207
|
+
def constant_name: () -> TypeName?
|
208
|
+
|
209
|
+
# @rbs () { (Prism::Node) -> void } -> void
|
210
|
+
def each_attribute_argument: () { (Prism::Node) -> void } -> void
|
211
|
+
|
212
|
+
# @rbs (Prism::ConstantWriteNode) -> Prism::CallNode?
|
213
|
+
def self.struct_new?: (Prism::ConstantWriteNode) -> Prism::CallNode?
|
214
|
+
|
215
|
+
# @rbs %a{pure}
|
216
|
+
%a{pure}
|
217
|
+
def keyword_init?: () -> bool
|
218
|
+
|
219
|
+
# @rbs %a{pure}
|
220
|
+
%a{pure}
|
221
|
+
def positional_init?: () -> bool
|
222
|
+
|
223
|
+
# Returns `true` is annotation is given to make all attributes *readonly*
|
224
|
+
#
|
225
|
+
# Add `# @rbs %a{rbs-inline:readonly-attributes=true}` to the class to make all attributes `attr_reader`, instead of `attr_accessor`.
|
226
|
+
#
|
227
|
+
# @rbs %a{pure}
|
228
|
+
%a{pure}
|
229
|
+
def readonly_attributes?: () -> bool
|
230
|
+
|
231
|
+
# Returns `true` if annotation is given to make all `.new` arguments required
|
232
|
+
#
|
233
|
+
# Add `# @rbs %a{rbs-inline:new-args=required}` to the class to make all of the parameters required.
|
234
|
+
#
|
235
|
+
# @rbs %a{pure}
|
236
|
+
%a{pure}
|
237
|
+
def required_new_args?: () -> bool
|
238
|
+
end
|
132
239
|
end
|
133
240
|
end
|
134
241
|
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.6.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-01 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.11
|
114
114
|
signing_key:
|
115
115
|
specification_version: 4
|
116
116
|
summary: Inline RBS type declaration.
|