diff options
Diffstat (limited to 'crates/ide/src/display/navigation_target.rs')
-rw-r--r-- | crates/ide/src/display/navigation_target.rs | 53 |
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 | |||
7 | use ide_db::{ | 7 | use 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 | }; |
11 | use ide_db::{defs::Definition, RootDatabase}; | 12 | use ide_db::{defs::Definition, RootDatabase}; |
12 | use syntax::{ | 13 | use syntax::{ |
@@ -18,30 +19,6 @@ use crate::FileSymbol; | |||
18 | 19 | ||
19 | use super::short_label::ShortLabel; | 20 | use super::short_label::ShortLabel; |
20 | 21 | ||
21 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] | ||
22 | pub 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(), |