]> git.lizzy.rs Git - rust.git/blobdiff - crates/ra_ide_api/src/navigation_target.rs
Format
[rust.git] / crates / ra_ide_api / src / navigation_target.rs
index fd001179a168bd0f450daaad55412032e720301e..d806cb368d3cd20c4a115d8e19a7c4fe6acaf165 100644 (file)
@@ -3,7 +3,7 @@
     SyntaxNode, SyntaxNodePtr, AstNode, SmolStr, TextRange, ast,
     SyntaxKind::{self, NAME},
 };
-use hir::{ModuleSource, FieldSource, Name};
+use hir::{ModuleSource, FieldSource, Name, ImplItem};
 
 use crate::{FileSymbol, db::RootDatabase};
 
@@ -67,7 +67,7 @@ pub(crate) fn from_symbol(symbol: FileSymbol) -> NavigationTarget {
             name: symbol.name.clone(),
             kind: symbol.ptr.kind(),
             full_range: symbol.ptr.range(),
-            focus_range: None,
+            focus_range: symbol.name_range,
             container_name: symbol.container_name.clone(),
         }
     }
@@ -154,7 +154,7 @@ pub(crate) fn from_def(db: &RootDatabase, module_def: hir::ModuleDef) -> Navigat
                 let (file_id, node) = e.source(db);
                 NavigationTarget::from_named(file_id.original_file(db), &*node)
             }
-            hir::ModuleDef::Type(e) => {
+            hir::ModuleDef::TypeAlias(e) => {
                 let (file_id, node) = e.source(db);
                 NavigationTarget::from_named(file_id.original_file(db), &*node)
             }
@@ -174,6 +174,20 @@ pub(crate) fn from_impl_block(
         )
     }
 
+    pub(crate) fn from_impl_item(db: &RootDatabase, impl_item: hir::ImplItem) -> NavigationTarget {
+        match impl_item {
+            ImplItem::Method(f) => NavigationTarget::from_function(db, f),
+            ImplItem::Const(c) => {
+                let (file_id, node) = c.source(db);
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
+            ImplItem::TypeAlias(a) => {
+                let (file_id, node) = a.source(db);
+                NavigationTarget::from_named(file_id.original_file(db), &*node)
+            }
+        }
+    }
+
     #[cfg(test)]
     pub(crate) fn assert_match(&self, expected: &str) {
         let actual = self.debug_render();
@@ -193,12 +207,13 @@ pub(crate) fn debug_render(&self) -> String {
             buf.push_str(&format!(" {:?}", focus_range))
         }
         if let Some(container_name) = self.container_name() {
-            buf.push_str(&format!(" {:?}", container_name))
+            buf.push_str(&format!(" {}", container_name))
         }
         buf
     }
 
-    fn from_named(file_id: FileId, node: &impl ast::NameOwner) -> NavigationTarget {
+    /// Allows `NavigationTarget` to be created from a `NameOwner`
+    pub(crate) fn from_named(file_id: FileId, node: &impl ast::NameOwner) -> NavigationTarget {
         let name = node.name().map(|it| it.text().clone()).unwrap_or_default();
         let focus_range = node.name().map(|it| it.syntax().range());
         NavigationTarget::from_syntax(file_id, name, focus_range, node.syntax())