Skip to content

Commit c0306dd

Browse files
committed
Update environment
1 parent 7b81cb0 commit c0306dd

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

lib/rbs/environment.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,8 @@ def resolve_ruby_decl(resolver, decl, context:, prefix:)
702702
case member
703703
when AST::Ruby::Declarations::Base
704704
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
705+
when AST::Ruby::Members::Base
706+
resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
705707
else
706708
raise "Unknown member type: #{member.class}"
707709
end
@@ -722,6 +724,30 @@ def resolve_ruby_member(resolver, member, context:)
722724
member.node,
723725
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
724726
)
727+
when AST::Ruby::Members::IncludeMember
728+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
729+
AST::Ruby::Members::IncludeMember.new(
730+
member.buffer,
731+
member.node,
732+
absolute_type_name(resolver, nil, member.module_name, context: context),
733+
resolved_annotation
734+
)
735+
when AST::Ruby::Members::ExtendMember
736+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
737+
AST::Ruby::Members::ExtendMember.new(
738+
member.buffer,
739+
member.node,
740+
absolute_type_name(resolver, nil, member.module_name, context: context),
741+
resolved_annotation
742+
)
743+
when AST::Ruby::Members::PrependMember
744+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
745+
AST::Ruby::Members::PrependMember.new(
746+
member.buffer,
747+
member.node,
748+
absolute_type_name(resolver, nil, member.module_name, context: context),
749+
resolved_annotation
750+
)
725751
else
726752
raise "Unknown member type: #{member.class}"
727753
end

test/rbs/environment_test.rb

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,4 +646,77 @@ module World
646646
end
647647
end
648648
end
649+
650+
def test__ruby__resolve_type_names_mixin_members
651+
result = parse_inline(<<~RUBY)
652+
module M
653+
end
654+
655+
class String
656+
end
657+
658+
class Integer
659+
end
660+
661+
class A
662+
include M #[String]
663+
end
664+
665+
class B
666+
extend M #[String, Integer]
667+
end
668+
669+
class C
670+
prepend M #[Integer]
671+
end
672+
RUBY
673+
674+
env = Environment.new
675+
env.add_source(RBS::Source::Ruby.new(result.buffer, result.prism_result, result.declarations, result.diagnostics))
676+
677+
env.resolve_type_names.tap do |env|
678+
# Test A include
679+
a_decl = env.class_decls[RBS::TypeName.parse("::A")]
680+
a_decl.each_decl do |decl|
681+
decl.members.each do |member|
682+
case member
683+
when RBS::AST::Ruby::Members::IncludeMember
684+
assert_equal RBS::TypeName.parse("::M"), member.module_name
685+
assert_equal 1, member.type_args.size
686+
# Type argument should be resolved to absolute TypeName
687+
assert_equal RBS::TypeName.parse("::String"), member.type_args[0].name
688+
end
689+
end
690+
end
691+
692+
# Test B extend
693+
b_decl = env.class_decls[RBS::TypeName.parse("::B")]
694+
b_decl.each_decl do |decl|
695+
decl.members.each do |member|
696+
case member
697+
when RBS::AST::Ruby::Members::ExtendMember
698+
assert_equal RBS::TypeName.parse("::M"), member.module_name
699+
assert_equal 2, member.type_args.size
700+
# Both type arguments should be resolved to absolute TypeNames
701+
assert_equal RBS::TypeName.parse("::String"), member.type_args[0].name
702+
assert_equal RBS::TypeName.parse("::Integer"), member.type_args[1].name
703+
end
704+
end
705+
end
706+
707+
# Test C prepend
708+
c_decl = env.class_decls[RBS::TypeName.parse("::C")]
709+
c_decl.each_decl do |decl|
710+
decl.members.each do |member|
711+
case member
712+
when RBS::AST::Ruby::Members::PrependMember
713+
assert_equal RBS::TypeName.parse("::M"), member.module_name
714+
assert_equal 1, member.type_args.size
715+
# Type argument should be resolved to absolute TypeName
716+
assert_equal RBS::TypeName.parse("::Integer"), member.type_args[0].name
717+
end
718+
end
719+
end
720+
end
721+
end
649722
end

0 commit comments

Comments
 (0)