rbs 0.18.1 → 1.0.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/Rakefile +12 -0
  4. data/Steepfile +2 -1
  5. data/bin/annotate-with-rdoc +0 -4
  6. data/core/builtin.rbs +4 -0
  7. data/core/file.rbs +3 -4
  8. data/core/hash.rbs +1 -3
  9. data/core/io.rbs +165 -7
  10. data/core/kernel.rbs +1 -1
  11. data/core/module.rbs +41 -0
  12. data/core/time.rbs +0 -12
  13. data/docs/syntax.md +0 -17
  14. data/goodcheck.yml +22 -2
  15. data/lib/rbs.rb +2 -0
  16. data/lib/rbs/ast/declarations.rb +7 -49
  17. data/lib/rbs/ast/members.rb +10 -4
  18. data/lib/rbs/cli.rb +10 -10
  19. data/lib/rbs/definition.rb +70 -3
  20. data/lib/rbs/definition_builder.rb +573 -984
  21. data/lib/rbs/definition_builder/ancestor_builder.rb +525 -0
  22. data/lib/rbs/definition_builder/method_builder.rb +217 -0
  23. data/lib/rbs/environment.rb +6 -8
  24. data/lib/rbs/environment_loader.rb +8 -4
  25. data/lib/rbs/errors.rb +88 -121
  26. data/lib/rbs/method_type.rb +1 -31
  27. data/lib/rbs/parser.rb +1082 -1014
  28. data/lib/rbs/parser.y +108 -76
  29. data/lib/rbs/prototype/rb.rb +18 -3
  30. data/lib/rbs/prototype/rbi.rb +6 -6
  31. data/lib/rbs/prototype/runtime.rb +71 -35
  32. data/lib/rbs/substitution.rb +4 -0
  33. data/lib/rbs/test.rb +3 -1
  34. data/lib/rbs/test/hook.rb +26 -8
  35. data/lib/rbs/types.rb +68 -7
  36. data/lib/rbs/validator.rb +4 -2
  37. data/lib/rbs/variance_calculator.rb +5 -1
  38. data/lib/rbs/version.rb +1 -1
  39. data/lib/rbs/writer.rb +13 -4
  40. data/schema/members.json +5 -1
  41. data/sig/ancestor_builder.rbs +98 -0
  42. data/sig/declarations.rbs +4 -16
  43. data/sig/definition.rbs +6 -1
  44. data/sig/definition_builder.rbs +15 -67
  45. data/sig/errors.rbs +159 -0
  46. data/sig/members.rbs +4 -1
  47. data/sig/method_builder.rbs +71 -0
  48. data/sig/method_types.rbs +3 -16
  49. data/sig/substitution.rbs +3 -0
  50. data/sig/type_name_resolver.rbs +4 -2
  51. data/sig/types.rbs +17 -15
  52. data/sig/validator.rbs +12 -0
  53. data/stdlib/csv/0/csv.rbs +3 -0
  54. data/stdlib/dbm/0/dbm.rbs +0 -2
  55. data/stdlib/logger/0/log_device.rbs +1 -2
  56. data/stdlib/monitor/0/monitor.rbs +119 -0
  57. data/stdlib/pathname/0/pathname.rbs +1 -1
  58. data/stdlib/prime/0/prime.rbs +6 -0
  59. data/stdlib/securerandom/0/securerandom.rbs +2 -0
  60. data/stdlib/time/0/time.rbs +327 -0
  61. data/stdlib/tsort/0/tsort.rbs +8 -0
  62. data/stdlib/uri/0/common.rbs +401 -0
  63. data/stdlib/uri/0/rfc2396_parser.rbs +9 -0
  64. data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
  65. data/steep/Gemfile.lock +13 -14
  66. metadata +16 -5
@@ -3,7 +3,7 @@ rules:
3
3
  pattern: 💪👽🚨
4
4
  message: Do you forget to delete `arglists` section?
5
5
  glob:
6
- - "stdlib/**/*.rbs"
6
+ - "{core,stdlib}/**/*.rbs"
7
7
  fail:
8
8
  - |
9
9
  # arglists 💪👽🚨 << Delete this section
@@ -22,12 +22,32 @@ rules:
22
22
  justification:
23
23
  - Documents (comments) may contain that pattern.
24
24
  glob:
25
- - "stdlib/**/*.rbs"
25
+ - "{core,stdlib}/**/*.rbs"
26
26
  fail:
27
27
  - "def `send`: (String | Symbol arg0, *untyped arg1) -> untyped"
28
28
  pass:
29
29
  - "def `send`: (String | Symbol, *untyped) -> untyped"
30
30
 
