rbs 3.9.2 → 4.0.0.dev.1

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.github/workflows/windows.yml +1 -1
  4. data/CHANGELOG.md +0 -13
  5. data/Rakefile +28 -21
  6. data/Steepfile +1 -0
  7. data/config.yml +232 -62
  8. data/ext/rbs_extension/ast_translation.c +1149 -0
  9. data/ext/rbs_extension/ast_translation.h +30 -0
  10. data/{src/constants.c → ext/rbs_extension/class_constants.c} +15 -1
  11. data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +10 -1
  12. data/ext/rbs_extension/extconf.rb +3 -1
  13. data/ext/rbs_extension/{location.c → legacy_location.c} +25 -34
  14. data/ext/rbs_extension/legacy_location.h +40 -0
  15. data/ext/rbs_extension/main.c +402 -8
  16. data/ext/rbs_extension/rbs_extension.h +3 -21
  17. data/ext/rbs_extension/rbs_string_bridging.c +9 -0
  18. data/ext/rbs_extension/rbs_string_bridging.h +20 -0
  19. data/include/rbs/ast.h +748 -0
  20. data/include/rbs/defines.h +60 -0
  21. data/{ext/rbs_extension → include/rbs}/lexer.h +40 -32
  22. data/include/rbs/location.h +59 -0
  23. data/include/rbs/parser.h +151 -0
  24. data/include/rbs/string.h +49 -0
  25. data/include/rbs/util/rbs_allocator.h +38 -0
  26. data/include/rbs/util/rbs_assert.h +9 -0
  27. data/include/rbs/util/rbs_buffer.h +83 -0
  28. data/include/rbs/util/rbs_constant_pool.h +3 -64
  29. data/include/rbs/util/rbs_encoding.h +280 -0
  30. data/include/rbs/util/rbs_unescape.h +23 -0
  31. data/include/rbs.h +1 -2
  32. data/lib/rbs/annotate/formatter.rb +3 -13
  33. data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
  34. data/lib/rbs/annotate/rdoc_source.rb +1 -1
  35. data/lib/rbs/ast/ruby/annotations.rb +119 -0
  36. data/lib/rbs/ast/ruby/comment_block.rb +221 -0
  37. data/lib/rbs/ast/ruby/declarations.rb +86 -0
  38. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
  39. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  40. data/lib/rbs/ast/ruby/members.rb +213 -0
  41. data/lib/rbs/buffer.rb +104 -24
  42. data/lib/rbs/cli/validate.rb +39 -34
  43. data/lib/rbs/cli.rb +4 -5
  44. data/lib/rbs/definition.rb +6 -1
  45. data/lib/rbs/definition_builder/ancestor_builder.rb +63 -60
  46. data/lib/rbs/definition_builder/method_builder.rb +45 -30
  47. data/lib/rbs/definition_builder.rb +44 -9
  48. data/lib/rbs/environment/class_entry.rb +69 -0
  49. data/lib/rbs/environment/module_entry.rb +66 -0
  50. data/lib/rbs/environment.rb +185 -154
  51. data/lib/rbs/environment_loader.rb +2 -2
  52. data/lib/rbs/errors.rb +4 -3
  53. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  54. data/lib/rbs/inline_parser.rb +206 -0
  55. data/lib/rbs/location_aux.rb +35 -3
  56. data/lib/rbs/parser_aux.rb +11 -1
  57. data/lib/rbs/prototype/runtime.rb +2 -2
  58. data/lib/rbs/source.rb +99 -0
  59. data/lib/rbs/subtractor.rb +4 -3
  60. data/lib/rbs/version.rb +1 -1
  61. data/lib/rbs.rb +12 -0
  62. data/lib/rdoc/discover.rb +1 -1
  63. data/lib/rdoc_plugin/parser.rb +2 -2
  64. data/rbs.gemspec +1 -0
  65. data/sig/ancestor_builder.rbs +1 -1
  66. data/sig/annotate/formatter.rbs +2 -2
  67. data/sig/annotate/rdoc_annotater.rbs +1 -1
  68. data/sig/ast/ruby/annotations.rbs +110 -0
  69. data/sig/ast/ruby/comment_block.rbs +119 -0
  70. data/sig/ast/ruby/declarations.rbs +60 -0
  71. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  72. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  73. data/sig/ast/ruby/members.rbs +72 -0
  74. data/sig/buffer.rbs +63 -5
  75. data/sig/definition.rbs +1 -0
  76. data/sig/definition_builder.rbs +1 -1
  77. data/sig/environment/class_entry.rbs +50 -0
  78. data/sig/environment/module_entry.rbs +50 -0
  79. data/sig/environment.rbs +22 -76
  80. data/sig/errors.rbs +13 -6
  81. data/sig/inline_parser/comment_association.rbs +71 -0
  82. data/sig/inline_parser.rbs +87 -0
  83. data/sig/location.rbs +32 -7
  84. data/sig/method_builder.rbs +7 -4
  85. data/sig/parser.rbs +16 -0
  86. data/sig/source.rbs +48 -0
  87. data/src/ast.c +1345 -0
  88. data/src/lexer.c +2867 -0
  89. data/src/lexer.re +151 -0
  90. data/{ext/rbs_extension → src}/lexstate.c +58 -42
  91. data/src/location.c +71 -0
  92. data/src/parser.c +3739 -0
  93. data/src/string.c +89 -0
  94. data/src/util/rbs_allocator.c +149 -0
  95. data/src/util/rbs_assert.c +19 -0
  96. data/src/util/rbs_buffer.c +54 -0
  97. data/src/util/rbs_constant_pool.c +13 -81
  98. data/src/util/rbs_encoding.c +5273 -0
  99. data/src/util/rbs_unescape.c +130 -0
  100. data/stdlib/rdoc/0/code_object.rbs +2 -2
  101. data/stdlib/rdoc/0/comment.rbs +2 -0
  102. data/stdlib/rdoc/0/options.rbs +76 -0
  103. data/stdlib/rdoc/0/rdoc.rbs +6 -4
  104. data/stdlib/rdoc/0/store.rbs +1 -1
  105. metadata +70 -17
  106. data/ext/rbs_extension/lexer.c +0 -2728
  107. data/ext/rbs_extension/lexer.re +0 -147
  108. data/ext/rbs_extension/location.h +0 -85
  109. data/ext/rbs_extension/parser.c +0 -2982
  110. data/ext/rbs_extension/parser.h +0 -18
  111. data/ext/rbs_extension/parserstate.c +0 -411
  112. data/ext/rbs_extension/parserstate.h +0 -163
  113. data/ext/rbs_extension/unescape.c +0 -32
  114. data/include/rbs/ruby_objs.h +0 -72
  115. data/src/ruby_objs.c +0 -799
