Skip to content

Commit e746976

Browse files
committed
Update DefinitionBuilder
1 parent 987fed8 commit e746976

File tree

4 files changed

+98
-4
lines changed

4 files changed

+98
-4
lines changed

lib/rbs/definition_builder.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ def import_methods(definition, module_name, module_methods, interfaces_methods,
606606

607607
methods.each do |method|
608608
if interface_method_duplicates.include?(method.name)
609-
member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
609+
(member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
610610

611611
raise DuplicatedInterfaceMethodDefinitionError.new(
612612
type: definition.self_type,

lib/rbs/definition_builder/ancestor_builder.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ def instance_ancestors(type_name, building_ancestors: [])
537537
included_modules.each do |mod|
538538
name = mod.name
539539
arg_types = mod.args
540-
mod.source.is_a?(AST::Members::Include) or raise
540+
(mod.source.is_a?(AST::Members::Include) || mod.source.is_a?(AST::Ruby::Members::IncludeMember)) or raise
541541
mod_ancestors =
542542
instance_ancestors(name, building_ancestors: building_ancestors)
543543
.apply(arg_types, env: env, location: mod.source.location)
@@ -552,7 +552,7 @@ def instance_ancestors(type_name, building_ancestors: [])
552552
prepended_modules.each do |mod|
553553
name = mod.name
554554
arg_types = mod.args
555-
mod.source.is_a?(AST::Members::Prepend) or raise
555+
(mod.source.is_a?(AST::Members::Prepend) || mod.source.is_a?(AST::Ruby::Members::PrependMember)) or raise
556556
mod_ancestors =
557557
instance_ancestors(name, building_ancestors: building_ancestors)
558558
.apply(arg_types, env: env, location: mod.source.location)
@@ -607,7 +607,7 @@ def singleton_ancestors(type_name, building_ancestors: [])
607607
extended_modules.each do |mod|
608608
name = mod.name
609609
args = mod.args
610-
mod.source.is_a?(AST::Members::Extend) or raise
610+
(mod.source.is_a?(AST::Members::Extend) || mod.source.is_a?(AST::Ruby::Members::ExtendMember)) or raise
611611
mod_ancestors =
612612
instance_ancestors(name, building_ancestors: building_ancestors)
613613
.apply(args, env: env, location: mod.source.location)

test/rbs/ancestor_builder_test.rb

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,4 +1295,43 @@ class TestPrependClass
12951295
end
12961296
end
12971297
end
1298+
1299+
def test__ruby__invalid_ancestor_args
1300+
SignatureManager.new do |manager|
1301+
manager.files[Pathname("foo.rbs")] = <<-EOF
1302+
module X
1303+
end
1304+
EOF
1305+
1306+
manager.ruby_files[Pathname("lib/test.rb")] = <<-RUBY
1307+
class A
1308+
include X #[bool]
1309+
end
1310+
1311+
class B
1312+
extend X #[untyped]
1313+
end
1314+
1315+
class C
1316+
prepend X #[void]
1317+
end
1318+
RUBY
1319+
1320+
manager.build do |env|
1321+
builder = DefinitionBuilder::AncestorBuilder.new(env: env)
1322+
1323+
assert_raises InvalidTypeApplicationError do
1324+
builder.instance_ancestors(type_name("::A"))
1325+
end
1326+
1327+
assert_raises InvalidTypeApplicationError do
1328+
builder.singleton_ancestors(type_name("::B"))
1329+
end
1330+
1331+
assert_raises InvalidTypeApplicationError do
1332+
builder.instance_ancestors(type_name("::C"))
1333+
end
1334+
end
1335+
end
1336+
end
12981337
end

test/rbs/definition_builder_test.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3253,4 +3253,59 @@ def hello(x) = 123
32533253
end
32543254
end
32553255
end
3256+
3257+
def test_ruby_mixin_members
3258+
SignatureManager.new do |manager|
3259+
manager.files[Pathname("modules.rbs")] = <<EOF
3260+
module M1[T]
3261+
def m1_method: [U] () { (T) -> U } -> Hash[T, U]
3262+
end
3263+
3264+
module M2
3265+
def m2_method: (untyped) -> bool
3266+
end
3267+
3268+
module M3
3269+
def m3_method: () -> String
3270+
end
3271+
EOF
3272+
3273+
manager.add_ruby_file("mixin_test.rb", <<~RUBY)
3274+
class A
3275+
include M1 #[String]
3276+
extend M2
3277+
prepend M3
3278+
end
3279+
RUBY
3280+
3281+
manager.build do |env|
3282+
builder = DefinitionBuilder.new(env: env)
3283+
3284+
builder.build_instance(type_name("::A")).tap do |definition|
3285+
# Test include: should have m1_method from M1[String]
3286+
definition.methods[:m1_method].tap do |method|
3287+
assert_equal type_name("::M1"), method.defined_in
3288+
assert_equal type_name("::M1"), method.implemented_in
3289+
assert_equal [parse_method_type("[U] () { (::String) -> U } -> ::Hash[::String, U]")], method.method_types
3290+
end
3291+
3292+
# Test prepend: should have m3_method from M3
3293+
definition.methods[:m3_method].tap do |method|
3294+
assert_equal type_name("::M3"), method.defined_in
3295+
assert_equal type_name("::M3"), method.implemented_in
3296+
assert_equal [parse_method_type("() -> ::String")], method.method_types
3297+
end
3298+
end
3299+
3300+
builder.build_singleton(type_name("::A")).tap do |definition|
3301+
# Test extend: should have m2_method from M2
3302+
definition.methods[:m2_method].tap do |method|
3303+
assert_equal type_name("::M2"), method.defined_in
3304+
assert_equal type_name("::M2"), method.implemented_in
3305+
assert_equal [parse_method_type("(untyped) -> bool")], method.method_types
3306+
end
3307+
end
3308+
end
3309+
end
3310+
end
32563311
end

0 commit comments

Comments
 (0)