31
+ - id: rbs.prefer_boolish
32
+ pattern:
33
+ - regexp: '\([^(]*\bbool\b[^\n]*\)'
34
+ - token: "-> bool }"
35
+ message: |
36
+ Prefer `boolish` over `bool` for method arguments and block return values
37
+
38
+ See the doc below:
39
+ https://github.com/ruby/rbs/blob/78d04a2db0f1c4925d2b13c2939868edf9465d6c/docs/syntax.md#bool-or-boolish
40
+ glob:
41
+ - "**/*.rbs"
42
+ justification:
43
+ - When you strictly want `true | false`.
44
+ pass:
45
+ - "(arg: boolish)"
46
+ - "{ () -> boolish }"
47
+ fail:
48
+ - "(arg: bool)"
49
+ - "{ () -> bool }"
50
+
31
51
  - id: deprecate_stdlib_test
32
52
  pattern:
33
53
  token: < StdlibTest
data/lib/rbs.rb CHANGED
@@ -23,6 +23,8 @@ require "rbs/environment_loader"
23
23
  require "rbs/builtin_names"
24
24
  require "rbs/definition"
25
25
  require "rbs/definition_builder"
26
+ require "rbs/definition_builder/ancestor_builder"
27
+ require "rbs/definition_builder/method_builder"
26
28
  require "rbs/variance_calculator"
27
29
  require "rbs/substitution"
28
30
  require "rbs/constant"
@@ -136,10 +136,12 @@ module RBS
136
136
  class Super
137
137
  attr_reader :name
138
138
  attr_reader :args
139
+ attr_reader :location
139
140
 
140
- def initialize(name:, args:)
141
+ def initialize(name:, args:, location:)
141
142
  @name = name
142
143
  @args = args
144
+ @location = location
143
145
  end
144
146
 
145
147
  def ==(other)
@@ -155,7 +157,8 @@ module RBS
155
157
  def to_json(*a)
156
158
  {
157
159
  name: name,
158
- args: args
160
+ args: args,
161
+ location: location
159
162
  }.to_json(*a)
160
163
  end
161
164
  end
@@ -297,53 +300,6 @@ module RBS
297
300
  end
298
301
  end
299
302
 
300
- class Extension < Base
301
- attr_reader :name
302
- attr_reader :type_params
303
- attr_reader :extension_name
304
- attr_reader :members
305
- attr_reader :annotations
306
- attr_reader :location
307
- attr_reader :comment
308
-
309
- def initialize(name:, type_params:, extension_name:, members:, annotations:, location:, comment:)
310
- @name = name
311
- @type_params = type_params
312
- @extension_name = extension_name
313
- @members = members
314
- @annotations = annotations
315
- @location = location
316
- @comment = comment
317
- end
318
-
319
- def ==(other)
320
- other.is_a?(Extension) &&
321
- other.name == name &&
322
- other.type_params == type_params &&
323
- other.extension_name == extension_name &&
324
- other.members == members
325
- end
326
-
327
- alias eql? ==
328
-
329
- def hash
330
- self.class.hash ^ name.hash ^ type_params.hash ^ extension_name.hash ^ members.hash
331
- end
332
-
333
- def to_json(*a)
334
- {
335
- declaration: :extension,
336
- name: name,
337
- type_params: type_params,
338
- extension_name: extension_name,
339
- members: members,
340
- annotations: annotations,
341
- location: location,
342
- comment: comment
343
- }.to_json(*a)
344
- end
345
- end
346
-
347
303
  class Interface < Base
348
304
  attr_reader :name
349
305
  attr_reader :type_params
@@ -352,6 +308,8 @@ module RBS
352
308
  attr_reader :location
353
309
  attr_reader :comment
354
310
 
311
+ include MixinHelper
312
+
355
313
  def initialize(name:, type_params:, members:, annotations:, location:, comment:)
356
314
  @name = name
357
315
  @type_params = type_params
@@ -20,7 +20,7 @@ module RBS
20
20
  @annotations = annotations
21
21
  @location = location
22
22
  @comment = comment
23
- @overload = overload
23
+ @overload = overload ? true : false
24
24
  end
25
25
 
26
26
  def ==(other)
@@ -216,31 +216,34 @@ module RBS
216
216
  module Attribute
217
217
  attr_reader :name
218
218
  attr_reader :type
219
+ attr_reader :kind
219
220
  attr_reader :ivar_name
220
221
  attr_reader :annotations
221
222
  attr_reader :location
222
223
  attr_reader :comment
223
224
 
224
- def initialize(name:, type:, ivar_name:, annotations:, location:, comment:)
225
+ def initialize(name:, type:, ivar_name:, kind:, annotations:, location:, comment:)
225
226
  @name = name
226
227
  @type = type
227
228
  @ivar_name = ivar_name
228
229
  @annotations = annotations
229
230
  @location = location
230
231
  @comment = comment
232
+ @kind = kind
231
233
  end
232
234
 
233
235
  def ==(other)
234
236
  other.is_a?(self.class) &&
235
237
  other.name == name &&
236
238
  other.type == type &&
237
- other.ivar_name == ivar_name
239
+ other.ivar_name == ivar_name &&
240
+ other.kind == kind
238
241
  end
239
242
 
240
243
  alias eql? ==
241
244
 
242
245
  def hash
243
- self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash
246
+ self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash ^ kind.hash
244
247
  end
245
248
  end
246
249
 
