rbs 0.18.1 → 1.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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