some code docs for the ide_db/rename module
This commit is contained in:
parent
5e533e5900
commit
995c8f50a2
@ -1470,6 +1470,7 @@ fn foo(Foo { i: bar }: Foo) -> i32 {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_struct_field_complex_ident_pat() {
|
fn test_struct_field_complex_ident_pat() {
|
||||||
|
cov_mark::check!(rename_record_pat_field_name_split);
|
||||||
check(
|
check(
|
||||||
"baz",
|
"baz",
|
||||||
r#"
|
r#"
|
||||||
|
@ -326,12 +326,16 @@ pub fn source_edit_from_references(
|
|||||||
|
|
||||||
fn source_edit_from_name(name: &ast::Name, new_name: &str) -> Option<(TextRange, String)> {
|
fn source_edit_from_name(name: &ast::Name, new_name: &str) -> Option<(TextRange, String)> {
|
||||||
if let Some(_) = ast::RecordPatField::for_field_name(name) {
|
if let Some(_) = ast::RecordPatField::for_field_name(name) {
|
||||||
|
if let Some(ident_pat) = name.syntax().parent().and_then(ast::IdentPat::cast) {
|
||||||
|
cov_mark::hit!(rename_record_pat_field_name_split);
|
||||||
|
// Foo { ref mut field } -> Foo { new_name: ref mut field }
|
||||||
|
// ^ insert `new_name: `
|
||||||
|
|
||||||
// FIXME: instead of splitting the shorthand, recursively trigger a rename of the
|
// FIXME: instead of splitting the shorthand, recursively trigger a rename of the
|
||||||
// other name https://github.com/rust-analyzer/rust-analyzer/issues/6547
|
// other name https://github.com/rust-analyzer/rust-analyzer/issues/6547
|
||||||
if let Some(ident_pat) = name.syntax().parent().and_then(ast::IdentPat::cast) {
|
|
||||||
return Some((
|
return Some((
|
||||||
TextRange::empty(ident_pat.syntax().text_range().start()),
|
TextRange::empty(ident_pat.syntax().text_range().start()),
|
||||||
[new_name, ": "].concat(),
|
format!("{}: ", new_name),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -347,21 +351,29 @@ fn source_edit_from_name_ref(
|
|||||||
if let Some(record_field) = ast::RecordExprField::for_name_ref(name_ref) {
|
if let Some(record_field) = ast::RecordExprField::for_name_ref(name_ref) {
|
||||||
let rcf_name_ref = record_field.name_ref();
|
let rcf_name_ref = record_field.name_ref();
|
||||||
let rcf_expr = record_field.expr();
|
let rcf_expr = record_field.expr();
|
||||||
match (rcf_name_ref, rcf_expr.and_then(|it| it.name_ref())) {
|
match &(rcf_name_ref, rcf_expr.and_then(|it| it.name_ref())) {
|
||||||
// field: init-expr, check if we can use a field init shorthand
|
// field: init-expr, check if we can use a field init shorthand
|
||||||
(Some(field_name), Some(init)) => {
|
(Some(field_name), Some(init)) => {
|
||||||
if field_name == *name_ref {
|
if field_name == name_ref {
|
||||||
if init.text() == new_name {
|
if init.text() == new_name {
|
||||||
cov_mark::hit!(test_rename_field_put_init_shorthand);
|
cov_mark::hit!(test_rename_field_put_init_shorthand);
|
||||||
|
// Foo { field: local } -> Foo { local }
|
||||||
|
// ^^^^^^^^ delete this
|
||||||
|
// FIXME: Actually delete this instead of replacing the entire thing
|
||||||
|
|
||||||
// same names, we can use a shorthand here instead.
|
// same names, we can use a shorthand here instead.
|
||||||
// we do not want to erase attributes hence this range start
|
// we do not want to erase attributes hence this range start
|
||||||
let s = field_name.syntax().text_range().start();
|
let s = field_name.syntax().text_range().start();
|
||||||
let e = record_field.syntax().text_range().end();
|
let e = record_field.syntax().text_range().end();
|
||||||
return Some((TextRange::new(s, e), new_name.to_owned()));
|
return Some((TextRange::new(s, e), new_name.to_owned()));
|
||||||
}
|
}
|
||||||
} else if init == *name_ref {
|
} else if init == name_ref {
|
||||||
if field_name.text() == new_name {
|
if field_name.text() == new_name {
|
||||||
cov_mark::hit!(test_rename_local_put_init_shorthand);
|
cov_mark::hit!(test_rename_local_put_init_shorthand);
|
||||||
|
// Foo { field: local } -> Foo { field }
|
||||||
|
// ^^^^^^^ delete this
|
||||||
|
// FIXME: Actually delete this instead of replacing the entire thing
|
||||||
|
|
||||||
// same names, we can use a shorthand here instead.
|
// same names, we can use a shorthand here instead.
|
||||||
// we do not want to erase attributes hence this range start
|
// we do not want to erase attributes hence this range start
|
||||||
let s = field_name.syntax().text_range().start();
|
let s = field_name.syntax().text_range().start();
|
||||||
@ -374,11 +386,15 @@ fn source_edit_from_name_ref(
|
|||||||
// init shorthand
|
// init shorthand
|
||||||
(None, Some(_)) if matches!(def, Definition::Field(_)) => {
|
(None, Some(_)) if matches!(def, Definition::Field(_)) => {
|
||||||
cov_mark::hit!(test_rename_field_in_field_shorthand);
|
cov_mark::hit!(test_rename_field_in_field_shorthand);
|
||||||
|
// Foo { field } -> Foo { new_name: field }
|
||||||
|
// ^ insert `new_name: `
|
||||||
let s = name_ref.syntax().text_range().start();
|
let s = name_ref.syntax().text_range().start();
|
||||||
Some((TextRange::empty(s), format!("{}: ", new_name)))
|
Some((TextRange::empty(s), format!("{}: ", new_name)))
|
||||||
}
|
}
|
||||||
(None, Some(_)) if matches!(def, Definition::Local(_)) => {
|
(None, Some(_)) if matches!(def, Definition::Local(_)) => {
|
||||||
cov_mark::hit!(test_rename_local_in_field_shorthand);
|
cov_mark::hit!(test_rename_local_in_field_shorthand);
|
||||||
|
// Foo { field } -> Foo { field: new_name }
|
||||||
|
// ^ insert `: new_name`
|
||||||
let s = name_ref.syntax().text_range().end();
|
let s = name_ref.syntax().text_range().end();
|
||||||
Some((TextRange::empty(s), format!(": {}", new_name)))
|
Some((TextRange::empty(s), format!(": {}", new_name)))
|
||||||
}
|
}
|
||||||
@ -395,6 +411,11 @@ fn source_edit_from_name_ref(
|
|||||||
// field name is being renamed
|
// field name is being renamed
|
||||||
if pat.name().map_or(false, |it| it.text() == new_name) {
|
if pat.name().map_or(false, |it| it.text() == new_name) {
|
||||||
cov_mark::hit!(test_rename_field_put_init_shorthand_pat);
|
cov_mark::hit!(test_rename_field_put_init_shorthand_pat);
|
||||||
|
// Foo { field: ref mut local } -> Foo { ref mut field }
|
||||||
|
// ^^^^^^^ delete this
|
||||||
|
// ^^^^^ replace this with `field`
|
||||||
|
// FIXME: do this the way its written here
|
||||||
|
|
||||||
// same names, we can use a shorthand here instead/
|
// same names, we can use a shorthand here instead/
|
||||||
// we do not want to erase attributes hence this range start
|
// we do not want to erase attributes hence this range start
|
||||||
let s = field_name.syntax().text_range().start();
|
let s = field_name.syntax().text_range().start();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user