@@ -253,6 +256,7 @@ module RBS
253
256
  name: name,
254
257
  type: type,
255
258
  ivar_name: ivar_name,
259
+ kind: kind,
256
260
  annotations: annotations,
257
261
  location: location,
258
262
  comment: comment
@@ -269,6 +273,7 @@ module RBS
269
273
  name: name,
270
274
  type: type,
271
275
  ivar_name: ivar_name,
276
+ kind: kind,
272
277
  annotations: annotations,
273
278
  location: location,
274
279
  comment: comment
@@ -285,6 +290,7 @@ module RBS
285
290
  name: name,
286
291
  type: type,
287
292
  ivar_name: ivar_name,
293
+ kind: kind,
288
294
  annotations: annotations,
289
295
  location: location,
290
296
  comment: comment
@@ -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,443 +2,342 @@ 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
23
  end
107
24
 
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
- end
124
-
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)
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)
168
29
  end
169
30
  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
31
  end
178
32
 
179
- def one_singleton_ancestors(type_name)
180
- as = one_singleton_ancestors_cache[type_name] and return as
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)
181
38
 
182
- entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_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
43
+ )
183
44
 
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
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
+ included_interfaces = ancestor_builder.one_interface_ancestors(type_name).included_interfaces or raise
48
+ included_interfaces.each do |mod|
49
+ defn = build_interface(mod.name)
50
+ subst = Substitution.build(defn.type_params, mod.args)
189
51
 
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
52
+ defn.methods.each do |name, method|
53
+ definition.methods[name] = method.sub(subst)
54
+ end
195
55
  end
196
56
 
197
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
57
+ methods = method_builder.build_interface(type_name)
58
+ one_ancestors = ancestor_builder.one_interface_ancestors(type_name)
59
+
60
+ validate_type_params(definition, methods: methods, ancestors: one_ancestors)
61
+
62
+ methods.each do |defn|
63
+ method = case original = defn.original
64
+ when AST::Members::MethodDefinition
65
+ defs = original.types.map do |method_type|
66
+ Definition::Method::TypeDef.new(
67
+ type: method_type,
68
+ member: original,
69
+ defined_in: type_name,
70
+ implemented_in: nil
71
+ )
72
+ end
73
+
74
+ Definition::Method.new(
75
+ super_method: nil,
76
+ defs: defs,
77
+ accessibility: :public,
78
+ alias_of: nil
79
+ )
80
+ when AST::Members::Alias
81
+ unless definition.methods.key?(original.old_name)
82
+ raise UnknownMethodAliasError.new(
83
+ original_name: original.old_name,
84
+ aliased_name: original.new_name,
85
+ location: original.location
86
+ )
87
+ end
88
+
89
+ original_method = definition.methods[original.old_name]
90
+ Definition::Method.new(
91
+ super_method: nil,
92
+ defs: original_method.defs.map do |defn|
93
+ defn.update(implemented_in: nil, defined_in: type_name)
94
+ end,
95
+ accessibility: :public,
96
+ alias_of: original_method
97
+ )
98
+ when nil
99
+ unless definition.methods.key?(defn.name)
100
+ raise InvalidOverloadMethodError.new(
101
+ type_name: type_name,
102
+ method_name: defn.name,
103
+ kind: :instance,
104
+ members: defn.overloads
105
+ )
106
+ end
107
+
108
+ definition.methods[defn.name]
109
+
110
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
111
+ raise
112
+
113
+ end
114
+
115
+ defn.overloads.each do |overload|
116
+ overload_defs = overload.types.map do |method_type|
117
+ Definition::Method::TypeDef.new(
118
+ type: method_type,
119
+ member: overload,
120
+ defined_in: type_name,
121
+ implemented_in: nil
122
+ )
123
+ end
198
124
 
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
- )
125
+ method.defs.unshift(*overload_defs)
126
+ end
127
+
128
+ definition.methods[defn.name] = method
129
+ end
208
130
  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
131
  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
132
  end
223
133
 
224
- def mixin_ancestors(entry, included_modules:, extended_modules:, prepended_modules:)
225
- entry.decls.each do |d|
226
- decl = d.decl
134
+ def build_instance(type_name)
135
+ try_cache(type_name, cache: instance_cache) do
136
+ entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
137
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
227
138
 
228
- align_params = Substitution.build(
229
- decl.type_params.each.map(&:name),
230
- Types::Variable.build(entry.type_params.each.map(&:name))
231
- )
139
+ case entry
140
+ when Environment::ClassEntry, Environment::ModuleEntry
141
+ ancestors = ancestor_builder.instance_ancestors(type_name)
142
+ self_type = Types::ClassInstance.new(name: type_name,
143
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
144
+ location: nil)
232
145
 
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)
146
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
147
+ one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
148
+ methods = method_builder.build_instance(type_name)
238
149
 
239
- module_name = member.name
240
- module_args = member.args.map {|type| type.sub(align_params) }
150
+ validate_type_params definition, methods: methods, ancestors: one_ancestors
241
151
 
