rbs 0.20.1 → 1.0.0.pre

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