]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide/src/goto_implementation.rs
Explicitly check for reference locals or fields in Name classification
[rust.git] / crates / ide / src / goto_implementation.rs
index 43356a94edf4f3ac62179fa82ac8c89fb9f889fa..d1101230452f7b5a3f25d57446c87a61997cf223 100644 (file)
@@ -29,10 +29,10 @@ pub(crate) fn goto_implementation(
     let node = sema.find_node_at_offset_with_descend(&syntax, position.offset)?;
     let def = match &node {
         ast::NameLike::Name(name) => {
-            NameClass::classify(&sema, name).map(|class| class.referenced_or_defined(sema.db))
+            NameClass::classify(&sema, name).map(|class| class.defined_or_referenced_local())
         }
         ast::NameLike::NameRef(name_ref) => {
-            NameRefClass::classify(&sema, name_ref).map(|class| class.referenced(sema.db))
+            NameRefClass::classify(&sema, name_ref).map(|class| class.referenced_local())
         }
         ast::NameLike::Lifetime(_) => None,
     }?;
@@ -52,13 +52,13 @@ pub(crate) fn goto_implementation(
         hir::ModuleDef::Function(f) => {
             let assoc = f.as_assoc_item(sema.db)?;
             let name = assoc.name(sema.db)?;
-            let trait_ = assoc.containing_trait(sema.db)?;
+            let trait_ = assoc.containing_trait_or_trait_impl(sema.db)?;
             impls_for_trait_item(&sema, trait_, name)
         }
         hir::ModuleDef::Const(c) => {
             let assoc = c.as_assoc_item(sema.db)?;
             let name = assoc.name(sema.db)?;
-            let trait_ = assoc.containing_trait(sema.db)?;
+            let trait_ = assoc.containing_trait_or_trait_impl(sema.db)?;
             impls_for_trait_item(&sema, trait_, name)
         }
         _ => return None,
@@ -87,7 +87,7 @@ fn impls_for_trait_item(
         .filter_map(|imp| {
             let item = imp.items(sema.db).iter().find_map(|itm| {
                 let itm_name = itm.name(sema.db)?;
-                (itm_name == fun_name).then(|| itm.clone())
+                (itm_name == fun_name).then(|| *itm)
             })?;
             item.try_to_nav(sema.db)
         })
@@ -236,15 +236,10 @@ impl T for &Foo {}
     fn goto_implementation_to_builtin_derive() {
         check(
             r#"
+//- minicore: copy, derive
   #[derive(Copy)]
 //^^^^^^^^^^^^^^^
 struct Foo$0;
-
-mod marker {
-    trait Copy {}
-}
-#[rustc_builtin_macro]
-macro Copy {}
 "#,
         );
     }