rbs 0.18.0 → 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/Rakefile +4 -0
  4. data/core/builtin.rbs +4 -0
  5. data/core/file.rbs +0 -4
  6. data/core/hash.rbs +1 -3
  7. data/core/io.rbs +159 -6
  8. data/core/kernel.rbs +1 -1
  9. data/core/time.rbs +0 -12
  10. data/goodcheck.yml +20 -0
  11. data/lib/rbs.rb +2 -0
  12. data/lib/rbs/ast/declarations.rb +7 -2
  13. data/lib/rbs/ast/members.rb +10 -4
  14. data/lib/rbs/cli.rb +10 -10
  15. data/lib/rbs/definition.rb +70 -3
  16. data/lib/rbs/definition_builder.rb +544 -989
  17. data/lib/rbs/definition_builder/ancestor_builder.rb +476 -0
  18. data/lib/rbs/definition_builder/method_builder.rb +217 -0
  19. data/lib/rbs/environment.rb +5 -1
  20. data/lib/rbs/environment_loader.rb +1 -1
  21. data/lib/rbs/environment_walker.rb +16 -10
  22. data/lib/rbs/errors.rb +71 -66
  23. data/lib/rbs/method_type.rb +1 -31
  24. data/lib/rbs/parser.rb +1000 -894
  25. data/lib/rbs/parser.y +108 -57
  26. data/lib/rbs/prototype/rb.rb +14 -3
  27. data/lib/rbs/prototype/rbi.rb +6 -6
  28. data/lib/rbs/prototype/runtime.rb +53 -33
  29. data/lib/rbs/substitution.rb +4 -0
  30. data/lib/rbs/test.rb +3 -1
  31. data/lib/rbs/test/hook.rb +24 -7
  32. data/lib/rbs/types.rb +63 -6
  33. data/lib/rbs/validator.rb +4 -2
  34. data/lib/rbs/variance_calculator.rb +5 -1
  35. data/lib/rbs/version.rb +1 -1
  36. data/lib/rbs/writer.rb +9 -1
  37. data/schema/members.json +5 -1
  38. data/sig/definition.rbs +6 -1
  39. data/sig/definition_builder.rbs +3 -0
  40. data/sig/errors.rbs +20 -0
  41. data/sig/members.rbs +4 -1
  42. data/sig/method_types.rbs +3 -16
  43. data/sig/type_name_resolver.rbs +4 -2
  44. data/sig/types.rbs +17 -1
  45. data/sig/validator.rbs +12 -0
  46. data/stdlib/dbm/0/dbm.rbs +0 -2
  47. data/stdlib/logger/0/log_device.rbs +1 -2
  48. data/stdlib/monitor/0/monitor.rbs +119 -0
  49. data/stdlib/time/0/time.rbs +327 -0
  50. data/stdlib/tsort/0/tsort.rbs +8 -0
  51. data/stdlib/uri/0/common.rbs +401 -0
  52. data/stdlib/uri/0/rfc2396_parser.rbs +9 -0
  53. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  54. data/steep/Gemfile.lock +13 -14
  55. metadata +14 -5
@@ -25,7 +25,7 @@ module RBS
25
25
  end
26
26
 
27
27
  loader = EnvironmentLoader.new(core_root: core_root, repository: repository)
28
-
28
+
29
29
  dirs.each do |dir|
30
30
  loader.add(path: Pathname(dir))
31
31
  end
@@ -43,21 +43,21 @@ module RBS
43
43
  opts.on("-r LIBRARY", "Load RBS files of the library") do |lib|
44
44
  libs << lib
45
45
  end
46
-
46
+
47
47
  opts.on("-I DIR", "Load RBS files from the directory") do |dir|
48
48
  dirs << dir
49
49
  end
50
-
50
+
51
51
  opts.on("--no-stdlib", "Skip loading standard library signatures") do
52
52
  self.core_root = nil
53
53
  end
54
-
54
+
55
55
  opts.on("--repo DIR", "Add RBS repository") do |dir|
56
56
  repos << dir
57
57
  end
58
-
58
+
59
59
  opts
60
- end
60
+ end
61
61
  end
62
62
 
63
63
  attr_reader :stdout
@@ -242,7 +242,7 @@ EOU
242
242
 
243
243
  env = Environment.from_loader(loader).resolve_type_names
244
244
 
245
- builder = DefinitionBuilder.new(env: env)
245
+ builder = DefinitionBuilder::AncestorBuilder.new(env: env)
246
246
  type_name = TypeName(args[0]).absolute!
247
247
 
248
248
  if env.class_decls.key?(type_name)
@@ -626,7 +626,7 @@ EOU
626
626
 
627
627
  opts = OptionParser.new
628
628
  opts.banner = <<EOU
629
- Usage: rbs prototype #{format} [options...] [files...]
629
+ Usage: rbs prototype #{format} [files...]
630
630
  #{availability}
631
631
  Generate RBS prototype from source code.
632
632
  It parses specified Ruby code and and generates RBS prototypes.
@@ -735,7 +735,7 @@ Examples:
735
735
  syntax_error = false
736
736
  args.each do |path|
737
737
  path = Pathname(path)
738
- loader.each_file(path, skip_hidden: false, immediate: true) do |file_path|
738
+ loader.each_file(path, skip_hidden: false, immediate: true) do |file_path|
739
739
  Parser.parse_signature(file_path.read)
740
740
  rescue RBS::Parser::SyntaxError => ex
741
741
  loc = ex.error_value.location
@@ -757,7 +757,7 @@ Examples:
757
757
  opts.push(*options.repos.map {|dir| "--repo #{Shellwords.escape(dir)}"})
758
758
  opts.push(*options.dirs.map {|dir| "-I #{Shellwords.escape(dir)}"})
759
759
  opts.push(*options.libs.map {|lib| "-r#{Shellwords.escape(lib)}"})
760
-
760
+
761
761
  opts.empty? ? nil : opts.join(" ")
762
762
  end
763
763
 
@@ -34,6 +34,20 @@ module RBS
34
34
  @implemented_in = implemented_in
35
35
  end
36
36
 
37
+ def ==(other)
38
+ other.is_a?(TypeDef) &&
39
+ other.type == type &&
40
+ other.member == member &&
41
+ other.defined_in == defined_in &&
42
+ other.implemented_in == implemented_in
43
+ end
44
+
45
+ alias eql? ==
46
+
47
+ def hash
48
+ self.class.hash ^ type.hash ^ member.hash ^ defined_in.hash ^ implemented_in.hash
49
+ end
50
+
37
51
  def comment
38
52
  member.comment
39
53
  end
@@ -70,6 +84,21 @@ module RBS
70
84
  @alias_of = alias_of
71
85
  end
72
86
 
87
+ def ==(other)
88
+ other.is_a?(Method) &&
89
+ other.super_method == super_method &&
90
+ other.defs == defs &&
91
+ other.accessibility == accessibility &&
92
+ other.annotations == annotations &&
93
+ other.alias_of == alias_of
94
+ end
95
+
96
+ alias eql? ==
97
+
98
+ def hash
99
+ self.class.hash ^ super_method.hash ^ defs.hash ^ accessibility.hash ^ annotations.hash ^ alias_of.hash
100
+ end
101
+
73
102
  def defined_in
74
103
  @defined_in ||= begin
75
104
  last_def = defs.last or raise
@@ -137,8 +166,43 @@ module RBS
137
166
  end
138
167
 
139
168
  module Ancestor
