rbs 0.4.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +7 -1
  3. data/.gitignore +1 -1
  4. data/CHANGELOG.md +35 -0
  5. data/Gemfile +14 -0
  6. data/README.md +86 -47
  7. data/Rakefile +53 -21
  8. data/bin/rbs-prof +9 -0
  9. data/bin/run_in_md.rb +49 -0
  10. data/docs/stdlib.md +0 -2
  11. data/docs/syntax.md +6 -3
  12. data/goodcheck.yml +65 -0
  13. data/lib/rbs.rb +3 -0
  14. data/lib/rbs/ast/comment.rb +6 -0
  15. data/lib/rbs/ast/declarations.rb +106 -13
  16. data/lib/rbs/ast/members.rb +41 -17
  17. data/lib/rbs/cli.rb +317 -121
  18. data/lib/rbs/constant.rb +4 -4
  19. data/lib/rbs/constant_table.rb +51 -45
  20. data/lib/rbs/definition.rb +175 -59
  21. data/lib/rbs/definition_builder.rb +814 -604
  22. data/lib/rbs/environment.rb +352 -210
  23. data/lib/rbs/environment_walker.rb +14 -23
  24. data/lib/rbs/errors.rb +184 -3
  25. data/lib/rbs/factory.rb +14 -0
  26. data/lib/rbs/location.rb +15 -0
  27. data/lib/rbs/parser.y +100 -34
  28. data/lib/rbs/prototype/rb.rb +101 -113
  29. data/lib/rbs/prototype/rbi.rb +5 -3
  30. data/lib/rbs/prototype/runtime.rb +11 -7
  31. data/lib/rbs/substitution.rb +12 -1
  32. data/lib/rbs/test.rb +82 -3
  33. data/lib/rbs/test/errors.rb +5 -1
  34. data/lib/rbs/test/hook.rb +133 -259
  35. data/lib/rbs/test/observer.rb +17 -0
  36. data/lib/rbs/test/setup.rb +35 -19
  37. data/lib/rbs/test/setup_helper.rb +29 -0
  38. data/lib/rbs/test/spy.rb +0 -321
  39. data/lib/rbs/test/tester.rb +116 -0
  40. data/lib/rbs/test/type_check.rb +43 -7
  41. data/lib/rbs/type_name_resolver.rb +58 -0
  42. data/lib/rbs/types.rb +94 -2
  43. data/lib/rbs/validator.rb +55 -0
  44. data/lib/rbs/variance_calculator.rb +12 -2
  45. data/lib/rbs/version.rb +1 -1
  46. data/lib/rbs/writer.rb +127 -91
  47. data/rbs.gemspec +0 -10
  48. data/schema/decls.json +36 -10
  49. data/schema/members.json +3 -0
  50. data/stdlib/benchmark/benchmark.rbs +151 -151
  51. data/stdlib/builtin/enumerable.rbs +3 -3
  52. data/stdlib/builtin/file.rbs +0 -3
  53. data/stdlib/builtin/io.rbs +4 -4
  54. data/stdlib/builtin/proc.rbs +1 -2
  55. data/stdlib/builtin/thread.rbs +2 -2
  56. data/stdlib/csv/csv.rbs +4 -6
  57. data/stdlib/fiber/fiber.rbs +1 -1
  58. data/stdlib/json/json.rbs +7 -1
  59. data/stdlib/logger/formatter.rbs +23 -0
  60. data/stdlib/logger/log_device.rbs +39 -0
  61. data/stdlib/logger/logger.rbs +507 -0
  62. data/stdlib/logger/period.rbs +7 -0
  63. data/stdlib/logger/severity.rbs +8 -0
  64. data/stdlib/mutex_m/mutex_m.rbs +77 -0
  65. data/stdlib/pathname/pathname.rbs +6 -6
  66. data/stdlib/prime/integer-extension.rbs +1 -1
  67. data/stdlib/prime/prime.rbs +44 -44
  68. data/stdlib/pty/pty.rbs +159 -0
  69. data/stdlib/tmpdir/tmpdir.rbs +1 -1
  70. metadata +19 -130
  71. data/lib/rbs/test/test_helper.rb +0 -183
@@ -1,188 +1,375 @@
1
1
  module RBS
2
2
  class DefinitionBuilder
3
3
  attr_reader :env
4
+ attr_reader :type_name_resolver
5
+
4
6
  attr_reader :instance_cache
5
7
  attr_reader :singleton_cache
8
+ attr_reader :interface_cache
9
+
10
+ attr_reader :one_instance_cache
11
+ attr_reader :one_singleton_cache
12
+
13
+ attr_reader :instance_ancestors_cache
14
+ attr_reader :singleton_ancestor_cache
15
+
16
+ attr_reader :one_instance_ancestors_cache
17
+ attr_reader :one_singleton_ancestors_cache
18
+
19
+ class OneAncestors
20
+ attr_reader :type_name
21
+ attr_reader :params
22
+ attr_reader :super_class
23
+ attr_reader :self_types
24
+ attr_reader :included_modules
25
+ attr_reader :prepended_modules
26
+ attr_reader :extended_modules
27
+
28
+ def initialize(type_name:, params:, super_class:, self_types:, included_modules:, prepended_modules:, extended_modules:)
29
+ @type_name = type_name
30
+ @params = params
31
+ @super_class = super_class
32
+ @self_types = self_types
33
+ @included_modules = included_modules
34
+ @prepended_modules = prepended_modules
35
+ @extended_modules = extended_modules
36
+ end
37
+
38
+ def each_ancestor(&block)
39
+ if block_given?
40
+ yield super_class if super_class
41
+ self_types&.each(&block)
42
+ included_modules&.each(&block)
43
+ prepended_modules&.each(&block)
44
+ extended_modules&.each(&block)
45
+ else
46
+ enum_for :each_ancestor
47
+ end
48
+ end
49
+
50
+ def self.class_instance(type_name:, params:, super_class:)
51
+ new(
52
+ type_name: type_name,
53
+ params: params,
54
+ super_class: super_class,
55
+ self_types: nil,
56
+ included_modules: [],
57
+ prepended_modules: [],
58
+ extended_modules: nil
59
+ )
60
+ end
61
+
62
+ def self.singleton(type_name:, super_class:)
63
+ new(
64
+ type_name: type_name,
65
+ params: nil,
66
+ super_class: super_class,
67
+ self_types: nil,
68
+ included_modules: nil,
69
+ prepended_modules: nil,
70
+ extended_modules: []
71
+ )
72
+ end
73
+
74
+ def self.module_instance(type_name:, params:)
75
+ new(
76
+ type_name: type_name,
77
+ params: params,
78
+ self_types: [],
79
+ included_modules: [],
80
+ prepended_modules: [],
81
+ super_class: nil,
82
+ extended_modules: nil
83
+ )
84
+ end
85
+ end
6
86
 
7
87
  def initialize(env:)
8
88
  @env = env
89
+ @type_name_resolver = TypeNameResolver.from_env(env)
90
+
9
91
  @instance_cache = {}
10
92
  @singleton_cache = {}
93
+ @interface_cache = {}
94
+
95
+ @one_instance_cache = {}
96
+ @one_singleton_cache = {}
97
+
98
+ @instance_ancestors_cache = {}
99
+ @singleton_ancestor_cache = {}
100
+
101
+ @one_instance_ancestors_cache = {}
102
+ @one_singleton_ancestors_cache = {}
11
103
  end
12
104
 
13
- def build_ancestors(self_ancestor, ancestors: [], building_ancestors: [], location: nil)
14
- decl = env.find_class(self_ancestor.name)
15
- namespace = self_ancestor.name.absolute!.to_namespace
105
+ def validate_super_class!(type_name, entry)
106
+ with_super_classes = entry.decls.select {|d| d.decl.super_class }
16
107
 
