aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src/display/navigation_target.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api/src/display/navigation_target.rs')
-rw-r--r--crates/ra_ide_api/src/display/navigation_target.rs54
1 files changed, 21 insertions, 33 deletions
diff --git a/crates/ra_ide_api/src/display/navigation_target.rs b/crates/ra_ide_api/src/display/navigation_target.rs
index 4703cfaf7..291b5ee40 100644
--- a/crates/ra_ide_api/src/display/navigation_target.rs
+++ b/crates/ra_ide_api/src/display/navigation_target.rs
@@ -9,8 +9,9 @@ use ra_syntax::{
9 SyntaxNode, TextRange, 9 SyntaxNode, TextRange,
10}; 10};
11 11
12use crate::{db::RootDatabase, expand::original_range, FileSymbol};
13
12use super::short_label::ShortLabel; 14use super::short_label::ShortLabel;
13use crate::{db::RootDatabase, FileSymbol};
14 15
15/// `NavigationTarget` represents and element in the editor's UI which you can 16/// `NavigationTarget` represents and element in the editor's UI which you can
16/// click on to navigate to a particular piece of code. 17/// click on to navigate to a particular piece of code.
@@ -79,13 +80,12 @@ impl NavigationTarget {
79 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget { 80 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget {
80 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); 81 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default();
81 if let Some(src) = module.declaration_source(db) { 82 if let Some(src) = module.declaration_source(db) {
82 let (file_id, text_range) = 83 let frange = original_range(db, src.as_ref().map(|it| it.syntax()));
83 find_range_from_node(db, src.as_ref().map(|it| it.syntax()));
84 return NavigationTarget::from_syntax( 84 return NavigationTarget::from_syntax(
85 file_id, 85 frange.file_id,
86 name, 86 name,
87 None, 87 None,
88 text_range, 88 frange.range,
89 src.ast.syntax(), 89 src.ast.syntax(),
90 src.ast.doc_comment_text(), 90 src.ast.doc_comment_text(),
91 src.ast.short_label(), 91 src.ast.short_label(),
@@ -149,14 +149,14 @@ impl NavigationTarget {
149 //FIXME: use `_` instead of empty string 149 //FIXME: use `_` instead of empty string
150 let name = node.name().map(|it| it.text().clone()).unwrap_or_default(); 150 let name = node.name().map(|it| it.text().clone()).unwrap_or_default();
151 let focus_range = 151 let focus_range =
152 node.name().map(|it| find_range_from_node(db, Source::new(file_id, it.syntax())).1); 152 node.name().map(|it| original_range(db, Source::new(file_id, it.syntax())).range);
153 let (file_id, full_range) = find_range_from_node(db, Source::new(file_id, node.syntax())); 153 let frange = original_range(db, Source::new(file_id, node.syntax()));
154 154
155 NavigationTarget::from_syntax( 155 NavigationTarget::from_syntax(
156 file_id, 156 frange.file_id,
157 name, 157 name,
158 focus_range, 158 focus_range,
159 full_range, 159 frange.range,
160 node.syntax(), 160 node.syntax(),
161 docs, 161 docs,
162 description, 162 description,
@@ -234,26 +234,26 @@ impl ToNav for hir::Module {
234 let name = self.name(db).map(|it| it.to_string().into()).unwrap_or_default(); 234 let name = self.name(db).map(|it| it.to_string().into()).unwrap_or_default();
235 match &src.ast { 235 match &src.ast {
236 ModuleSource::SourceFile(node) => { 236 ModuleSource::SourceFile(node) => {
237 let (file_id, text_range) = find_range_from_node(db, src.with_ast(node.syntax())); 237 let frange = original_range(db, src.with_ast(node.syntax()));
238 238
239 NavigationTarget::from_syntax( 239 NavigationTarget::from_syntax(
240 file_id, 240 frange.file_id,
241 name, 241 name,
242 None, 242 None,
243 text_range, 243 frange.range,
244 node.syntax(), 244 node.syntax(),
245 None, 245 None,
246 None, 246 None,
247 ) 247 )
248 } 248 }
249 ModuleSource::Module(node) => { 249 ModuleSource::Module(node) => {
250 let (file_id, text_range) = find_range_from_node(db, src.with_ast(node.syntax())); 250 let frange = original_range(db, src.with_ast(node.syntax()));
251 251
252 NavigationTarget::from_syntax( 252 NavigationTarget::from_syntax(
253 file_id, 253 frange.file_id,
254 name, 254 name,
255 None, 255 None,
256 text_range, 256 frange.range,
257 node.syntax(), 257 node.syntax(),
258 node.doc_comment_text(), 258 node.doc_comment_text(),
259 node.short_label(), 259 node.short_label(),
@@ -266,13 +266,13 @@ impl ToNav for hir::Module {
266impl ToNav for hir::ImplBlock { 266impl ToNav for hir::ImplBlock {
267 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 267 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
268 let src = self.source(db); 268 let src = self.source(db);
269 let (file_id, text_range) = find_range_from_node(db, src.as_ref().map(|it| it.syntax())); 269 let frange = original_range(db, src.as_ref().map(|it| it.syntax()));
270 270
271 NavigationTarget::from_syntax( 271 NavigationTarget::from_syntax(
272 file_id, 272 frange.file_id,
273 "impl".into(), 273 "impl".into(),
274 None, 274 None,
275 text_range, 275 frange.range,
276 src.ast.syntax(), 276 src.ast.syntax(),
277 None, 277 None,
278 None, 278 None,
@@ -293,12 +293,12 @@ impl ToNav for hir::StructField {
293 it.short_label(), 293 it.short_label(),
294 ), 294 ),
295 FieldSource::Pos(it) => { 295 FieldSource::Pos(it) => {
296 let (file_id, text_range) = find_range_from_node(db, src.with_ast(it.syntax())); 296 let frange = original_range(db, src.with_ast(it.syntax()));
297 NavigationTarget::from_syntax( 297 NavigationTarget::from_syntax(
298 file_id, 298 frange.file_id,
299 "".into(), 299 "".into(),
300 None, 300 None,
301 text_range, 301 frange.range,
302 it.syntax(), 302 it.syntax(),
303 None, 303 None,
304 None, 304 None,
@@ -362,18 +362,6 @@ impl ToNav for hir::Local {
362 } 362 }
363} 363}
364 364
365fn find_range_from_node(db: &RootDatabase, node: Source<&SyntaxNode>) -> (FileId, TextRange) {
366 let text_range = node.ast.text_range();
367 let (file_id, text_range) = node
368 .file_id
369 .expansion_info(db)
370 .and_then(|expansion_info| expansion_info.find_range(text_range))
371 .unwrap_or((node.file_id, text_range));
372
373 // FIXME: handle recursive macro generated macro
374 (file_id.original_file(db), text_range)
375}
376
377pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option<String> { 365pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option<String> {
378 let parse = db.parse(symbol.file_id); 366 let parse = db.parse(symbol.file_id);
379 let node = symbol.ptr.to_node(parse.tree().syntax()); 367 let node = symbol.ptr.to_node(parse.tree().syntax());