diff --git a/crates/ide-assists/src/handlers/qualify_method_call.rs b/crates/ide-assists/src/handlers/qualify_method_call.rs index ba0a142718..7d642e45e8 100644 --- a/crates/ide-assists/src/handlers/qualify_method_call.rs +++ b/crates/ide-assists/src/handlers/qualify_method_call.rs @@ -281,7 +281,7 @@ use test_mod::*; fn main() { let test_struct = test_mod::TestStruct {}; - TestTrait::test_method(&test_struct) + TestStruct::test_method(&test_struct) } "#, ); @@ -324,7 +324,7 @@ use test_mod::*; fn main() { let test_struct = test_mod::TestStruct {}; - TestTrait::test_method(&test_struct, 12, 32u) + TestStruct::test_method(&test_struct, 12, 32u) } "#, ); @@ -367,7 +367,7 @@ use test_mod::*; fn main() { let test_struct = test_mod::TestStruct {}; - TestTrait::test_method(test_struct, 12, 32u) + TestStruct::test_method(test_struct, 12, 32u) } "#, ); @@ -410,7 +410,7 @@ use test_mod::*; fn main() { let test_struct = test_mod::TestStruct {}; - TestTrait::test_method(&mut test_struct, 12, 32u) + TestStruct::test_method(&mut test_struct, 12, 32u) } "#, ); @@ -480,7 +480,7 @@ use test_mod::*; fn main() { let test_struct = TestStruct {}; - TestTrait::test_method::<()>(&test_struct) + TestStruct::test_method::<()>(&test_struct) } "#, ); diff --git a/crates/ide-db/src/rename.rs b/crates/ide-db/src/rename.rs index 8f83496e93..505ebc98f3 100644 --- a/crates/ide-db/src/rename.rs +++ b/crates/ide-db/src/rename.rs @@ -244,7 +244,7 @@ fn rename_mod( fn rename_reference( sema: &Semantics, - mut def: Definition, + def: Definition, new_name: &str, ) -> Result { let ident_kind = IdentifierKind::classify(new_name)?; @@ -271,15 +271,43 @@ fn rename_reference( } } + let def = convert_to_trait_def(def, sema); + let usages = def.usages(sema).all(); + + if !usages.is_empty() && ident_kind == IdentifierKind::Underscore { + cov_mark::hit!(rename_underscore_multiple); + bail!("Cannot rename reference to `_` as it is being referenced multiple times"); + } + let mut source_change = SourceChange::default(); + source_change.extend(usages.iter().map(|(&file_id, references)| { + (file_id, source_edit_from_references(references, def, new_name)) + })); + + let mut insert_def_edit = |def| { + let (file_id, edit) = source_edit_from_def(sema, def, new_name)?; + source_change.insert_source_edit(file_id, edit); + Ok(()) + }; + match def { + Definition::Local(l) => l + .associated_locals(sema.db) + .iter() + .try_for_each(|&local| insert_def_edit(Definition::Local(local))), + def => insert_def_edit(def), + }?; + Ok(source_change) +} + +pub(crate) fn convert_to_trait_def(def: Definition, sema: &Semantics) -> Definition { + // HACK: resolve trait impl items to the item def of the trait definition + // so that we properly resolve all trait item references let assoc_item = match def { - // HACK: resolve trait impl items to the item def of the trait definition - // so that we properly resolve all trait item references Definition::Function(it) => it.as_assoc_item(sema.db), Definition::TypeAlias(it) => it.as_assoc_item(sema.db), Definition::Const(it) => it.as_assoc_item(sema.db), _ => None, }; - def = match assoc_item { + match assoc_item { Some(assoc) => assoc .containing_trait_impl(sema.db) .and_then(|trait_| { @@ -305,31 +333,7 @@ fn rename_reference( }) .unwrap_or(def), None => def, - }; - let usages = def.usages(sema).all(); - - if !usages.is_empty() && ident_kind == IdentifierKind::Underscore { - cov_mark::hit!(rename_underscore_multiple); - bail!("Cannot rename reference to `_` as it is being referenced multiple times"); } - let mut source_change = SourceChange::default(); - source_change.extend(usages.iter().map(|(&file_id, references)| { - (file_id, source_edit_from_references(references, def, new_name)) - })); - - let mut insert_def_edit = |def| { - let (file_id, edit) = source_edit_from_def(sema, def, new_name)?; - source_change.insert_source_edit(file_id, edit); - Ok(()) - }; - match def { - Definition::Local(l) => l - .associated_locals(sema.db) - .iter() - .try_for_each(|&local| insert_def_edit(Definition::Local(local))), - def => insert_def_edit(def), - }?; - Ok(source_change) } pub fn source_edit_from_references( diff --git a/crates/ide-db/src/search.rs b/crates/ide-db/src/search.rs index e6bd46347d..25065ba7e3 100644 --- a/crates/ide-db/src/search.rs +++ b/crates/ide-db/src/search.rs @@ -619,7 +619,9 @@ impl<'a> FindUsages<'a> { }; sink(file_id, reference) } - Some(NameRefClass::Definition(def)) if def == self.def => { + Some(NameRefClass::Definition(def)) + if crate::rename::convert_to_trait_def(def, self.sema) == self.def => + { let FileRange { file_id, range } = self.sema.original_range(name_ref.syntax()); let reference = FileReference { range, diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html index 0716bae751..885aef1668 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html @@ -121,6 +121,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd let Packed { a: ref _a } = packed; // unsafe auto ref of packed field - packed.a.calls_autoref(); + packed.a.calls_autoref(); } } \ No newline at end of file