17
- RecursiveAncestorError.check!(self_ancestor,
18
- ancestors: building_ancestors,
19
- location: location || decl.location)
20
- building_ancestors.push self_ancestor
108
+ return if with_super_classes.size <= 1
21
109
 
22
- case self_ancestor
23
- when Definition::Ancestor::Instance
24
- args = self_ancestor.args
25
- param_names = decl.type_params.each.map(&:name)
26
-
27
- InvalidTypeApplicationError.check!(
28
- type_name: self_ancestor.name,
29
- args: args,
30
- params: decl.type_params,
31
- location: location || decl.location
32
- )
110
+ super_types = with_super_classes.map do |d|
111
+ super_class = d.decl.super_class
112
+ Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
113
+ end
33
114
 
34
- sub = Substitution.build(param_names, args)
115
+ super_types.uniq!
35
116
 
36
- case decl
37
- when AST::Declarations::Class
38
- unless self_ancestor.name == BuiltinNames::BasicObject.name
39
- super_ancestor = decl.super_class&.yield_self do |super_class|
40
- Definition::Ancestor::Instance.new(
41
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location),
42
- args: super_class.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
43
- )
44
- end || Definition::Ancestor::Instance.new(name: BuiltinNames::Object.name, args: [])
117
+ return if super_types.size == 1
118
+
119
+ raise SuperclassMismatchError.new(name: type_name, super_classes: super_types, entry: entry)
120
+ end
121
+
122
+ def one_instance_ancestors(type_name)
123
+ as = one_instance_ancestors_cache[type_name] and return as
124
+
125
+ entry = env.class_decls[type_name] or raise "Unknown name for one_instance_ancestors: #{type_name}"
126
+ params = entry.type_params.each.map(&:name)
45
127
 
46
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
128
+ case entry
129
+ when Environment::ClassEntry
130
+ validate_super_class!(type_name, entry)
131
+ primary = entry.primary
132
+ super_class = primary.decl.super_class
133
+
134
+ if type_name != BuiltinNames::BasicObject.name
135
+ if super_class
136
+ super_name = super_class.name
137
+ super_args = super_class.args
138
+ else
139
+ super_name = BuiltinNames::Object.name
140
+ super_args = []
47
141
  end
142
+
143
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
144
+
145
+ ancestors = OneAncestors.class_instance(
146
+ type_name: type_name,
147
+ params: params,
148
+ super_class: Definition::Ancestor::Instance.new(name: super_name, args: super_args)
149
+ )
150
+ else
151
+ ancestors = OneAncestors.class_instance(
152
+ type_name: type_name,
153
+ params: params,
154
+ super_class: nil
155
+ )
48
156
  end
157
+ when Environment::ModuleEntry
158
+ ancestors = OneAncestors.module_instance(type_name: type_name, params: params)
49
159
 
50
- decl.members.each do |member|
51
- case member
52
- when AST::Members::Include
53
- if member.name.class?
54
- ancestor = Definition::Ancestor::Instance.new(
55
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
56
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
57
- )
58
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
59
- end
60
- end
160
+ entry.self_types.each do |module_self|
161
+ NoSelfTypeFoundError.check!(module_self, env: env)
162
+ ancestors.self_types.push Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args)
61
163
  end
164
+ else
165
+ raise "Unexpected entry for: #{type_name}"
166
+ end
62
167
 
63
- ancestors.unshift(self_ancestor)
168
+ mixin_ancestors(entry,
169
+ included_modules: ancestors.included_modules,
170
+ prepended_modules: ancestors.prepended_modules,
171
+ extended_modules: nil)
64
172
 
65
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
66
- InvalidExtensionParameterError.check!(
67
- type_name: self_ancestor.name,
68
- extension_name: extension.extension_name,
69
- extension_params: extension.type_params,
70
- class_params: self_ancestor.args.map(&:name),
71
- location: extension.location
72
- )
173
+ one_instance_ancestors_cache[type_name] = ancestors
174
+ end
73
175
 
74
- sub = Substitution.build(extension.type_params, self_ancestor.args)
176
+ def one_singleton_ancestors(type_name)
177
+ as = one_singleton_ancestors_cache[type_name] and return as
75
178
 
76
- extension.members.each do |member|
77
- case member
78
- when AST::Members::Include
79
- if member.name.class?
80
- ancestor = Definition::Ancestor::Instance.new(
81
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
82
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
83
- )
84
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
85
- end
86
- end
87
- end
179
+ entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_name}"
88
180
 
89
- extension_ancestor = Definition::Ancestor::ExtensionInstance.new(
90
- name: extension.name.absolute!,
91
- extension_name: extension.extension_name,
92
- args: self_ancestor.args,
93
- )
94
- ancestors.unshift(extension_ancestor)
181
+ case entry
182
+ when Environment::ClassEntry
183
+ validate_super_class!(type_name, entry)
184
+ primary = entry.primary
185
+ super_class = primary.decl.super_class
95
186
 
96
- extension.members.each do |member|
97
- case member
98
- when AST::Members::Prepend
99
- if member.name.class?
100
- ancestor = Definition::Ancestor::Instance.new(
101
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
102
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
103
- )
104
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
105
- end
106
- end
187
+ if type_name != BuiltinNames::BasicObject.name
188
+ if super_class
189
+ super_name = super_class.name
190
+ else
191
+ super_name = BuiltinNames::Object.name
107
192
  end
108
- end
109
193
 
110
- decl.members.each do |member|
111
- case member
112
- when AST::Members::Prepend
113
- ancestor = Definition::Ancestor::Instance.new(
114
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
115
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
116
- )
117
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
118
- end
119
- end
120
- when Definition::Ancestor::Singleton
121
- case decl
122
- when AST::Declarations::Class
123
- if self_ancestor.name == BuiltinNames::BasicObject.name
124
- class_ancestor = Definition::Ancestor::Instance.new(
125
- name: BuiltinNames::Class.name,
126
- args: []
127
- )
128
- build_ancestors class_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
129
- else
130
- super_ancestor = decl.super_class&.yield_self do |super_class|
131
- Definition::Ancestor::Singleton.new(
132
- name: absolute_type_name(super_class.name, namespace: namespace, location: location || decl.location)
133
- )
134
- end || Definition::Ancestor::Singleton.new(name: BuiltinNames::Object.name)
194
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
135
195
 
136
- build_ancestors(super_ancestor, ancestors: ancestors, building_ancestors: building_ancestors)
137
- end
138
- when AST::Declarations::Module
139
- module_ancestor = Definition::Ancestor::Instance.new(
140
- name: BuiltinNames::Module.name,
141
- args: []
196
+ ancestors = OneAncestors.singleton(
197
+ type_name: type_name,
198
+ super_class: Definition::Ancestor::Singleton.new(name: super_name)
199
+ )
200
+ else
201
+ ancestors = OneAncestors.singleton(
202
+ type_name: type_name,
203
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Class.name, args: [])
142
204
  )
143
- build_ancestors module_ancestor, ancestors: ancestors, building_ancestors: building_ancestors
144
205
  end
206
+ when Environment::ModuleEntry
207
+ ancestors = OneAncestors.singleton(
208
+ type_name: type_name,
209
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Module.name, args: [])
210
+ )
145
211
 
146
- decl.members.each do |member|
212
+ else
213
+ raise "Unexpected entry for: #{type_name}"
214
+ end
215
+
216
+ mixin_ancestors(entry,
217
+ included_modules: nil,
218
+ prepended_modules: nil,
219
+ extended_modules: ancestors.extended_modules)
220
+
221
+ one_singleton_ancestors_cache[type_name] = ancestors
222
+ end
223
+
224
+ def mixin_ancestors(entry, included_modules:, extended_modules:, prepended_modules:)
225
+ entry.decls.each do |d|
226
+ decl = d.decl
227
+
228
+ align_params = Substitution.build(
229
+ decl.type_params.each.map(&:name),
230
+ Types::Variable.build(entry.type_params.each.map(&:name))
231
+ )
232
+
233
+ decl.each_mixin do |member|
147
234
  case member
