feat: handle self-param outside of methods when renaming

This commit is contained in:
roife 2024-10-13 05:42:07 +08:00
parent d7628c0a8b
commit 1e8a03a56e

View file

@ -421,7 +421,8 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: &str) -> Opt
None
}
let impl_def = self_param.syntax().ancestors().find_map(ast::Impl::cast)?;
match self_param.syntax().ancestors().find_map(ast::Impl::cast) {
Some(impl_def) => {
let type_name = target_type_name(&impl_def)?;
let mut replacement_text = String::from(new_name);
@ -434,6 +435,14 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: &str) -> Opt
replacement_text.push_str(type_name.as_str());
Some(TextEdit::replace(self_param.syntax().text_range(), replacement_text))
}
None => {
cov_mark::hit!(rename_self_outside_of_methods);
let mut replacement_text = String::from(new_name);
replacement_text.push_str(": _");
Some(TextEdit::replace(self_param.syntax().text_range(), replacement_text))
}
}
}
#[cfg(test)]
@ -1977,6 +1986,26 @@ impl Foo {
);
}
#[test]
fn test_self_outside_of_methods() {
cov_mark::check!(rename_self_outside_of_methods);
check(
"foo",
r#"
fn f($0self) -> i32 {
use self as _;
self.i
}
"#,
r#"
fn f(foo: _) -> i32 {
use self as _;
foo.i
}
"#,
);
}
#[test]
fn test_self_in_path_to_parameter() {
check(