From 9df78ec4a4e41ca94b25f292aba90e266f104f02 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 29 Mar 2021 21:23:45 +0200 Subject: Properly resolve intra doc links in hover and goto_definition --- crates/ide/src/goto_definition.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'crates/ide/src/goto_definition.rs') diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index c6556c487..4e4d1b200 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -31,7 +31,8 @@ pub(crate) fn goto_definition( let token = sema.descend_into_macros(original_token.clone()); let parent = token.parent()?; if let Some(comment) = ast::Comment::cast(token) { - let (_, link, ns) = extract_positioned_link_from_comment(position.offset, &comment)?; + let docs = doc_owner_to_def(&sema, &parent)?.docs(db)?; + let (_, link, ns) = extract_positioned_link_from_comment(position.offset, &comment, docs)?; let def = doc_owner_to_def(&sema, &parent)?; let nav = resolve_doc_path_for_def(db, def, &link, ns)?.try_to_nav(db)?; return Some(RangeInfo::new(original_token.text_range(), vec![nav])); @@ -1158,4 +1159,25 @@ fn fn_macro() {} "#, ) } + + #[test] + fn goto_intra_doc_links() { + check( + r#" + +pub mod theitem { + /// This is the item. Cool! + pub struct TheItem; + //^^^^^^^ +} + +/// Gives you a [`TheItem$0`]. +/// +/// [`TheItem`]: theitem::TheItem +pub fn gimme() -> theitem::TheItem { + theitem::TheItem +} +"#, + ); + } } -- cgit v1.2.3 From 9a327311e4a9b9102528751e052c63266c00c6bd Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 30 Mar 2021 17:20:43 +0200 Subject: Implement basic Documentation source to syntax range mapping --- crates/ide/src/goto_definition.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'crates/ide/src/goto_definition.rs') diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 4e4d1b200..1951c599f 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -32,6 +32,7 @@ pub(crate) fn goto_definition( let parent = token.parent()?; if let Some(comment) = ast::Comment::cast(token) { let docs = doc_owner_to_def(&sema, &parent)?.docs(db)?; + let (_, link, ns) = extract_positioned_link_from_comment(position.offset, &comment, docs)?; let def = doc_owner_to_def(&sema, &parent)?; let nav = resolve_doc_path_for_def(db, def, &link, ns)?.try_to_nav(db)?; -- cgit v1.2.3 From bb56b7a75cfae8297535d55fbddbee9875cbc756 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 30 Mar 2021 18:27:16 +0200 Subject: Use new new docs string source mapping in goto_def and hover --- crates/ide/src/goto_definition.rs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'crates/ide/src/goto_definition.rs') diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index 1951c599f..780bdd40d 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -1,5 +1,5 @@ use either::Either; -use hir::Semantics; +use hir::{InFile, Semantics}; use ide_db::{ defs::{NameClass, NameRefClass}, RootDatabase, @@ -8,7 +8,7 @@ use syntax::{ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxToken, Toke use crate::{ display::TryToNav, - doc_links::{doc_owner_to_def, extract_positioned_link_from_comment, resolve_doc_path_for_def}, + doc_links::{doc_attributes, extract_definitions_from_markdown, resolve_doc_path_for_def}, FilePosition, NavigationTarget, RangeInfo, }; @@ -30,11 +30,16 @@ pub(crate) fn goto_definition( let original_token = pick_best(file.token_at_offset(position.offset))?; let token = sema.descend_into_macros(original_token.clone()); let parent = token.parent()?; - if let Some(comment) = ast::Comment::cast(token) { - let docs = doc_owner_to_def(&sema, &parent)?.docs(db)?; - - let (_, link, ns) = extract_positioned_link_from_comment(position.offset, &comment, docs)?; - let def = doc_owner_to_def(&sema, &parent)?; + if let Some(_) = ast::Comment::cast(token) { + let (attributes, def) = doc_attributes(&sema, &parent)?; + + let (docs, doc_mapping) = attributes.docs_with_rangemap(db)?; + let (_, link, ns) = + extract_definitions_from_markdown(docs.as_str()).into_iter().find(|(range, ..)| { + doc_mapping.map(range.clone()).map_or(false, |InFile { file_id, value: range }| { + file_id == position.file_id.into() && range.contains(position.offset) + }) + })?; let nav = resolve_doc_path_for_def(db, def, &link, ns)?.try_to_nav(db)?; return Some(RangeInfo::new(original_token.text_range(), vec![nav])); } -- cgit v1.2.3