235
+ when AST::Members::Include
236
+ if included_modules
237
+ NoMixinFoundError.check!(member.name, env: env, member: member)
238
+
239
+ module_name = member.name
240
+ module_args = member.args.map {|type| type.sub(align_params) }
241
+
242
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
243
+ end
244
+
245
+ when AST::Members::Prepend
246
+ if prepended_modules
247
+ NoMixinFoundError.check!(member.name, env: env, member: member)
248
+
249
+ module_name = member.name
250
+ module_args = member.args.map {|type| type.sub(align_params) }
251
+
252
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
253
+ end
254
+
148
255
  when AST::Members::Extend
149
- if member.name.class?
150
- ancestor = Definition::Ancestor::Instance.new(
151
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
152
- args: member.args.map {|ty| absolute_type(ty.sub(sub), namespace: namespace) }
153
- )
154
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
256
+ if extended_modules
257
+ NoMixinFoundError.check!(member.name, env: env, member: member)
258
+
259
+ module_name = member.name
260
+ module_args = member.args
261
+
262
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
155
263
  end
156
264
  end
157
265
  end
266
+ end
267
+ end
268
+
269
+ def instance_ancestors(type_name, building_ancestors: [])
270
+ as = instance_ancestors_cache[type_name] and return as
271
+
272
+ entry = env.class_decls[type_name] or raise "Unknown name for instance_ancestors: #{type_name}"
273
+ params = entry.type_params.each.map(&:name)
274
+ args = Types::Variable.build(params)
275
+ self_ancestor = Definition::Ancestor::Instance.new(name: type_name, args: args)
276
+
277
+ RecursiveAncestorError.check!(self_ancestor,
278
+ ancestors: building_ancestors,
279
+ location: entry.primary.decl.location)
280
+ building_ancestors.push self_ancestor
281
+
282
+ one_ancestors = one_instance_ancestors(type_name)
283
+
284
+ ancestors = []
285
+
286
+ case entry
287
+ when Environment::ClassEntry
288
+ if one_ancestors.super_class
289
+ super_name = one_ancestors.super_class.name
290
+ super_args = one_ancestors.super_class.args
291
+
292
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
293
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
294
+ end
295
+ end
158
296
 
159
- ancestors.unshift(self_ancestor)
297
+ one_ancestors.included_modules.each do |mod|
298
+ if mod.name.class?
299
+ name = mod.name
300
+ args = mod.args
301
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
302
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
303
+ end
304
+ end
160
305
 
161
- env.each_extension(self_ancestor.name).sort_by {|e| e.extension_name.to_s }.each do |extension|
162
- extension.members.each do |member|
163
- case member
164
- when AST::Members::Extend
165
- if member.name.class?
166
- ancestor = Definition::Ancestor::Instance.new(
167
- name: absolute_type_name(member.name, namespace: namespace, location: member.location),
168
- args: member.args.map {|ty| absolute_type(ty, namespace: namespace) }
169
- )
170
- build_ancestors ancestor, ancestors: ancestors, building_ancestors: building_ancestors, location: member.location
171
- end
172
- end
173
- end
306
+ ancestors.unshift(self_ancestor)
174
307
 
175
- extension_ancestor = Definition::Ancestor::ExtensionSingleton.new(
176
- name: extension.name.absolute!,
177
- extension_name: extension.extension_name
178
- )
179
- ancestors.unshift(extension_ancestor)
308
+ one_ancestors.prepended_modules.each do |mod|
309
+ if mod.name.class?
310
+ name = mod.name
311
+ args = mod.args
312
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
313
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
180
314
  end
181
315
  end
182
316
 
183
317
  building_ancestors.pop
184
318
 
185
- ancestors
319
+ instance_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
320
+ type_name: type_name,
321
+ params: params,
322
+ ancestors: ancestors
323
+ )
324
+ end
325
+
326
+ def singleton_ancestors(type_name, building_ancestors: [])
327
+ as = singleton_ancestor_cache[type_name] and return as
328
+
329
+ entry = env.class_decls[type_name] or raise "Unknown name for singleton_ancestors: #{type_name}"
330
+ self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
331
+
332
+ RecursiveAncestorError.check!(self_ancestor,
333
+ ancestors: building_ancestors,
334
+ location: entry.primary.decl.location)
335
+ building_ancestors.push self_ancestor
336
+
337
+ one_ancestors = one_singleton_ancestors(type_name)
338
+
339
+ ancestors = []
340
+
341
+ case one_ancestors.super_class
342
+ when Definition::Ancestor::Instance
343
+ super_name = one_ancestors.super_class.name
344
+ super_args = one_ancestors.super_class.args
345
+
346
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
347
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
348
+
349
+ when Definition::Ancestor::Singleton
350
+ super_name = one_ancestors.super_class.name
351
+
352
+ super_ancestors = singleton_ancestors(super_name, building_ancestors: [])
353
+ ancestors.unshift(*super_ancestors.ancestors)
354
+ end
355
+
356
+ one_ancestors.extended_modules.each do |mod|
357
+ if mod.name.class?
358
+ name = mod.name
359
+ args = mod.args
360
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
361
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
362
+ end
363
+ end
364
+
365
+ ancestors.unshift(self_ancestor)
366
+
367
+ building_ancestors.pop
368
+
369
+ singleton_ancestor_cache[type_name] = Definition::SingletonAncestors.new(
370
+ type_name: type_name,
371
+ ancestors: ancestors
372
+ )
186
373
  end
187
374
 
188
375
  def each_member_with_accessibility(members, accessibility: :public)
@@ -198,336 +385,377 @@ module RBS
198
385
  end
199
386
  end
200
387
 
388
+ def ensure_namespace!(namespace, location:)
389
+ namespace.ascend do |ns|
390
+ unless ns.empty?
391
+ NoTypeFoundError.check!(ns.to_type_name, env: env, location: location)
392
+ end
393
+ end
394
+ end
395
+
201
396
  def build_instance(type_name)
202
397
  try_cache type_name, cache: instance_cache do
203
- decl = env.find_class(type_name)
204
- self_ancestor = Definition::Ancestor::Instance.new(name: type_name,
205
- args: Types::Variable.build(decl.type_params.each.map(&:name)))
206
- self_type = Types::ClassInstance.new(name: type_name, args: self_ancestor.args, location: nil)
207
-
208
- case decl
209
- when AST::Declarations::Class, AST::Declarations::Module
210
- ancestors = build_ancestors(self_ancestor)
211
- definition_pairs = ancestors.map do |ancestor|
398
+ entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
399
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
400
+
401
+ case entry
402
+ when Environment::ClassEntry, Environment::ModuleEntry
403
+ ancestors = instance_ancestors(type_name)
404
+ self_type = Types::ClassInstance.new(name: type_name,
405
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
406
+ location: nil)
407
+
408
+ definition_pairs = ancestors.ancestors.map do |ancestor|
212
409
  case ancestor
213
410
  when Definition::Ancestor::Instance
214
411
  [ancestor, build_one_instance(ancestor.name)]
215
412
  when Definition::Ancestor::Singleton
216
413
  [ancestor, build_one_singleton(ancestor.name)]
217
- when Definition::Ancestor::ExtensionInstance
218
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
219
- when Definition::Ancestor::ExtensionSingleton
220
- [ancestor, build_one_extension_singleton(ancestor.name, extension_name: ancestor.extension_name)]
414
+ else
415
+ raise
221
416
  end