@@ -173,12 +173,12 @@ module RBS
173
173
  end
174
174
 
175
175
  def validate_super_class!(type_name, entry)
176
- with_super_classes = entry.decls.select {|d| d.decl.super_class }
176
+ with_super_classes = entry.each_decl.select {|decl| decl.super_class }
177
177
 
178
178
  return if with_super_classes.size <= 1
179
179
 
180
- super_types = with_super_classes.map do |d|
181
- super_class = d.decl.super_class or raise
180
+ super_types = with_super_classes.map do |decl|
181
+ super_class = decl.super_class or raise
182
182
  Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
183
183
  end
184
184
 
@@ -200,8 +200,8 @@ module RBS
200
200
  case entry
201
201
  when Environment::ClassEntry
202
202
  validate_super_class!(type_name, entry)
203
- primary = entry.primary
204
- super_class = primary.decl.super_class
203
+ primary = entry.primary_decl
204
+ super_class = primary.super_class
205
205
 
206
206
  if type_name != BuiltinNames::BasicObject.name
207
207
  if super_class
@@ -214,7 +214,7 @@ module RBS
214
214
 
215
215
  super_name = env.normalize_module_name(super_name)
216
216
 
217
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
217
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
218
218
  if super_class
219
219
  InheritModuleError.check!(super_class, env: env)
