diff --git a/crates/ra_ide/src/references/rename.rs b/crates/ra_ide/src/references/rename.rs index 1fca6de1ffc..7d1190af9e9 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 b843b5b5702..cf78d3e41ed 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), + }), - 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 + }; } _ => {} // not a usage }