222
417
  end
223
418
 
224
- if decl.is_a?(AST::Declarations::Module)
225
- if decl.self_type
226
- self_interface = absolute_type(decl.self_type, namespace: type_name.to_namespace)
227
- ancestor = Definition::Ancestor::Instance.new(name: self_interface.name,
228
- args: self_interface.args)
229
-
230
- definition_pairs.push [ancestor, build_one_instance(ancestor.name)]
419
+ if entry.is_a?(Environment::ModuleEntry)
420
+ entry.self_types.each do |module_self|
421
+ ancestor = Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args)
422
+ definition_pairs.push(
423
+ [
424
+ ancestor,
425
+ if module_self.name.interface?
426
+ build_interface(module_self.name)
427
+ else
428
+ build_instance(module_self.name)
429
+ end
430
+ ]
431
+ )
231
432
  end
232
433
  end
233
434
 
234
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
435
+ merge_definitions(type_name, definition_pairs, entry: entry, self_type: self_type, ancestors: ancestors)
436
+
437
+ else
438
+ raise
235
439
  end
236
440
  end
237
441
  end
238
442
 
239
443
  def build_singleton(type_name)
240
444
  try_cache type_name, cache: singleton_cache do
241
- decl = env.find_class(type_name)
242
- self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
243
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
445
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
446
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
447
+
448
+ case entry
449
+ when Environment::ClassEntry, Environment::ModuleEntry
450
+ ancestors = singleton_ancestors(type_name)
451
+ self_type = Types::ClassSingleton.new(name: type_name, location: nil)
452
+ instance_type = Types::ClassInstance.new(
453
+ name: type_name,
454
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
455
+ location: nil
456
+ )
244
457
 
245
- case decl
246
- when AST::Declarations::Class, AST::Declarations::Module
247
- ancestors = build_ancestors(self_ancestor)
248
- definition_pairs = ancestors.map do |ancestor|
458
+ definition_pairs = ancestors.ancestors.map do |ancestor|
249
459
  case ancestor
250
460
  when Definition::Ancestor::Instance
251
461
  [ancestor, build_one_instance(ancestor.name)]
252
462
  when Definition::Ancestor::Singleton
253
- [ancestor, build_one_singleton(ancestor.name)]
254
- when Definition::Ancestor::ExtensionInstance
255
- [ancestor, build_one_instance(ancestor.name, extension_name: ancestor.extension_name)]
256
- when Definition::Ancestor::ExtensionSingleton
257
- [ancestor, build_one_singleton(ancestor.name, extension_name: ancestor.extension_name)]
463
+ definition = build_one_singleton(ancestor.name)
464
+ definition = definition.sub(Substitution.build([], [], instance_type: instance_type))
465
+ definition = definition.map_method_type do |method_type|
466
+ s = Substitution.build(
467
+ method_type.free_variables.to_a,
468
+ method_type.free_variables.map { Types::Bases::Any.new(location: nil) }
469
+ )
470
+ method_type.sub(s)
471
+ end
472
+
473
+ [
474
+ ancestor,
475
+ definition
476
+ ]
477
+ else
478
+ raise
258
479
  end
259
480
  end
260
481
 
261
- if decl.is_a?(AST::Declarations::Class)
262
- definition_pairs.find {|ancestor, _| ancestor == self_ancestor }.tap do |_, definition|
263
- unless definition.methods[:new]&.implemented_in == decl
264
- instance_definition = build_instance(type_name)
265
- class_params = decl.type_params.each.map(&:name)
266
- initialize_method = instance_definition.methods[:initialize]
267
- method_types = initialize_method.method_types.map do |method_type|
268
- case method_type
269
- when MethodType
270
- fvs = method_type.free_variables + class_params
271
- unless fvs.empty?
272
- param_name_set = Set.new(class_params)
273
- bound_variables = method_type.type_params
274
- renamed_types = bound_variables.map do |x|
275
- if param_name_set.member?(x)
276
- Types::Variable.fresh(x)
277
- else
278
- Types::Variable.new(name: x, location: nil)
279
- end
280
- end
281
- sub = Substitution.build(bound_variables, renamed_types)
282
- method_type_params = renamed_types.unshift(*class_params)
283
- else
284
- sub = Substitution.build([], [])
285
- method_type_params = method_type.type_params
286
- end
482
+ merge_definitions(type_name, definition_pairs, entry: entry, self_type: self_type, ancestors: ancestors)
483
+ else
484
+ raise
485
+ end
486
+ end
487
+ end
287
488
 
