diff options
Diffstat (limited to 'crates/ra_ide/src/display/navigation_target.rs')
-rw-r--r-- | crates/ra_ide/src/display/navigation_target.rs | 85 |
1 files changed, 37 insertions, 48 deletions
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index 914a8b471..c7bb1e69f 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs | |||
@@ -11,7 +11,7 @@ use ra_syntax::{ | |||
11 | TextRange, | 11 | TextRange, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | use crate::FileSymbol; | 14 | use crate::{FileRange, FileSymbol}; |
15 | 15 | ||
16 | use super::short_label::ShortLabel; | 16 | use super::short_label::ShortLabel; |
17 | 17 | ||
@@ -22,10 +22,11 @@ use super::short_label::ShortLabel; | |||
22 | /// code, like a function or a struct, but this is not strictly required. | 22 | /// code, like a function or a struct, but this is not strictly required. |
23 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 23 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
24 | pub struct NavigationTarget { | 24 | pub struct NavigationTarget { |
25 | // FIXME: use FileRange? | ||
25 | file_id: FileId, | 26 | file_id: FileId, |
27 | full_range: TextRange, | ||
26 | name: SmolStr, | 28 | name: SmolStr, |
27 | kind: SyntaxKind, | 29 | kind: SyntaxKind, |
28 | full_range: TextRange, | ||
29 | focus_range: Option<TextRange>, | 30 | focus_range: Option<TextRange>, |
30 | container_name: Option<SmolStr>, | 31 | container_name: Option<SmolStr>, |
31 | description: Option<String>, | 32 | description: Option<String>, |
@@ -63,6 +64,10 @@ impl NavigationTarget { | |||
63 | self.file_id | 64 | self.file_id |
64 | } | 65 | } |
65 | 66 | ||
67 | pub fn file_range(&self) -> FileRange { | ||
68 | FileRange { file_id: self.file_id, range: self.full_range } | ||
69 | } | ||
70 | |||
66 | pub fn full_range(&self) -> TextRange { | 71 | pub fn full_range(&self) -> TextRange { |
67 | self.full_range | 72 | self.full_range |
68 | } | 73 | } |
@@ -87,15 +92,16 @@ impl NavigationTarget { | |||
87 | let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); | 92 | let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); |
88 | if let Some(src) = module.declaration_source(db) { | 93 | if let Some(src) = module.declaration_source(db) { |
89 | let frange = original_range(db, src.as_ref().map(|it| it.syntax())); | 94 | let frange = original_range(db, src.as_ref().map(|it| it.syntax())); |
90 | return NavigationTarget::from_syntax( | 95 | let mut res = NavigationTarget::from_syntax( |
91 | frange.file_id, | 96 | frange.file_id, |
92 | name, | 97 | name, |
93 | None, | 98 | None, |
94 | frange.range, | 99 | frange.range, |
95 | src.value.syntax().kind(), | 100 | src.value.syntax().kind(), |
96 | src.value.doc_comment_text(), | ||
97 | src.value.short_label(), | ||
98 | ); | 101 | ); |
102 | res.docs = src.value.doc_comment_text(); | ||
103 | res.description = src.value.short_label(); | ||
104 | return res; | ||
99 | } | 105 | } |
100 | module.to_nav(db) | 106 | module.to_nav(db) |
101 | } | 107 | } |
@@ -125,11 +131,9 @@ impl NavigationTarget { | |||
125 | } | 131 | } |
126 | 132 | ||
127 | /// Allows `NavigationTarget` to be created from a `NameOwner` | 133 | /// Allows `NavigationTarget` to be created from a `NameOwner` |
128 | fn from_named( | 134 | pub(crate) fn from_named( |
129 | db: &RootDatabase, | 135 | db: &RootDatabase, |
130 | node: InFile<&dyn ast::NameOwner>, | 136 | node: InFile<&dyn ast::NameOwner>, |
131 | docs: Option<String>, | ||
132 | description: Option<String>, | ||
133 | ) -> NavigationTarget { | 137 | ) -> NavigationTarget { |
134 | //FIXME: use `_` instead of empty string | 138 | //FIXME: use `_` instead of empty string |
135 | let name = node.value.name().map(|it| it.text().clone()).unwrap_or_default(); | 139 | let name = node.value.name().map(|it| it.text().clone()).unwrap_or_default(); |
@@ -143,8 +147,6 @@ impl NavigationTarget { | |||
143 | focus_range, | 147 | focus_range, |
144 | frange.range, | 148 | frange.range, |
145 | node.value.syntax().kind(), | 149 | node.value.syntax().kind(), |
146 | docs, | ||
147 | description, | ||
148 | ) | 150 | ) |
149 | } | 151 | } |
150 | 152 | ||
@@ -154,8 +156,6 @@ impl NavigationTarget { | |||
154 | focus_range: Option<TextRange>, | 156 | focus_range: Option<TextRange>, |
155 | full_range: TextRange, | 157 | full_range: TextRange, |
156 | kind: SyntaxKind, | 158 | kind: SyntaxKind, |
157 | docs: Option<String>, | ||
158 | description: Option<String>, | ||
159 | ) -> NavigationTarget { | 159 | ) -> NavigationTarget { |
160 | NavigationTarget { | 160 | NavigationTarget { |
161 | file_id, | 161 | file_id, |
@@ -164,8 +164,8 @@ impl NavigationTarget { | |||
164 | full_range, | 164 | full_range, |
165 | focus_range, | 165 | focus_range, |
166 | container_name: None, | 166 | container_name: None, |
167 | description, | 167 | description: None, |
168 | docs, | 168 | docs: None, |
169 | } | 169 | } |
170 | } | 170 | } |
171 | } | 171 | } |
@@ -233,12 +233,11 @@ where | |||
233 | { | 233 | { |
234 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { | 234 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { |
235 | let src = self.source(db); | 235 | let src = self.source(db); |
236 | NavigationTarget::from_named( | 236 | let mut res = |
237 | db, | 237 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); |
238 | src.as_ref().map(|it| it as &dyn ast::NameOwner), | 238 | res.docs = src.value.doc_comment_text(); |
239 | src.value.doc_comment_text(), | 239 | res.description = src.value.short_label(); |
240 | src.value.short_label(), | 240 | res |
241 | ) | ||
242 | } | 241 | } |
243 | } | 242 | } |
244 | 243 | ||
@@ -253,15 +252,7 @@ impl ToNav for hir::Module { | |||
253 | } | 252 | } |
254 | }; | 253 | }; |
255 | let frange = original_range(db, src.with_value(syntax)); | 254 | let frange = original_range(db, src.with_value(syntax)); |
256 | NavigationTarget::from_syntax( | 255 | NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, syntax.kind()) |
257 | frange.file_id, | ||
258 | name, | ||
259 | focus, | ||
260 | frange.range, | ||
261 | syntax.kind(), | ||
262 | None, | ||
263 | None, | ||
264 | ) | ||
265 | } | 256 | } |
266 | } | 257 | } |
267 | 258 | ||
@@ -280,8 +271,6 @@ impl ToNav for hir::ImplDef { | |||
280 | None, | 271 | None, |
281 | frange.range, | 272 | frange.range, |
282 | src.value.syntax().kind(), | 273 | src.value.syntax().kind(), |
283 | None, | ||
284 | None, | ||
285 | ) | 274 | ) |
286 | } | 275 | } |
287 | } | 276 | } |
@@ -291,12 +280,12 @@ impl ToNav for hir::Field { | |||
291 | let src = self.source(db); | 280 | let src = self.source(db); |
292 | 281 | ||
293 | match &src.value { | 282 | match &src.value { |
294 | FieldSource::Named(it) => NavigationTarget::from_named( | 283 | FieldSource::Named(it) => { |
295 | db, | 284 | let mut res = NavigationTarget::from_named(db, src.with_value(it)); |
296 | src.with_value(it), | 285 | res.docs = it.doc_comment_text(); |
297 | it.doc_comment_text(), | 286 | res.description = it.short_label(); |
298 | it.short_label(), | 287 | res |
299 | ), | 288 | } |
300 | FieldSource::Pos(it) => { | 289 | FieldSource::Pos(it) => { |
301 | let frange = original_range(db, src.with_value(it.syntax())); | 290 | let frange = original_range(db, src.with_value(it.syntax())); |
302 | NavigationTarget::from_syntax( | 291 | NavigationTarget::from_syntax( |
@@ -305,8 +294,6 @@ impl ToNav for hir::Field { | |||
305 | None, | 294 | None, |
306 | frange.range, | 295 | frange.range, |
307 | it.syntax().kind(), | 296 | it.syntax().kind(), |
308 | None, | ||
309 | None, | ||
310 | ) | 297 | ) |
311 | } | 298 | } |
312 | } | 299 | } |
@@ -317,12 +304,10 @@ impl ToNav for hir::MacroDef { | |||
317 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { | 304 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { |
318 | let src = self.source(db); | 305 | let src = self.source(db); |
319 | log::debug!("nav target {:#?}", src.value.syntax()); | 306 | log::debug!("nav target {:#?}", src.value.syntax()); |
320 | NavigationTarget::from_named( | 307 | let mut res = |
321 | db, | 308 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); |
322 | src.as_ref().map(|it| it as &dyn ast::NameOwner), | 309 | res.docs = src.value.doc_comment_text(); |
323 | src.value.doc_comment_text(), | 310 | res |
324 | None, | ||
325 | ) | ||
326 | } | 311 | } |
327 | } | 312 | } |
328 | 313 | ||
@@ -376,16 +361,20 @@ impl ToNav for hir::Local { | |||
376 | impl ToNav for hir::TypeParam { | 361 | impl ToNav for hir::TypeParam { |
377 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { | 362 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { |
378 | let src = self.source(db); | 363 | let src = self.source(db); |
379 | let range = match src.value { | 364 | let full_range = match &src.value { |
380 | Either::Left(it) => it.syntax().text_range(), | 365 | Either::Left(it) => it.syntax().text_range(), |
381 | Either::Right(it) => it.syntax().text_range(), | 366 | Either::Right(it) => it.syntax().text_range(), |
382 | }; | 367 | }; |
368 | let focus_range = match &src.value { | ||
369 | Either::Left(_) => None, | ||
370 | Either::Right(it) => it.name().map(|it| it.syntax().text_range()), | ||
371 | }; | ||
383 | NavigationTarget { | 372 | NavigationTarget { |
384 | file_id: src.file_id.original_file(db), | 373 | file_id: src.file_id.original_file(db), |
385 | name: self.name(db).to_string().into(), | 374 | name: self.name(db).to_string().into(), |
386 | kind: TYPE_PARAM, | 375 | kind: TYPE_PARAM, |
387 | full_range: range, | 376 | full_range, |
388 | focus_range: None, | 377 | focus_range, |
389 | container_name: None, | 378 | container_name: None, |
390 | description: None, | 379 | description: None, |
391 | docs: None, | 380 | docs: None, |