diff options
Diffstat (limited to 'support/texlab/src/features/hover/citation.rs')
-rw-r--r-- | support/texlab/src/features/hover/citation.rs | 119 |
1 files changed, 15 insertions, 104 deletions
diff --git a/support/texlab/src/features/hover/citation.rs b/support/texlab/src/features/hover/citation.rs index 4a0e3d2313..5e86019eee 100644 --- a/support/texlab/src/features/hover/citation.rs +++ b/support/texlab/src/features/hover/citation.rs @@ -1,121 +1,32 @@ -use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent, MarkupKind}; +use lsp_types::{HoverParams, MarkupKind}; use rowan::ast::AstNode; -use crate::{citation, features::cursor::CursorContext, syntax::bibtex, LineIndexExt}; +use crate::{citation, features::cursor::CursorContext, syntax::bibtex}; -pub fn find_citation_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { - let main_document = context.request.main_document(); +use super::HoverResult; - let (key_text, key_range) = context +pub(super) fn find_citation_hover(context: &CursorContext<HoverParams>) -> Option<HoverResult> { + let (key, range) = context .find_citation_key_word() .or_else(|| context.find_citation_key_command()) .or_else(|| context.find_entry_key())?; - let contents = context + let value = context .request .workspace .documents_by_uri .values() .find_map(|document| { - document.data.as_bibtex().and_then(|data| { - let root = bibtex::SyntaxNode::new_root(data.green.clone()); - let root = bibtex::Root::cast(root)?; - let entry = root.find_entry(&key_text)?; - - citation::render(&entry).map(|value| MarkupContent { - kind: MarkupKind::Markdown, - value, - }) - }) + let data = document.data.as_bibtex()?; + let root = bibtex::SyntaxNode::new_root(data.green.clone()); + let root = bibtex::Root::cast(root)?; + let entry = root.find_entry(&key)?; + citation::render(&entry) })?; - Some(Hover { - range: Some(main_document.line_index.line_col_lsp_range(key_range)), - contents: HoverContents::Markup(contents), + Some(HoverResult { + range, + value, + value_kind: MarkupKind::Markdown, }) } - -#[cfg(test)] -mod tests { - use insta::assert_debug_snapshot; - - use crate::features::testing::FeatureTester; - - use super::*; - - #[test] - fn test_empty_latex_document() { - let request = FeatureTester::builder() - .files(vec![("main.tex", "")]) - .main("main.tex") - .line(0) - .character(0) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context); - - assert_eq!(actual_hover, None); - } - - #[test] - fn test_empty_bibtex_document() { - let request = FeatureTester::builder() - .files(vec![("main.bib", "")]) - .main("main.bib") - .line(0) - .character(0) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context); - - assert_eq!(actual_hover, None); - } - - #[test] - fn test_inside_cite() { - let request = FeatureTester::builder() - .files(vec![ - ( - "main.bib", - "@article{foo, author = {Foo Bar}, title = {Baz Qux}, year = 1337}", - ), - ("main.tex", "\\addbibresource{main.bib}\n\\cite{foo}"), - ]) - .main("main.tex") - .line(1) - .character(7) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context).unwrap(); - - assert_debug_snapshot!(actual_hover); - } - - #[test] - fn test_inside_entry() { - let request = FeatureTester::builder() - .files(vec![ - ( - "main.bib", - "@article{foo, author = {Foo Bar}, title = {Baz Qux}, year = 1337}", - ), - ("main.tex", "\\addbibresource{main.bib}\n\\cite{foo}"), - ]) - .main("main.bib") - .line(0) - .character(11) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context).unwrap(); - - assert_debug_snapshot!(actual_hover); - } -} |