rbs 0.18.1 → 1.0.0.pre2

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/Rakefile +12 -0
  4. data/Steepfile +2 -1
  5. data/bin/annotate-with-rdoc +0 -4
  6. data/core/builtin.rbs +4 -0
  7. data/core/file.rbs +3 -4
  8. data/core/hash.rbs +1 -3
  9. data/core/io.rbs +165 -7
  10. data/core/kernel.rbs +1 -1
  11. data/core/module.rbs +41 -0
  12. data/core/time.rbs +0 -12
  13. data/docs/syntax.md +0 -17
  14. data/goodcheck.yml +22 -2
  15. data/lib/rbs.rb +2 -0
  16. data/lib/rbs/ast/declarations.rb +7 -49
  17. data/lib/rbs/ast/members.rb +10 -4
  18. data/lib/rbs/cli.rb +10 -10
  19. data/lib/rbs/definition.rb +70 -3
  20. data/lib/rbs/definition_builder.rb +573 -984
  21. data/lib/rbs/definition_builder/ancestor_builder.rb +525 -0
  22. data/lib/rbs/definition_builder/method_builder.rb +217 -0
  23. data/lib/rbs/environment.rb +6 -8
  24. data/lib/rbs/environment_loader.rb +8 -4
  25. data/lib/rbs/errors.rb +88 -121
  26. data/lib/rbs/method_type.rb +1 -31
  27. data/lib/rbs/parser.rb +1082 -1014
  28. data/lib/rbs/parser.y +108 -76
  29. data/lib/rbs/prototype/rb.rb +18 -3
  30. data/lib/rbs/prototype/rbi.rb +6 -6
  31. data/lib/rbs/prototype/runtime.rb +71 -35
  32. data/lib/rbs/substitution.rb +4 -0
  33. data/lib/rbs/test.rb +3 -1
  34. data/lib/rbs/test/hook.rb +26 -8
  35. data/lib/rbs/types.rb +68 -7
  36. data/lib/rbs/validator.rb +4 -2
  37. data/lib/rbs/variance_calculator.rb +5 -1
  38. data/lib/rbs/version.rb +1 -1
  39. data/lib/rbs/writer.rb +13 -4
  40. data/schema/members.json +5 -1
  41. data/sig/ancestor_builder.rbs +98 -0
  42. data/sig/declarations.rbs +4 -16
  43. data/sig/definition.rbs +6 -1
  44. data/sig/definition_builder.rbs +15 -67
  45. data/sig/errors.rbs +159 -0
  46. data/sig/members.rbs +4 -1
  47. data/sig/method_builder.rbs +71 -0
  48. data/sig/method_types.rbs +3 -16
  49. data/sig/substitution.rbs +3 -0
  50. data/sig/type_name_resolver.rbs +4 -2
  51. data/sig/types.rbs +17 -15
  52. data/sig/validator.rbs +12 -0
  53. data/stdlib/csv/0/csv.rbs +3 -0
  54. data/stdlib/dbm/0/dbm.rbs +0 -2
  55. data/stdlib/logger/0/log_device.rbs +1 -2
  56. data/stdlib/monitor/0/monitor.rbs +119 -0
  57. data/stdlib/pathname/0/pathname.rbs +1 -1
  58. data/stdlib/prime/0/prime.rbs +6 -0
  59. data/stdlib/securerandom/0/securerandom.rbs +2 -0
  60. data/stdlib/time/0/time.rbs +327 -0
  61. data/stdlib/tsort/0/tsort.rbs +8 -0
  62. data/stdlib/uri/0/common.rbs +401 -0
  63. data/stdlib/uri/0/rfc2396_parser.rbs +9 -0
  64. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  65. data/steep/Gemfile.lock +13 -14
  66. metadata +16 -5
@@ -20,7 +20,7 @@ class RBS::Parser
20
20
  nonassoc kARROW
21
21
  preclow
22
22
 
23
- expect 2
23
+ expect 5
24
24
 
25
25
  rule
26
26
 
@@ -50,7 +50,6 @@ rule
50
50
  | interface_decl
51
51
  | module_decl
52
52
  | class_decl
53
- | extension_decl
54
53
 
55
54
  start_new_scope: { start_new_variables_scope }
56
55
  start_merged_scope: { start_merged_variables_scope }
@@ -61,24 +60,6 @@ rule
61
60
  result = val[1].unshift(Annotation.new(string: val[0].value, location: val[0].location))
62
61
  }
63
62
 
64
- extension_decl:
65
- annotations kEXTENSION start_new_scope class_name type_params kLPAREN extension_name kRPAREN class_members kEND {
66
- reset_variable_scope
67
-
68
- location = val[1].location + val[9].location
69
- result = Declarations::Extension.new(
70
- name: val[3].value,
71
- type_params: val[4]&.value || [],
72
- extension_name: val[6].value.to_sym,
73
- members: val[8],
74
- annotations: val[0],
75
- location: location,
76
- comment: leading_comment(val[0].first&.location || location)
77
- )
78
- }
79
-
80
- extension_name: tUIDENT | tLIDENT
81
-
82
63
  class_decl:
83
64
  annotations kCLASS start_new_scope class_name module_type_params super_class class_members kEND {
84
65
  reset_variable_scope
@@ -99,11 +80,13 @@ rule
99
80
  { result = nil }
100
81
  | kLT class_name {
101
82
  result = Declarations::Class::Super.new(name: val[1].value,
102
- args: [])
83
+ args: [],
84
+ location: val[1].location)
103
85
  }
104
86
  | kLT class_name kLBRACKET type_list kRBRACKET {
105
87
  result = Declarations::Class::Super.new(name: val[1].value,
106
- args: val[3])
88
+ args: val[3],
89
+ location: val[1].location + val[4].location)
107
90
  }
108
91
 
109
92
  module_decl:
@@ -202,57 +185,67 @@ rule
202
185
  | alias_member
203
186
  | signature
204
187
 
188
+ attribute_kind:
189
+ { result = :instance }
190
+ | kSELF kDOT { result = :singleton }
191
+
205
192
  attribute_member:
