mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-14 17:07:26 +00:00
Properly handle shorthands in destructure patterns when renaming
This commit is contained in:
parent
e55a44a831
commit
924eecf4af
2 changed files with 68 additions and 5 deletions
|
@ -110,14 +110,23 @@ pub(crate) fn find_all_refs(
|
|||
.filter(|r| search_kind == ReferenceKind::Other || search_kind == r.kind)
|
||||
.collect();
|
||||
|
||||
let decl_range = def.try_to_nav(sema.db)?.focus_or_full_range();
|
||||
let nav = def.try_to_nav(sema.db)?;
|
||||
let decl_range = nav.focus_or_full_range();
|
||||
|
||||
let declaration = Declaration {
|
||||
nav: def.try_to_nav(sema.db)?,
|
||||
kind: ReferenceKind::Other,
|
||||
access: decl_access(&def, &syntax, decl_range),
|
||||
let mut kind = ReferenceKind::Other;
|
||||
if let Definition::Local(local) = def {
|
||||
if let either::Either::Left(pat) = local.source(sema.db).value {
|
||||
if matches!(
|
||||
pat.syntax().parent().and_then(ast::RecordPatField::cast),
|
||||
Some(pat_field) if pat_field.name_ref().is_none()
|
||||
) {
|
||||
kind = ReferenceKind::FieldShorthandForLocal;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let declaration = Declaration { nav, kind, access: decl_access(&def, &syntax, decl_range) };
|
||||
|
||||
Some(RangeInfo::new(range, ReferenceSearchResult { declaration, references }))
|
||||
}
|
||||
|
||||
|
|
|
@ -1135,6 +1135,60 @@ struct Foo { bar: i32 }
|
|||
fn foo(bar: i32) -> Foo {
|
||||
Foo { bar }
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rename_binding_in_destructure_pat_shorthand() {
|
||||
check(
|
||||
"bar",
|
||||
r#"
|
||||
struct Foo {
|
||||
i: i32,
|
||||
}
|
||||
|
||||
fn foo(foo: Foo) {
|
||||
let Foo { i } = foo;
|
||||
let _ = i<|>;
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
struct Foo {
|
||||
i: i32,
|
||||
}
|
||||
|
||||
fn foo(foo: Foo) {
|
||||
let Foo { i: bar } = foo;
|
||||
let _ = bar;
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rename_binding_in_destructure_pat() {
|
||||
check(
|
||||
"bar",
|
||||
r#"
|
||||
struct Foo {
|
||||
i: i32,
|
||||
}
|
||||
|
||||
fn foo(foo: Foo) {
|
||||
let Foo { i: b } = foo;
|
||||
let _ = b<|>;
|
||||
}
|
||||
"#,
|
||||
r#"
|
||||
struct Foo {
|
||||
i: i32,
|
||||
}
|
||||
|
||||
fn foo(foo: Foo) {
|
||||
let Foo { i: bar } = foo;
|
||||
let _ = bar;
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue