diff options
Diffstat (limited to 'support/texlab/src/features/hover/string_ref.rs')
-rw-r--r-- | support/texlab/src/features/hover/string_ref.rs | 47 |
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); } } |