206
- annotations kATTRREADER keyword type {
207
- location = val[1].location + val[3].location
208
- result = Members::AttrReader.new(name: val[2].value,
193
+ annotations kATTRREADER attribute_kind keyword type {
194
+ location = val[1].location + val[4].location
195
+ result = Members::AttrReader.new(name: val[3].value,
209
196
  ivar_name: nil,
210
- type: val[3],
197
+ type: val[4],
198
+ kind: val[2],
211
199
  annotations: val[0],
212
200
  location: location,
213
201
  comment: leading_comment(val[0].first&.location || location))
214
202
  }
215
- | annotations kATTRREADER method_name attr_var_opt kCOLON type {
216
- location = val[1].location + val[5].location
217
- result = Members::AttrReader.new(name: val[2].value.to_sym,
218
- ivar_name: val[3],
219
- type: val[5],
203
+ | annotations kATTRREADER attribute_kind method_name attr_var_opt kCOLON type {
204
+ location = val[1].location + val[6].location
205
+ result = Members::AttrReader.new(name: val[3].value.to_sym,
206
+ ivar_name: val[4],
207
+ type: val[6],
208
+ kind: val[2],
220
209
  annotations: val[0],
221
210
  location: location,
222
211
  comment: leading_comment(val[0].first&.location || location))
223
212
  }
224
- | annotations kATTRWRITER keyword type {
225
- location = val[1].location + val[3].location
226
- result = Members::AttrWriter.new(name: val[2].value,
213
+ | annotations kATTRWRITER attribute_kind keyword type {
214
+ location = val[1].location + val[4].location
215
+ result = Members::AttrWriter.new(name: val[3].value,
227
216
  ivar_name: nil,
228
- type: val[3],
217
+ kind: val[2],
218
+ type: val[4],
229
219
  annotations: val[0],
230
220
  location: location,
231
221
  comment: leading_comment(val[0].first&.location || location))
232
222
  }
233
- | annotations kATTRWRITER method_name attr_var_opt kCOLON type {
234
- location = val[1].location + val[5].location
235
- result = Members::AttrWriter.new(name: val[2].value.to_sym,
236
- ivar_name: val[3],
237
- type: val[5],
223
+ | annotations kATTRWRITER attribute_kind method_name attr_var_opt kCOLON type {
224
+ location = val[1].location + val[6].location
225
+ result = Members::AttrWriter.new(name: val[3].value.to_sym,
226
+ ivar_name: val[4],
227
+ kind: val[2],
228
+ type: val[6],
238
229
  annotations: val[0],
239
230
  location: location,
240
231
  comment: leading_comment(val[0].first&.location || location))
241
232
  }
242
- | annotations kATTRACCESSOR keyword type {
243
- location = val[1].location + val[3].location
244
- result = Members::AttrAccessor.new(name: val[2].value,
233
+ | annotations kATTRACCESSOR attribute_kind keyword type {
234
+ location = val[1].location + val[4].location
235
+ result = Members::AttrAccessor.new(name: val[3].value,
245
236
  ivar_name: nil,
246
- type: val[3],
237
+ kind: val[2],
238
+ type: val[4],
247
239
  annotations: val[0],
248
240
  location: location,
249
241
  comment: leading_comment(val[0].first&.location || location))
250
242
  }
251
- | annotations kATTRACCESSOR method_name attr_var_opt kCOLON type {
252
- location = val[1].location + val[5].location
253
- result = Members::AttrAccessor.new(name: val[2].value.to_sym,
254
- ivar_name: val[3],
255
- type: val[5],
243
+ | annotations kATTRACCESSOR attribute_kind method_name attr_var_opt kCOLON type {
244
+ location = val[1].location + val[6].location
245
+ result = Members::AttrAccessor.new(name: val[3].value.to_sym,
246
+ ivar_name: val[4],
247
+ kind: val[2],
248
+ type: val[6],
256
249
  annotations: val[0],
257
250
  location: location,
258
251
  comment: leading_comment(val[0].first&.location || location))
@@ -474,26 +467,13 @@ rule
474
467
  }
475
468
 
476
469
  method_type:
477
- start_merged_scope type_params params_opt block_opt kARROW simple_type {
470
+ start_merged_scope type_params proc_type {
478
471
  reset_variable_scope
479
472
 
480
- location = (val[1] || val[2] || val[3] || val[4]).location + val[5].location
473
+ location = (val[1] || val[2]).location + val[2].location
481
474
  type_params = val[1]&.value || []
482
475
 
483
- params = val[2]&.value || empty_params_result
484
-
485
- type = Types::Function.new(
486
- required_positionals: params[0],
487
- optional_positionals: params[1],
488
- rest_positionals: params[2],
489
- trailing_positionals: params[3],
490
- required_keywords: params[4],
491
- optional_keywords: params[5],
492
- rest_keywords: params[6],
493
- return_type: val[5]
494
- )
495
-
496
- block = val[3]&.value
476
+ type, block = val[2].value
497
477
 
498
478
  result = MethodType.new(type_params: type_params,
499
479
  type: type,
@@ -507,14 +487,13 @@ rule
507
487
  result = LocatedValue.new(value: val[1], location: val[0].location + val[2].location)
508
488
  }
509
489
 
510
- block_opt:
511
- { result = nil }
512
- | kLBRACE function_type kRBRACE {
513
- block = MethodType::Block.new(type: val[1].value, required: true)
490
+ block:
491
+ kLBRACE simple_function_type kRBRACE {
492
+ block = Types::Block.new(type: val[1].value, required: true)
514
493
  result = LocatedValue.new(value: block, location: val[0].location + val[2].location)
515
494
  }
516
- | kQUESTION kLBRACE function_type kRBRACE {
517
- block = MethodType::Block.new(type: val[2].value, required: false)
495
+ | kQUESTION kLBRACE simple_function_type kRBRACE {
496
+ block = Types::Block.new(type: val[2].value, required: false)
518
497
  result = LocatedValue.new(value: block, location: val[0].location + val[3].location)
519
498
  }
520
499
 
@@ -797,8 +776,9 @@ rule
797
776
  result = Types::ClassSingleton.new(name: val[2].value,
798
777
  location: val[0].location + val[3].location)
799
778
  }
800
- | kHAT function_type {
801
- result = Types::Proc.new(type: val[1].value, location: val[0].location + val[1].location)
779
+ | kHAT proc_type {
780
+ type, block = val[1].value
781
+ result = Types::Proc.new(type: type, block: block, location: val[0].location + val[1].location)
802
782
  }
803
783
  | simple_type kQUESTION {
804
784
  result = Types::Optional.new(type: val[0], location: val[0].location + val[1].location)
@@ -842,6 +822,15 @@ rule
842
822
  | keyword type {
843
823
  result = { val[0].value => val[1] }
844
824
  }
825
+ | identifier_keywords kCOLON type {
826
+ result = { val[0].value => val[2] }
827
+ }
828
+ | tQUOTEDIDENT kCOLON type {
829
+ result = { val[0].value => val[2] }
830
+ }
831
+ | tQUOTEDMETHOD kCOLON type {
832
+ result = { val[0].value => val[2] }
833
+ }
845
834
 
846
835
  keyword_name:
847
836
  keyword
@@ -851,7 +840,32 @@ rule
851
840
 
852
841
  keyword: tLKEYWORD | tUKEYWORD | tLKEYWORD_Q_E | tUKEYWORD_Q_E
853
842
 
854
- function_type:
843
+ proc_type:
844
+ params_opt block kARROW simple_type {
845
+ location = (val[0] || val[1] || val[2]).location + val[3].location
846
+
847
+ params = val[0]&.value || [[], [], nil, [], {}, {}, nil]
848
+
849
+ type = Types::Function.new(
850
+ required_positionals: params[0],
851
+ optional_positionals: params[1],
852
+ rest_positionals: params[2],
853
+ trailing_positionals: params[3],
854
+ required_keywords: params[4],
855
+ optional_keywords: params[5],
856
+ rest_keywords: params[6],
857
+ return_type: val[3]
858
+ )
859
+
860
+ block = val[1].value
861
+
862
+ result = LocatedValue.new(value: [type, block], location: location)
863
+ }
864
+ | simple_function_type {
865
+ result = LocatedValue.new(value: [val[0].value, nil], location: val[0].location)
866
+ }
867
+
868
+ simple_function_type:
855
869
  kLPAREN params kRPAREN kARROW simple_type {
856
870
  location = val[0].location + val[4].location
857
871
  type = Types::Function.new(
@@ -883,7 +897,7 @@ rule
883
897
  result = LocatedValue.new(value: type, location: location)
884
898
  }
885
899
 
886
- params:
900
+ params:
887
901
  required_positional kCOMMA params {
888
902
  result = val[2]
889
903
  result[0].unshift(val[0])
@@ -1294,6 +1308,10 @@ ANNOTATION_RE = Regexp.union(/%a\{.*?\}/,
1294
1308
  /%a\(.*?\)/,
1295
1309
  /%a\<.*?\>/,
1296
1310
  /%a\|.*?\|/)
1311
+
1312
+ escape_sequences = %w[a b e f n r s t v "].map { |l| "\\\\#{l}" }
1313
+ DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE = /(#{escape_sequences.join("|")})/
1314
+
1297
1315
  def next_token
1298
1316
  if @type
1299
1317
  type = @type
@@ -1373,7 +1391,21 @@ def next_token
1373
1391
  when input.scan(/[a-z_]\w*\b/)
1374
1392
  new_token(:tLIDENT)
1375
1393
  when input.scan(/"(\\"|[^"])*"/)
1376
- s = input.matched.yield_self {|s| s[1, s.length - 2] }.gsub(/\\"/, '"')
1394
+ s = input.matched.yield_self {|s| s[1, s.length - 2] }
1395
+ .gsub(DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE) do |match|
1396
+ case match
1397
+ when '\\a' then "\a"
1398
+ when '\\b' then "\b"
1399
+ when '\\e' then "\e"
1400
+ when '\\f' then "\f"
1401
+ when '\\n' then "\n"
1402
+ when '\\r' then "\r"
1403
+ when '\\s' then "\s"
1404
+ when '\\t' then "\t"
1405
+ when '\\v' then "\v"
1406
+ when '\\"' then '"'
1407
+ end
1408
+ end
1377
1409
  new_token(:tSTRING, s)
1378
1410
  when input.scan(/'(\\'|[^'])*'/)
1379
1411
  s = input.matched.yield_self {|s| s[1, s.length - 2] }.gsub(/\\'/, "'")
@@ -15,6 +15,14 @@ module RBS
15
15
  :instance
16
16
  end
17
17
  end
18
+
19
+ def attribute_kind
20
+ if singleton
21
+ :singleton
22
+ else
23
+ :instance
24
+ end
25
+ end
18
26
  end
19
27
 
20
28
  attr_reader :source_decls
@@ -77,7 +85,7 @@ module RBS
77
85
  class_name, super_class, *class_body = node.children
78
86
  kls = AST::Declarations::Class.new(
79
87
  name: const_to_name(class_name),
80
- super_class: super_class && AST::Declarations::Class::Super.new(name: const_to_name(super_class), args: []),
88
+ super_class: super_class && AST::Declarations::Class::Super.new(name: const_to_name(super_class), args: [], location: nil),
81
89
  type_params: AST::Declarations::ModuleTypeParams.empty,
82
90
  members: [],
83
91
  annotations: [],
@@ -121,9 +129,13 @@ module RBS
121
129
  RBS.logger.warn "`class <<` syntax with not-self may be compiled to incorrect code: #{this}"
122
130
  end
123
131
 
132
+ accessibility = current_accessibility(decls)
133
+
124
134
  ctx = Context.initial.tap { |ctx| ctx.singleton = true }
125
135
  process_children(body, decls: decls, comments: comments, context: ctx)
126
136
 
137
+ decls << accessibility
138
+
127
139
  when :DEFN, :DEFS
128
140
  if node.type == :DEFN
129
141
  def_name, def_body = node.children
@@ -202,6 +214,7 @@ module RBS
202
214
  name: name,
203
215
  ivar_name: nil,
204
216
  type: Types::Bases::Any.new(location: nil),
217
+ kind: context.attribute_kind,
205
218
  location: nil,
206
219
  comment: comments[node.first_lineno - 1],
207
220
  annotations: []
@@ -215,6 +228,7 @@ module RBS
215
228
  name: name,
216
229
  ivar_name: nil,
217
230
  type: Types::Bases::Any.new(location: nil),
231
+ kind: context.attribute_kind,
218
232
  location: nil,
219
233
  comment: comments[node.first_lineno - 1],
220
234
  annotations: []
@@ -228,6 +242,7 @@ module RBS
228
242
  name: name,
229
243
  ivar_name: nil,
230
244
  type: Types::Bases::Any.new(location: nil),
245
+ kind: context.attribute_kind,
231
246
  location: nil,
232
247
  comment: comments[node.first_lineno - 1],
233
248
  annotations: []
@@ -549,7 +564,7 @@ module RBS
549
564
  method_block = nil
550
565
 
551
566
  if block
552
- method_block = MethodType::Block.new(
567
+ method_block = Types::Block.new(
553
568
  required: true,
554
569
  type: Types::Function.empty(untyped)
555
570
  )
@@ -557,7 +572,7 @@ module RBS
557
572
 
558
573
  if body_node
559
574
  if (yields = any_node?(body_node) {|n| n.type == :YIELD })
560
- method_block = MethodType::Block.new(
575
+ method_block = Types::Block.new(
561
576
  required: true,
562
577
  type: Types::Function.empty(untyped)
563
578
  )
@@ -47,7 +47,7 @@ module RBS
47
47
  def push_class(name, super_class, comment:)
48
48
  modules.push AST::Declarations::Class.new(
49
49
  name: nested_name(name),
50
- super_class: super_class && AST::Declarations::Class::Super.new(name: const_to_name(super_class), args: []),
50
+ super_class: super_class && AST::Declarations::Class::Super.new(name: const_to_name(super_class), args: [], location: nil),
51
51
  type_params: AST::Declarations::ModuleTypeParams.empty,
52
52
  members: [],
53
53
  annotations: [],
@@ -387,19 +387,19 @@ module RBS
387
387
  if block
388
388
  if (type = vars[block])
389
389
  if type.is_a?(Types::Proc)
390
- method_block = MethodType::Block.new(required: true, type: type.type)
390
+ method_block = Types::Block.new(required: true, type: type.type)
391
391
  elsif type.is_a?(Types::Bases::Any)
392
- method_block = MethodType::Block.new(
392
+ method_block = Types::Block.new(
393
393
  required: true,
394
394
  type: Types::Function.empty(Types::Bases::Any.new(location: nil))
395
395
  )
396
396
  # Handle an optional block like `T.nilable(T.proc.void)`.
397
397
  elsif type.is_a?(Types::Optional) && type.type.is_a?(Types::Proc)
398
- method_block = MethodType::Block.new(required: false, type: type.type.type)
398
+ method_block = Types::Block.new(required: false, type: type.type.type)
399
399
  else
400
400
  STDERR.puts "Unexpected block type: #{type}"
401
401
  PP.pp args_node, STDERR
402
- method_block = MethodType::Block.new(
402
+ method_block = Types::Block.new(
403
403
  required: true,
404
404
  type: Types::Function.empty(Types::Bases::Any.new(location: nil))
405
405
  )
@@ -485,7 +485,7 @@ module RBS
485
485
  Types::Tuple.new(types: types, location: nil)
486
486
  else
487
487
  if proc_type?(type_node)
488
- Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, location: nil)
488
+ Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, block: nil, location: nil)
489
489
  else
490
490
  STDERR.puts "Unexpected type_node:"
491
491
  PP.pp type_node, STDERR
@@ -61,11 +61,32 @@ module RBS
61
61
  end
62
62
  end
63
63
 
64
- def each_mixin(mixins, *super_mixes)
65
- supers = Set.new(super_mixes)
66
- mixins.each do |mix|
64
+ def each_included_module(type_name, mod)
65
+ supers = Set[]
66
+
67
+ mod.included_modules.each do |mix|
68
+ supers.merge(mix.included_modules)
69
+ end
70
+
71
+ if mod.is_a?(Class)
72
+ mod.superclass.included_modules.each do |mix|
73
+ supers << mix
74
+ supers.merge(mix.included_modules)
75
+ end
76
+ end
77
+
78
+ mod.included_modules.each do |mix|
67
79
  unless supers.include?(mix)
68
- yield mix
80
+ unless const_name(mix)
81
+ RBS.logger.warn("Skipping anonymous module #{mix} included in #{mod}")
82
+ else
83
+ module_name = module_full_name = to_type_name(const_name(mix))
84
+ if module_full_name.namespace == type_name.namespace
85
+ module_name = TypeName.new(name: module_full_name.name, namespace: Namespace.empty)
86
+ end
87
+
88
+ yield module_name, module_full_name, mix
89
+ end
69
90
  end
70
91
  end
71
92
  end
@@ -103,7 +124,7 @@ module RBS
103
124
  when :keyrest
104
125
  rest_keywords = Types::Function::Param.new(name: nil, type: untyped)
105
126
  when :block
106
- block = MethodType::Block.new(
127
+ block = Types::Block.new(
107
128
  type: Types::Function.empty(untyped).update(rest_positionals: Types::Function::Param.new(name: nil, type: untyped)),
108
129
  required: true
109
130
  )
@@ -298,11 +319,13 @@ module RBS
298
319
  location: nil
299
320
  )
300
321
  else
301
- Types::ClassInstance.new(name: to_type_name(value.class.to_s), args: [], location: nil)
322
+ value_type_name = to_type_name(const_name(value.class))
323
+ args = type_args(value_type_name)
324
+ Types::ClassInstance.new(name: value_type_name, args: args, location: nil)
302
325
  end
303
326
 
304
327
  @decls << AST::Declarations::Constant.new(
305
- name: "#{mod.to_s}::#{name}",
328
+ name: "#{const_name(mod)}::#{name}",
306
329
  type: type,
307
330
  location: nil,
308
331
  comment: nil
@@ -311,14 +334,16 @@ module RBS
311
334
  end
312
335
 
313
336
  def generate_class(mod)
314
- type_name = to_type_name(mod.name)
337
+ type_name = to_type_name(const_name(mod))
315
338
  super_class = if mod.superclass == ::Object
316
339
  nil
317
- elsif mod.superclass.name.nil?
340
+ elsif const_name(mod.superclass).nil?
318
341
  RBS.logger.warn("Skipping anonymous superclass #{mod.superclass} of #{mod}")
319
342
  nil
320
343
  else
321
- AST::Declarations::Class::Super.new(name: to_type_name(mod.superclass.name), args: [])
344
+ super_name = to_type_name(const_name(mod.superclass))
345
+ super_args = type_args(super_name)
346
+ AST::Declarations::Class::Super.new(name: super_name, args: super_args, location: nil)
322
347
  end
323
348
 
324
349
  decl = AST::Declarations::Class.new(
@@ -331,20 +356,22 @@ module RBS
331
356
  comment: nil
332
357
  )
333
358
 
334
- each_mixin(mod.included_modules, *mod.superclass.included_modules, *mod.included_modules.flat_map(&:included_modules)) do |included_module|
335
- unless included_module.name
336
- RBS.logger.warn("Skipping anonymous module #{included_module} included in #{mod}")
337
- next
338
- end
339
-
340
- module_name = to_type_name(included_module.name)
341
- if module_name.namespace == type_name.namespace
342
- module_name = TypeName.new(name: module_name.name, namespace: Namespace.empty)
343
- end
344
-
359
+ each_included_module(type_name, mod) do |module_name, module_full_name, _|
360
+ args = type_args(module_full_name)
345
361
  decl.members << AST::Members::Include.new(
346
362
  name: module_name,
347
- args: [],
363
+ args: args,
364
+ location: nil,
365
+ comment: nil,
366
+ annotations: []
367
+ )
368
+ end
369
+
370
+ each_included_module(type_name, mod.singleton_class) do |module_name, module_full_name ,_|
371
+ args = type_args(module_full_name)
372
+ decl.members << AST::Members::Extend.new(
373
+ name: module_name,
374
+ args: args,
348
375
  location: nil,
349
376
  comment: nil,
350
377
  annotations: []
@@ -378,21 +405,22 @@ module RBS
378
405
  comment: nil
379
406
  )
380
407
 
381
- each_mixin(mod.included_modules, *mod.included_modules.flat_map(&:included_modules), namespace: type_name.namespace) do |included_module|
382
- included_module_name = const_name(included_module)
383
- unless included_module_name
384
- RBS.logger.warn("Skipping anonymous module #{included_module} included in #{mod}")
385
- next
386
- end
387
-
388
- module_name = to_type_name(included_module_name)
389
- if module_name.namespace == type_name.namespace
390
- module_name = TypeName.new(name: module_name.name, namespace: Namespace.empty)
391
- end
392
-
408
+ each_included_module(type_name, mod) do |module_name, module_full_name, _|
409
+ args = type_args(module_full_name)
393
410
  decl.members << AST::Members::Include.new(
394
411
  name: module_name,
395
- args: [],
412
+ args: args,
413
+ location: nil,
414
+ comment: nil,
415
+ annotations: []
416
+ )
417
+ end
418
+
419
+ each_included_module(type_name, mod.singleton_class) do |module_name, module_full_name, _|
420
+ args = type_args(module_full_name)
421
+ decl.members << AST::Members::Extend.new(
422
+ name: module_name,
423
+ args: args,
396
424
  location: nil,
397
425
  comment: nil,
398
426
  annotations: []
@@ -410,6 +438,14 @@ module RBS
410
438
  @module_name_method ||= Module.instance_method(:name)
411
439
  @module_name_method.bind(const).call
412
440
  end
441
+
442
+ def type_args(type_name)
443
+ if class_decl = env.class_decls[type_name.absolute!]
444
+ class_decl.type_params.size.times.map { :untyped }
445
+ else
446
+ []
447
+ end
448
+ end
413
449
  end
414
450
  end
415
451
  end