Check whether cursor is on and not between intra doc links in goto_definition

This commit is contained in:
Lukas Wirth 2021-03-17 17:24:16 +01:00
parent edf11480ce
commit 5481c78f32

View File

@ -1,3 +1,5 @@
use std::ops::Range;
use either::Either; use either::Either;
use hir::{HasAttrs, ModuleDef, Semantics}; use hir::{HasAttrs, ModuleDef, Semantics};
use ide_db::{ use ide_db::{
@ -5,7 +7,8 @@ use ide_db::{
RootDatabase, RootDatabase,
}; };
use syntax::{ use syntax::{
ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxToken, TextSize, TokenAtOffset, T, ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxToken, TextRange, TextSize,
TokenAtOffset, T,
}; };
use crate::{ use crate::{
@ -92,15 +95,18 @@ fn extract_positioned_link_from_comment(
position: FilePosition, position: FilePosition,
comment: &ast::Comment, comment: &ast::Comment,
) -> Option<(String, Option<hir::Namespace>)> { ) -> Option<(String, Option<hir::Namespace>)> {
let comment_range = comment.syntax().text_range();
let doc_comment = comment.doc_comment()?; let doc_comment = comment.doc_comment()?;
let comment_start =
comment.syntax().text_range().start() + TextSize::from(comment.prefix().len() as u32);
let def_links = extract_definitions_from_markdown(doc_comment); let def_links = extract_definitions_from_markdown(doc_comment);
let start = comment_range.start() + TextSize::from(comment.prefix().len() as u32); let (def_link, ns, _) = def_links.into_iter().find(|&(_, _, Range { start, end })| {
let (def_link, ns, _) = def_links.iter().min_by_key(|(_, _, def_link_range)| { TextRange::at(
let matched_position = start + TextSize::from(def_link_range.start as u32); comment_start + TextSize::from(start as u32),
position.offset.checked_sub(matched_position).unwrap_or_else(|| comment_range.end()) TextSize::from((end - start) as u32),
)
.contains(position.offset)
})?; })?;
Some((def_link.to_string(), *ns)) Some((def_link, ns))
} }
fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> { fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
@ -1134,7 +1140,7 @@ fn foo<'foo>(_: &'foo ()) {
fn goto_def_for_intra_doc_link_same_file() { fn goto_def_for_intra_doc_link_same_file() {
check( check(
r#" r#"
/// Blah, [`bar`](bar) .. [`foo`](foo)$0 has [`bar`](bar) /// Blah, [`bar`](bar) .. [`foo`](foo$0) has [`bar`](bar)
pub fn bar() { } pub fn bar() { }
/// You might want to see [`std::fs::read()`] too. /// You might want to see [`std::fs::read()`] too.