140
- Instance = _ = Struct.new(:name, :args, keyword_init: true)
141
- Singleton = _ = Struct.new(:name, keyword_init: true)
169
+ class Instance
170
+ attr_reader :name, :args, :source
171
+
172
+ def initialize(name:, args:, source:)
173
+ @name = name
174
+ @args = args
175
+ @source = source
176
+ end
177
+
178
+ def ==(other)
179
+ other.is_a?(Instance) && other.name == name && other.args == args
180
+ end
181
+
182
+ alias eql? ==
183
+
184
+ def hash
185
+ self.class.hash ^ name.hash ^ args.hash
186
+ end
187
+ end
188
+
189
+ class Singleton
190
+ attr_reader :name
191
+
192
+ def initialize(name:)
193
+ @name = name
194
+ end
195
+
196
+ def ==(other)
197
+ other.is_a?(Singleton) && other.name == name
198
+ end
199
+
200
+ alias eql? ==
201
+
202
+ def hash
203
+ self.class.hash ^ name.hash
204
+ end
205
+ end
142
206
  end
143
207
 
144
208
  class InstanceAncestors
@@ -170,7 +234,8 @@ module RBS
170
234
  else
171
235
  Ancestor::Instance.new(
172
236
  name: ancestor.name,
173
- args: ancestor.args.map {|type| type.sub(subst) }
237
+ args: ancestor.args.map {|type| type.sub(subst) },
238
+ source: ancestor.source
174
239
  )
175
240
  end
176
241
  when Ancestor::Singleton
@@ -233,6 +298,8 @@ module RBS
233
298
  case en = entry
234
299
  when Environment::SingleEntry
235
300
  en.decl.is_a?(AST::Declarations::Interface)
301
+ else
302
+ false
236
303
  end
237
304
  end
238
305
 
@@ -2,781 +2,408 @@ module RBS
2
2
  class DefinitionBuilder
3
3
  attr_reader :env
4
4
  attr_reader :type_name_resolver
5
+ attr_reader :ancestor_builder
6
+ attr_reader :method_builder
5
7
 
6
8
  attr_reader :instance_cache
7
9
  attr_reader :singleton_cache
10
+ attr_reader :singleton0_cache
8
11
  attr_reader :interface_cache
9
12
 
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
40
- if s = super_class
41
- yield s
42
- end
43
-
44
- self_types&.each(&block)
45
- included_modules&.each(&block)
46
- prepended_modules&.each(&block)
47
- extended_modules&.each(&block)
48
- else
49
- enum_for :each_ancestor
50
- end
51
- end
52
-
53
- def self.class_instance(type_name:, params:, super_class:)
54
- new(
55
- type_name: type_name,
56
- params: params,
57
- super_class: super_class,
58
- self_types: nil,
59
- included_modules: [],
60
- prepended_modules: [],
61
- extended_modules: nil
62
- )
63
- end
64
-
65
- def self.singleton(type_name:, super_class:)
66
- new(
67
- type_name: type_name,
68
- params: nil,
69
- super_class: super_class,
70
- self_types: nil,
71
- included_modules: nil,
72
- prepended_modules: nil,
73
- extended_modules: []
74
- )
75
- end
76
-
77
- def self.module_instance(type_name:, params:)
78
- new(
79
- type_name: type_name,
80
- params: params,
81
- self_types: [],
82
- included_modules: [],
83
- prepended_modules: [],
84
- super_class: nil,
85
- extended_modules: nil
86
- )
87
- end
88
- end
89
-
90
13
  def initialize(env:)
91
14
  @env = env
92
15
  @type_name_resolver = TypeNameResolver.from_env(env)
16
+ @ancestor_builder = AncestorBuilder.new(env: env)
17
+ @method_builder = MethodBuilder.new(env: env)
93
18
 
94
19
  @instance_cache = {}
95
20
  @singleton_cache = {}
21
+ @singleton0_cache = {}
96
22
  @interface_cache = {}
97
-
98
- @one_instance_cache = {}
99
- @one_singleton_cache = {}
100
-
101
- @instance_ancestors_cache = {}
102
- @singleton_ancestor_cache = {}
103
-
104
- @one_instance_ancestors_cache = {}
105
- @one_singleton_ancestors_cache = {}
106
- end
107
-
108
- def validate_super_class!(type_name, entry)
109
- with_super_classes = entry.decls.select {|d| d.decl.super_class }
110
-
111
- return if with_super_classes.size <= 1
112
-
113
- super_types = with_super_classes.map do |d|
114
- super_class = d.decl.super_class or raise
115
- Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
116
- end
117
-
118
- super_types.uniq!
119
-
120
- return if super_types.size == 1
121
-
122
- raise SuperclassMismatchError.new(name: type_name, super_classes: super_types, entry: entry)
123
23
  end
124
24
 
125
- def one_instance_ancestors(type_name)
126
- as = one_instance_ancestors_cache[type_name] and return as
127
-
128
- entry = env.class_decls[type_name] or raise "Unknown name for one_instance_ancestors: #{type_name}"
129
- params = entry.type_params.each.map(&:name)
130
-
131
- case entry
132
- when Environment::ClassEntry
133
- validate_super_class!(type_name, entry)
134
- primary = entry.primary
135
- super_class = primary.decl.super_class
136
-
137
- if type_name != BuiltinNames::BasicObject.name
138
- if super_class
139
- super_name = super_class.name
140
- super_args = super_class.args
141
- else
142
- super_name = BuiltinNames::Object.name
143
- super_args = []
144
- end
145
-
146
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
147
-
148
- ancestors = OneAncestors.class_instance(
149
- type_name: type_name,
150
- params: params,
151
- super_class: Definition::Ancestor::Instance.new(name: super_name, args: super_args)
152
- )
153
- else
154
- ancestors = OneAncestors.class_instance(
155
- type_name: type_name,
156
- params: params,
157
- super_class: nil
158
- )
159
- end
160
- when Environment::ModuleEntry
161
- ancestors = OneAncestors.module_instance(type_name: type_name, params: params)
162
-
163
- entry.self_types.each do |module_self|
164
- NoSelfTypeFoundError.check!(module_self, env: env)
165
-
166
- self_types = ancestors.self_types or raise
167
- self_types.push Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args)
168
- end
169
- end
170
-
171
- mixin_ancestors(entry,
172
- included_modules: ancestors.included_modules,
173
- prepended_modules: ancestors.prepended_modules,
174
- extended_modules: nil)
175
-
176
- one_instance_ancestors_cache[type_name] = ancestors
177
- end
178
-
179
- def one_singleton_ancestors(type_name)
180
- as = one_singleton_ancestors_cache[type_name] and return as
181
-
182
- entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_name}"
183
-
184
- case entry
185
- when Environment::ClassEntry
186
- validate_super_class!(type_name, entry)
187
- primary = entry.primary
188
- super_class = primary.decl.super_class
189
-
190
- if type_name != BuiltinNames::BasicObject.name
191
- if super_class
192
- super_name = super_class.name
193
- else
194
- super_name = BuiltinNames::Object.name
195
- end
196
-
197
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
198
-
199
- ancestors = OneAncestors.singleton(
200
- type_name: type_name,
201
- super_class: Definition::Ancestor::Singleton.new(name: super_name)
202
- )
203
- else
204
- ancestors = OneAncestors.singleton(
205
- type_name: type_name,
206
- super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Class.name, args: [])
207
- )
25
+ def ensure_namespace!(namespace, location:)
26
+ namespace.ascend do |ns|
27
+ unless ns.empty?
28
+ NoTypeFoundError.check!(ns.to_type_name, env: env, location: location)
208
29
  end
209
- when Environment::ModuleEntry
210
- ancestors = OneAncestors.singleton(
211
- type_name: type_name,
212
- super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Module.name, args: [])
213
- )
214
30
  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
31
  end
223
32
 
224
- def mixin_ancestors(entry, included_modules:, extended_modules:, prepended_modules:)
225
- entry.decls.each do |d|
226
- decl = d.decl
33
+ def build_interface(type_name)
34
+ try_cache(type_name, cache: interface_cache) do
35
+ entry = env.interface_decls[type_name] or raise "Unknown name for build_interface: #{type_name}"
36
+ declaration = entry.decl
37
+ ensure_namespace!(type_name.namespace, location: declaration.location)
227
38
 