220
220
  InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
@@ -283,8 +283,8 @@ module RBS
283
283
  case entry
284
284
  when Environment::ClassEntry
285
285
  validate_super_class!(type_name, entry)
286
- primary = entry.primary
287
- super_class = primary.decl.super_class
286
+ primary = entry.primary_decl
287
+ super_class = primary.super_class
288
288
 
289
289
  if type_name != BuiltinNames::BasicObject.name
290
290
  if super_class
@@ -295,7 +295,7 @@ module RBS
295
295
 
296
296
  super_name = env.normalize_module_name(super_name)
297
297
 
298
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
298
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
299
299
  if super_class
300
300
  InheritModuleError.check!(super_class, env: env)
301
301
  end
@@ -348,75 +348,78 @@ module RBS
348
348
  end
349
349
 
350
350
  def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
351
- decl.each_mixin do |member|
352
- case member
353
- when AST::Members::Include
354
- module_name = member.name
355
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
351
+ case decl
352
+ when AST::Declarations::Base
353
+ decl.each_mixin do |member|
354
+ case member
355
+ when AST::Members::Include
356
+ module_name = member.name
357
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
356
358
 
357
- case
358
- when member.name.class? && included_modules
359
- MixinClassError.check!(type_name: type_name, env: env, member: member)
360
- NoMixinFoundError.check!(member.name, env: env, member: member)
359
+ case
360
+ when member.name.class? && included_modules
361
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
362
+ NoMixinFoundError.check!(member.name, env: env, member: member)
361
363
 
362
- module_decl = env.normalized_module_entry(module_name) or raise
363
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
+ module_decl = env.normalized_module_entry(module_name) or raise
365
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
366
 
365
- module_name = env.normalize_module_name(module_name)
366
- included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
367
- when member.name.interface? && included_interfaces
368
- NoMixinFoundError.check!(member.name, env: env, member: member)
367
+ module_name = env.normalize_module_name(module_name)
368
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
369
+ when member.name.interface? && included_interfaces
370
+ NoMixinFoundError.check!(member.name, env: env, member: member)
369
371
 
370
- interface_decl = env.interface_decls.fetch(module_name)
371
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
+ interface_decl = env.interface_decls.fetch(module_name)
373
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
374
 
373
- included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
374
- end
375
+ included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
376
+ end
375
377
 
376
- when AST::Members::Prepend
377
- if prepended_modules
378
- MixinClassError.check!(type_name: type_name, env: env, member: member)
379
- NoMixinFoundError.check!(member.name, env: env, member: member)
378
+ when AST::Members::Prepend
379
+ if prepended_modules
380
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
381
+ NoMixinFoundError.check!(member.name, env: env, member: member)
380
382
 
381
- module_decl = env.normalized_module_entry(member.name) or raise
382
- module_name = module_decl.name
383
+ module_decl = env.normalized_module_entry(member.name) or raise
384
+ module_name = module_decl.name
383
385
 
384
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
385
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
387
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
388
 
387
- prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
388
- end
389
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
390
+ end
389
391
 
390
- when AST::Members::Extend
391
- module_name = member.name
392
- module_args = member.args
392
+ when AST::Members::Extend
393
+ module_name = member.name
394
+ module_args = member.args
393
395
 
394
- case
395
- when member.name.class? && extended_modules
396
- MixinClassError.check!(type_name: type_name, env: env, member: member)
397
- NoMixinFoundError.check!(member.name, env: env, member: member)
396
+ case
397
+ when member.name.class? && extended_modules
398
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
399
+ NoMixinFoundError.check!(member.name, env: env, member: member)
398
400
 
399
- module_decl = env.normalized_module_entry(module_name) or raise
400
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
+ module_decl = env.normalized_module_entry(module_name) or raise
402
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
403
 
402
- module_name = env.normalize_module_name(module_name)
403
- extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
404
- when member.name.interface? && extended_interfaces
405
- NoMixinFoundError.check!(member.name, env: env, member: member)
404
+ module_name = env.normalize_module_name(module_name)
405
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
406
+ when member.name.interface? && extended_interfaces
407
+ NoMixinFoundError.check!(member.name, env: env, member: member)
406
408
 
