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