228
- align_params = Substitution.build(
229
- decl.type_params.each.map(&:name),
230
- Types::Variable.build(entry.type_params.each.map(&:name))
39
+ self_type = Types::Interface.new(
40
+ name: type_name,
41
+ args: Types::Variable.build(declaration.type_params.each.map(&:name)),
42
+ location: nil
231
43
  )
232
44
 
233
- decl.each_mixin do |member|
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
-
255
- when AST::Members::Extend
256
- if extended_modules
257
- NoMixinFoundError.check!(member.name, env: env, member: member)
258
-
259
- module_name = member.name
260
- module_args = member.args
45
+ ancestors = ancestor_builder.interface_ancestors(type_name)
46
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
47
+ ancestor_builder.one_interface_ancestors(type_name).included_interfaces.each do |mod|
48
+ defn = build_interface(mod.name)
49
+ subst = Substitution.build(defn.type_params, mod.args)
261
50
 
262
- extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
51
+ defn.methods.each do |name, method|
52
+ definition.methods[name] = method.sub(subst)
263
53
  end
264
54
  end
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 super_class = one_ancestors.super_class
289
- # @type var super_class: Definition::Ancestor::Instance
290
- super_name = super_class.name
291
- super_args = super_class.args
292
55
 
293
- super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
294
- ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
295
- end
296
- end
297
-
298
- if included_modules = one_ancestors.included_modules
299
- included_modules.each do |mod|
300
- if mod.name.class?
301
- name = mod.name
302
- arg_types = mod.args
303
- mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
304
- ancestors.unshift(*mod_ancestors.apply(arg_types, location: entry.primary.decl.location))
305
- end
306
- end
307
- end
56
+ methods = method_builder.build_interface(type_name)
57
+ methods.each do |defn|
58
+ method = case defn.original
59
+ when AST::Members::MethodDefinition
60
+ defs = defn.original.types.map do |method_type|
61
+ Definition::Method::TypeDef.new(
62
+ type: method_type,
63
+ member: defn.original,
64
+ defined_in: type_name,
65
+ implemented_in: nil
66
+ )
67
+ end
68
+
69
+ Definition::Method.new(
70
+ super_method: nil,
71
+ defs: defs,
72
+ accessibility: :public,
73
+ alias_of: nil
74
+ )
75
+ when AST::Members::Alias
76
+ unless definition.methods.key?(defn.original.old_name)
77
+ raise UnknownMethodAliasError.new(
78
+ original_name: defn.original.old_name,
79
+ aliased_name: defn.original.new_name,
80
+ location: defn.original.location
81
+ )
82
+ end
83
+
84
+ original_method = definition.methods[defn.original.old_name]
85
+ Definition::Method.new(
86
+ super_method: nil,
87
+ defs: original_method.defs.map do |defn|
88
+ defn.update(implemented_in: nil, defined_in: type_name)
89
+ end,
90
+ accessibility: :public,
91
+ alias_of: original_method
92
+ )
93
+ when nil
94
+ unless definition.methods.key?(defn.name)
95
+ raise InvalidOverloadMethodError.new(
96
+ type_name: type_name,
97
+ method_name: defn.name,
98
+ kind: :instance,
99
+ members: defn.overloads
100
+ )
101
+ end
102
+
103
+ definition.methods[defn.name]
104
+ end
105
+
106
+ defn.overloads.each do |overload|
107
+ defs = overload.types.map do |method_type|
108
+ Definition::Method::TypeDef.new(
109
+ type: method_type,
110
+ member: overload,
111
+ defined_in: type_name,
112
+ implemented_in: nil
113
+ )
114
+ end
308
115
 
309
- ancestors.unshift(self_ancestor)
116
+ method.defs.unshift(*defs)
117
+ end
310
118
 
311
- if prepended_modules = one_ancestors.prepended_modules
312
- prepended_modules.each do |mod|
313
- if mod.name.class?
314
- name = mod.name
315
- arg_types = mod.args
316
- mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
317
- ancestors.unshift(*mod_ancestors.apply(arg_types, location: entry.primary.decl.location))
119
+ definition.methods[defn.name] = method
318
120
  end
319
121
  end
320
122
  end
321
-
322
- building_ancestors.pop
323
-
324
- instance_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
325
- type_name: type_name,
326
- params: params,
327
- ancestors: ancestors
328
- )
329
123
  end
330
124
 
331
- def singleton_ancestors(type_name, building_ancestors: [])
332
- as = singleton_ancestor_cache[type_name] and return as
333
-
334
- entry = env.class_decls[type_name] or raise "Unknown name for singleton_ancestors: #{type_name}"
335
- self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
336
-
337
- RecursiveAncestorError.check!(self_ancestor,
338
- ancestors: building_ancestors,
339
- location: entry.primary.decl.location)
340
- building_ancestors.push self_ancestor
341
-
342
- one_ancestors = one_singleton_ancestors(type_name)
343
-
344
- ancestors = []
125
+ def build_instance(type_name)
126
+ try_cache(type_name, cache: instance_cache) do
127
+ entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
128
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
345
129
 
346
- case super_class = one_ancestors.super_class
347
- when Definition::Ancestor::Instance
348
- super_name = super_class.name
349
- super_args = super_class.args
130
+ case entry
131
+ when Environment::ClassEntry, Environment::ModuleEntry
132
+ ancestors = ancestor_builder.instance_ancestors(type_name)
133
+ self_type = Types::ClassInstance.new(name: type_name,
134
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
135
+ location: nil)
350
136
 
351
- super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
352
- ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
137
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
138
+ one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
139
+ methods = method_builder.build_instance(type_name)
353
140
 
354
- when Definition::Ancestor::Singleton
355
- super_name = super_class.name
141
+ validate_type_params definition, methods: methods, ancestors: one_ancestors
356
142
 
357
- super_ancestors = singleton_ancestors(super_name, building_ancestors: [])
358
- ancestors.unshift(*super_ancestors.ancestors)
359
- end
143
+ if super_class = one_ancestors.super_class
144
+ defn = build_instance(super_class.name)
145
+ merge_definition(src: defn,
146
+ dest: definition,
147
+ subst: Substitution.build(defn.type_params, super_class.args),
148
+ keep_super: true)
149
+ end
360
150
 
361
- extended_modules = one_ancestors.extended_modules or raise
362
- extended_modules.each do |mod|
363
- if mod.name.class?
364
- name = mod.name
365
- args = mod.args
366
- mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
367
- ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
368
- end
369
- end
151
+ if one_ancestors.self_types
152
+ one_ancestors.self_types.each do |ans|
153
+ defn = if ans.name.interface?
154
+ build_interface(ans.name)
155
+ else
156
+ build_instance(ans.name)
157
+ end
158
+
159
+ # Successor interface method overwrites.
160
+ merge_definition(src: defn,
161
+ dest: definition,
162
+ subst: Substitution.build(defn.type_params, ans.args),
163
+ keep_super: true)
164
+ end
165
+ end
370
166
 
371
- ancestors.unshift(self_ancestor)
167
+ one_ancestors.included_modules.each do |mod|
168
+ defn = build_instance(mod.name)
169
+ merge_definition(src: defn,
170
+ dest: definition,
171
+ subst: Substitution.build(defn.type_params, mod.args))
172
+ end
372
173
 
373
- building_ancestors.pop
174
+ interface_methods = {}
374
175
 
375
- singleton_ancestor_cache[type_name] = Definition::SingletonAncestors.new(
376
- type_name: type_name,
377
- ancestors: ancestors
378
- )
379
- end
176
+ one_ancestors.included_interfaces.each do |mod|
177
+ defn = build_interface(mod.name)
178
+ subst = Substitution.build(defn.type_params, mod.args)
380
179
 
381
- def each_member_with_accessibility(members, accessibility: :public)
382
- members.each do |member|
383
- case member
384
- when AST::Members::Public
385
- accessibility = :public
386
- when AST::Members::Private
387
- accessibility = :private
388
- else
389
- yield member, accessibility
390
- end
391
- end
392
- end
180
+ defn.methods.each do |name, method|
181
+ if interface_methods.key?(name)
182
+ raise DuplicatedInterfaceMethodDefinitionError.new(
183
+ type: self_type,
184
+ method_name: name,
185
+ member: mod.source
186
+ )
187
+ end
393
188
 