242
- included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
152
+ if super_class = one_ancestors.super_class
153
+ case super_class
154
+ when Definition::Ancestor::Instance
155
+ build_instance(super_class.name).yield_self do |defn|
156
+ merge_definition(src: defn,
157
+ dest: definition,
158
+ subst: Substitution.build(defn.type_params, super_class.args),
159
+ keep_super: true)
160
+ end
161
+ else
162
+ raise
163
+ end
243
164
  end
244
165
 
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)
166
+ if self_types = one_ancestors.self_types
167
+ self_types.each do |ans|
168
+ defn = if ans.name.interface?
169
+ build_interface(ans.name)
170
+ else
171
+ build_instance(ans.name)
172
+ end
173
+
174
+ # Successor interface method overwrites.
175
+ merge_definition(src: defn,
176
+ dest: definition,
177
+ subst: Substitution.build(defn.type_params, ans.args),
178
+ keep_super: true)
179
+ end
253
180
  end
254
181
 
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
261
-
262
- extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
182
+ one_ancestors.each_included_module do |mod|
183
+ defn = build_instance(mod.name)
184
+ merge_definition(src: defn,
185
+ dest: definition,
186
+ subst: Substitution.build(defn.type_params, mod.args))
263
187
  end
264
- end
265
- end
266
- end
267
- end
268
188
 
269
- def instance_ancestors(type_name, building_ancestors: [])
270
- as = instance_ancestors_cache[type_name] and return as
189
+ interface_methods = {}
271
190
 
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)
191
+ one_ancestors.each_included_interface do |mod|
192
+ defn = build_interface(mod.name)
193
+ subst = Substitution.build(defn.type_params, mod.args)
276
194
 
277
- RecursiveAncestorError.check!(self_ancestor,
278
- ancestors: building_ancestors,
279
- location: entry.primary.decl.location)
280
- building_ancestors.push self_ancestor
195
+ defn.methods.each do |name, method|
196
+ if interface_methods.key?(name)
197
+ include_member = mod.source
281
198
 
282
- one_ancestors = one_instance_ancestors(type_name)
199
+ raise unless include_member.is_a?(AST::Members::Include)
283
200
 
284
- ancestors = []
201
+ raise DuplicatedInterfaceMethodDefinitionError.new(
202
+ type: self_type,
203
+ method_name: name,
204
+ member: include_member
205
+ )
206
+ end
285
207
 
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
208
+ merge_method(type_name, interface_methods, name, method, subst, implemented_in: type_name)
209
+ end
210
+ end
292
211
 
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
212
+ define_methods(definition,
213
+ interface_methods: interface_methods,
214
+ methods: methods,
215
+ super_interface_method: entry.is_a?(Environment::ModuleEntry))
216
+
217
+ entry.decls.each do |d|
218
+ d.decl.members.each do |member|
219
+ case member
220
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
221
+ if member.kind == :instance
222
+ ivar_name = case member.ivar_name
223
+ when false
224
+ nil
225
+ else
226
+ member.ivar_name || :"@#{member.name}"
227
+ end
228
+
229
+ if ivar_name
230
+ insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
231
+ end
232
+ end
297
233
 
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
234
+ when AST::Members::InstanceVariable
235
+ insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
308
236
 
309
- ancestors.unshift(self_ancestor)
237
+ when AST::Members::ClassVariable
238
+ insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
239
+ end
240
+ end
241
+ end
310
242
 
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))
243
+ one_ancestors.each_prepended_module do |mod|
244
+ defn = build_instance(mod.name)
245
+ merge_definition(src: defn,
246
+ dest: definition,
247
+ subst: Substitution.build(defn.type_params, mod.args))
248
+ end
318
249
  end
319
250
  end
320
251
  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
252
  end
330
253
 
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 = []
345
-
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
350
-
351
- super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
352
- ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
353
-
354
- when Definition::Ancestor::Singleton
355
- super_name = super_class.name
356
-
357
- super_ancestors = singleton_ancestors(super_name, building_ancestors: [])
358
- ancestors.unshift(*super_ancestors.ancestors)
359
- end
360
-
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
254
+ # Builds a definition for singleton without .new method.
255
+ #
256
+ def build_singleton0(type_name)
257
+ try_cache type_name, cache: singleton0_cache do
258
+ entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
259
+ ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
370
260
 
371
- ancestors.unshift(self_ancestor)
261
+ case entry
262
+ when Environment::ClassEntry, Environment::ModuleEntry
263
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
264
+ self_type = Types::ClassSingleton.new(name: type_name, location: nil)
372
265
 
373
- building_ancestors.pop
266
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
267
+ one_ancestors = ancestor_builder.one_singleton_ancestors(type_name)
268
+
269
+ if super_class = one_ancestors.super_class
270
+ case super_class
271
+ when Definition::Ancestor::Instance
272
+ defn = build_instance(super_class.name)
273
+ merge_definition(src: defn,
274
+ dest: definition,
275
+ subst: Substitution.build(defn.type_params, super_class.args),
276
+ keep_super: true)
277
+ when Definition::Ancestor::Singleton
278
+ defn = build_singleton0(super_class.name)
279
+ merge_definition(src: defn, dest: definition, subst: Substitution.new, keep_super: true)
280
+ end
281
+ end
374
282
 
