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,19 +421,28 @@ fn text_edit_from_self_param(self_param: &ast::SelfParam, new_name: &str) -> Opt
None None
} }
let impl_def = self_param.syntax().ancestors().find_map(ast::Impl::cast)?; match self_param.syntax().ancestors().find_map(ast::Impl::cast) {
let type_name = target_type_name(&impl_def)?; Some(impl_def) => {
let type_name = target_type_name(&impl_def)?;
let mut replacement_text = String::from(new_name); let mut replacement_text = String::from(new_name);
replacement_text.push_str(": "); replacement_text.push_str(": ");
match (self_param.amp_token(), self_param.mut_token()) { match (self_param.amp_token(), self_param.mut_token()) {
(Some(_), None) => replacement_text.push('&'), (Some(_), None) => replacement_text.push('&'),
(Some(_), Some(_)) => replacement_text.push_str("&mut "), (Some(_), Some(_)) => replacement_text.push_str("&mut "),
(_, _) => (), (_, _) => (),
}; };
replacement_text.push_str(type_name.as_str()); replacement_text.push_str(type_name.as_str());
Some(TextEdit::replace(self_param.syntax().text_range(), replacement_text)) 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)] #[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] #[test]
fn test_self_in_path_to_parameter() { fn test_self_in_path_to_parameter() {
check( check(