mirror of
https://github.com/latex-lsp/texlab.git
synced 2025-12-23 09:19:21 +00:00
148 lines
4.9 KiB
Rust
148 lines
4.9 KiB
Rust
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());
|
|
}
|
|
}
|