rbs 0.2.0 → 0.6.0

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