rbs 0.20.1 → 1.0.0.pre

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