From 13ccbb2919dff8e98d0a242d9d6b7edd17a6bd2c Mon Sep 17 00:00:00 2001 From: Matt Niemeir Date: Tue, 10 Mar 2020 22:27:38 -0500 Subject: find_usages limited to actual usages again --- crates/ra_ide/src/references/rename.rs | 70 ++++++++++++++++++++++++++++++++++ crates/ra_ide_db/src/search.rs | 28 +++++++------- 2 files changed, 84 insertions(+), 14 deletions(-) diff --git a/crates/ra_ide/src/references/rename.rs b/crates/ra_ide/src/references/rename.rs index 1fca6de1f..7d1190af9 100644 --- a/crates/ra_ide/src/references/rename.rs +++ b/crates/ra_ide/src/references/rename.rs @@ -381,6 +381,76 @@ mod tests { ); } + #[test] + fn test_field_shorthand_correct_struct() { + test_rename( + r#" + struct Foo { + i<|>: i32, + } + + struct Bar { + i: i32, + } + + impl Bar { + fn new(i: i32) -> Self { + Self { i } + } + } + "#, + "j", + r#" + struct Foo { + j: i32, + } + + struct Bar { + i: i32, + } + + impl Bar { + fn new(i: i32) -> Self { + Self { i } + } + } + "#, + ); + } + + #[test] + fn test_shadow_local_for_struct_shorthand() { + test_rename( + r#" + struct Foo { + i: i32, + } + + fn baz(i<|>: i32) -> Self { + let x = Foo { i }; + { + let i = 0; + Foo { i } + } + } + "#, + "j", + r#" + struct Foo { + i: i32, + } + + fn baz(j: i32) -> Self { + let x = Foo { i: j }; + { + let i = 0; + Foo { i } + } + } + "#, + ); + } + #[test] fn test_rename_mod() { let (analysis, position) = analysis_and_position( diff --git a/crates/ra_ide_db/src/search.rs b/crates/ra_ide_db/src/search.rs index b843b5b57..cf78d3e41 100644 --- a/crates/ra_ide_db/src/search.rs +++ b/crates/ra_ide_db/src/search.rs @@ -256,21 +256,21 @@ impl Definition { access: reference_access(&def, &name_ref), }); } - Some(NameRefClass::FieldShorthand { local, field: _ }) => { - let kind = match self { - Definition::StructField(_) => { - ReferenceKind::StructFieldShorthandForField - } - Definition::Local(_) => ReferenceKind::StructFieldShorthandForLocal, - _ => continue, + Some(NameRefClass::FieldShorthand { local, field }) => { + match self { + Definition::StructField(_) if &field == self => refs.push(Reference { + file_range: sema.original_range(name_ref.syntax()), + kind: ReferenceKind::StructFieldShorthandForField, + access: reference_access(&field, &name_ref), + }), + Definition::Local(l) if &local == l => refs.push(Reference { + file_range: sema.original_range(name_ref.syntax()), + kind: ReferenceKind::StructFieldShorthandForLocal, + access: reference_access(&Definition::Local(local), &name_ref), + }), + + _ => {} // not a usage }; - - let file_range = sema.original_range(name_ref.syntax()); - refs.push(Reference { - file_range, - kind, - access: reference_access(&Definition::Local(local), &name_ref), - }); } _ => {} // not a usage } -- cgit v1.2.3