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.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +1 -1
- data/.github/workflows/windows.yml +1 -1
- data/CHANGELOG.md +0 -13
- data/Rakefile +28 -21
- data/Steepfile +1 -0
- data/config.yml +232 -62
- data/ext/rbs_extension/ast_translation.c +1149 -0
- data/ext/rbs_extension/ast_translation.h +30 -0
- data/{src/constants.c → ext/rbs_extension/class_constants.c} +15 -1
- data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +10 -1
- data/ext/rbs_extension/extconf.rb +3 -1
- data/ext/rbs_extension/{location.c → legacy_location.c} +25 -34
- data/ext/rbs_extension/legacy_location.h +40 -0
- data/ext/rbs_extension/main.c +402 -8
- data/ext/rbs_extension/rbs_extension.h +3 -21
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +20 -0
- data/include/rbs/ast.h +748 -0
- data/include/rbs/defines.h +60 -0
- data/{ext/rbs_extension → include/rbs}/lexer.h +40 -32
- data/include/rbs/location.h +59 -0
- data/include/rbs/parser.h +151 -0
- data/include/rbs/string.h +49 -0
- data/include/rbs/util/rbs_allocator.h +38 -0
- data/include/rbs/util/rbs_assert.h +9 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +3 -64
- data/include/rbs/util/rbs_encoding.h +280 -0
- data/include/rbs/util/rbs_unescape.h +23 -0
- data/include/rbs.h +1 -2
- data/lib/rbs/annotate/formatter.rb +3 -13
- data/lib/rbs/annotate/rdoc_annotator.rb +3 -1
- data/lib/rbs/annotate/rdoc_source.rb +1 -1
- data/lib/rbs/ast/ruby/annotations.rb +119 -0
- data/lib/rbs/ast/ruby/comment_block.rb +221 -0
- data/lib/rbs/ast/ruby/declarations.rb +86 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +213 -0
- data/lib/rbs/buffer.rb +104 -24
- data/lib/rbs/cli/validate.rb +39 -34
- data/lib/rbs/cli.rb +4 -5
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +63 -60
- data/lib/rbs/definition_builder/method_builder.rb +45 -30
- data/lib/rbs/definition_builder.rb +44 -9
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +185 -154
- data/lib/rbs/environment_loader.rb +2 -2
- data/lib/rbs/errors.rb +4 -3
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +206 -0
- data/lib/rbs/location_aux.rb +35 -3
- data/lib/rbs/parser_aux.rb +11 -1
- data/lib/rbs/prototype/runtime.rb +2 -2
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +12 -0
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +2 -2
- data/rbs.gemspec +1 -0
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +110 -0
- data/sig/ast/ruby/comment_block.rbs +119 -0
- data/sig/ast/ruby/declarations.rbs +60 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +72 -0
- data/sig/buffer.rbs +63 -5
- data/sig/definition.rbs +1 -0
- data/sig/definition_builder.rbs +1 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +22 -76
- data/sig/errors.rbs +13 -6
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +87 -0
- data/sig/location.rbs +32 -7
- data/sig/method_builder.rbs +7 -4
- data/sig/parser.rbs +16 -0
- data/sig/source.rbs +48 -0
- data/src/ast.c +1345 -0
- data/src/lexer.c +2867 -0
- data/src/lexer.re +151 -0
- data/{ext/rbs_extension → src}/lexstate.c +58 -42
- data/src/location.c +71 -0
- data/src/parser.c +3739 -0
- data/src/string.c +89 -0
- data/src/util/rbs_allocator.c +149 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +13 -81
- data/src/util/rbs_encoding.c +5273 -0
- data/src/util/rbs_unescape.c +130 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -2
- data/stdlib/rdoc/0/comment.rbs +2 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/rdoc.rbs +6 -4
- data/stdlib/rdoc/0/store.rbs +1 -1
- metadata +70 -17
- data/ext/rbs_extension/lexer.c +0 -2728
- data/ext/rbs_extension/lexer.re +0 -147
- data/ext/rbs_extension/location.h +0 -85
- data/ext/rbs_extension/parser.c +0 -2982
- data/ext/rbs_extension/parser.h +0 -18
- data/ext/rbs_extension/parserstate.c +0 -411
- data/ext/rbs_extension/parserstate.h +0 -163
- data/ext/rbs_extension/unescape.c +0 -32
- data/include/rbs/ruby_objs.h +0 -72
- 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.
|
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 |
|
181
|
-
super_class =
|
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.
|
204
|
-
super_class = primary.
|
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.
|
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.
|
287
|
-
super_class = primary.
|
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.
|
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
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
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
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
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
|
-
|
363
|
-
|
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
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
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
|
-
|
371
|
-
|
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
|
-
|
374
|
-
|
375
|
+
included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
376
|
+
end
|
375
377
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
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
|
-
|
382
|
-
|
383
|
+
module_decl = env.normalized_module_entry(member.name) or raise
|
384
|
+
module_name = module_decl.name
|
383
385
|
|
384
|
-
|
385
|
-
|
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
|
-
|
388
|
-
|
389
|
+
prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
390
|
+
end
|
389
391
|
|
390
|
-
|
391
|
-
|
392
|
-
|
392
|
+
when AST::Members::Extend
|
393
|
+
module_name = member.name
|
394
|
+
module_args = member.args
|
393
395
|
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
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
|
-
|
400
|
-
|
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
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
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
|
-
|
408
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
107
|
-
subst = Substitution.build(
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
case member
|
112
|
-
when
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
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
|
124
|
-
accessibility: :
|
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.
|
153
|
-
|
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
|
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.
|
130
|
-
subst_ = subst + Substitution.build(
|
129
|
+
entry.each_decl do |decl|
|
130
|
+
subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
|
131
131
|
|
132
|
-
|
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.
|
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.
|
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.
|
276
|
-
|
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.
|
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.
|
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
|