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.rs47
1 files changed, 23 insertions, 24 deletions
diff --git a/support/texlab/src/features/hover/string_ref.rs b/support/texlab/src/features/hover/string_ref.rs
index f6e7f1c873..f1df08e8ab 100644
--- a/support/texlab/src/features/hover/string_ref.rs
+++ b/support/texlab/src/features/hover/string_ref.rs
@@ -1,37 +1,37 @@
-use cancellation::CancellationToken;
use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent, MarkupKind};
+use rowan::ast::AstNode;
use crate::{
features::cursor::CursorContext,
- syntax::{bibtex, CstNode},
+ syntax::bibtex::{self, HasName, HasValue},
LineIndexExt,
};
-pub fn find_string_reference_hover(
- context: &CursorContext<HoverParams>,
- cancellation_token: &CancellationToken,
-) -> Option<Hover> {
+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()?;
- let name = context
- .cursor
- .as_bibtex()
- .filter(|token| token.kind() == bibtex::WORD)
- .filter(|name| matches!(name.parent().kind(), bibtex::TOKEN | bibtex::STRING))?;
-
- for string in data.root.children().filter_map(bibtex::String::cast) {
- if cancellation_token.is_canceled() {
- return None;
- }
-
- if string.name().filter(|n| n.text() == name.text()).is_some() {
+ 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()))
+ })?;
+
+ for string in bibtex::SyntaxNode::new_root(data.green.clone())
+ .children()
+ .filter_map(bibtex::StringDef::cast)
+ {
+ if string
+ .name_token()
+ .filter(|k| k.text() == key.text())
+ .is_some()
+ {
let value = string.value()?.syntax().text().to_string();
return Some(Hover {
range: Some(
main_document
.line_index
- .line_col_lsp_range(name.text_range()),
+ .line_col_lsp_range(key.text_range()),
),
contents: HoverContents::Markup(MarkupContent {
kind: MarkupKind::PlainText,
@@ -64,7 +64,7 @@ mod tests {
.hover();
let context = CursorContext::new(request);
- let actual_hover = find_string_reference_hover(&context, CancellationToken::none());
+ let actual_hover = find_string_reference_hover(&context);
assert_eq!(actual_hover, None);
}
@@ -80,7 +80,7 @@ mod tests {
.hover();
let context = CursorContext::new(request);
- let actual_hover = find_string_reference_hover(&context, CancellationToken::none());
+ let actual_hover = find_string_reference_hover(&context);
assert_eq!(actual_hover, None);
}
@@ -103,8 +103,7 @@ mod tests {
.hover();
let context = CursorContext::new(request);
- let actual_hover =
- find_string_reference_hover(&context, CancellationToken::none()).unwrap();
+ let actual_hover = find_string_reference_hover(&context).unwrap();
let expected_hover = Hover {
contents: HoverContents::Markup(MarkupContent {
@@ -135,7 +134,7 @@ mod tests {
.hover();
let context = CursorContext::new(request);
- let actual_hover = find_string_reference_hover(&context, CancellationToken::none());
+ let actual_hover = find_string_reference_hover(&context);
assert_eq!(actual_hover, None);
}
}