summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/hover
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/hover')
-rw-r--r--support/texlab/src/features/hover/citation.rs66
-rw-r--r--support/texlab/src/features/hover/component.rs18
-rw-r--r--support/texlab/src/features/hover/entry_type.rs20
-rw-r--r--support/texlab/src/features/hover/field.rs29
-rw-r--r--support/texlab/src/features/hover/label.rs14
-rw-r--r--support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_cite.snap25
-rw-r--r--support/texlab/src/features/hover/snapshots/texlab__features__hover__citation__tests__inside_entry.snap25
-rw-r--r--support/texlab/src/features/hover/string_ref.rs47
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);
}
}