diff options
Diffstat (limited to 'support/texlab/src/features/hover')
8 files changed, 129 insertions, 115 deletions
diff --git a/support/texlab/src/features/hover/citation.rs b/support/texlab/src/features/hover/citation.rs index c097a922f7..4a0e3d2313 100644 --- a/support/texlab/src/features/hover/citation.rs +++ b/support/texlab/src/features/hover/citation.rs @@ -1,13 +1,9 @@ -use cancellation::CancellationToken; -use lsp_types::{Hover, HoverContents, HoverParams}; +use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent, MarkupKind}; +use rowan::ast::AstNode; -use crate::{citation, features::cursor::CursorContext, LineIndexExt}; +use crate::{citation, features::cursor::CursorContext, syntax::bibtex, LineIndexExt}; -pub fn find_citation_hover( - context: &CursorContext<HoverParams>, - cancellation_token: &CancellationToken, -) -> Option<Hover> { - cancellation_token.result().ok()?; +pub fn find_citation_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { let main_document = context.request.main_document(); let (key_text, key_range) = context @@ -17,14 +13,20 @@ pub fn find_citation_hover( let contents = context .request - .subset - .documents - .iter() + .workspace + .documents_by_uri + .values() .find_map(|document| { - document - .data - .as_bibtex() - .and_then(|data| citation::render_citation(&data.root, &key_text)) + 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, + }) + }) })?; Some(Hover { @@ -35,9 +37,9 @@ pub fn find_citation_hover( #[cfg(test)] mod tests { - use lsp_types::{MarkupContent, MarkupKind, Range}; + use insta::assert_debug_snapshot; - use crate::{features::testing::FeatureTester, RangeExt}; + use crate::features::testing::FeatureTester; use super::*; @@ -52,7 +54,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context, CancellationToken::none()); + let actual_hover = find_citation_hover(&context); assert_eq!(actual_hover, None); } @@ -68,7 +70,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context, CancellationToken::none()); + let actual_hover = find_citation_hover(&context); assert_eq!(actual_hover, None); } @@ -90,16 +92,9 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context, CancellationToken::none()).unwrap(); - - let expected_hover = Hover { - contents: HoverContents::Markup(MarkupContent { - kind: MarkupKind::Markdown, - value: "Bar, Foo. (1337). *Baz Qux*.".into(), - }), - range: Some(Range::new_simple(1, 6, 1, 9)), - }; - assert_eq!(actual_hover, expected_hover); + let actual_hover = find_citation_hover(&context).unwrap(); + + assert_debug_snapshot!(actual_hover); } #[test] @@ -119,15 +114,8 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_citation_hover(&context, CancellationToken::none()).unwrap(); - - let expected_hover = Hover { - contents: HoverContents::Markup(MarkupContent { - kind: MarkupKind::Markdown, - value: "Bar, Foo. (1337). *Baz Qux*.".into(), - }), - range: Some(Range::new_simple(0, 9, 0, 12)), - }; - assert_eq!(actual_hover, expected_hover); + let actual_hover = find_citation_hover(&context).unwrap(); + + assert_debug_snapshot!(actual_hover); } } diff --git a/support/texlab/src/features/hover/component.rs b/support/texlab/src/features/hover/component.rs index abfdb781f1..7b7e6c6e02 100644 --- a/support/texlab/src/features/hover/component.rs +++ b/support/texlab/src/features/hover/component.rs @@ -1,21 +1,13 @@ -use cancellation::CancellationToken; use lsp_types::{Hover, HoverContents, HoverParams}; use crate::{ component_db::COMPONENT_DATABASE, features::cursor::CursorContext, syntax::latex, LineIndexExt, }; -pub fn find_component_hover( - context: &CursorContext<HoverParams>, - token: &CancellationToken, -) -> Option<Hover> { +pub fn find_component_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { let main_document = context.request.main_document(); let data = main_document.data.as_latex()?; for link in &data.extras.explicit_links { - if token.is_canceled() { - break; - } - if matches!( link.kind, latex::ExplicitLinkKind::Package | latex::ExplicitLinkKind::Class @@ -50,7 +42,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_component_hover(&context, CancellationToken::none()); + let actual_hover = find_component_hover(&context); assert_eq!(actual_hover, None); } @@ -66,7 +58,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_component_hover(&context, CancellationToken::none()); + let actual_hover = find_component_hover(&context); assert_eq!(actual_hover, None); } @@ -82,7 +74,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_component_hover(&context, CancellationToken::none()).unwrap(); + let actual_hover = find_component_hover(&context).unwrap(); assert_eq!(actual_hover.range.unwrap(), Range::new_simple(0, 12, 0, 19)); } @@ -98,7 +90,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_component_hover(&context, CancellationToken::none()); + let actual_hover = find_component_hover(&context); assert_eq!(actual_hover, None); } diff --git a/support/texlab/src/features/hover/entry_type.rs b/support/texlab/src/features/hover/entry_type.rs index e480b2f835..ab36177ae8 100644 --- a/support/texlab/src/features/hover/entry_type.rs +++ b/support/texlab/src/features/hover/entry_type.rs @@ -1,16 +1,12 @@ -use cancellation::CancellationToken; use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent}; -use crate::{features::cursor::CursorContext, LineIndexExt, LANGUAGE_DATA}; +use crate::{features::cursor::CursorContext, syntax::bibtex, LineIndexExt, LANGUAGE_DATA}; -pub fn find_entry_type_hover( - context: &CursorContext<HoverParams>, - _token: &CancellationToken, -) -> Option<Hover> { +pub fn find_entry_type_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { let name = context .cursor .as_bibtex() - .filter(|token| token.kind().is_type())?; + .filter(|token| token.kind() == bibtex::TYPE)?; let docs = LANGUAGE_DATA.entry_type_documentation(&name.text()[1..])?; Some(Hover { @@ -47,7 +43,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_entry_type_hover(&context, CancellationToken::none()); + let actual_hover = find_entry_type_hover(&context); assert_eq!(actual_hover, None); } @@ -63,7 +59,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_entry_type_hover(&context, CancellationToken::none()); + let actual_hover = find_entry_type_hover(&context); assert_eq!(actual_hover, None); } @@ -79,7 +75,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_entry_type_hover(&context, CancellationToken::none()).unwrap(); + let actual_hover = find_entry_type_hover(&context).unwrap(); let expected_hover = Hover { contents: HoverContents::Markup(MarkupContent { @@ -105,7 +101,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_entry_type_hover(&context, CancellationToken::none()); + let actual_hover = find_entry_type_hover(&context); assert_eq!(actual_hover, None); } @@ -121,7 +117,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_entry_type_hover(&context, CancellationToken::none()); + let actual_hover = find_entry_type_hover(&context); assert_eq!(actual_hover, None); } diff --git a/support/texlab/src/features/hover/field.rs b/support/texlab/src/features/hover/field.rs index 54a8718d69..daa0c301cd 100644 --- a/support/texlab/src/features/hover/field.rs +++ b/support/texlab/src/features/hover/field.rs @@ -1,26 +1,19 @@ -use cancellation::CancellationToken; use lsp_types::{Hover, HoverContents, HoverParams, MarkupContent}; +use rowan::ast::AstNode; -use crate::{ - features::cursor::CursorContext, - syntax::{bibtex, CstNode}, - LineIndexExt, LANGUAGE_DATA, -}; +use crate::{features::cursor::CursorContext, syntax::bibtex, LineIndexExt, LANGUAGE_DATA}; -pub fn find_field_hover( - context: &CursorContext<HoverParams>, - _token: &CancellationToken, -) -> Option<Hover> { +pub fn find_field_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { let main_document = context.request.main_document(); let name = context .cursor .as_bibtex() - .filter(|token| token.kind() == bibtex::WORD)?; + .filter(|token| token.kind() == bibtex::NAME)?; - bibtex::Field::cast(name.parent())?; + bibtex::Field::cast(name.parent()?)?; - let docs = LANGUAGE_DATA.field_documentation(&name.text())?; + let docs = LANGUAGE_DATA.field_documentation(name.text())?; Some(Hover { contents: HoverContents::Markup(MarkupContent { kind: lsp_types::MarkupKind::Markdown, @@ -53,7 +46,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_field_hover(&context, CancellationToken::none()); + let actual_hover = find_field_hover(&context); assert_eq!(actual_hover, None); } @@ -69,7 +62,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_field_hover(&context, CancellationToken::none()); + let actual_hover = find_field_hover(&context); assert_eq!(actual_hover, None); } @@ -85,7 +78,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_field_hover(&context, CancellationToken::none()).unwrap(); + let actual_hover = find_field_hover(&context).unwrap(); let expected_hover = Hover { contents: HoverContents::Markup(MarkupContent { kind: MarkupKind::Markdown, @@ -107,7 +100,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_field_hover(&context, CancellationToken::none()); + let actual_hover = find_field_hover(&context); assert_eq!(actual_hover, None); } @@ -122,7 +115,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_field_hover(&context, CancellationToken::none()); + let actual_hover = find_field_hover(&context); assert_eq!(actual_hover, None); } } diff --git a/support/texlab/src/features/hover/label.rs b/support/texlab/src/features/hover/label.rs index 26477feb7c..1018c187c5 100644 --- a/support/texlab/src/features/hover/label.rs +++ b/support/texlab/src/features/hover/label.rs @@ -1,19 +1,15 @@ -use cancellation::CancellationToken; use lsp_types::{Hover, HoverContents, HoverParams}; use crate::{features::cursor::CursorContext, render_label, LineIndexExt}; -pub fn find_label_hover( - context: &CursorContext<HoverParams>, - _token: &CancellationToken, -) -> Option<Hover> { +pub fn find_label_hover(context: &CursorContext<HoverParams>) -> Option<Hover> { let main_document = context.request.main_document(); let (name_text, name_range) = context .find_label_name_key() .or_else(|| context.find_label_name_command())?; - let label = render_label(&context.request.subset, &name_text, None)?; + let label = render_label(&context.request.workspace, &name_text, None)?; Some(Hover { range: Some(main_document.line_index.line_col_lsp_range(name_range)), @@ -40,7 +36,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_label_hover(&context, CancellationToken::none()); + let actual_hover = find_label_hover(&context); assert_eq!(actual_hover, None); } @@ -56,7 +52,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_label_hover(&context, CancellationToken::none()); + let actual_hover = find_label_hover(&context); assert_eq!(actual_hover, None); } @@ -72,7 +68,7 @@ mod tests { .hover(); let context = CursorContext::new(request); - let actual_hover = find_label_hover(&context, CancellationToken::none()).unwrap(); + let actual_hover = find_label_hover(&context).unwrap(); assert_eq!(actual_hover.range.unwrap(), Range::new_simple(0, 20, 0, 27)); } diff --git a/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_cite.snap b/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_cite.snap new file mode 100644 index 0000000000..2bca88bbff --- /dev/null +++ b/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_cite.snap @@ -0,0 +1,25 @@ +--- +source: src/features/hover/citation.rs +assertion_line: 97 +expression: actual_hover +--- +Hover { + contents: Markup( + MarkupContent { + kind: Markdown, + value: "F. Bar: \"Baz Qux\". (1337).", + }, + ), + range: Some( + Range { + start: Position { + line: 1, + character: 6, + }, + end: Position { + line: 1, + character: 9, + }, + }, + ), +} diff --git a/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_entry.snap b/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_entry.snap new file mode 100644 index 0000000000..73ac4b7b69 --- /dev/null +++ b/support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_entry.snap @@ -0,0 +1,25 @@ +--- +source: src/features/hover/citation.rs +assertion_line: 119 +expression: actual_hover +--- +Hover { + contents: Markup( + MarkupContent { + kind: Markdown, + value: "F. Bar: \"Baz Qux\". (1337).", + }, + ), + range: Some( + Range { + start: Position { + line: 0, + character: 9, + }, + end: Position { + line: 0, + character: 12, + }, + }, + ), +} 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); } } |