394
- def ensure_namespace!(namespace, location:)
395
- namespace.ascend do |ns|
396
- unless ns.empty?
397
- NoTypeFoundError.check!(ns.to_type_name, env: env, location: location)
398
- end
399
- end
400
- end
189
+ merge_method(type_name, interface_methods, name, method, subst, implemented_in: type_name)
190
+ end
191
+ end
401
192
 
402
- def build_instance(type_name)
403
- try_cache type_name, cache: instance_cache do
404
- entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
405
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
193
+ define_methods(definition,
194
+ interface_methods: interface_methods,
195
+ methods: methods,
196
+ super_interface_method: entry.is_a?(Environment::ModuleEntry))
197
+
198
+ entry.decls.each do |d|
199
+ d.decl.members.each do |member|
200
+ case member
201
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
202
+ if member.kind == :instance
203
+ ivar_name = case member.ivar_name
204
+ when false
205
+ nil
206
+ else
207
+ member.ivar_name || :"@#{member.name}"
208
+ end
209
+
210
+ if ivar_name
211
+ insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
212
+ end
213
+ end
406
214
 
407
- case entry
408
- when Environment::ClassEntry, Environment::ModuleEntry
409
- ancestors = instance_ancestors(type_name)
410
- self_type = Types::ClassInstance.new(name: type_name,
411
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
412
- location: nil)
215
+ when AST::Members::InstanceVariable
216
+ insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
413
217
 
414
- definition_pairs = ancestors.ancestors.map do |ancestor|
415
- # @type block: [Definition::Ancestor::t, Definition]
416
- case ancestor
417
- when Definition::Ancestor::Instance
418
- [ancestor, build_one_instance(ancestor.name)]
419
- when Definition::Ancestor::Singleton
420
- [ancestor, build_one_singleton(ancestor.name)]
218
+ when AST::Members::ClassVariable
219
+ insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
220
+ end
221
+ end
421
222
  end
422
- end
423
223
 
424
- case entry
425
- when Environment::ModuleEntry
426
- entry.self_types.each do |module_self|
427
- ancestor = Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args)
428
- definition_pairs.push(
429
- [
430
- ancestor,
431
- if module_self.name.interface?
432
- build_interface(module_self.name)
433
- else
434
- build_instance(module_self.name)
435
- end
436
- ]
437
- )
224
+ one_ancestors.prepended_modules.each do |mod|
225
+ defn = build_instance(mod.name)
226
+ merge_definition(src: defn,
227
+ dest: definition,
228
+ subst: Substitution.build(defn.type_params, mod.args))
438
229
  end
439
230
  end
440
-
441
- merge_definitions(type_name, definition_pairs, entry: entry, self_type: self_type, ancestors: ancestors)
442
231
  end
443
232
  end
444
233
  end
445
234
 
446
- def build_singleton(type_name)
447
- try_cache type_name, cache: singleton_cache do
448
- entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
235
+ # Builds a definition for singleton without .new method.
236
+ #
237
+ def build_singleton0(type_name)
238
+ try_cache type_name, cache: singleton0_cache do
239
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
449
240
  ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
450
241
 
451
242
  case entry
452
243
  when Environment::ClassEntry, Environment::ModuleEntry
453
- ancestors = singleton_ancestors(type_name)
244
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
454
245
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
455
- instance_type = Types::ClassInstance.new(
456
- name: type_name,
457
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
458
- location: nil
459
- )
460
246
 
461
- definition_pairs = ancestors.ancestors.map do |ancestor|
462
- # @type block: [Definition::Ancestor::t, Definition]
463
- case ancestor
464
- when Definition::Ancestor::Instance
465
- [ancestor, build_one_instance(ancestor.name)]
466
- when Definition::Ancestor::Singleton
467
- definition = build_one_singleton(ancestor.name)
468
- definition = definition.sub(Substitution.build([], [], instance_type: instance_type))
469
- definition = definition.map_method_type do |method_type|
470
- s = Substitution.build(
471
- method_type.free_variables.to_a,
472
- method_type.free_variables.map { Types::Bases::Any.new(location: nil) }
473
- )
474
- method_type.sub(s)
247
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
248
+ one_ancestors = ancestor_builder.one_singleton_ancestors(type_name)
249
+
250
+ if super_class = one_ancestors.super_class
251
+ case super_class
252
+ when Definition::Ancestor::Instance
253
+ defn = build_instance(super_class.name)
254
+ merge_definition(src: defn,
255
+ dest: definition,
256
+ subst: Substitution.build(defn.type_params, super_class.args),
257
+ keep_super: true)
258
+ when Definition::Ancestor::Singleton
259
+ defn = build_singleton0(super_class.name)
260
+ merge_definition(src: defn, dest: definition, subst: Substitution.new, keep_super: true)
475
261
  end
476
-
477
- [
478
- ancestor,
479
- definition
480
- ]
481
262
  end
482
- end
483
-
484
- merge_definitions(type_name, definition_pairs, entry: entry, self_type: self_type, ancestors: ancestors)
485
- end
486
- end
487
- end
488
-
489
- def method_definition_members(type_name, entry, kind:)
490
- # @type var interface_methods: Hash[Symbol, [Definition::Method, AST::Members::t]]
491
- interface_methods = {}
492
- # @type var methods: Hash[Symbol, Array[[AST::Members::MethodDefinition, Definition::accessibility]]]
493
- methods = {}
494
263
 
495
- entry.decls.each do |d|
496
- each_member_with_accessibility(d.decl.members) do |member, accessibility|
497
- case member
498
- when AST::Members::MethodDefinition
499
- case kind
500
- when :singleton
501
- next unless member.singleton?
502
- when :instance
503
- next unless member.instance?
264
+ one_ancestors.extended_modules.each do |mod|
265
+ defn = build_instance(mod.name)
266
+ merge_definition(src: defn,
267
+ dest: definition,
268
+ subst: Substitution.build(defn.type_params, mod.args))
504
269
  end
505
270
 
506
- methods[member.name] ||= []
507
- methods[member.name] << [
508
- member.update(types: member.types),
509
- accessibility
510
- ]
511
- when AST::Members::Include, AST::Members::Extend
512
- if member.name.interface?
513
- if (kind == :instance && member.is_a?(AST::Members::Include)) || (kind == :singleton && member.is_a?(AST::Members::Extend))
514
- NoMixinFoundError.check!(member.name, env: env, member: member)
515
-
516
- interface_name = member.name
517
- interface_args = member.args
271
+ interface_methods = {}
272
+ one_ancestors.extended_interfaces.each do |mod|
273
+ defn = build_interface(mod.name)
274
+ subst = Substitution.build(defn.type_params, mod.args)
275
+
276
+ defn.methods.each do |name, method|
277
+ if interface_methods.key?(name)
278
+ raise DuplicatedInterfaceMethodDefinitionError.new(
279
+ type: self_type,
280
+ method_name: name,
281
+ member: mod.source
282
+ )
283
+ end
518
284
 
519
- interface_definition = build_interface(interface_name)
285
+ merge_method(type_name, interface_methods, name, method, subst, implemented_in: type_name)
286
+ end
287
+ end
520
288
 
521
- InvalidTypeApplicationError.check!(
522
- type_name: interface_name,
523
- args: interface_args,
524
- params: interface_definition.type_params_decl,
525
- location: member.location
526
- )
289
+ methods = method_builder.build_singleton(type_name)
290
+ define_methods(definition, interface_methods: interface_methods, methods: methods, super_interface_method: false)
291
+
292
+ entry.decls.each do |d|
293
+ d.decl.members.each do |member|
294
+ case member
295
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
296
+ if member.kind == :singleton
297
+ ivar_name = case member.ivar_name
298
+ when false
299
+ nil
300
+ else
301
+ member.ivar_name || :"@#{member.name}"
302
+ end
303
+
304
+ if ivar_name
305
+ insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
306
+ end
307
+ end
527
308
 