375
- singleton_ancestor_cache[type_name] = Definition::SingletonAncestors.new(
376
- type_name: type_name,
377
- ancestors: ancestors
378
- )
379
- end
283
+ one_ancestors.each_extended_module do |mod|
284
+ mod_defn = build_instance(mod.name)
285
+ merge_definition(src: mod_defn,
286
+ dest: definition,
287
+ subst: Substitution.build(mod_defn.type_params, mod.args))
288
+ end
380
289
 
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
290
+ interface_methods = {}
291
+ one_ancestors.each_extended_interface do |mod|
292
+ mod_defn = build_interface(mod.name)
293
+ subst = Substitution.build(mod_defn.type_params, mod.args)
393
294
 
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
295
+ mod_defn.methods.each do |name, method|
296
+ if interface_methods.key?(name)
297
+ src_member = mod.source
401
298
 
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)
299
+ raise unless src_member.is_a?(AST::Members::Extend)
406
300
 
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)
301
+ raise DuplicatedInterfaceMethodDefinitionError.new(
302
+ type: self_type,
303
+ method_name: name,
304
+ member: src_member
305
+ )
306
+ end
413
307
 
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)]
308
+ merge_method(type_name, interface_methods, name, method, subst, implemented_in: type_name)
309
+ end
421
310
  end
422
- end
423
311
 
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)
312
+ methods = method_builder.build_singleton(type_name)
313
+ define_methods(definition, interface_methods: interface_methods, methods: methods, super_interface_method: false)
314
+
315
+ entry.decls.each do |d|
316
+ d.decl.members.each do |member|
317
+ case member
318
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
319
+ if member.kind == :singleton
320
+ ivar_name = case member.ivar_name
321
+ when false
322
+ nil
323
+ else
324
+ member.ivar_name || :"@#{member.name}"
325
+ end
326
+
327
+ if ivar_name
328
+ insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
329
+ end
435
330
  end
436
- ]
437
- )
331
+
332
+ when AST::Members::ClassInstanceVariable
333
+ insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
334
+
335
+ when AST::Members::ClassVariable
336
+ insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
337
+ end
338
+ end
438
339
  end
439
340
  end
440
-
441
- merge_definitions(type_name, definition_pairs, entry: entry, self_type: self_type, ancestors: ancestors)
442
341
  end
443
342
  end
444
343
  end
@@ -450,333 +349,84 @@ module RBS
450
349
 
451
350
  case entry
452
351
  when Environment::ClassEntry, Environment::ModuleEntry
453
- ancestors = singleton_ancestors(type_name)
352
+ ancestors = ancestor_builder.singleton_ancestors(type_name)
454
353
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
455
354
  instance_type = Types::ClassInstance.new(
456
355
  name: type_name,
457
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
356
+ args: entry.type_params.each.map { Types::Bases::Any.new(location: nil) },
458
357
  location: nil
459
358
  )
460
359
 
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)
475
- end
476
-
477
- [
478
- ancestor,
479
- definition
480
- ]
481
- 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
-
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?
504
- end
505
-
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
518
-
519
- interface_definition = build_interface(interface_name)
520
-
521
- InvalidTypeApplicationError.check!(
522
- type_name: interface_name,
523
- args: interface_args,
524
- params: interface_definition.type_params_decl,
525
- location: member.location
526
- )
527
-
528
- sub = Substitution.build(interface_definition.type_params, interface_args)
529
-
530
- interface_definition.methods.each do |name, method|
531
- interface_methods[name] = [method.sub(sub), member]
532
- end
533
- end
534
- end
535
- end
536
- end
537
- end
538
-
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
588
-
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
360
+ Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
361
+ def0 = build_singleton0(type_name)
362
+ subst = Substitution.build([], [], instance_type: instance_type)
594
363
 
595
- result
596
- end
597
-
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
- )
364
+ merge_definition(src: def0, dest: definition, subst: subst, keep_super: true)
611
365
 
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
366
+ if entry.is_a?(Environment::ClassEntry)
367
+ new_method = definition.methods[:new]
368
+ if new_method.defs.all? {|d| d.defined_in == BuiltinNames::Class.name }
369
+ # The method is _untyped new_.
615
370
 
