summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/hover/citation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/hover/citation.rs')
-rw-r--r--support/texlab/src/features/hover/citation.rs119
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);
- }
-}