528
- sub = Substitution.build(interface_definition.type_params, interface_args)
309
+ when AST::Members::ClassInstanceVariable
310
+ insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
529
311
 
530
- interface_definition.methods.each do |name, method|
531
- interface_methods[name] = [method.sub(sub), member]
312
+ when AST::Members::ClassVariable
313
+ insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
532
314
  end
533
315
  end
534
316
  end
535
317
  end
536
318
  end
537
319
  end
320
+ end
538
321
 
539
- # @type var result: Hash[Symbol, member_detail]
540
- result = {}
541
-
542
- interface_methods.each do |name, pair|
543
- method_definition, _ = pair
544
- # @type var detail: member_detail
545
- detail = [:public, method_definition, nil, []]
546
- result[name] = detail
547
- end
548
-
549
- methods.each do |method_name, array|
550
- if result[method_name]
551
- unless array.all? {|pair| pair[0].overload? }
552
- raise MethodDefinitionConflictWithInterfaceMixinError.new(
553
- type_name: type_name,
554
- method_name: method_name,
555
- kind: :instance,
556
- mixin_member: interface_methods[method_name][1],
557
- entries: array.map(&:first)
558
- )
559
- end
560
-
561
- unless array.all? {|pair| pair[1] == :public}
562
- raise InconsistentMethodVisibilityError.new(
563
- type_name: type_name,
564
- method_name: method_name,
565
- kind: :instance,
566
- member_pairs: array
567
- )
568
- end
569
-
570
- result[method_name][3].push(*array.map(&:first))
571
- else
572
- case
573
- when array.size == 1 && !array[0][0].overload?
574
- member, visibility = array[0]
575
- result[method_name] = [visibility, nil, member, []]
576
-
577
- else
578
- visibilities = array.group_by {|pair| pair[1] }
579
-
580
- if visibilities.size > 1
581
- raise InconsistentMethodVisibilityError.new(
582
- type_name: type_name,
583
- method_name: method_name,
584
- kind: :instance,
585
- member_pairs: array
586
- )
587
- end
322
+ def build_singleton(type_name)
323
+ try_cache type_name, cache: singleton_cache do
324
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
325
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
588
326
 
589
- overloads, primary = array.map(&:first).partition(&:overload?)
590
- result[method_name] = [array[0][1], nil, primary[0], overloads]
591
- end
592
- end
593
- end
327
+ case entry
328
+ when Environment::ClassEntry, Environment::ModuleEntry
329
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
330
+ self_type = Types::ClassSingleton.new(name: type_name, location: nil)
331
+ instance_type = Types::ClassInstance.new(
332
+ name: type_name,
333
+ args: entry.type_params.each.map { Types::Bases::Any.new(location: nil) },
334
+ location: nil
335
+ )
594
336
 
595
- result
596
- end
337
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
338
+ def0 = build_singleton0(type_name)
339
+ subst = Substitution.build([], [], instance_type: instance_type)
597
340
 
