From 745892fbddea56040139108277e728b53fd8fc11 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 28 May 2020 03:03:21 +0000 Subject: CTAN sync 202005280303 --- support/texlab/src/protocol/capabilities.rs | 145 ++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 support/texlab/src/protocol/capabilities.rs (limited to 'support/texlab/src/protocol/capabilities.rs') 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()); + } +} -- cgit v1.2.3