diff options
author | Norbert Preining <norbert@preining.info> | 2021-05-23 03:00:39 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-05-23 03:00:39 +0000 |
commit | f1261b349e875b842745b63258c3e338cb1fe3bf (patch) | |
tree | b5d402b3e80818cde2c079a42249f3dcb9732247 /support/texlab/src/capabilities.rs | |
parent | 58aa1ac09b1d9e4769d0a0661cf12e2b2db41b14 (diff) |
CTAN sync 202105230300
Diffstat (limited to 'support/texlab/src/capabilities.rs')
-rw-r--r-- | support/texlab/src/capabilities.rs | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/support/texlab/src/capabilities.rs b/support/texlab/src/capabilities.rs new file mode 100644 index 0000000000..e20a66b1ba --- /dev/null +++ b/support/texlab/src/capabilities.rs @@ -0,0 +1,148 @@ +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::{ + DocumentSymbolClientCapabilities, GotoCapability, HoverClientCapabilities, + TextDocumentClientCapabilities, WindowClientCapabilities, + }; + + #[test] + fn test_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 test_has_definition_link_support_false() { + let capabilities = ClientCapabilities::default(); + assert!(!capabilities.has_definition_link_support()); + } + + #[test] + fn test_has_hierarchical_document_symbol_support_true() { + let capabilities = ClientCapabilities { + text_document: Some(TextDocumentClientCapabilities { + document_symbol: Some(DocumentSymbolClientCapabilities { + hierarchical_document_symbol_support: Some(true), + ..DocumentSymbolClientCapabilities::default() + }), + ..TextDocumentClientCapabilities::default() + }), + ..ClientCapabilities::default() + }; + assert!(capabilities.has_hierarchical_document_symbol_support()); + } + + #[test] + fn test_has_hierarchical_document_symbol_support_false() { + let capabilities = ClientCapabilities::default(); + assert!(!capabilities.has_hierarchical_document_symbol_support()); + } + + #[test] + fn test_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 test_has_work_done_progress_support_false() { + let capabilities = ClientCapabilities::default(); + assert!(!capabilities.has_work_done_progress_support()); + } + + #[test] + fn test_has_hover_markdown_support_true() { + let capabilities = ClientCapabilities { + text_document: Some(TextDocumentClientCapabilities { + hover: Some(HoverClientCapabilities { + content_format: Some(vec![MarkupKind::PlainText, MarkupKind::Markdown]), + ..HoverClientCapabilities::default() + }), + ..TextDocumentClientCapabilities::default() + }), + ..ClientCapabilities::default() + }; + assert!(capabilities.has_hover_markdown_support()); + } + + #[test] + fn test_has_hover_markdown_support_false() { + let capabilities = ClientCapabilities::default(); + assert!(!capabilities.has_hover_markdown_support()); + } +} |