598
- def build_one_instance(type_name)
599
- try_cache(type_name, cache: one_instance_cache) do
600
- entry = env.class_decls[type_name]
601
-
602
- param_names = entry.type_params.each.map(&:name)
603
- self_type = Types::ClassInstance.new(name: type_name,
604
- args: Types::Variable.build(param_names),
605
- location: nil)
606
- ancestors = Definition::InstanceAncestors.new(
607
- type_name: type_name,
608
- params: param_names,
609
- ancestors: [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
610
- )
341
+ merge_definition(src: def0, dest: definition, subst: subst, keep_super: true)
611
342
 
612
- Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
613
- method_definition_members(type_name, entry, kind: :instance).each do |method_name, array|
614
- visibility, method_def, primary_member, overload_members = array
343
+ if entry.is_a?(Environment::ClassEntry)
344
+ new_method = definition.methods[:new]
345
+ if new_method.defs.all? {|d| d.defined_in == BuiltinNames::Class.name }
346
+ # The method is _untyped new_.
615
347
 
616
- members = if primary_member
617
- [primary_member, *overload_members]
618
- else
619
- overload_members
620
- end
348
+ instance = build_instance(type_name)
349
+ initialize = instance.methods[:initialize]
621
350
 
622
- m = if method_def
623
- Definition::Method.new(
624
- super_method: nil,
625
- accessibility: visibility,
626
- defs: method_def.defs.map {|defn| defn.update(implemented_in: type_name) },
627
- alias_of: nil
628
- )
629
- else
630
- Definition::Method.new(
631
- super_method: nil,
632
- accessibility: visibility,
633
- defs: [],
634
- alias_of: nil
635
- )
636
- end
351
+ if initialize
352
+ class_params = entry.type_params.each.map(&:name)
637
353
 
638
- definition.methods[method_name] = members.inject(m) do |original, member|
639
- defs = member.types.map do |method_type|
640
- Definition::Method::TypeDef.new(
641
- type: method_type,
642
- member: member,
643
- implemented_in: type_name,
644
- defined_in: type_name
645
- )
646
- end
354
+ # Inject a virtual _typed new_.
355
+ initialize_defs = initialize.defs
356
+ definition.methods[:new] = Definition::Method.new(
357
+ super_method: new_method,
358
+ defs: initialize_defs.map do |initialize_def|
359
+ method_type = initialize_def.type
647
360
 
648
- Definition::Method.new(
649
- super_method: nil,
650
- defs: defs + original.defs,
651
- accessibility: original.accessibility,
652
- alias_of: nil
653
- )
654
- end
655
- end
361
+ class_type_param_vars = Set.new(class_params)
362
+ method_type_param_vars = Set.new(method_type.type_params)
656
363
 
657
- entry.decls.each do |d|
658
- each_member_with_accessibility(d.decl.members) do |member, accessibility|
659
- case member
660
- when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
661
- name = member.name
662
- type = member.type
364
+ if class_type_param_vars.intersect?(method_type_param_vars)
365
+ renamed_method_params = method_type.type_params.map do |name|
366
+ if class_type_param_vars.include?(name)
367
+ Types::Variable.fresh(name).name
368
+ else
369
+ name
370
+ end
371
+ end
372
+ method_params = class_params + renamed_method_params
663
373
 
664
- ivar_name = case member.ivar_name
665
- when false
666
- nil
667
- else
668
- member.ivar_name || :"@#{member.name}"
669
- end
374
+ sub = Substitution.build(method_type.type_params, Types::Variable.build(renamed_method_params))
375
+ else
376
+ method_params = class_params + method_type.type_params
377
+ sub = Substitution.build([], [])
378
+ end
670
379
 
671
- if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
672
- definition.methods[name] = Definition::Method.new(
673
- super_method: nil,
674
- defs: [
675
- Definition::Method::TypeDef.new(
676
- type: MethodType.new(
677
- type_params: [],
678
- type: Types::Function.empty(type),
679
- block: nil,
680
- location: nil
681
- ),
682
- member: member,
683
- defined_in: type_name,
684
- implemented_in: type_name
380
+ method_type = method_type.map_type {|ty| ty.sub(sub) }
381
+ method_type = method_type.update(
382
+ type_params: method_params,
383
+ type: method_type.type.with_return_type(
384
+ Types::ClassInstance.new(
385
+ name: type_name,
386
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
387
+ location: nil
388
+ )
389
+ )
685
390
  )
686
- ],
687
- accessibility: accessibility,
688
- alias_of: nil
689
- )
690
- end
691
391
 
692
- if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
693
- definition.methods[:"#{name}="] = Definition::Method.new(
694
- super_method: nil,
695
- defs: [
696
392
  Definition::Method::TypeDef.new(
697
- type: MethodType.new(
698
- type_params: [],
699
- type: Types::Function.empty(type).update(
700
- required_positionals: [Types::Function::Param.new(name: name, type: type)]
701
- ),
702
- block: nil,
703
- location: nil
704
- ),
705
- member: member,
706
- defined_in: type_name,
707
- implemented_in: type_name
708
- ),
709
- ],
710
- accessibility: accessibility,
393
+ type: method_type,
394
+ member: initialize_def.member,
395
+ defined_in: initialize_def.defined_in,
396
+ implemented_in: initialize_def.implemented_in
397
+ )
398
+ end,
399
+ accessibility: :public,
400
+ annotations: [],
711
401
  alias_of: nil
712
402
  )
713
403
  end
714
-
715
- if ivar_name
716
- definition.instance_variables[ivar_name] = Definition::Variable.new(
717
- parent_variable: nil,
718
- type: type,
719
- declared_in: type_name
720
- )
721
- end
722
-
723
- when AST::Members::InstanceVariable
724
- definition.instance_variables[member.name] = Definition::Variable.new(
725
- parent_variable: nil,
726
- type: member.type,
727
- declared_in: type_name
728
- )
729
-
730
- when AST::Members::ClassVariable
731
- definition.class_variables[member.name] = Definition::Variable.new(
732
- parent_variable: nil,
733
- type: member.type,
734
- declared_in: type_name
735
- )
736
-
737
- end
738
- end
739
- end
740
-
741
- entry.decls.each do |d|
742
- d.decl.members.each do |member|
743
- case member
744
- when AST::Members::Alias
745
- if member.instance?
746
- UnknownMethodAliasError.check!(
747
- methods: definition.methods,
748
- original_name: member.old_name,
749
- aliased_name: member.new_name,
750
- location: member.location
751
- )
752
-
753
- DuplicatedMethodDefinitionError.check!(
754
- decl: d.decl,
755
- methods: definition.methods,
756
- name: member.new_name,
757
- location: member.location
758
- )
759
-
760
- original_method = definition.methods[member.old_name]
761
-
762
- definition.methods[member.new_name] = Definition::Method.new(
763
- super_method: original_method.super_method,
764
- defs: original_method.defs,
765
- accessibility: original_method.accessibility,
766
- alias_of: original_method,
767
- annotations: original_method.annotations
768
- )
769
- end
770
404
  end
771
405
  end
772
406
  end
773
-
774
- entry.decls.each do |d|
775
- validate_parameter_variance(
776
- decl: d.decl,
777
- methods: definition.methods
778
- )
779
- end
780
407
  end
781
408
  end
782
409
  end
@@ -791,277 +418,302 @@ module RBS
791
418
  end
792
419
  end
793
420
 
794
- def validate_parameter_variance(decl:, methods:)
795
- type_params = decl.type_params
421
+ def validate_type_params(definition, ancestors:, methods:)
422
+ type_params = definition.type_params_decl
796
423
 
797
424
  calculator = VarianceCalculator.new(builder: self)
798
425
  param_names = type_params.each.map(&:name)
799
426
 
800
- errors = []
801
-
802
- case decl
803
- when AST::Declarations::Class
804
- if super_class = decl.super_class
805
- result = calculator.in_inherit(name: super_class.name, args: super_class.args, variables: param_names)
806
-
807
- validate_params_with type_params, result: result do |param|
808
- errors.push InvalidVarianceAnnotationError::InheritanceError.new(
809
- param: param
427
+ ancestors.each_ancestor do |ancestor|
428
+ case ancestor
429
+ when Definition::Ancestor::Instance
430
+ result = calculator.in_inherit(name: ancestor.name, args: ancestor.args, variables: param_names)
431
+ validate_params_with(type_params, result: result) do |param|
432
+ location = case source = ancestor.source
433
+ when nil
434
+ definition.entry.primary.decl.location
435
+ when :super
436
+ definition.entry.primary.decl.super_class.location
437
+ else
438
+ source.location
439
+ end
440
+
441
+ raise InvalidVarianceAnnotationError.new(
442
+ type_name: definition.type_name,
443
+ param: param,
444
+ location: location
810
445
  )
811
446
  end
812
447
  end
813
448
  end
814
449
 
815
- # @type var result: VarianceCalculator::Result
816
-
817
- decl.members.each do |member|
818
- case member
819
- when AST::Members::Include
820
- if member.name.class?
821
- result = calculator.in_inherit(name: member.name, args: member.args, variables: param_names)
822
-
823
- validate_params_with type_params, result: result do |param|
824
- errors.push InvalidVarianceAnnotationError::MixinError.new(
825
- include_member: member,
826
- param: param
827
- )
828
- end
829
- end
830
- end
831
- end
832
-
833
- methods.each do |name, method|
834
- method.method_types.each do |method_type|
835
- unless name == :initialize
450
+ methods.each do |defn|
451
+ next if defn.name == :initialize
452
+
453
+ method_types = case original = defn.original
454
+ when AST::Members::MethodDefinition
455
+ original.types
456
+ when AST::Members::AttrWriter, AST::Members::AttrReader, AST::Members::AttrAccessor
457
+ if defn.name.to_s.end_with?("=")
458
+ [
459
+ MethodType.new(
460
+ type_params: [],
461
+ type: Types::Function.empty(original.type).update(
462
+ required_positionals: [
463
+ Types::Function::Param.new(type: original.type, name: original.name)
464
+ ]
465
+ ),
466
+ block: nil,
467
+ location: original.location
468
+ )
469
+ ]
470
+ else
471
+ [
472
+ MethodType.new(
473
+ type_params: [],
474
+ type: Types::Function.empty(original.type),
475
+ block: nil,
476
+ location: original.location
477
+ )
478
+ ]
479
+ end
480
+ when AST::Members::Alias
481
+ nil
482
+ when nil
483
+ nil
484
+ else
485
+ raise
486
+ end
487
+
488
+ if method_types
489
+ method_types.each do |method_type|
836
490
  result = calculator.in_method_type(method_type: method_type, variables: param_names)
837
-
838
- validate_params_with type_params, result: result do |param|
839
- errors.push InvalidVarianceAnnotationError::MethodTypeError.new(
840
- method_name: name,
841
- method_type: method_type,
842
- param: param
491
+ validate_params_with(type_params, result: result) do |param|
492
+ raise InvalidVarianceAnnotationError.new(
493
+ type_name: definition.type_name,
494
+ param: param,
495
+ location: method_type.location
843
496
  )
844
497
  end
845
498
  end
846
499
  end
847
500
  end
501
+ end
848
502
 
849
- unless errors.empty?
850
- raise InvalidVarianceAnnotationError.new(decl: decl, errors: errors)
851
- end
503
+ def insert_variable(type_name, variables, name:, type:)
504
+ variables[name] = Definition::Variable.new(
505
+ parent_variable: variables[name],
506
+ type: type,
507
+ declared_in: type_name
508
+ )
852
509
  end
853
510
 
854
- def build_one_singleton(type_name)
855
- try_cache(type_name, cache: one_singleton_cache) do
856
- entry = env.class_decls[type_name]
511
+ def define_methods(definition, interface_methods:, methods:, super_interface_method:)
512
+ methods.each do |method_def|
513
+ method_name = method_def.name
514
+ original = method_def.original
857
515
 
858
- self_type = Types::ClassSingleton.new(name: type_name, location: nil)
859
- ancestors = Definition::SingletonAncestors.new(
860
- type_name: type_name,
861
- ancestors: [Definition::Ancestor::Singleton.new(name: type_name)]
862
- )
516
+ if original.is_a?(AST::Members::Alias)
517
+ existing_method = interface_methods[method_name] || definition.methods[method_name]
518
+ original_method = interface_methods[original.old_name] || definition.methods[original.old_name]
863
519
 
864
- Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
865
- method_definition_members(type_name, entry, kind: :singleton).each do |method_name, array|
866
- visibility, method_def, primary_member, overload_members = array
520
+ unless original_method
521
+ raise UnknownMethodAliasError.new(
522
+ original_name: original.old_name,
523
+ aliased_name: original.new_name,
524
+ location: original.location
525
+ )
526
+ end
867
527
 
868
- members = if primary_member
869
- [primary_member, *overload_members]
870
- else
871
- overload_members
872
- end
528
+ method = Definition::Method.new(
529
+ super_method: existing_method,
530
+ defs: original_method.defs.map do |defn|
531
+ defn.update(defined_in: definition.type_name, implemented_in: definition.type_name)
532
+ end,
533
+ accessibility: method_def.accessibility,
534
+ alias_of: original_method
535
+ )
536
+ else
537
+ if interface_methods.key?(method_name)
538
+ interface_method = interface_methods[method_name]
873
539
 
874
- m = Definition::Method.new(
875
- super_method: nil,
876
- defs: method_def&.yield_self do |method_def|
877
- method_def.defs.map {|defn| defn.update(implemented_in: type_name) }
878
- end || [],
879
- accessibility: visibility,
880
- alias_of: nil
881
- )
882
- definition.methods[method_name] = members.inject(m) do |original, new|
883
- defs = new.types.map do |type|
884
- Definition::Method::TypeDef.new(
885
- type: type,
886
- member: new,
887
- defined_in: type_name,
888
- implemented_in: type_name
889
- )
890
- end
891
- Definition::Method.new(
892
- super_method: nil,
893
- defs: defs + original.defs,
894
- accessibility: original.accessibility,
895
- alias_of: nil
540
+ if method_def.original
541
+ raise DuplicatedMethodDefinitionError.new(
542
+ type: definition.self_type,
543
+ method_name: method_name,
544
+ members: [method_def.original]
896
545
  )
897
546
  end
898
- end
899
547
 
900
- entry.decls.each do |d|
901
- d.decl.members.each do |member|
902
- case member
903
- when AST::Members::Alias
904
- if member.singleton?
905
- UnknownMethodAliasError.check!(
906
- methods: definition.methods,
907
- original_name: member.old_name,
908
- aliased_name: member.new_name,
909
- location: member.location
910
- )
548
+ definition.methods[method_name] = interface_method
549
+ end
911
550
 
912
- DuplicatedMethodDefinitionError.check!(
913
- decl: d.decl,
914
- methods: definition.methods,
915
- name: member.new_name,
916
- location: member.location
917
- )
551
+ existing_method = definition.methods[method_name]
918
552
 
919
- original_method = definition.methods[member.old_name]
920
- definition.methods[member.new_name] = Definition::Method.new(
921
- super_method: original_method.super_method,
922
- defs: original_method.defs,
923
- accessibility: original_method.accessibility,
924
- alias_of: original_method,
925
- annotations: original_method.annotations
926
- )
927
- end
928
- end
553
+ case original
554
+ when AST::Members::MethodDefinition
555
+ defs = original.types.map do |method_type|
556
+ Definition::Method::TypeDef.new(
557
+ type: method_type,
558
+ member: original,
559
+ defined_in: definition.type_name,
560
+ implemented_in: definition.type_name
561
+ )
929
562
  end
930
- end
931
563
 
932
- unless definition.methods.key?(:new)
933
- instance = build_instance(type_name)
934
- initialize = instance.methods[:initialize]
564
+ accessibility = if method_name == :initialize
565
+ :private
566
+ else
567
+ method_def.accessibility
568
+ end
935
569
 
936
- if initialize
937
- class_params = entry.type_params.each.map(&:name)
570
+ method = Definition::Method.new(
571
+ super_method: existing_method,
572
+ defs: defs,
573
+ accessibility: accessibility,
574
+ alias_of: nil
575
+ )
938
576
 
939
- initialize_defs = initialize.defs
940
- definition.methods[:new] = Definition::Method.new(
941
- super_method: nil,
942
- defs: initialize_defs.map do |initialize_def|
943
- method_type = initialize_def.type
577
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
578
+ method_type = if method_name.to_s.end_with?("=")
579
+ # setter
580
+ MethodType.new(
581
+ type_params: [],
582
+ type: Types::Function.empty(original.type).update(
583
+ required_positionals: [
584
+ Types::Function::Param.new(type: original.type, name: original.name)
585
+ ]
586
+ ),
587
+ block: nil,
588
+ location: nil
589
+ )
590
+ else
591
+ # getter
592
+ MethodType.new(
593
+ type_params: [],
594
+ type: Types::Function.empty(original.type),
595
+ block: nil,
596
+ location: nil
597
+ )
598
+ end
599
+ defs = [
600
+ Definition::Method::TypeDef.new(
601
+ type: method_type,
602
+ member: original,
603
+ defined_in: definition.type_name,
604
+ implemented_in: definition.type_name
605
+ )
606
+ ]
944
607
 
945
- class_type_param_vars = Set.new(class_params)
946
- method_type_param_vars = Set.new(method_type.type_params)
608
+ method = Definition::Method.new(
609
+ super_method: existing_method,
610
+ defs: defs,
611
+ accessibility: method_def.accessibility,
612
+ alias_of: nil
613
+ )
947
614
 
948
- if class_type_param_vars.intersect?(method_type_param_vars)
949
- renamed_method_params = method_type.type_params.map do |name|
950
- if class_type_param_vars.include?(name)
951
- Types::Variable.fresh(name).name
952
- else
953
- name
954
- end
955
- end
956
- method_params = class_params + renamed_method_params
615
+ when nil
616
+ unless definition.methods.key?(method_name)
617
+ raise InvalidOverloadMethodError.new(
618
+ type_name: definition.type_name,
619
+ method_name: method_name,
620
+ kind: :instance,
621
+ members: method_def.overloads
622
+ )
623
+ end
957
624
 
958
- sub = Substitution.build(method_type.type_params, Types::Variable.build(renamed_method_params))
959
- else
960
- method_params = class_params + method_type.type_params
961
- sub = Substitution.build([], [])
962
- end
625
+ if !super_interface_method && existing_method.defs.any? {|defn| defn.defined_in.interface? }
626
+ super_method = existing_method.super_method
627
+ else
628
+ super_method = existing_method
629
+ end
963
630
 
964
- method_type = method_type.map_type {|ty| ty.sub(sub) }
965
- method_type = method_type.update(
966
- type_params: method_params,
967
- type: method_type.type.with_return_type(Types::Bases::Instance.new(location: nil))
968
- )
631
+ method = Definition::Method.new(
632
+ super_method: super_method,
633
+ defs: existing_method.defs.map do |defn|
634
+ defn.update(implemented_in: definition.type_name)
635
+ end,
636
+ accessibility: existing_method.accessibility,
637
+ alias_of: existing_method.alias_of
638
+ )
639
+ end
640
+ end
969
641
 
970
- Definition::Method::TypeDef.new(
971
- type: method_type,
972
- member: initialize_def.member,
973
- defined_in: initialize_def.defined_in,
974
- implemented_in: initialize_def.implemented_in
975
- )
976
- end,
977
- accessibility: :public,
978
- annotations: [AST::Annotation.new(location: nil, string: "rbs:test:target")],
979
- alias_of: nil
980
- )
981
- end
642
+ method_def.overloads.each do |overload|
643
+ defs = overload.types.map do |method_type|
644
+ Definition::Method::TypeDef.new(
645
+ type: method_type,
646
+ member: overload,
647
+ defined_in: definition.type_name,
648
+ implemented_in: definition.type_name
649
+ )
982
650
  end
983
651
 
984
- entry.decls.each do |d|
985
- each_member_with_accessibility(d.decl.members) do |member, _|
986
- case member
987
- when AST::Members::ClassInstanceVariable
988
- definition.instance_variables[member.name] = Definition::Variable.new(
989
- parent_variable: nil,
990
- type: member.type,
991
- declared_in: type_name
992
- )
652
+ method.defs.unshift(*defs)
653
+ end
993
654
 
994
- when AST::Members::ClassVariable
995
- definition.class_variables[member.name] = Definition::Variable.new(
996
- parent_variable: nil,
997
- type: member.type,
998
- declared_in: type_name
999
- )
1000
- end
1001
- end
1002
- end
655
+ definition.methods[method_name] = method
656
+ end
657
+
658
+ interface_methods.each do |name, method|
659
+ unless methods.methods.key?(name)
660
+ merge_method(definition.type_name, definition.methods, name, method, Substitution.new)
1003
661
  end
1004
662
  end
1005
663
  end
1006
664
 
1007
- def merge_definitions(type_name, pairs, entry:, self_type:, ancestors:)
1008
- Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
1009
- pairs.reverse_each do |ancestor, current_definition|
1010
- sub = case ancestor
1011
- when Definition::Ancestor::Instance
1012
- Substitution.build(current_definition.type_params, ancestor.args)
1013
- when Definition::Ancestor::Singleton
1014
- Substitution.build([], [])
1015
- end
1016
-
1017
- # @type var kind: method_kind
1018
- kind = case ancestor
1019
- when Definition::Ancestor::Instance
1020
- :instance
1021
- when Definition::Ancestor::Singleton
1022
- :singleton
1023
- end
1024
-
1025
- current_definition.methods.each do |name, method|
1026
- merge_method type_name, definition.methods, name, method, sub, kind: kind
1027
- end
665
+ def merge_definition(src:, dest:, subst:, implemented_in: :keep, keep_super: false)
666
+ src.methods.each do |name, method|
667
+ merge_method(dest.type_name, dest.methods, name, method, subst, implemented_in: implemented_in, keep_super: keep_super)
668
+ end
1028
669
 
1029
- current_definition.instance_variables.each do |name, variable|
1030
- merge_variable definition.instance_variables, name, variable
1031
- end
670
+ src.instance_variables.each do |name, variable|
671
+ merge_variable(dest.instance_variables, name, variable, subst, keep_super: keep_super)
672
+ end
1032
673
 
1033
- current_definition.class_variables.each do |name, variable|
1034
- merge_variable definition.class_variables, name, variable
1035
- end
1036
- end
674
+ src.class_variables.each do |name, variable|
675
+ merge_variable(dest.class_variables, name, variable, subst, keep_super: keep_super)
1037
676
  end
1038
677
  end
1039
678
 
1040
- def merge_variable(variables, name, variable)
679
+ def merge_variable(variables, name, variable, sub, keep_super: false)
1041
680
  super_variable = variables[name]
1042
681
 
1043
682
  variables[name] = Definition::Variable.new(
1044
- parent_variable: super_variable,
1045
- type: variable.type,
683
+ parent_variable: keep_super ? variable.parent_variable : super_variable,
684
+ type: sub.empty? ? variable.type : variable.type.sub(sub),
1046
685
  declared_in: variable.declared_in
1047
686
  )
1048
687
  end
1049
688
 
1050
- def merge_method(type_name, methods, name, method, sub, kind:)
1051
- super_method = methods[name]
689
+ def merge_method(type_name, methods, name, method, sub, implemented_in: :keep, keep_super: false)
690
+ defs = method.defs.yield_self do |defs|
691
+ if sub.empty? && implemented_in == :keep
692
+ defs
693
+ else
694
+ defs.map do |defn|
695
+ defn.update(
696
+ type: sub.empty? ? defn.type : defn.type.sub(sub),
697
+ implemented_in: case implemented_in
698
+ when :keep
699
+ defn.implemented_in
700
+ when nil
701
+ nil
702
+ else
703
+ implemented_in
704
+ end
705
+ )
706
+ end
707
+ end
708
+ end
1052
709
 
1053
- defs = if method.defs.all? {|d| d.overload? }
1054
- raise InvalidOverloadMethodError.new(type_name: type_name, method_name: name, kind: kind, members: method.members) unless super_method
1055
- method.defs + super_method.defs
1056
- else
1057
- method.defs
1058
- end
710
+ super_method = methods[name]
1059
711
 
1060
712
  methods[name] = Definition::Method.new(
1061
- super_method: super_method,
713
+ super_method: keep_super ? method.super_method : super_method,
1062
714
  accessibility: method.accessibility,
1063
- defs: sub.mapping.empty? ? defs : defs.map {|defn| defn.update(type: defn.type.sub(sub)) },
1064
- alias_of: nil
715
+ defs: defs,
716
+ alias_of: method.alias_of
1065
717
  )
1066
718
  end
1067
719
 
@@ -1086,103 +738,6 @@ module RBS
1086
738
  end
1087
739
  end
1088
740
 
1089
- def build_interface(type_name)
1090
- try_cache(type_name, cache: interface_cache) do
1091
- entry = env.interface_decls[type_name] or raise "Unknown name for build_interface: #{type_name}"
1092
- declaration = entry.decl
1093
- ensure_namespace!(type_name.namespace, location: declaration.location)
1094
-
1095
- self_type = Types::Interface.new(
1096
- name: type_name,
1097
- args: Types::Variable.build(declaration.type_params.each.map(&:name)),
1098
- location: nil
1099
- )
1100
-
1101
- Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: nil).tap do |definition|
1102
- include_members = []
1103
- def_members = []
1104
- alias_members = []
1105
-
1106
- declaration.members.each do |member|
1107
- case member
1108
- when AST::Members::Include
1109
- include_members << member
1110
- when AST::Members::MethodDefinition
1111
- def_members << member
1112
- when AST::Members::Alias
1113
- alias_members << member
1114
- end
1115
- end
1116
-
1117
- include_members.each do |member|
1118
- NoMixinFoundError.check!(member.name, env: env, member: member)
1119
-
1120
- mixin = build_interface(member.name)
1121
-
1122
- args = member.args
1123
- # @type var interface_entry: Environment::SingleEntry[TypeName, AST::Declarations::Interface]
1124
- interface_entry = _ = mixin.entry
1125
- type_params = interface_entry.decl.type_params
1126
-
1127
- InvalidTypeApplicationError.check!(
1128
- type_name: type_name,
1129
- args: args,
1130
- params: type_params.each.map(&:name),
1131
- location: member.location
1132
- )
1133
-
1134
- sub = Substitution.build(type_params.each.map(&:name), args)
1135
- mixin.methods.each do |name, method|
1136
- definition.methods[name] = method.sub(sub)
1137
- end
1138
- end
1139
-
1140
- def_members.each do |member|
1141
- DuplicatedMethodDefinitionError.check!(
1142
- decl: declaration,
1143
- methods: definition.methods,
1144
- name: member.name,
1145
- location: member.location
1146
- )
1147
-
1148
- method = Definition::Method.new(
1149
- super_method: nil,
1150
- defs: member.types.map do |method_type|
1151
- Definition::Method::TypeDef.new(
1152
- type: method_type,
1153
- member: member,
1154
- defined_in: type_name,
1155
- implemented_in: nil
1156
- )
1157
- end,
1158
- accessibility: :public,
1159
- alias_of: nil
1160
- )
1161
- definition.methods[member.name] = method
1162
- end
1163
-
1164
- alias_members.each do |member|
1165
- UnknownMethodAliasError.check!(
1166
- methods: definition.methods,
1167
- original_name: member.old_name,
1168
- aliased_name: member.new_name,
1169
- location: member.location
1170
- )
1171
-
1172
- DuplicatedMethodDefinitionError.check!(
1173
- decl: declaration,
1174
- methods: definition.methods,
1175
- name: member.new_name,
1176
- location: member.location
1177
- )
1178
-
1179
- # FIXME: may cause a problem if #old_name has super type
1180
- definition.methods[member.new_name] = definition.methods[member.old_name]
1181
- end
1182
- end
1183
- end
1184
- end
1185
-
1186
741
  def expand_alias(type_name)
1187
742
  entry = env.alias_decls[type_name] or raise "Unknown name for expand_alias: #{type_name}"
1188
743
  ensure_namespace!(type_name.namespace, location: entry.decl.location)