288
- MethodType.new(
289
- type_params: method_type_params,
290
- type: method_type.type.sub(sub).with_return_type(instance_definition.self_type),
291
- block: method_type.block&.yield_self {|ty| ty.sub(sub) },
292
- location: method_type.location
293
- )
294
- end
295
- end.compact
296
-
297
- definition.methods[:new] = Definition::Method.new(
298
- super_method: nil,
299
- defined_in: nil,
300
- implemented_in: env.find_class(RBS::BuiltinNames::Class.name),
301
- method_types: method_types,
302
- accessibility: :public,
303
- attributes: [:incompatible],
304
- annotations: [],
305
- comment: nil
489
+ def method_definition_members(type_name, entry, kind:)
490
+ interface_methods = {}
491
+ methods = {}
492
+
493
+ entry.decls.each do |d|
494
+ each_member_with_accessibility(d.decl.members) do |member, accessibility|
495
+ case member
496
+ when AST::Members::MethodDefinition
497
+ case kind
498
+ when :singleton
499
+ next unless member.singleton?
500
+ when :instance
501
+ next unless member.instance?
502
+ end
503
+
504
+ methods[member.name] ||= []
505
+ methods[member.name] << [
506
+ member.update(types: member.types),
507
+ accessibility
508
+ ]
509
+ when AST::Members::Include, AST::Members::Extend
510
+ if member.name.interface?
511
+ if (kind == :instance && member.is_a?(AST::Members::Include)) || (kind == :singleton && member.is_a?(AST::Members::Extend))
512
+ NoMixinFoundError.check!(member.name, env: env, member: member)
513
+
514
+ interface_name = member.name
515
+ interface_args = member.args
516
+
517
+ interface_definition = build_interface(interface_name)
518
+
519
+ InvalidTypeApplicationError.check!(
520
+ type_name: interface_name,
521
+ args: interface_args,
522
+ params: interface_definition.type_params_decl,
523
+ location: member.location
306
524
  )
525
+
526
+ sub = Substitution.build(interface_definition.type_params, interface_args)
527
+
528
+ interface_definition.methods.each do |name, method|
529
+ interface_methods[name] = [method.sub(sub), member]
530
+ end
307
531
  end
308
532
  end
309
533
  end
534
+ end
535
+ end
536
+
537
+ result = {}
538
+
539
+ interface_methods.each do |name, pair|
540
+ method_definition, _ = pair
541
+ result[name] = [:public, method_definition]
542
+ end
543
+
544
+ methods.each do |method_name, array|
545
+ if result[method_name]
546
+ unless array.all? {|pair| pair[0].overload? }
547
+ raise MethodDefinitionConflictWithInterfaceMixinError.new(
548
+ type_name: type_name,
549
+ method_name: method_name,
550
+ kind: :instance,
551
+ mixin_member: interface_methods[method_name][1],
552
+ entries: array.map(&:first)
553
+ )
554
+ end
555
+
556
+ unless array.all? {|pair| pair[1] == :public}
557
+ raise InconsistentMethodVisibilityError.new(
558
+ type_name: type_name,
559
+ method_name: method_name,
560
+ kind: :instance,
561
+ member_pairs: array
562
+ )
563
+ end
564
+
565
+ result[method_name] += array.map(&:first)
566
+ else
567
+ case
568
+ when array.size == 1 && !array[0][0].overload?
569
+ member, visibility = array[0]
570
+ result[method_name] = [visibility, nil, member]
571
+
572
+ when array.count {|pair| !pair[0].overload? } == 1
573
+ visibilities = array.group_by {|pair| pair[1] }
574
+
575
+ if visibilities.size > 1
576
+ raise InconsistentMethodVisibilityError.new(
577
+ type_name: type_name,
578
+ method_name: method_name,
579
+ kind: :instance,
580
+ member_pairs: array
581
+ )
582
+ end
310
583
 
311
- merge_definitions(definition_pairs, decl: decl, self_type: self_type, ancestors: ancestors)
584
+ overloads, primary = array.map(&:first).partition(&:overload?)
585
+ result[method_name] = [array[0][1], nil, *primary, *overloads]
586
+
587
+ else
588
+ raise InvalidOverloadMethodError.new(
589
+ type_name: type_name,
590
+ method_name: method_name,
591
+ kind: :instance,
592
+ members: array.map(&:first)
593
+ )
594
+ end
312
595
  end
313
596
  end
597
+
598
+ result
314
599
  end
315
600
 
316
- def build_one_instance(type_name, extension_name: nil)
317
- decl = if extension_name
318
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
319
- raise "Unknown extension: #{type_name} (#{extension_name})"
320
- else
321
- env.find_class(type_name)
322
- end
323
-
324
- case decl
325
- when AST::Declarations::Interface
326
- build_interface type_name, decl
327
- else
328
- namespace = type_name.to_namespace
601
+ def build_one_instance(type_name)
602
+ try_cache(type_name, cache: one_instance_cache) do
603
+ entry = env.class_decls[type_name]
329
604
 
330
- case decl
331
- when AST::Declarations::Class, AST::Declarations::Module
332
- self_type = Types::ClassInstance.new(name: type_name,
333
- args: Types::Variable.build(decl.type_params.each.map(&:name)),
334
- location: nil)
335
- ancestors = [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
336
- when AST::Declarations::Extension
337
- self_type = Types::ClassInstance.new(name: type_name, args: Types::Variable.build(decl.type_params), location: nil)
338
- ancestors = [Definition::Ancestor::ExtensionInstance.new(name: type_name,
339
- extension_name: extension_name,
340
- args: self_type.args)]
341
- end
605
+ self_type = Types::ClassInstance.new(name: type_name,
606
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
607
+ location: nil)
608
+ ancestors = [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
342
609
 
343
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
344
- alias_members = []
610
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
611
+ method_definition_members(type_name, entry, kind: :instance).each do |method_name, array|
612
+ visibility, method_def, *members = array
345
613
 
346
- each_member_with_accessibility(decl.members) do |member, accessibility|
347
- case member
348
- when AST::Members::MethodDefinition
349
- if member.instance?
350
- name = member.name
351
- method_types = member.types.map do |method_type|
352
- case method_type
353
- when MethodType
354
- method_type.map_type do |type|
355
- absolute_type(type, namespace: namespace)
356
- end
357
- when :super
358
- :super
359
- end
614
+ m = if method_def
615
+ Definition::Method.new(
616
+ super_method: nil,
617
+ accessibility: visibility,
618
+ defs: method_def.defs.map {|defn| defn.update(implemented_in: type_name) }
619
+ )
620
+ else
621
+ Definition::Method.new(
622
+ super_method: nil,
623
+ accessibility: visibility,
624
+ defs: []
625
+ )
360
626
  end
361
627
 
362
- DuplicatedMethodDefinitionError.check!(
363
- decl: decl,
364
- methods: definition.methods,
365
- name: name,
366
- location: member.location
367
- )
368
-
369
- attrs = if name == :initialize
370
- (member.attributes + [:incompatible]).uniq
371
- else
372
- member.attributes
373
- end
374
-
375
- definition.methods[name] = Definition::Method.new(super_method: nil,
376
- method_types: method_types,
377
- defined_in: decl,
378
- implemented_in: decl,
379
- accessibility: accessibility,
380
- attributes: attrs,
381
- annotations: member.annotations,
382
- comment: member.comment)
383
- end
384
- when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
385
- name = member.name
386
- type = absolute_type(member.type, namespace: namespace)
387
- ivar_name = case member.ivar_name
388
- when false
389
- nil
390
- else
391
- member.ivar_name || :"@#{member.name}"
392
- end
393
-
394
- if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
395
- definition.methods[name] = Definition::Method.new(
396
- super_method: nil,
397
- method_types: [
398
- MethodType.new(
399
- type_params: [],
400
- type: Types::Function.empty(type),
401
- block: nil,
402
- location: nil
403
- )
404
- ],
405
- defined_in: decl,
406
- implemented_in: decl,
407
- accessibility: accessibility,
408
- attributes: [],
409
- annotations: member.annotations,
410
- comment: member.comment
628
+ definition.methods[method_name] = members.inject(m) do |original, member|
629
+ defs = member.types.map do |method_type|
630
+ Definition::Method::TypeDef.new(
631
+ type: method_type,
632
+ member: member,
633
+ implemented_in: type_name,
634
+ defined_in: type_name
411
635
  )
412
636
  end
413
637
 
414
- if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
415
- definition.methods[:"#{name}="] = Definition::Method.new(
416
- super_method: nil,
417
- method_types: [
418
- MethodType.new(
419
- type_params: [],
420
- type: Types::Function.new(required_positionals: [Types::Function::Param.new(name: name, type: type)],
421
- optional_positionals: [],
422
- rest_positionals: nil,
423
- trailing_positionals: [],
424
- required_keywords: {},
425
- optional_keywords: {},
426
- rest_keywords: nil,
427
- return_type: type),
428
- block: nil,
429
- location: nil
430
- )
431
- ],
432
- defined_in: decl,
433
- implemented_in: decl,
434
- accessibility: accessibility,
435
- attributes: [],
436
- annotations: member.annotations,
437
- comment: member.comment
638
+ Definition::Method.new(
639
+ super_method: nil,
640
+ defs: defs + original.defs,
641
+ accessibility: original.accessibility
642
+ )
643
+ end
644
+ end
645
+
646
+ entry.decls.each do |d|
647
+ each_member_with_accessibility(d.decl.members) do |member, accessibility|
648
+ case member
649
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
650
+ name = member.name
651
+ type = member.type
652
+
653
+ ivar_name = case member.ivar_name
654
+ when false
655
+ nil
656
+ else
657
+ member.ivar_name || :"@#{member.name}"
658
+ end
659
+
660
+ if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
661
+ definition.methods[name] = Definition::Method.new(
662
+ super_method: nil,
663
+ defs: [
664
+ Definition::Method::TypeDef.new(
665
+ type: MethodType.new(
666
+ type_params: [],
667
+ type: Types::Function.empty(type),
668
+ block: nil,
669
+ location: nil
670
+ ),
671
+ member: member,
672
+ defined_in: type_name,
673
+ implemented_in: type_name
674
+ )
675
+ ],
676
+ accessibility: accessibility
677
+ )
678
+ end
679
+
680
+ if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
681
+ definition.methods[:"#{name}="] = Definition::Method.new(
682
+ super_method: nil,
683
+ defs: [
684
+ Definition::Method::TypeDef.new(
685
+ type: MethodType.new(
686
+ type_params: [],
687
+ type: Types::Function.empty(type).update(
688
+ required_positionals: [Types::Function::Param.new(name: name, type: type)]
689
+ ),
690
+ block: nil,
691
+ location: nil
692
+ ),
693
+ member: member,
694
+ defined_in: type_name,
695
+ implemented_in: type_name
696
+ ),
697
+ ],
698
+ accessibility: accessibility
699
+ )
700
+ end
701
+
702
+ if ivar_name
703
+ definition.instance_variables[ivar_name] = Definition::Variable.new(
704
+ parent_variable: nil,
705
+ type: type,
706
+ declared_in: type_name
707
+ )
708
+ end
709
+
710
+ when AST::Members::InstanceVariable
711
+ definition.instance_variables[member.name] = Definition::Variable.new(
712
+ parent_variable: nil,
713
+ type: member.type,
714
+ declared_in: type_name
438
715
  )
439
- end
440
716
 
441
- if ivar_name
442
- definition.instance_variables[ivar_name] = Definition::Variable.new(
717
+ when AST::Members::ClassVariable
718
+ definition.class_variables[member.name] = Definition::Variable.new(
443
719
  parent_variable: nil,
444
- type: type,
445
- declared_in: decl
720
+ type: member.type,
721
+ declared_in: type_name
446
722
  )
447
- end
448
723
 
449
- when AST::Members::Alias
450
- if member.instance?
451
- alias_members << member
452
724
  end
453
- when AST::Members::Include
454
- if member.name.interface?
455
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
456
- interface_definition = build_one_instance(absolute_name)
457
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
458
-
459
- InvalidTypeApplicationError.check!(
460
- type_name: absolute_name,
461
- args: absolute_args,
462
- params: interface_definition.type_params_decl,
463
- location: member.location
464
- )
725
+ end
726
+ end
465
727
 
466
- sub = Substitution.build(interface_definition.type_params, absolute_args)
467
- interface_definition.methods.each do |name, method|
468
- method_types = method.method_types.map do |method_type|
469
- method_type.sub(sub).map_type do |type|
470
- absolute_type(type, namespace: namespace)
471
- end
472
- end
728
+ entry.decls.each do |d|
729
+ d.decl.members.each do |member|
730
+ case member
731
+ when AST::Members::Alias
732
+ if member.instance?
733
+ UnknownMethodAliasError.check!(
734
+ methods: definition.methods,
735
+ original_name: member.old_name,
736
+ aliased_name: member.new_name,
737
+ location: member.location
738
+ )
473
739
 
474
740
  DuplicatedMethodDefinitionError.check!(
475
- decl: decl,
741
+ decl: d.decl,
476
742
  methods: definition.methods,
477
- name: name,
743
+ name: member.new_name,
478
744
  location: member.location
479
745
  )
480
746
 
481
- definition.methods[name] = Definition::Method.new(
482
- super_method: nil,
483
- method_types: method_types,
484
- defined_in: method.defined_in,
485
- implemented_in: decl,
486
- accessibility: method.accessibility,
487
- attributes: [],
488
- annotations: method.annotations,
489
- comment: member.comment
490
- )
747
+ definition.methods[member.new_name] = definition.methods[member.old_name]
491
748
  end
492
749
  end
493
- when AST::Members::InstanceVariable
494
- definition.instance_variables[member.name] = Definition::Variable.new(
495
- type: absolute_type(member.type, namespace: namespace),
496
- parent_variable: nil,
497
- declared_in: decl
498
- )
499
- when AST::Members::ClassVariable
500
- definition.class_variables[member.name] = Definition::Variable.new(
501
- type: absolute_type(member.type, namespace: namespace),
502
- parent_variable: nil,
503
- declared_in: decl
504
- )
505
750
  end
506
751
  end
507
752
 
508
- alias_members.each do |member|
509
- UnknownMethodAliasError.check!(
510
- methods: definition.methods,
511
- original_name: member.old_name,
512
- aliased_name: member.new_name,
513
- location: member.location
514
- )
515
-
516
- DuplicatedMethodDefinitionError.check!(
517
- decl: decl,
518
- methods: definition.methods,
519
- name: member.new_name,
520
- location: member.location
753
+ entry.decls.each do |d|
754
+ validate_parameter_variance(
755
+ decl: d.decl,
756
+ methods: definition.methods
521
757
  )
522
-
523
- # FIXME: may cause a problem if #old_name has super type
524
- definition.methods[member.new_name] = definition.methods[member.old_name]
525
758
  end
526
-
527
- validate_parameter_variance(
528
- decl: decl,
529
- methods: definition.methods
530
- )
531
759
  end
532
760
  end
533
761
  end
@@ -543,14 +771,8 @@ module RBS
543
771
  end
544
772
 
545
773
  def validate_parameter_variance(decl:, methods:)
546
- type_params = case decl
547
- when AST::Declarations::Extension
548
- env.find_class(decl.name.absolute!).type_params.rename_to(decl.type_params)
549
- else
550
- decl.type_params
551
- end
774
+ type_params = decl.type_params
552
775
 
553
- namespace = decl.name.absolute!.to_namespace
554
776
  calculator = VarianceCalculator.new(builder: self)
555
777
  param_names = type_params.each.map(&:name)
556
778
 
@@ -558,9 +780,8 @@ module RBS
558
780
 
559
781
  if decl.is_a?(AST::Declarations::Class)
560
782
  if decl.super_class
561
- absolute_super_name = absolute_type_name(decl.super_class.name, namespace: namespace, location: decl.location)
562
- absolute_args = decl.super_class.args.map {|type| absolute_type(type, namespace: namespace) }
563
- result = calculator.in_inherit(name: absolute_super_name, args: absolute_args, variables: param_names)
783
+ super_class = decl.super_class
784
+ result = calculator.in_inherit(name: super_class.name, args: super_class.args, variables: param_names)
564
785
 
565
786
  validate_params_with type_params, result: result do |param|
566
787
  errors.push InvalidVarianceAnnotationError::InheritanceError.new(
@@ -574,9 +795,7 @@ module RBS
574
795
  case member
575
796
  when AST::Members::Include
576
797
  if member.name.class?
577
- absolute_module_name = absolute_type_name(member.name, namespace: namespace, location: decl.location)
578
- absolute_args = member.args.map {|type| absolute_type(type, namespace: namespace) }
579
- result = calculator.in_inherit(name: absolute_module_name, args: absolute_args, variables: param_names)
798
+ result = calculator.in_inherit(name: member.name, args: member.args, variables: param_names)
580
799
 
581
800
  validate_params_with type_params, result: result do |param|
582
801
  errors.push InvalidVarianceAnnotationError::MixinError.new(
@@ -610,148 +829,151 @@ module RBS
610
829
  end
611
830
  end
612
831
 
613
- def build_one_singleton(type_name, extension_name: nil)
614
- decl = if extension_name
615
- env.each_extension(type_name).find {|ext| ext.extension_name == extension_name } or
616
- raise "Unknown extension: #{type_name} (#{extension_name})"
617
- else
618
- env.find_class(type_name)
619
- end
620
-
621
- namespace = type_name.to_namespace
832
+ def build_one_singleton(type_name)
833
+ try_cache(type_name, cache: one_singleton_cache) do
834
+ entry = env.class_decls[type_name]
622
835
 
623
- case decl
624
- when AST::Declarations::Module, AST::Declarations::Class
625
836
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
626
837
  ancestors = [Definition::Ancestor::Singleton.new(name: type_name)]
627
- when AST::Declarations::Extension
628
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
629
- ancestors = [Definition::Ancestor::ExtensionSingleton.new(name: type_name, extension_name: extension_name)]
630
- end
631
838
 
632
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
633
- alias_members = []
839
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
840
+ method_definition_members(type_name, entry, kind: :singleton).each do |method_name, array|
841
+ visibility, method_def, *members = array
634
842
 
635
- each_member_with_accessibility(decl.members) do |member, accessibility|
636
- case member
637
- when AST::Members::MethodDefinition
638
- if member.singleton?
639
- name = member.name
640
- method_types = member.types.map do |method_type|
641
- method_type.map_type do |type|
642
- absolute_type(type, namespace: namespace)
643
- end
843
+ m = Definition::Method.new(
844
+ super_method: nil,
845
+ defs: method_def&.yield_self do |method_def|
846
+ method_def.defs.map {|defn| defn.update(implemented_in: type_name) }
847
+ end || [],
848
+ accessibility: visibility
849
+ )
850
+ definition.methods[method_name] = members.inject(m) do |original, new|
851
+ defs = new.types.map do |type|
852
+ Definition::Method::TypeDef.new(
853
+ type: type,
854
+ member: new,
855
+ defined_in: type_name,
856
+ implemented_in: type_name
857
+ )
644
858
  end
645
-
646
- DuplicatedMethodDefinitionError.check!(
647
- decl: decl,
648
- methods: definition.methods,
649
- name: name,
650
- location: member.location
859
+ Definition::Method.new(
860
+ super_method: nil,
861
+ defs: defs + original.defs,
862
+ accessibility: original.accessibility
651
863
  )
652
-
653
- definition.methods[name] = Definition::Method.new(super_method: nil,
654
- method_types: method_types,
655
- defined_in: decl,
656
- implemented_in: decl,
657
- accessibility: accessibility,
658
- attributes: member.attributes,
659
- annotations: member.annotations,
660
- comment: member.comment)
661
864
  end
662
- when AST::Members::Alias
663
- if member.singleton?
664
- alias_members << member
865
+ end
866
+
867
+ entry.decls.each do |d|
868
+ d.decl.members.each do |member|
869
+ case member
870
+ when AST::Members::Alias
871
+ if member.singleton?
872
+ UnknownMethodAliasError.check!(
873
+ methods: definition.methods,
874
+ original_name: member.old_name,
875
+ aliased_name: member.new_name,
876
+ location: member.location
877
+ )
878
+
879
+ DuplicatedMethodDefinitionError.check!(
880
+ decl: d.decl,
881
+ methods: definition.methods,
882
+ name: member.new_name,
883
+ location: member.location
884
+ )
885
+
886
+ definition.methods[member.new_name] = definition.methods[member.old_name]
887
+ end
888
+ end
665
889
  end
666
- when AST::Members::Extend
667
- if member.name.interface?
668
- absolute_name = absolute_type_name(member.name, namespace: namespace, location: member.location)
669
- interface_definition = build_one_instance(absolute_name)
670
- absolute_args = member.args.map {|ty| absolute_type(ty, namespace: namespace) }
671
-
672
- InvalidTypeApplicationError.check!(
673
- type_name: absolute_name,
674
- args: absolute_args,
675
- params: interface_definition.type_params_decl,
676
- location: member.location
677
- )
890
+ end
678
891
 
679
- sub = Substitution.build(interface_definition.type_params, absolute_args)
680
- interface_definition.methods.each do |name, method|
681
- method_types = method.method_types.map do |method_type|
682
- method_type.sub(sub).map_type do |type|
683
- absolute_type(type, namespace: namespace)
892
+ unless definition.methods.key?(:new)
893
+ instance = build_one_instance(type_name)
894
+ initialize = instance.methods[:initialize]
895
+
896
+ if initialize
897
+ class_params = entry.type_params.each.map(&:name)
898
+
899
+ initialize_defs = initialize.defs
900
+ definition.methods[:new] = Definition::Method.new(
901
+ super_method: nil,
902
+ defs: initialize_defs.map do |initialize_def|
903
+ method_type = initialize_def.type
904
+
905
+ class_type_param_vars = Set.new(class_params)
906
+ method_type_param_vars = Set.new(method_type.type_params)
907
+
908
+ if class_type_param_vars.intersect?(method_type_param_vars)
909
+ renamed_method_params = method_type.type_params.map do |name|
910
+ if class_type_param_vars.include?(name)
911
+ Types::Variable.fresh(name).name
912
+ else
913
+ name
914
+ end
915
+ end
916
+ method_params = class_params + renamed_method_params
917
+
918
+ sub = Substitution.build(method_type.type_params, Types::Variable.build(renamed_method_params))
919
+ else
920
+ method_params = class_params + method_type.type_params
921
+ sub = Substitution.build([], [])
684
922
  end
685
- end
686
923
 
687
- DuplicatedMethodDefinitionError.check!(
688
- decl: decl,
689
- methods: definition.methods,
690
- name: name,
691
- location: member.location
924
+ method_type = method_type.map_type {|ty| ty.sub(sub) }
925
+ method_type = method_type.update(
926
+ type_params: method_params,
927
+ type: method_type.type.with_return_type(Types::Bases::Instance.new(location: nil))
928
+ )
929
+
930
+ Definition::Method::TypeDef.new(
931
+ type: method_type,
932
+ member: initialize_def.member,
933
+ defined_in: nil,
934
+ implemented_in: nil
935
+ )
936
+ end,
937
+ accessibility: :public
938
+ )
939
+ end
940
+ end
941
+
942
+ entry.decls.each do |d|
943
+ each_member_with_accessibility(d.decl.members) do |member, _|
944
+ case member
945
+ when AST::Members::ClassInstanceVariable
946
+ definition.instance_variables[member.name] = Definition::Variable.new(
947
+ parent_variable: nil,
948
+ type: member.type,
949
+ declared_in: type_name
692
950
  )
693
951
 
694
- definition.methods[name] = Definition::Method.new(
695
- super_method: nil,
696
- method_types: method_types,
697
- defined_in: method.defined_in,
698
- implemented_in: decl,
699
- accessibility: method.accessibility,
700
- attributes: method.attributes,
701
- annotations: method.annotations,
702
- comment: member.comment
952
+ when AST::Members::ClassVariable
953
+ definition.class_variables[member.name] = Definition::Variable.new(
954
+ parent_variable: nil,
955
+ type: member.type,
956
+ declared_in: type_name
703
957
  )
704
958
  end
705
959
  end
706
- when AST::Members::ClassInstanceVariable
707
- definition.instance_variables[member.name] = Definition::Variable.new(
708
- type: absolute_type(member.type, namespace: namespace),
709
- parent_variable: nil,
710
- declared_in: decl
711
- )
712
- when AST::Members::ClassVariable
713
- definition.class_variables[member.name] = Definition::Variable.new(
714
- type: absolute_type(member.type, namespace: namespace),
715
- parent_variable: nil,
716
- declared_in: decl
717
- )
718
960
  end
719
961
  end
720
-
721
- alias_members.each do |member|
722
- UnknownMethodAliasError.check!(
723
- methods: definition.methods,
724
- original_name: member.old_name,
725
- aliased_name: member.new_name,
726
- location: member.location
727
- )
728
-
729
- DuplicatedMethodDefinitionError.check!(
730
- decl: decl,
731
- methods: definition.methods,
732
- name: member.new_name,
733
- location: member.location
734
- )
735
-
736
- # FIXME: may cause a problem if #old_name has super type
737
- definition.methods[member.new_name] = definition.methods[member.old_name]
738
- end
739
962
  end
740
963
  end
741
964
 
742
- def merge_definitions(pairs, decl:, self_type:, ancestors:)
743
- Definition.new(declaration: decl, self_type: self_type, ancestors: ancestors).tap do |definition|
965
+ def merge_definitions(type_name, pairs, entry:, self_type:, ancestors:)
966
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
744
967
  pairs.reverse_each do |(ancestor, current_definition)|
745
968
  sub = case ancestor
746
- when Definition::Ancestor::Instance, Definition::Ancestor::ExtensionInstance
969
+ when Definition::Ancestor::Instance
747
970
  Substitution.build(current_definition.type_params, ancestor.args)
748
- when Definition::Ancestor::Singleton, Definition::Ancestor::ExtensionSingleton
971
+ when Definition::Ancestor::Singleton
749
972
  Substitution.build([], [])
750
973
  end
751
- namespace = current_definition.name.absolute!.to_namespace
752
974
 
753
975
  current_definition.methods.each do |name, method|
754
- merge_method definition.methods, name, method, sub, namespace
976
+ merge_method definition.methods, name, method, sub
755
977
  end
756
978
 
757
979
  current_definition.instance_variables.each do |name, variable|
@@ -775,25 +997,13 @@ module RBS
775
997
  )
776
998
  end
777
999
 
778
- def merge_method(methods, name, method, sub, namespace)
1000
+ def merge_method(methods, name, method, sub)
779
1001
  super_method = methods[name]
780
1002
 
781
1003
  methods[name] = Definition::Method.new(
782
- method_types: method.method_types.flat_map do |method_type|
783
- case method_type
784
- when MethodType
785
- [absolute_type(method_type.sub(sub), namespace: namespace)]
786
- when :super
787
- super_method.method_types
788
- end
789
- end,
790
1004
  super_method: super_method,
791
- defined_in: method.defined_in,
792
- implemented_in: method.implemented_in,
793
1005
  accessibility: method.accessibility,
794
- attributes: method.attributes,
795
- annotations: method.annotations,
796
- comment: method.comment
1006
+ defs: sub.mapping.empty? ? method.defs : method.defs.map {|defn| defn.update(type: defn.type.sub(sub)) }
797
1007
  )
798
1008
  end
799
1009
 
@@ -816,31 +1026,46 @@ module RBS
816
1026
  end
817
1027
  end
818
1028
 
819
- def build_interface(type_name, declaration = env.find_class(type_name))
820
- self_type = Types::Interface.new(
821
- name: type_name,
822
- args: declaration.type_params.each.map {|p| Types::Variable.new(name: p.name, location: nil) },
823
- location: nil
824
- )
1029
+ def build_interface(type_name)
1030
+ try_cache(type_name, cache: interface_cache) do
1031
+ entry = env.interface_decls[type_name] or raise "Unknown name for build_interface: #{type_name}"
1032
+ declaration = entry.decl
1033
+ ensure_namespace!(type_name.namespace, location: declaration.location)
825
1034
 
826
- namespace = type_name.to_namespace
1035
+ self_type = Types::Interface.new(
1036
+ name: type_name,
1037
+ args: Types::Variable.build(declaration.type_params.each.map(&:name)),
1038
+ location: nil
1039
+ )
827
1040
 
828
- Definition.new(declaration: declaration, self_type: self_type, ancestors: []).tap do |definition|
829
- alias_members = []
1041
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: nil).tap do |definition|
1042
+ include_members = []
1043
+ def_members = []
1044
+ alias_members = []
830
1045
 
831
- declaration.members.each do |member|
832
- case member
833
- when AST::Members::Include
834
- mixin_name = env.absolute_interface_name(member.name, namespace: namespace) || member.name.absolute!
835
- mixin = build_one_instance(mixin_name)
1046
+ declaration.members.each do |member|
1047
+ case member
1048
+ when AST::Members::Include
1049
+ include_members << member
1050
+ when AST::Members::MethodDefinition
1051
+ def_members << member
1052
+ when AST::Members::Alias
1053
+ alias_members << member
1054
+ end
1055
+ end
1056
+
1057
+ include_members.each do |member|
1058
+ NoMixinFoundError.check!(member.name, env: env, member: member)
836
1059
 
837
- args = member.args.map {|type| absolute_type(type, namespace: namespace) }
838
- type_params = mixin.declaration.type_params
1060
+ mixin = build_interface(member.name)
1061
+
1062
+ args = member.args
1063
+ type_params = mixin.entry.decl.type_params
839
1064
 
840
1065
  InvalidTypeApplicationError.check!(
841
1066
  type_name: type_name,
842
1067
  args: args,
843
- params: type_params,
1068
+ params: type_params.each.map(&:name),
844
1069
  location: member.location
845
1070
  )
846
1071
 
@@ -849,11 +1074,8 @@ module RBS
849
1074
  definition.methods[name] = method.sub(sub)
850
1075
  end
851
1076
  end
852
- end
853
1077
 
854
- declaration.members.each do |member|
855
- case member
856
- when AST::Members::MethodDefinition
1078
+ def_members.each do |member|
857
1079
  DuplicatedMethodDefinitionError.check!(
858
1080
  decl: declaration,
859
1081
  methods: definition.methods,
@@ -863,57 +1085,45 @@ module RBS
863
1085
 
864
1086
  method = Definition::Method.new(
865
1087
  super_method: nil,
866
- method_types: member.types.map do |method_type|
867
- method_type.map_type {|ty| absolute_type(ty, namespace: namespace) }
1088
+ defs: member.types.map do |method_type|
1089
+ Definition::Method::TypeDef.new(
1090
+ type: method_type,
1091
+ member: member,
1092
+ defined_in: type_name,
1093
+ implemented_in: nil
1094
+ )
868
1095
  end,
869
- defined_in: declaration,
870
- implemented_in: nil,
871
- accessibility: :public,
872
- attributes: member.attributes,
873
- annotations: member.annotations,
874
- comment: member.comment
1096
+ accessibility: :public
875
1097
  )
876
1098
  definition.methods[member.name] = method
877
- when AST::Members::Alias
878
- alias_members << member
879
1099
  end
880
- end
881
1100
 
882
- alias_members.each do |member|
883
- UnknownMethodAliasError.check!(
884
- methods: definition.methods,
885
- original_name: member.old_name,
886
- aliased_name: member.new_name,
887
- location: member.location
888
- )
1101
+ alias_members.each do |member|
1102
+ UnknownMethodAliasError.check!(
1103
+ methods: definition.methods,
1104
+ original_name: member.old_name,
1105
+ aliased_name: member.new_name,
1106
+ location: member.location
1107
+ )
889
1108
 
890
- DuplicatedMethodDefinitionError.check!(
891
- decl: declaration,
892
- methods: definition.methods,
893
- name: member.new_name,
894
- location: member.location
895
- )
1109
+ DuplicatedMethodDefinitionError.check!(
1110
+ decl: declaration,
1111
+ methods: definition.methods,
1112
+ name: member.new_name,
1113
+ location: member.location
1114
+ )
896
1115
 
897
- # FIXME: may cause a problem if #old_name has super type
898
- definition.methods[member.new_name] = definition.methods[member.old_name]
1116
+ # FIXME: may cause a problem if #old_name has super type
1117
+ definition.methods[member.new_name] = definition.methods[member.old_name]
1118
+ end
899
1119
  end
900
1120
  end
901
1121
  end
902
1122
 
903
- def absolute_type(type, namespace:)
904
- env.absolute_type(type, namespace: namespace) do |type|
905
- NoTypeFoundError.check!(type.name.absolute!, env: env, location: type.location)
906
- end
907
- end
908
-
909
- def absolute_type_name(type_name, namespace:, location:)
910
- env.absolute_type_name(type_name, namespace: namespace) do |type_name|
911
- NoTypeFoundError.check!(type_name.absolute!, env: env, location: location)
912
- end
913
- end
914
-
915
1123
  def expand_alias(type_name)
916
- absolute_type(env.find_alias(type_name).type, namespace: type_name.namespace)
1124
+ entry = env.alias_decls[type_name] or raise "Unknown name for expand_alias: #{type_name}"
1125
+ ensure_namespace!(type_name.namespace, location: entry.decl.location)
1126
+ entry.decl.type
917
1127
  end
918
1128
  end
919
1129
  end