Skip to content

Commit 6341786

Browse files
authored
Merge pull request #3068 from ruby/claude/fix-type-param-rename-substitution
Fix TypeParam.rename to substitute variables in bounds and default types
2 parents 6c2f00c + 831baec commit 6341786

2 files changed

Lines changed: 25 additions & 1 deletion

File tree

lib/rbs/ast/type_param.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def self.subst_var(vars, type)
114114
def self.rename(params, new_names:)
115115
raise unless params.size == new_names.size
116116

117-
subst = Substitution.build(new_names, Types::Variable.build(new_names))
117+
subst = Substitution.build(params.map(&:name), Types::Variable.build(new_names))
118118

119119
params.map.with_index do |param, index|
120120
new_name = new_names[index]

test/rbs/ast/type_param_test.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,28 @@ def test_normalize_args
6666
assert_equal ["::Integer", "::Array[::Integer]", "::Array[::Array[::Integer]]"], args.map(&:to_s)
6767
end
6868
end
69+
70+
def test_rename
71+
params = [
72+
TypeParam.new(name: :A, variance: :covariant, upper_bound: nil, lower_bound: nil, location: nil),
73+
TypeParam.new(
74+
name: :B,
75+
variance: :invariant,
76+
upper_bound: parse_type("::Array[A]"),
77+
lower_bound: nil,
78+
default_type: parse_type("::Hash[A, B]"),
79+
location: nil
80+
).unchecked!
81+
]
82+
83+
TypeParam.rename(params, new_names: [:X, :Y]).tap do |renamed|
84+
assert_equal [:X, :Y], renamed.map(&:name)
85+
assert_equal :covariant, renamed[0].variance
86+
assert_equal :invariant, renamed[1].variance
87+
assert_predicate renamed[1], :unchecked?
88+
89+
assert_equal parse_type("::Array[X]", variables: [:X]), renamed[1].upper_bound_type
90+
assert_equal parse_type("::Hash[X, Y]", variables: [:X, :Y]), renamed[1].default_type
91+
end
92+
end
6993
end

0 commit comments

Comments
 (0)