616
- members = if primary_member
617
- [primary_member, *overload_members]
618
- else
619
- overload_members
620
- end
371
+ instance = build_instance(type_name)
372
+ initialize = instance.methods[:initialize]
621
373
 
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
374
+ if initialize
375
+ class_params = entry.type_params.each.map(&:name)
637
376
 
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
377
+ # Inject a virtual _typed new_.
378
+ initialize_defs = initialize.defs
379
+ definition.methods[:new] = Definition::Method.new(
380
+ super_method: new_method,
381
+ defs: initialize_defs.map do |initialize_def|
382
+ method_type = initialize_def.type
647
383
 
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
384
+ class_type_param_vars = Set.new(class_params)
385
+ method_type_param_vars = Set.new(method_type.type_params)
656
386
 
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
387
+ if class_type_param_vars.intersect?(method_type_param_vars)
388
+ renamed_method_params = method_type.type_params.map do |name|
389
+ if class_type_param_vars.include?(name)
390
+ Types::Variable.fresh(name).name
391
+ else
392
+ name
393
+ end
394
+ end
395
+ method_params = class_params + renamed_method_params
663
396
 
664
- ivar_name = case member.ivar_name
665
- when false
666
- nil
667
- else
668
- member.ivar_name || :"@#{member.name}"
669
- end
397
+ sub = Substitution.build(method_type.type_params, Types::Variable.build(renamed_method_params))
398
+ else
399
+ method_params = class_params + method_type.type_params
400
+ sub = Substitution.build([], [])
401
+ end
670
402
 
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
403
+ method_type = method_type.map_type {|ty| ty.sub(sub) }
404
+ method_type = method_type.update(
405
+ type_params: method_params,
406
+ type: method_type.type.with_return_type(
407
+ Types::ClassInstance.new(
408
+ name: type_name,
409
+ args: Types::Variable.build(entry.type_params.each.map(&:name)),
410
+ location: nil
411
+ )
412
+ )
685
413
  )
686
- ],
687
- accessibility: accessibility,
688
- alias_of: nil
689
- )
690
- end
691
414
 
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
415
  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,
416
+ type: method_type,
417
+ member: initialize_def.member,
418
+ defined_in: initialize_def.defined_in,
419
+ implemented_in: initialize_def.implemented_in
420
+ )
421
+ end,
422
+ accessibility: :public,
423
+ annotations: [],
711
424
  alias_of: nil
712
425
  )
713
426
  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
427
  end
738
428
  end
739
429
  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
- end
771
- end
772
- end
773
-
774
- entry.decls.each do |d|
775
- validate_parameter_variance(
776
- decl: d.decl,
777
- methods: definition.methods
778
- )
779
- end
780
430
  end
781
431
  end
782
432
  end
@@ -791,277 +441,313 @@ module RBS
791
441
  end
792
442
  end
793
443
 
794
- def validate_parameter_variance(decl:, methods:)
795
- type_params = decl.type_params
796
-
797
- calculator = VarianceCalculator.new(builder: self)
798
- param_names = type_params.each.map(&:name)
799
-
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
810
- )
811
- end
444
+ def source_location(source, decl)
445
+ case source
446
+ when nil
447
+ decl.location
448
+ when :super
449
+ case decl
450
+ when AST::Declarations::Class
451
+ decl.super_class&.location
812
452
  end
453
+ else
454
+ source.location
813
455
  end
456
+ end
814
457
 
815
- # @type var result: VarianceCalculator::Result
458
+ def validate_type_params(definition, ancestors:, methods:)
459
+ type_params = definition.type_params_decl
816
460
 
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)
461
+ calculator = VarianceCalculator.new(builder: self)
462
+ param_names = type_params.each.map(&:name)
822
463
 
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
464
+ ancestors.each_ancestor do |ancestor|
465
+ case ancestor
466
+ when Definition::Ancestor::Instance
467
+ result = calculator.in_inherit(name: ancestor.name, args: ancestor.args, variables: param_names)
468
+ validate_params_with(type_params, result: result) do |param|
469
+ decl = case entry = definition.entry
470
+ when Environment::ModuleEntry, Environment::ClassEntry
471
+ entry.primary.decl
472
+ when Environment::SingleEntry
473
+ entry.decl
474
+ end
475
+
476
+ raise InvalidVarianceAnnotationError.new(
477
+ type_name: definition.type_name,
478
+ param: param,
479
+ location: source_location(ancestor.source, decl)
480
+ )
829
481
  end
830
482
  end
831
483
  end
832
484
 
833
- methods.each do |name, method|
834
- method.method_types.each do |method_type|
835
- unless name == :initialize
485
+ methods.each do |defn|
486
+ next if defn.name == :initialize
487
+
488
+ method_types = case original = defn.original
489
+ when AST::Members::MethodDefinition
490
+ original.types
491
+ when AST::Members::AttrWriter, AST::Members::AttrReader, AST::Members::AttrAccessor
492
+ if defn.name.to_s.end_with?("=")
493
+ [
494
+ MethodType.new(
495
+ type_params: [],
496
+ type: Types::Function.empty(original.type).update(
497
+ required_positionals: [
498
+ Types::Function::Param.new(type: original.type, name: original.name)
499
+ ]
500
+ ),
501
+ block: nil,
502
+ location: original.location
503
+ )
504
+ ]
505
+ else
506
+ [
507
+ MethodType.new(
508
+ type_params: [],
509
+ type: Types::Function.empty(original.type),
510
+ block: nil,
511
+ location: original.location
512
+ )
513
+ ]
514
+ end
515
+ when AST::Members::Alias
516
+ nil
517
+ when nil
518
+ nil
519
+ end
520
+
521
+ if method_types
522
+ method_types.each do |method_type|
836
523
  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
