about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbitgaoshu <bitgaoshu@gmail.com>2022-06-24 19:15:16 +0800
committerbitgaoshu <bitgaoshu@gmail.com>2022-06-24 19:15:16 +0800
commit9e6bff79f460701f82e01e614b890d86edbb91c7 (patch)
treea1688c1d24150419fb2a04123e23cd1463f6a7c5
parent6ecabe352a34a0fb290b2639e2eccd4317c85556 (diff)
downloadrust-9e6bff79f460701f82e01e614b890d86edbb91c7.tar.gz
rust-9e6bff79f460701f82e01e614b890d86edbb91c7.zip
fix some test due to resolve to where trait m impl
-rw-r--r--crates/ide-assists/src/handlers/qualify_method_call.rs10
-rw-r--r--crates/ide-db/src/rename.rs60
-rw-r--r--crates/ide-db/src/search.rs4
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html2
4 files changed, 41 insertions, 35 deletions
diff --git a/crates/ide-assists/src/handlers/qualify_method_call.rs b/crates/ide-assists/src/handlers/qualify_method_call.rs
index ba0a1427181..7d642e45e8f 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 8f83496e938..505ebc98f3a 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<RootDatabase>,
-    mut def: Definition,
+    def: Definition,
     new_name: &str,
 ) -> Result<SourceChange> {
     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<RootDatabase>) -> 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 e6bd46347d9..25065ba7e32 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 0716bae7513..885aef16681 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
         <span class="keyword">let</span> <span class="struct">Packed</span> <span class="brace">{</span> <span class="field">a</span><span class="colon">:</span> <span class="keyword unsafe">ref</span> <span class="variable declaration reference">_a</span> <span class="brace">}</span> <span class="operator">=</span> <span class="variable">packed</span><span class="semicolon">;</span>
 
         <span class="comment">// unsafe auto ref of packed field</span>
-        <span class="variable">packed</span><span class="operator">.</span><span class="field">a</span><span class="operator">.</span><span class="function associated reference trait unsafe">calls_autoref</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
+        <span class="variable">packed</span><span class="operator">.</span><span class="field">a</span><span class="operator">.</span><span class="function associated reference unsafe">calls_autoref</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
     <span class="brace">}</span>
 <span class="brace">}</span></code></pre>
\ No newline at end of file