From eb08c1eb45a3acea7fc84b45d6ec54482ee225e4 Mon Sep 17 00:00:00 2001 From: Soutaro Matsumoto Date: Thu, 23 Dec 2021 20:00:16 +0900 Subject: [PATCH] Resolve super type name in outer context --- lib/rbs/environment.rb | 6 ++++-- test/rbs/environment_test.rb | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/rbs/environment.rb b/lib/rbs/environment.rb index c8b924c9e..28578bc0e 100644 --- a/lib/rbs/environment.rb +++ b/lib/rbs/environment.rb @@ -240,6 +240,8 @@ def resolve_declaration(resolver, decl, outer:, prefix:) array.unshift(head + decl.name.to_namespace) end + outer_context = context.drop(1) + case decl when AST::Declarations::Class outer_ = outer + [decl] @@ -249,8 +251,8 @@ def resolve_declaration(resolver, decl, outer:, prefix:) type_params: decl.type_params, super_class: decl.super_class&.yield_self do |super_class| AST::Declarations::Class::Super.new( - name: absolute_type_name(resolver, super_class.name, context: context), - args: super_class.args.map {|type| absolute_type(resolver, type, context: context) }, + name: absolute_type_name(resolver, super_class.name, context: outer_context), + args: super_class.args.map {|type| absolute_type(resolver, type, context: outer_context) }, location: super_class.location ) end, diff --git a/test/rbs/environment_test.rb b/test/rbs/environment_test.rb index 6a72b4e86..4660951c0 100644 --- a/test/rbs/environment_test.rb +++ b/test/rbs/environment_test.rb @@ -384,6 +384,31 @@ module ::Enumerable[A] RBS end + def test_absolute_type_super + env = Environment.new + + decls = RBS::Parser.parse_signature(<<-RBS) +module A + class C + end + + class B < C + class C + end + end +end + RBS + + decls.each do |decl| + env << decl + end + + env.resolve_type_names.tap do |env| + class_decl = env.class_decls[TypeName("::A::B")] + assert_equal TypeName("::A::C"), class_decl.primary.decl.super_class.name + end + end + def test_reject env = Environment.new