524
+ validate_params_with(type_params, result: result) do |param|
525
+ raise InvalidVarianceAnnotationError.new(
526
+ type_name: definition.type_name,
527
+ param: param,
528
+ location: method_type.location
843
529
  )
844
530
  end
845
531
  end
846
532
  end
847
533
  end
534
+ end
848
535
 
849
- unless errors.empty?
850
- raise InvalidVarianceAnnotationError.new(decl: decl, errors: errors)
851
- end
536
+ def insert_variable(type_name, variables, name:, type:)
537
+ variables[name] = Definition::Variable.new(
538
+ parent_variable: variables[name],
539
+ type: type,
540
+ declared_in: type_name
541
+ )
852
542
  end
853
543
 
854
- def build_one_singleton(type_name)
855
- try_cache(type_name, cache: one_singleton_cache) do
856
- entry = env.class_decls[type_name]
544
+ def define_methods(definition, interface_methods:, methods:, super_interface_method:)
545
+ methods.each do |method_def|
546
+ method_name = method_def.name
547
+ original = method_def.original
857
548
 
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
- )
549
+ if original.is_a?(AST::Members::Alias)
550
+ existing_method = interface_methods[method_name] || definition.methods[method_name]
551
+ original_method = interface_methods[original.old_name] || definition.methods[original.old_name]
863
552
 
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
553
+ unless original_method
554
+ raise UnknownMethodAliasError.new(
555
+ original_name: original.old_name,
556
+ aliased_name: original.new_name,
557
+ location: original.location
558
+ )
559
+ end
867
560
 
868
- members = if primary_member
869
- [primary_member, *overload_members]
870
- else
871
- overload_members
872
- end
561
+ method = Definition::Method.new(
562
+ super_method: existing_method,
563
+ defs: original_method.defs.map do |defn|
564
+ defn.update(defined_in: definition.type_name, implemented_in: definition.type_name)
565
+ end,
566
+ accessibility: method_def.accessibility,
567
+ alias_of: original_method
568
+ )
569
+ else
570
+ if interface_methods.key?(method_name)
571
+ interface_method = interface_methods[method_name]
873
572
 
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
573
+ if original = method_def.original
574
+ raise DuplicatedMethodDefinitionError.new(
575
+ type: definition.self_type,
576
+ method_name: method_name,
577
+ members: [original]
896
578
  )
897
579
  end
898
- end
899
580
 
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
- )
581
+ definition.methods[method_name] = interface_method
582
+ end
911
583
 
912
- DuplicatedMethodDefinitionError.check!(
913
- decl: d.decl,
914
- methods: definition.methods,
915
- name: member.new_name,
916
- location: member.location
917
- )
584
+ existing_method = definition.methods[method_name]
918
585
 
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
586
+ case original
587
+ when AST::Members::MethodDefinition
588
+ defs = original.types.map do |method_type|
589
+ Definition::Method::TypeDef.new(
590
+ type: method_type,
591
+ member: original,
592
+ defined_in: definition.type_name,
593
+ implemented_in: definition.type_name
594
+ )
929
595
  end
930
- end
931
596
 
932
- unless definition.methods.key?(:new)
933
- instance = build_instance(type_name)
934
- initialize = instance.methods[:initialize]
597
+ # @type var accessibility: RBS::Definition::accessibility
598
+ accessibility = if method_name == :initialize
599
+ :private
600
+ else
601
+ method_def.accessibility
602
+ end
935
603
 
936
- if initialize
937
- class_params = entry.type_params.each.map(&:name)
604
+ method = Definition::Method.new(
605
+ super_method: existing_method,
606
+ defs: defs,
607
+ accessibility: accessibility,
608
+ alias_of: nil
609
+ )
938
610
 
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
611
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
612
+ method_type = if method_name.to_s.end_with?("=")
613
+ # setter
614
+ MethodType.new(
615
+ type_params: [],
616
+ type: Types::Function.empty(original.type).update(
617
+ required_positionals: [
618
+ Types::Function::Param.new(type: original.type, name: original.name)
619
+ ]
620
+ ),
621
+ block: nil,
622
+ location: nil
623
+ )
624
+ else
625
+ # getter
626
+ MethodType.new(
627
+ type_params: [],
628
+ type: Types::Function.empty(original.type),
629
+ block: nil,
630
+ location: nil
631
+ )
632
+ end
633
+ defs = [
634
+ Definition::Method::TypeDef.new(
635
+ type: method_type,
636
+ member: original,
637
+ defined_in: definition.type_name,
638
+ implemented_in: definition.type_name
639
+ )
640
+ ]
944
641
 
