aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/display/navigation_target.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/display/navigation_target.rs')
-rw-r--r--crates/ide/src/display/navigation_target.rs53
1 files changed, 19 insertions, 34 deletions
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs
index 00e601244..198243466 100644
--- a/crates/ide/src/display/navigation_target.rs
+++ b/crates/ide/src/display/navigation_target.rs
@@ -7,6 +7,7 @@ use hir::{AssocItem, Documentation, FieldSource, HasAttrs, HasSource, InFile, Mo
7use ide_db::{ 7use ide_db::{
8 base_db::{FileId, FileRange, SourceDatabase}, 8 base_db::{FileId, FileRange, SourceDatabase},
9 symbol_index::FileSymbolKind, 9 symbol_index::FileSymbolKind,
10 SymbolKind,
10}; 11};
11use ide_db::{defs::Definition, RootDatabase}; 12use ide_db::{defs::Definition, RootDatabase};
12use syntax::{ 13use syntax::{
@@ -18,30 +19,6 @@ use crate::FileSymbol;
18 19
19use super::short_label::ShortLabel; 20use super::short_label::ShortLabel;
20 21
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
22pub enum SymbolKind {
23 Module,
24 Impl,
25 Field,
26 TypeParam,
27 ConstParam,
28 LifetimeParam,
29 ValueParam,
30 SelfParam,
31 Local,
32 Label,
33 Function,
34 Const,
35 Static,
36 Struct,
37 Enum,
38 Variant,
39 Union,
40 TypeAlias,
41 Trait,
42 Macro,
43}
44
45/// `NavigationTarget` represents and element in the editor's UI which you can 22/// `NavigationTarget` represents and element in the editor's UI which you can
46/// click on to navigate to a particular piece of code. 23/// click on to navigate to a particular piece of code.
47/// 24///
@@ -108,12 +85,16 @@ impl NavigationTarget {
108 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); 85 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default();
109 if let Some(src) = module.declaration_source(db) { 86 if let Some(src) = module.declaration_source(db) {
110 let node = src.as_ref().map(|it| it.syntax()); 87 let node = src.as_ref().map(|it| it.syntax());
111 let frange = node.original_file_range(db); 88 let full_range = node.original_file_range(db);
89 let focus_range = src
90 .value
91 .name()
92 .map(|name| src.with_value(name.syntax()).original_file_range(db).range);
112 let mut res = NavigationTarget::from_syntax( 93 let mut res = NavigationTarget::from_syntax(
113 frange.file_id, 94 full_range.file_id,
114 name, 95 name,
115 None, 96 focus_range,
116 frange.range, 97 full_range.range,
117 SymbolKind::Module, 98 SymbolKind::Module,
118 ); 99 );
119 res.docs = module.attrs(db).docs(); 100 res.docs = module.attrs(db).docs();
@@ -153,8 +134,7 @@ impl NavigationTarget {
153 node: InFile<&dyn ast::NameOwner>, 134 node: InFile<&dyn ast::NameOwner>,
154 kind: SymbolKind, 135 kind: SymbolKind,
155 ) -> NavigationTarget { 136 ) -> NavigationTarget {
156 let name = 137 let name = node.value.name().map(|it| it.text().into()).unwrap_or_else(|| "_".into());
157 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
158 let focus_range = 138 let focus_range =
159 node.value.name().map(|it| node.with_value(it.syntax()).original_file_range(db).range); 139 node.value.name().map(|it| node.with_value(it.syntax()).original_file_range(db).range);
160 let frange = node.map(|it| it.syntax()).original_file_range(db); 140 let frange = node.map(|it| it.syntax()).original_file_range(db);
@@ -197,6 +177,7 @@ impl ToNav for FileSymbol {
197 FileSymbolKind::Const => SymbolKind::Const, 177 FileSymbolKind::Const => SymbolKind::Const,
198 FileSymbolKind::Static => SymbolKind::Static, 178 FileSymbolKind::Static => SymbolKind::Static,
199 FileSymbolKind::Macro => SymbolKind::Macro, 179 FileSymbolKind::Macro => SymbolKind::Macro,
180 FileSymbolKind::Union => SymbolKind::Union,
200 }), 181 }),
201 full_range: self.range, 182 full_range: self.range,
202 focus_range: self.name_range, 183 focus_range: self.name_range,
@@ -295,6 +276,7 @@ impl ToNav for hir::Module {
295 ModuleSource::Module(node) => { 276 ModuleSource::Module(node) => {
296 (node.syntax(), node.name().map(|it| it.syntax().text_range())) 277 (node.syntax(), node.name().map(|it| it.syntax().text_range()))
297 } 278 }
279 ModuleSource::BlockExpr(node) => (node.syntax(), None),
298 }; 280 };
299 let frange = src.with_value(syntax).original_file_range(db); 281 let frange = src.with_value(syntax).original_file_range(db);
300 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, SymbolKind::Module) 282 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, SymbolKind::Module)
@@ -457,13 +439,16 @@ impl TryToNav for hir::TypeParam {
457 fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> { 439 fn try_to_nav(&self, db: &RootDatabase) -> Option<NavigationTarget> {
458 let src = self.source(db)?; 440 let src = self.source(db)?;
459 let full_range = match &src.value { 441 let full_range = match &src.value {
460 Either::Left(it) => it.syntax().text_range(), 442 Either::Left(it) => it
443 .name()
444 .map_or_else(|| it.syntax().text_range(), |name| name.syntax().text_range()),
461 Either::Right(it) => it.syntax().text_range(), 445 Either::Right(it) => it.syntax().text_range(),
462 }; 446 };
463 let focus_range = match &src.value { 447 let focus_range = match &src.value {
464 Either::Left(_) => None, 448 Either::Left(it) => it.name(),
465 Either::Right(it) => it.name().map(|it| it.syntax().text_range()), 449 Either::Right(it) => it.name(),
466 }; 450 }
451 .map(|it| it.syntax().text_range());
467 Some(NavigationTarget { 452 Some(NavigationTarget {
468 file_id: src.file_id.original_file(db), 453 file_id: src.file_id.original_file(db),
469 name: self.name(db).to_string().into(), 454 name: self.name(db).to_string().into(),