diff --git a/lib/rbs/ast/type_param.rb b/lib/rbs/ast/type_param.rb index b4f599b94a..33238e6053 100644 --- a/lib/rbs/ast/type_param.rb +++ b/lib/rbs/ast/type_param.rb @@ -114,7 +114,7 @@ def self.subst_var(vars, type) def self.rename(params, new_names:) raise unless params.size == new_names.size - subst = Substitution.build(new_names, Types::Variable.build(new_names)) + subst = Substitution.build(params.map(&:name), Types::Variable.build(new_names)) params.map.with_index do |param, index| new_name = new_names[index] diff --git a/test/rbs/ast/type_param_test.rb b/test/rbs/ast/type_param_test.rb index 080d155837..cd6c67a263 100644 --- a/test/rbs/ast/type_param_test.rb +++ b/test/rbs/ast/type_param_test.rb @@ -66,4 +66,28 @@ def test_normalize_args assert_equal ["::Integer", "::Array[::Integer]", "::Array[::Array[::Integer]]"], args.map(&:to_s) end end + + def test_rename + params = [ + TypeParam.new(name: :A, variance: :covariant, upper_bound: nil, lower_bound: nil, location: nil), + TypeParam.new( + name: :B, + variance: :invariant, + upper_bound: parse_type("::Array[A]"), + lower_bound: nil, + default_type: parse_type("::Hash[A, B]"), + location: nil + ).unchecked! + ] + + TypeParam.rename(params, new_names: [:X, :Y]).tap do |renamed| + assert_equal [:X, :Y], renamed.map(&:name) + assert_equal :covariant, renamed[0].variance + assert_equal :invariant, renamed[1].variance + assert_predicate renamed[1], :unchecked? + + assert_equal parse_type("::Array[X]", variables: [:X]), renamed[1].upper_bound_type + assert_equal parse_type("::Hash[X, Y]", variables: [:X, :Y]), renamed[1].default_type + end + end end