summaryrefslogtreecommitdiff
path: root/support/texlab/src/protocol/capabilities.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/protocol/capabilities.rs')
-rw-r--r--support/texlab/src/protocol/capabilities.rs145
1 files changed, 145 insertions, 0 deletions
diff --git a/support/texlab/src/protocol/capabilities.rs b/support/texlab/src/protocol/capabilities.rs
new file mode 100644
index 0000000000..c83b205aa8
--- /dev/null
+++ b/support/texlab/src/protocol/capabilities.rs
@@ -0,0 +1,145 @@
+use lsp_types::{ClientCapabilities, MarkupKind};
+
+pub trait ClientCapabilitiesExt {
+ fn has_definition_link_support(&self) -> bool;
+
+ fn has_hierarchical_document_symbol_support(&self) -> bool;
+
+ fn has_work_done_progress_support(&self) -> bool;
+
+ fn has_hover_markdown_support(&self) -> bool;
+
+ fn has_pull_configuration_support(&self) -> bool;
+
+ fn has_push_configuration_support(&self) -> bool;
+}
+
+impl ClientCapabilitiesExt for ClientCapabilities {
+ fn has_definition_link_support(&self) -> bool {
+ self.text_document
+ .as_ref()
+ .and_then(|cap| cap.definition.as_ref())
+ .and_then(|cap| cap.link_support)
+ == Some(true)
+ }
+
+ fn has_hierarchical_document_symbol_support(&self) -> bool {
+ self.text_document
+ .as_ref()
+ .and_then(|cap| cap.document_symbol.as_ref())
+ .and_then(|cap| cap.hierarchical_document_symbol_support)
+ == Some(true)
+ }
+
+ fn has_work_done_progress_support(&self) -> bool {
+ self.window.as_ref().and_then(|cap| cap.work_done_progress) == Some(true)
+ }
+
+ fn has_hover_markdown_support(&self) -> bool {
+ self.text_document
+ .as_ref()
+ .and_then(|cap| cap.hover.as_ref())
+ .and_then(|cap| cap.content_format.as_ref())
+ .filter(|formats| formats.contains(&MarkupKind::Markdown))
+ .is_some()
+ }
+
+ fn has_pull_configuration_support(&self) -> bool {
+ self.workspace.as_ref().and_then(|cap| cap.configuration) == Some(true)
+ }
+
+ fn has_push_configuration_support(&self) -> bool {
+ self.workspace
+ .as_ref()
+ .and_then(|cap| cap.did_change_configuration)
+ .and_then(|cap| cap.dynamic_registration)
+ == Some(true)
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use lsp_types::*;
+
+ #[test]
+ fn has_definition_link_support_true() {
+ let capabilities = ClientCapabilities {
+ text_document: Some(TextDocumentClientCapabilities {
+ definition: Some(GotoCapability {
+ link_support: Some(true),
+ ..GotoCapability::default()
+ }),
+ ..TextDocumentClientCapabilities::default()
+ }),
+ ..ClientCapabilities::default()
+ };
+ assert!(capabilities.has_definition_link_support());
+ }
+
+ #[test]
+ fn has_definition_link_support_false() {
+ let capabilities = ClientCapabilities::default();
+ assert!(!capabilities.has_definition_link_support());
+ }
+
+ #[test]
+ fn has_hierarchical_document_symbol_support_true() {
+ let capabilities = ClientCapabilities {
+ text_document: Some(TextDocumentClientCapabilities {
+ document_symbol: Some(DocumentSymbolCapability {
+ hierarchical_document_symbol_support: Some(true),
+ ..DocumentSymbolCapability::default()
+ }),
+ ..TextDocumentClientCapabilities::default()
+ }),
+ ..ClientCapabilities::default()
+ };
+ assert!(capabilities.has_hierarchical_document_symbol_support());
+ }
+
+ #[test]
+ fn has_hierarchical_document_symbol_support_false() {
+ let capabilities = ClientCapabilities::default();
+ assert!(!capabilities.has_hierarchical_document_symbol_support());
+ }
+
+ #[test]
+ fn has_work_done_progress_support_true() {
+ let capabilities = ClientCapabilities {
+ window: Some(WindowClientCapabilities {
+ work_done_progress: Some(true),
+ ..WindowClientCapabilities::default()
+ }),
+ ..ClientCapabilities::default()
+ };
+ assert!(capabilities.has_work_done_progress_support());
+ }
+
+ #[test]
+ fn has_work_done_progress_support_false() {
+ let capabilities = ClientCapabilities::default();
+ assert!(!capabilities.has_work_done_progress_support());
+ }
+
+ #[test]
+ fn has_hover_markdown_support_true() {
+ let capabilities = ClientCapabilities {
+ text_document: Some(TextDocumentClientCapabilities {
+ hover: Some(HoverCapability {
+ content_format: Some(vec![MarkupKind::PlainText, MarkupKind::Markdown]),
+ ..HoverCapability::default()
+ }),
+ ..TextDocumentClientCapabilities::default()
+ }),
+ ..ClientCapabilities::default()
+ };
+ assert!(capabilities.has_hover_markdown_support());
+ }
+
+ #[test]
+ fn has_hover_markdown_support_false() {
+ let capabilities = ClientCapabilities::default();
+ assert!(!capabilities.has_hover_markdown_support());
+ }
+}