945
- class_type_param_vars = Set.new(class_params)
946
- method_type_param_vars = Set.new(method_type.type_params)
642
+ method = Definition::Method.new(
643
+ super_method: existing_method,
644
+ defs: defs,
645
+ accessibility: method_def.accessibility,
646
+ alias_of: nil
647
+ )
947
648
 
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
649
+ when nil
650
+ unless definition.methods.key?(method_name)
651
+ raise InvalidOverloadMethodError.new(
652
+ type_name: definition.type_name,
653
+ method_name: method_name,
654
+ kind: :instance,
655
+ members: method_def.overloads
656
+ )
657
+ end
957
658
 
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
659
+ if !super_interface_method && existing_method.defs.any? {|defn| defn.defined_in.interface? }
660
+ super_method = existing_method.super_method
661
+ else
662
+ super_method = existing_method
663
+ end
963
664
 
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
- )
665
+ method = Definition::Method.new(
666
+ super_method: super_method,
667
+ defs: existing_method.defs.map do |defn|
668
+ defn.update(implemented_in: definition.type_name)
669
+ end,
670
+ accessibility: existing_method.accessibility,
671
+ alias_of: existing_method.alias_of
672
+ )
673
+ end
674
+ end
969
675
 
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
676
+ method_def.overloads.each do |overload|
677
+ type_defs = overload.types.map do |method_type|
678
+ Definition::Method::TypeDef.new(
679
+ type: method_type,
680
+ member: overload,
681
+ defined_in: definition.type_name,
682
+ implemented_in: definition.type_name
683
+ )
982
684
  end
983
685
 
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
- )
686
+ method.defs.unshift(*type_defs)
687
+ end
993
688
 
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
689
+ definition.methods[method_name] = method
690
+ end
691
+
692
+ interface_methods.each do |name, method|
693
+ unless methods.methods.key?(name)
694
+ merge_method(definition.type_name, definition.methods, name, method, Substitution.new)
1003
695
  end
1004
696
  end
1005
697
  end
1006
698
 
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
699
+ def merge_definition(src:, dest:, subst:, implemented_in: :keep, keep_super: false)
700
+ src.methods.each do |name, method|
701
+ merge_method(dest.type_name, dest.methods, name, method, subst, implemented_in: implemented_in, keep_super: keep_super)
702
+ end
1028
703
 
1029
- current_definition.instance_variables.each do |name, variable|
1030
- merge_variable definition.instance_variables, name, variable
1031
- end
704
+ src.instance_variables.each do |name, variable|
705
+ merge_variable(dest.instance_variables, name, variable, subst, keep_super: keep_super)
706
+ end
1032
707
 
1033
- current_definition.class_variables.each do |name, variable|
1034
- merge_variable definition.class_variables, name, variable
1035
- end
1036
- end
708
+ src.class_variables.each do |name, variable|
709
+ merge_variable(dest.class_variables, name, variable, subst, keep_super: keep_super)
1037
710
  end
1038
711
  end
1039
712
 
1040
- def merge_variable(variables, name, variable)
713
+ def merge_variable(variables, name, variable, sub, keep_super: false)
1041
714
  super_variable = variables[name]
1042
715
 
1043
716
  variables[name] = Definition::Variable.new(
1044
- parent_variable: super_variable,
1045
- type: variable.type,
717
+ parent_variable: keep_super ? variable.parent_variable : super_variable,
718
+ type: sub.empty? ? variable.type : variable.type.sub(sub),
1046
719
  declared_in: variable.declared_in
1047
720
  )
1048
721
  end
1049
722
 
1050
- def merge_method(type_name, methods, name, method, sub, kind:)
1051
- super_method = methods[name]
723
+ def merge_method(type_name, methods, name, method, sub, implemented_in: :keep, keep_super: false)
724
+ defs = method.defs.yield_self do |defs|
725
+ if sub.empty? && implemented_in == :keep
726
+ defs
727
+ else
728
+ defs.map do |defn|
729
+ defn.update(
730
+ type: sub.empty? ? defn.type : defn.type.sub(sub),
731
+ implemented_in: case implemented_in
732
+ when :keep
733
+ defn.implemented_in
734
+ when nil
735
+ nil
736
+ else
737
+ implemented_in
738
+ end
739
+ )
740
+ end
741
+ end
742
+ end
1052
743
 
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
744
+ super_method = methods[name]
1059
745
 
1060
746
  methods[name] = Definition::Method.new(
1061
- super_method: super_method,
747
+ super_method: keep_super ? method.super_method : super_method,
1062
748
  accessibility: method.accessibility,
1063
- defs: sub.mapping.empty? ? defs : defs.map {|defn| defn.update(type: defn.type.sub(sub)) },
1064
- alias_of: nil
749
+ defs: defs,
750
+ alias_of: method.alias_of
1065
751
  )
1066
752
  end
1067
753
 
@@ -1086,103 +772,6 @@ module RBS
1086
772
  end
1087
773
  end
1088
774
 
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
775
  def expand_alias(type_name)
1187
776
  entry = env.alias_decls[type_name] or raise "Unknown name for expand_alias: #{type_name}"
1188
777
  ensure_namespace!(type_name.namespace, location: entry.decl.location)