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
@@ -0,0 +1,525 @@
1
+ module RBS
2
+ class DefinitionBuilder
3
+ class AncestorBuilder
4
+ class OneAncestors
5
+ attr_reader :type_name
6
+ attr_reader :params
7
+ attr_reader :super_class
8
+ attr_reader :self_types
9
+ attr_reader :included_modules
10
+ attr_reader :included_interfaces
11
+ attr_reader :prepended_modules
12
+ attr_reader :extended_modules
13
+ attr_reader :extended_interfaces
14
+
15
+ def initialize(type_name:, params:, super_class:, self_types:, included_modules:, included_interfaces:, prepended_modules:, extended_modules:, extended_interfaces:)
16
+ @type_name = type_name
17
+ @params = params
18
+ @super_class = super_class
19
+ @self_types = self_types
20
+ @included_modules = included_modules
21
+ @included_interfaces = included_interfaces
22
+ @prepended_modules = prepended_modules
23
+ @extended_modules = extended_modules
24
+ @extended_interfaces = extended_interfaces
25
+ end
26
+
27
+ def each_ancestor(&block)
28
+ if block
29
+ if s = super_class
30
+ yield s
31
+ end
32
+
33
+ each_self_type(&block)
34
+ each_included_module(&block)
35
+ each_included_interface(&block)
36
+ each_prepended_module(&block)
37
+ each_extended_module(&block)
38
+ each_extended_interface(&block)
39
+ else
40
+ enum_for :each_ancestor
41
+ end
42
+ end
43
+
44
+ def each_self_type(&block)
45
+ if block
46
+ self_types&.each(&block)
47
+ else
48
+ enum_for :each_self_type
49
+ end
50
+ end
51
+
52
+ def each_included_module(&block)
53
+ if block
54
+ included_modules&.each(&block)
55
+ else
56
+ enum_for :each_included_module
57
+ end
58
+ end
59
+
60
+ def each_included_interface(&block)
61
+ if block
62
+ included_interfaces&.each(&block)
63
+ else
64
+ enum_for :each_included_interface
65
+ end
66
+ end
67
+
68
+ def each_prepended_module(&block)
69
+ if block
70
+ prepended_modules&.each(&block)
71
+ else
72
+ enum_for :each_prepended_module
73
+ end
74
+ end
75
+
76
+ def each_extended_module(&block)
77
+ if block
78
+ extended_modules&.each(&block)
79
+ else
80
+ enum_for :each_extended_module
81
+ end
82
+ end
83
+
84
+ def each_extended_interface(&block)
85
+ if block
86
+ extended_interfaces&.each(&block)
87
+ else
88
+ enum_for :each_extended_interface
89
+ end
90
+ end
91
+
92
+ def self.class_instance(type_name:, params:, super_class:)
93
+ new(
94
+ type_name: type_name,
95
+ params: params,
96
+ super_class: super_class,
97
+ self_types: nil,
98
+ included_modules: [],
99
+ included_interfaces: [],
100
+ prepended_modules: [],
101
+ extended_modules: nil,
102
+ extended_interfaces: nil
103
+ )
104
+ end
105
+
106
+ def self.singleton(type_name:, super_class:)
107
+ new(
108
+ type_name: type_name,
109
+ params: nil,
110
+ super_class: super_class,
111
+ self_types: nil,
112
+ included_modules: nil,
113
+ included_interfaces: nil,
114
+ prepended_modules: nil,
115
+ extended_modules: [],
116
+ extended_interfaces: []
117
+ )
118
+ end
119
+
120
+ def self.module_instance(type_name:, params:)
121
+ new(
122
+ type_name: type_name,
123
+ params: params,
124
+ self_types: [],
125
+ included_modules: [],
126
+ included_interfaces: [],
127
+ prepended_modules: [],
128
+ super_class: nil,
129
+ extended_modules: nil,
130
+ extended_interfaces: nil
131
+ )
132
+ end
133
+
134
+ def self.interface(type_name:, params:)
135
+ new(
136
+ type_name: type_name,
137
+ params: params,
138
+ self_types: nil,
139
+ included_modules: nil,
140
+ included_interfaces: [],
141
+ prepended_modules: nil,
142
+ super_class: nil,
143
+ extended_modules: nil,
144
+ extended_interfaces: nil
145
+ )
146
+ end
147
+ end
148
+
149
+ attr_reader :env
150
+
151
+ attr_reader :one_instance_ancestors_cache
152
+ attr_reader :instance_ancestors_cache
153
+
154
+ attr_reader :one_singleton_ancestors_cache
155
+ attr_reader :singleton_ancestors_cache
156
+
157
+ attr_reader :one_interface_ancestors_cache
158
+ attr_reader :interface_ancestors_cache
159
+
160
+ def initialize(env:)
161
+ @env = env
162
+
163
+ @one_instance_ancestors_cache = {}
164
+ @instance_ancestors_cache = {}
165
+
166
+ @one_singleton_ancestors_cache = {}
167
+ @singleton_ancestors_cache = {}
168
+
169
+ @one_interface_ancestors_cache = {}
170
+ @interface_ancestors_cache = {}
171
+ end
172
+
173
+ def validate_super_class!(type_name, entry)
174
+ with_super_classes = entry.decls.select {|d| d.decl.super_class }
175
+
176
+ return if with_super_classes.size <= 1
177
+
178
+ super_types = with_super_classes.map do |d|
179
+ super_class = d.decl.super_class or raise
180
+ Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
181
+ end
182
+
183
+ super_types.uniq!
184
+
185
+ return if super_types.size == 1
186
+
187
+ raise SuperclassMismatchError.new(name: type_name, entry: entry)
188
+ end
189
+
190
+ def one_instance_ancestors(type_name)
191
+ as = one_instance_ancestors_cache[type_name] and return as
192
+
193
+ entry = env.class_decls[type_name] or raise "Unknown name for one_instance_ancestors: #{type_name}"
194
+ params = entry.type_params.each.map(&:name)
195
+
196
+ case entry
197
+ when Environment::ClassEntry
198
+ validate_super_class!(type_name, entry)
199
+ primary = entry.primary
200
+ super_class = primary.decl.super_class
201
+
202
+ if type_name != BuiltinNames::BasicObject.name
203
+ if super_class
204
+ super_name = super_class.name
205
+ super_args = super_class.args
206
+ else
207
+ super_name = BuiltinNames::Object.name
208
+ super_args = []
209
+ end
210
+
211
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
212
+
213
+ ancestors = OneAncestors.class_instance(
214
+ type_name: type_name,
215
+ params: params,
216
+ super_class: Definition::Ancestor::Instance.new(name: super_name, args: super_args, source: :super)
217
+ )
218
+ else
219
+ ancestors = OneAncestors.class_instance(
220
+ type_name: type_name,
221
+ params: params,
222
+ super_class: nil
223
+ )
224
+ end
225
+ when Environment::ModuleEntry
226
+ ancestors = OneAncestors.module_instance(type_name: type_name, params: params)
227
+
228
+ self_types = ancestors.self_types or raise
229
+ if entry.self_types.empty?
230
+ self_types.push Definition::Ancestor::Instance.new(name: BuiltinNames::Object.name, args: [], source: nil)
231
+ else
232
+ entry.self_types.each do |module_self|
233
+ NoSelfTypeFoundError.check!(module_self, env: env)
234
+ self_types.push Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args, source: module_self)
235
+ end
236
+ end
237
+ end
238
+
239
+ mixin_ancestors(entry,
240
+ included_modules: ancestors.included_modules,
241
+ included_interfaces: ancestors.included_interfaces,
242
+ prepended_modules: ancestors.prepended_modules,
243
+ extended_modules: nil,
244
+ extended_interfaces: nil)
245
+
246
+ one_instance_ancestors_cache[type_name] = ancestors
247
+ end
248
+
249
+ def one_singleton_ancestors(type_name)
250
+ as = one_singleton_ancestors_cache[type_name] and return as
251
+
252
+ entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_name}"
253
+
254
+ case entry
255
+ when Environment::ClassEntry
256
+ validate_super_class!(type_name, entry)
257
+ primary = entry.primary
258
+ super_class = primary.decl.super_class
259
+
260
+ if type_name != BuiltinNames::BasicObject.name
261
+ if super_class
262
+ super_name = super_class.name
263
+ else
264
+ super_name = BuiltinNames::Object.name
265
+ end
266
+
267
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
268
+
269
+ ancestors = OneAncestors.singleton(
270
+ type_name: type_name,
271
+ super_class: Definition::Ancestor::Singleton.new(name: super_name)
272
+ )
273
+ else
274
+ ancestors = OneAncestors.singleton(
275
+ type_name: type_name,
276
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Class.name, args: [], source: :super)
277
+ )
278
+ end
279
+ when Environment::ModuleEntry
280
+ ancestors = OneAncestors.singleton(
281
+ type_name: type_name,
282
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Module.name, args: [], source: :super)
283
+ )
284
+ end
285
+
286
+ mixin_ancestors(entry,
287
+ included_modules: nil,
288
+ included_interfaces: nil,
289
+ prepended_modules: nil,
290
+ extended_modules: ancestors.extended_modules,
291
+ extended_interfaces: ancestors.extended_interfaces)
292
+
293
+ one_singleton_ancestors_cache[type_name] = ancestors
294
+ end
295
+
296
+ def one_interface_ancestors(type_name)
297
+ one_interface_ancestors_cache[type_name] ||=
298
+ begin
299
+ entry = env.interface_decls[type_name] or raise "Unknown name for one_interface_ancestors: #{type_name}"
300
+ params = entry.decl.type_params.each.map(&:name)
301
+
302
+ OneAncestors.interface(type_name: type_name, params: params).tap do |ancestors|
303
+ mixin_ancestors0(entry.decl,
304
+ align_params: nil,
305
+ included_modules: nil,
306
+ included_interfaces: ancestors.included_interfaces,
307
+ prepended_modules: nil,
308
+ extended_modules: nil,
309
+ extended_interfaces: nil)
310
+ end
311
+ end
312
+ end
313
+
314
+ def mixin_ancestors0(decl, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
315
+ decl.each_mixin do |member|
316
+ case member
317
+ when AST::Members::Include
318
+ module_name = member.name
319
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
320
+ ancestor = Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
321
+
322
+ case
323
+ when member.name.class? && included_modules
324
+ NoMixinFoundError.check!(member.name, env: env, member: member)
325
+ included_modules << ancestor
326
+ when member.name.interface? && included_interfaces
327
+ NoMixinFoundError.check!(member.name, env: env, member: member)
328
+ included_interfaces << ancestor
329
+ end
330
+
331
+ when AST::Members::Prepend
332
+ if prepended_modules
333
+ NoMixinFoundError.check!(member.name, env: env, member: member)
334
+
335
+ module_name = member.name
336
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
337
+
338
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
339
+ end
340
+
341
+ when AST::Members::Extend
342
+ module_name = member.name
343
+ module_args = member.args
344
+ ancestor = Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
345
+
346
+ case
347
+ when member.name.class? && extended_modules
348
+ NoMixinFoundError.check!(member.name, env: env, member: member)
349
+ extended_modules << ancestor
350
+ when member.name.interface? && extended_interfaces
351
+ NoMixinFoundError.check!(member.name, env: env, member: member)
352
+ extended_interfaces << ancestor
353
+ end
354
+ end
355
+ end
356
+ end
357
+
358
+ def mixin_ancestors(entry, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
359
+ entry.decls.each do |d|
360
+ decl = d.decl
361
+
362
+ align_params = Substitution.build(
363
+ decl.type_params.each.map(&:name),
364
+ Types::Variable.build(entry.type_params.each.map(&:name))
365
+ )
366
+
367
+ mixin_ancestors0(decl,
368
+ align_params: align_params,
369
+ included_modules: included_modules,
370
+ included_interfaces: included_interfaces,
371
+ extended_modules: extended_modules,
372
+ prepended_modules: prepended_modules,
373
+ extended_interfaces: extended_interfaces)
374
+ end
375
+ end
376
+
377
+ def instance_ancestors(type_name, building_ancestors: [])
378
+ as = instance_ancestors_cache[type_name] and return as
379
+
380
+ entry = env.class_decls[type_name] or raise "Unknown name for instance_ancestors: #{type_name}"
381
+ params = entry.type_params.each.map(&:name)
382
+ args = Types::Variable.build(params)
383
+ self_ancestor = Definition::Ancestor::Instance.new(name: type_name, args: args, source: nil)
384
+
385
+ RecursiveAncestorError.check!(self_ancestor,
386
+ ancestors: building_ancestors,
387
+ location: entry.primary.decl.location)
388
+ building_ancestors.push self_ancestor
389
+
390
+ one_ancestors = one_instance_ancestors(type_name)
391
+
392
+ ancestors = []
393
+
394
+ case entry
395
+ when Environment::ClassEntry
396
+ if super_class = one_ancestors.super_class
397
+ # @type var super_class: Definition::Ancestor::Instance
398
+ super_name = super_class.name
399
+ super_args = super_class.args
400
+
401
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
402
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
403
+ end
404
+ end
405
+
406
+ if self_types = one_ancestors.self_types
407
+ self_types.each do |mod|
408
+ if mod.name.class?
409
+ # Ensure there is no loop in ancestors chain
410
+ instance_ancestors(mod.name, building_ancestors: building_ancestors)
411
+ end
412
+ end
413
+ end
414
+
415
+ if included_modules = one_ancestors.included_modules
416
+ included_modules.each do |mod|
417
+ name = mod.name
418
+ arg_types = mod.args
419
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
420
+ ancestors.unshift(*mod_ancestors.apply(arg_types, location: entry.primary.decl.location))
421
+ end
422
+ end
423
+
424
+ ancestors.unshift(self_ancestor)
425
+
426
+ if prepended_modules = one_ancestors.prepended_modules
427
+ prepended_modules.each do |mod|
428
+ name = mod.name
429
+ arg_types = mod.args
430
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
431
+ ancestors.unshift(*mod_ancestors.apply(arg_types, location: entry.primary.decl.location))
432
+ end
433
+ end
434
+
435
+ building_ancestors.pop
436
+
437
+ instance_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
438
+ type_name: type_name,
439
+ params: params,
440
+ ancestors: ancestors
441
+ )
442
+ end
443
+
444
+ def singleton_ancestors(type_name, building_ancestors: [])
445
+ as = singleton_ancestors_cache[type_name] and return as
446
+
447
+ entry = env.class_decls[type_name] or raise "Unknown name for singleton_ancestors: #{type_name}"
448
+ self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
449
+
450
+ RecursiveAncestorError.check!(self_ancestor,
451
+ ancestors: building_ancestors,
452
+ location: entry.primary.decl.location)
453
+ building_ancestors.push self_ancestor
454
+
455
+ one_ancestors = one_singleton_ancestors(type_name)
456
+
457
+ ancestors = []
458
+
459
+ case super_class = one_ancestors.super_class
460
+ when Definition::Ancestor::Instance
461
+ super_name = super_class.name
462
+ super_args = super_class.args
463
+
464
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
465
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
466
+
467
+ when Definition::Ancestor::Singleton
468
+ super_name = super_class.name
469
+
470
+ super_ancestors = singleton_ancestors(super_name, building_ancestors: [])
471
+ ancestors.unshift(*super_ancestors.ancestors)
472
+ end
473
+
474
+ extended_modules = one_ancestors.extended_modules or raise
475
+ extended_modules.each do |mod|
476
+ name = mod.name
477
+ args = mod.args
478
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
479
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
480
+ end
481
+
482
+ ancestors.unshift(self_ancestor)
483
+
484
+ building_ancestors.pop
485
+
486
+ singleton_ancestors_cache[type_name] = Definition::SingletonAncestors.new(
487
+ type_name: type_name,
488
+ ancestors: ancestors
489
+ )
490
+ end
491
+
492
+ def interface_ancestors(type_name, building_ancestors: [])
493
+ as = interface_ancestors_cache[type_name] and return as
494
+
495
+ entry = env.interface_decls[type_name] or raise "Unknown name for interface_ancestors: #{type_name}"
496
+ params = entry.decl.type_params.each.map(&:name)
497
+ args = Types::Variable.build(params)
498
+ self_ancestor = Definition::Ancestor::Instance.new(name: type_name, args: args, source: nil)
499
+
500
+ RecursiveAncestorError.check!(self_ancestor,
501
+ ancestors: building_ancestors,
502
+ location: entry.decl.location)
503
+ building_ancestors.push self_ancestor
504
+
505
+ one_ancestors = one_interface_ancestors(type_name)
506
+ ancestors = []
507
+
508
+ included_interfaces = one_ancestors.included_interfaces or raise
509
+ included_interfaces.each do |a|
510
+ included_ancestors = interface_ancestors(a.name, building_ancestors: building_ancestors)
511
+ ancestors.unshift(*included_ancestors.apply(a.args, location: entry.decl.location))
512
+ end
513
+
514
+ ancestors.unshift(self_ancestor)
515
+ building_ancestors.pop
516
+
517
+ interface_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
518
+ type_name: type_name,
519
+ params: params,
520
+ ancestors: ancestors
521
+ )
522
+ end
523
+ end
524
+ end
525
+ end