407
- interface_decl = env.interface_decls.fetch(module_name)
408
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
+ interface_decl = env.interface_decls.fetch(module_name)
410
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
411
 
410
- extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
412
+ extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
413
+ end
411
414
  end
412
415
  end
416
+ when AST::Ruby::Declarations::Base
417
+ # noop
413
418
  end
414
419
  end
415
420
 
416
421
  def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
417
- entry.decls.each do |d|
418
- decl = d.decl
419
-
422
+ entry.each_decl do |decl|
420
423
  align_params = Substitution.build(
421
424
  decl.type_params.each.map(&:name),
422
425
  entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -445,7 +448,7 @@ module RBS
445
448
 
446
449
  RecursiveAncestorError.check!(self_ancestor,
447
450
  ancestors: building_ancestors,
448
- location: entry.primary.decl.location)
451
+ location: entry.primary_decl.location)
449
452
  building_ancestors.push self_ancestor
450
453
 
451
454
  one_ancestors = one_instance_ancestors(type_name)
@@ -462,7 +465,7 @@ module RBS
462
465
 
463
466
  super_ancestors =
464
467
  instance_ancestors(super_name, building_ancestors: building_ancestors)
465
- .apply(super_args, env: env, location: entry.primary.decl.super_class&.location)
468
+ .apply(super_args, env: env, location: entry.primary_decl.super_class&.location)
466
469
  super_ancestors.map! {|ancestor| fill_ancestor_source(ancestor, name: super_name, source: :super) }
467
470
  ancestors.unshift(*super_ancestors)
468
471
  end
@@ -522,7 +525,7 @@ module RBS
522
525
 
523
526
  RecursiveAncestorError.check!(self_ancestor,
524
527
  ancestors: building_ancestors,
525
- location: entry.primary.decl.location)
528
+ location: entry.primary_decl.location)
526
529
  building_ancestors.push self_ancestor
527
530
 
528
531
  one_ancestors = one_singleton_ancestors(type_name)
@@ -103,38 +103,53 @@ module RBS
103
103
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
104
104
  type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
105
105
  Methods.new(type: type).tap do |methods|
106
- entry.decls.each do |d|
107
- subst = Substitution.build(d.decl.type_params.each.map(&:name), args)
108
- each_member_with_accessibility(d.decl.members) do |member, accessibility|
109
- case member
110
- when AST::Members::MethodDefinition
111
- case member.kind
112
- when :instance
113
- build_method(
114
- methods,
115
- type,
116
- member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
117
- accessibility: member.visibility || accessibility
118
- )
119
- when :singleton_instance
106
+ entry.each_decl do |decl|
107
+ subst = Substitution.build(decl.type_params.each.map(&:name), args)
108
+ case decl
109
+ when AST::Declarations::Base
110
+ each_rbs_member_with_accessibility(decl.members) do |member, accessibility|
111
+ case member
112
+ when AST::Members::MethodDefinition
113
+ case member.kind
114
+ when :instance
115
+ build_method(
116
+ methods,
117
+ type,
118
+ member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
119
+ accessibility: member.visibility || accessibility
120
+ )
121
+ when :singleton_instance
122
+ build_method(
123
+ methods,
124
+ type,
125
+ member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
126
+ accessibility: :private
127
+ )
128
+ end
129
+ when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
130
+ if member.kind == :instance
131
+ build_attribute(methods,
132
+ type,
133
+ member: member.update(type: member.type.sub(subst)),
134
+ accessibility: member.visibility || accessibility)
135
+ end
136
+ when AST::Members::Alias
137
+ if member.kind == :instance
138
+ build_alias(methods, type, member: member)
139
+ end
140
+ end
141
+ end
142
+ when AST::Ruby::Declarations::Base
143
+ decl.members.each do |member|
144
+ case member
145
+ when AST::Ruby::Members::DefMember
120
146
  build_method(
121
147
  methods,
122
148
  type,
123
- member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
124
- accessibility: :private
149
+ member: member,
150
+ accessibility: :public
125
151
  )
126
152
  end
127
- when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
128
- if member.kind == :instance
129
- build_attribute(methods,
130
- type,
131
- member: member.update(type: member.type.sub(subst)),
132
- accessibility: member.visibility || accessibility)
133
- end
134
- when AST::Members::Alias
135
- if member.kind == :instance
136
- build_alias(methods, type, member: member)
137
- end
138
153
  end
139
154
  end
140
155
  end
@@ -149,8 +164,8 @@ module RBS
149
164
  type = Types::ClassSingleton.new(name: type_name, location: nil)
150
165
 
151
166
  Methods.new(type: type).tap do |methods|
152
- entry.decls.each do |d|
153
- d.decl.members.each do |member|
167
+ entry.each_decl do |decl|
168
+ decl.members.each do |member|
154
169
  case member
155
170
  when AST::Members::MethodDefinition
156
171
  if member.singleton?
@@ -223,7 +238,7 @@ module RBS
223
238
  end
224
239
  end
225
240
 
226
- def each_member_with_accessibility(members, accessibility: :public)
241
+ def each_rbs_member_with_accessibility(members, accessibility: :public)
227
242
  members.each do |member|
228
243
  case member
229
244
  when AST::Members::Public
@@ -126,10 +126,10 @@ module RBS
126
126
  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
127
127
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
128
128
 
129
- entry.decls.each do |d|
130
- subst_ = subst + Substitution.build(d.decl.type_params.each.map(&:name), args)
129
+ entry.each_decl do |decl|
130
+ subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
131
131
 
132
- d.decl.members.each do |member|
132
+ decl.members.each do |member|
133
133
  case member
134
134
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
135
135
  if member.kind == :instance
@@ -174,7 +174,7 @@ module RBS
174
174
 
175
175
  try_cache(type_name, cache: instance_cache) do
176
176
  entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
177
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
177
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
178
178
 
179
179
  ancestors = ancestor_builder.instance_ancestors(type_name)
180
180
  args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -234,7 +234,7 @@ module RBS
234
234
  def build_singleton0(type_name)
235
235
  try_cache type_name, cache: singleton0_cache do
236
236
  entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
237
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
237
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
238
238
 
239
239
  ancestors = ancestor_builder.singleton_ancestors(type_name)
240
240
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -272,8 +272,8 @@ module RBS
272
272
  interface_methods = interface_methods(all_interfaces)
273
273
  import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
274
274
 
275
- entry.decls.each do |d|
276
- d.decl.members.each do |member|
275
+ entry.each_decl do |decl|
276
+ decl.members.each do |member|
277
277
  case member
278
278
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
279
279
  if member.kind == :singleton
@@ -306,7 +306,7 @@ module RBS
306
306
 
307
307
  try_cache type_name, cache: singleton_cache do
308
308
  entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
309
- ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
309
+ ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
310
310
 
311
311
  ancestors = ancestor_builder.singleton_ancestors(type_name)
312
312
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -452,6 +452,10 @@ module RBS
452
452
  case decl
453
453
  when AST::Declarations::Class
454
454
  decl.super_class&.location
455
+ when AST::Ruby::Declarations::ClassDecl
456
+ nil
457
+ else
458
+ raise "Unexpected `:super` source location with #{decl.class}"
455
459
  end
456
460
  else
457
461
  source.location
@@ -471,7 +475,7 @@ module RBS
471
475
  validate_params_with(type_params, result: result) do |param|
472
476
  decl = case entry = definition.entry
473
477
  when Environment::ModuleEntry, Environment::ClassEntry
474
- entry.primary.decl
478
+ entry.primary_decl
475
479
  when Environment::SingleEntry
476
480
  entry.decl
477
481
  end
@@ -762,6 +766,37 @@ module RBS
762
766
  )
763
767
 
764
768
  method_definition.annotations.replace(original.annotations)
