diff options
Diffstat (limited to 'support/texlab/src/features/hover/string_ref.rs')
-rw-r--r-- | support/texlab/src/features/hover/string_ref.rs | 140 |
1 files changed, 22 insertions, 118 deletions
diff --git a/support/texlab/src/features/hover/string_ref.rs b/support/texlab/src/features/hover/string_ref.rs index f1df08e8ab..adccdd556c 100644 --- a/support/texlab/src/features/hover/string_ref.rs +++ b/support/texlab/src/features/hover/string_ref.rs @@ -1,21 +1,27 @@ -use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent, MarkupKind}; +use lsp_types::{HoverParams, MarkupKind}; use rowan::ast::AstNode; use crate::{ + citation::field::text::TextFieldData, features::cursor::CursorContext, syntax::bibtex::{self, HasName, HasValue}, - LineIndexExt, }; -pub fn find_string_reference_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { - let main_document = context.request.main_document(); - let data = main_document.data.as_bibtex()?; +use super::HoverResult; - let key = context.cursor.as_bibtex().filter(|token| { - let parent = token.parent().unwrap(); - (token.kind() == bibtex::NAME && bibtex::Value::can_cast(parent.kind())) - || (token.kind() == bibtex::NAME && bibtex::StringDef::can_cast(parent.kind())) - })?; +pub(super) fn find_string_reference_hover( + context: &CursorContext<HoverParams>, +) -> Option<HoverResult> { + let data = context.request.main_document().data.as_bibtex()?; + + let name = context + .cursor + .as_bibtex() + .filter(|token| token.kind() == bibtex::NAME) + .filter(|token| { + let parent = token.parent().unwrap(); + bibtex::Value::can_cast(parent.kind()) || bibtex::StringDef::can_cast(parent.kind()) + })?; for string in bibtex::SyntaxNode::new_root(data.green.clone()) .children() @@ -23,118 +29,16 @@ pub fn find_string_reference_hover(context: &CursorContext<HoverParams>) -> Opti { if string .name_token() - .filter(|k| k.text() == key.text()) - .is_some() + .map_or(false, |token| token.text() == name.text()) { - let value = string.value()?.syntax().text().to_string(); - return Some(Hover { - range: Some( - main_document - .line_index - .line_col_lsp_range(key.text_range()), - ), - contents: HoverContents::Markup(MarkupContent { - kind: MarkupKind::PlainText, - value, - }), + let value = TextFieldData::parse(&string.value()?)?.text; + return Some(HoverResult { + range: name.text_range(), + value, + value_kind: MarkupKind::PlainText, }); } } None } - -#[cfg(test)] -mod tests { - use indoc::indoc; - use lsp_types::Range; - - use crate::{features::testing::FeatureTester, RangeExt}; - - 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_string_reference_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_string_reference_hover(&context); - - assert_eq!(actual_hover, None); - } - - #[test] - fn test_inside_reference() { - let request = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = "Foo"} - @string{bar = "Bar"} - @article{baz, author = bar} - "# }, - )]) - .main("main.bib") - .line(2) - .character(24) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_string_reference_hover(&context).unwrap(); - - let expected_hover = Hover { - contents: HoverContents::Markup(MarkupContent { - kind: MarkupKind::PlainText, - value: "\"Bar\"".into(), - }), - range: Some(Range::new_simple(2, 23, 2, 26)), - }; - - assert_eq!(actual_hover, expected_hover); - } - - #[test] - fn test_inside_field() { - let request = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = "Foo"} - @string{bar = "Bar"} - @article{baz, author = bar} - "# }, - )]) - .main("main.bib") - .line(2) - .character(20) - .build() - .hover(); - - let context = CursorContext::new(request); - let actual_hover = find_string_reference_hover(&context); - assert_eq!(actual_hover, None); - } -} |