]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide/src/display/navigation_target.rs
Wrap remaining self/super/crate in Name{Ref}
[rust.git] / crates / ide / src / display / navigation_target.rs
index 1fb26c22660b47afeafb444c0a5990a07f4f85e0..00e6012442bc69e0bb13e7a501685498fa6704ab 100644 (file)
@@ -215,10 +215,8 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
             Definition::ModuleDef(it) => it.try_to_nav(db),
             Definition::SelfType(it) => it.try_to_nav(db),
             Definition::Local(it) => Some(it.to_nav(db)),
-            Definition::TypeParam(it) => it.try_to_nav(db),
-            Definition::LifetimeParam(it) => it.try_to_nav(db),
+            Definition::GenericParam(it) => it.try_to_nav(db),
             Definition::Label(it) => Some(it.to_nav(db)),
-            Definition::ConstParam(it) => Some(it.to_nav(db)),
         }
     }
 }
@@ -389,27 +387,44 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
     }
 }
 
+impl TryToNav for hir::GenericParam {
+    fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
+        match self {
+            hir::GenericParam::TypeParam(it) => it.try_to_nav(db),
+            hir::GenericParam::ConstParam(it) => it.try_to_nav(db),
+            hir::GenericParam::LifetimeParam(it) => it.try_to_nav(db),
+        }
+    }
+}
+
 impl ToNav for hir::Local {
     fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
         let src = self.source(db);
-        let node = match &src.value {
-            Either::Left(bind_pat) => {
-                bind_pat.name().map_or_else(|| bind_pat.syntax().clone(), |it| it.syntax().clone())
-            }
-            Either::Right(it) => it.syntax().clone(),
+        let (node, name) = match &src.value {
+            Either::Left(bind_pat) => (bind_pat.syntax().clone(), bind_pat.name()),
+            Either::Right(it) => (it.syntax().clone(), it.name()),
         };
+        let focus_range =
+            name.map(|it| src.with_value(&it.syntax().clone()).original_file_range(db).range);
+
         let full_range = src.with_value(&node).original_file_range(db);
         let name = match self.name(db) {
             Some(it) => it.to_string().into(),
             None => "".into(),
         };
-        let kind = if self.is_param(db) { SymbolKind::ValueParam } else { SymbolKind::Local };
+        let kind = if self.is_self(db) {
+            SymbolKind::SelfParam
+        } else if self.is_param(db) {
+            SymbolKind::ValueParam
+        } else {
+            SymbolKind::Local
+        };
         NavigationTarget {
             file_id: full_range.file_id,
             name,
             kind: Some(kind),
             full_range: full_range.range,
-            focus_range: None,
+            focus_range,
             container_name: None,
             description: None,
             docs: None,
@@ -479,11 +494,11 @@ fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
     }
 }
 
-impl ToNav for hir::ConstParam {
-    fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
-        let src = self.source(db);
+impl TryToNav for hir::ConstParam {
+    fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
+        let src = self.source(db)?;
         let full_range = src.value.syntax().text_range();
-        NavigationTarget {
+        Some(NavigationTarget {
             file_id: src.file_id.original_file(db),
             name: self.name(db).to_string().into(),
             kind: Some(SymbolKind::ConstParam),
@@ -492,7 +507,7 @@ fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
             container_name: None,
             description: None,
             docs: None,
-        }
+        })
     }
 }