769
+ when AST::Ruby::Members::DefMember
770
+ if duplicated_method = methods[method.name]
771
+ raise DuplicatedMethodDefinitionError.new(
772
+ type: definition.self_type,
773
+ method_name: method.name,
774
+ members: [original, *duplicated_method.members]
775
+ )
776
+ end
777
+
778
+ defs = original.overloads.map do |overload|
779
+ Definition::Method::TypeDef.new(
780
+ type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
781
+ member: original,
782
+ defined_in: defined_in,
783
+ implemented_in: implemented_in
784
+ ).tap do |type_def|
785
+ # Keep the original annotations given to overloads.
786
+ type_def.overload_annotations.replace(overload.annotations)
787
+ end
788
+ end
789
+
790
+ method_definition = Definition::Method.new(
791
+ super_method: existing_method,
792
+ defs: defs,
793
+ accessibility: :public,
794
+ alias_of: nil,
795
+ alias_member: nil
796
+ )
797
+
798
+ method_definition.annotations.replace([])
799
+
765
800
  when nil
766
801
  # Overloading method definition only
767
802
 
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class Environment
5
+ class ClassEntry
6
+ attr_reader :name
7
+
8
+ attr_reader :context_decls
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ @context_decls = []
13
+ end
14
+
15
+ def <<(context_decl)
16
+ context_decls << context_decl
17
+ @primary_decl = nil
18
+ self
19
+ end
20
+
21
+ def each_decl(&block)
22
+ if block
23
+ context_decls.each do |_, decl|
24
+ yield decl
25
+ end
26
+ else
27
+ enum_for(__method__ || raise)
28
+ end
29
+ end
30
+
31
+ def empty?
32
+ context_decls.empty?
33
+ end
34
+
35
+ def primary_decl
36
+ @primary_decl ||= nil.tap do
37
+ # @type break: declaration
38
+
39
+ decl = each_decl.find {|decl| decl.super_class }
40
+ break decl if decl
41
+
42
+ decl = each_decl.first
43
+ break decl if decl
44
+ end || raise("Cannot find primary declaration for #{name}")
45
+ end
46
+
47
+ def type_params
48
+ validate_type_params
49
+ primary_decl.type_params
50
+ end
51
+
52
+ def validate_type_params
53
+ unless context_decls.empty?
54
+ first_decl, *rest_decls = each_decl.to_a
55
+ first_decl or raise
56
+
57
+ first_params = first_decl.type_params
58
+ first_names = first_params.map(&:name)
59
+ rest_decls.each do |other_decl|
60
+ other_params = other_decl.type_params
61
+ unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
62
+ raise GenericParameterMismatchError.new(name: name, decl: other_decl)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBS
4
+ class Environment
5
+ class ModuleEntry
6
+ attr_reader :name
7
+
8
+ attr_reader :context_decls
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ @context_decls = []
13
+ end
14
+
15
+ def <<(context_decl)
16
+ context_decls << context_decl
17
+ self
18
+ end
19
+
20
+ def each_decl(&block)
21
+ if block
22
+ context_decls.each do |_, decl|
23
+ yield decl
24
+ end
25
+ else
26
+ enum_for(__method__ || raise)
27
+ end
28
+ end
29
+
30
+ def empty?
31
+ context_decls.empty?
32
+ end
33
+
34
+ def primary_decl
35
+ each_decl.first or raise
36
+ end
37
+
38
+ def type_params
39
+ validate_type_params
40
+ primary_decl.type_params
41
+ end
42
+
43
+ def self_types
44
+ each_decl.flat_map do |decl|
45
+ decl.self_types
46
+ end.uniq
47
+ end
48
+
49
+ def validate_type_params
50
+ unless context_decls.empty?
51
+ first_decl, *rest_decls = each_decl.to_a
52
+ first_decl or raise
53
+
54
+ first_params = first_decl.type_params
55
+ first_names = first_params.map(&:name)
56
+ rest_decls.each do |other_decl|
57
+ other_params = other_decl.type_params
58
+ unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
59
+ raise GenericParameterMismatchError.new(name: name, decl: other_decl)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end