lmntal-language-server 0.2.0

A language server for LMNtal.
Documentation
use tower_lsp_server::ls_types::{
    DocumentFilter, InitializeResult, OneOf, SemanticTokensFullOptions, SemanticTokensLegend,
    SemanticTokensOptions, SemanticTokensRegistrationOptions, SemanticTokensServerCapabilities,
    ServerCapabilities, ServerInfo, StaticRegistrationOptions, TextDocumentRegistrationOptions,
    TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions,
    WorkDoneProgressOptions,
};

use super::semantic_tokens::LEGEND_TYPE;

pub fn capabilities() -> InitializeResult {
    let semantic_tokens_registration_options = SemanticTokensRegistrationOptions {
        text_document_registration_options: TextDocumentRegistrationOptions {
            document_selector: Some(vec![DocumentFilter {
                language: Some("lmntal".to_string()),
                scheme: None,
                pattern: None,
            }]),
        },
        semantic_tokens_options: SemanticTokensOptions {
            work_done_progress_options: WorkDoneProgressOptions::default(),
            legend: SemanticTokensLegend {
                token_types: LEGEND_TYPE.into(),
                token_modifiers: vec![],
            },
            range: Some(false),
            full: Some(SemanticTokensFullOptions::Bool(true)),
        },
        static_registration_options: StaticRegistrationOptions::default(),
    };

    InitializeResult {
        capabilities: ServerCapabilities {
            text_document_sync: Some(TextDocumentSyncCapability::Options(
                TextDocumentSyncOptions {
                    open_close: Some(true),
                    change: Some(TextDocumentSyncKind::FULL),
                    ..Default::default()
                },
            )),
            semantic_tokens_provider: Some(
                SemanticTokensServerCapabilities::SemanticTokensRegistrationOptions(
                    semantic_tokens_registration_options,
                ),
            ),
            references_provider: Some(OneOf::Left(true)),
            document_symbol_provider: Some(OneOf::Left(true)),
            document_highlight_provider: Some(OneOf::Left(true)),
            ..ServerCapabilities::default()
        },
        server_info: Some(ServerInfo {
            name: "LMNtal Language Server".to_string(),
            version: Some(env!("CARGO_PKG_VERSION").to_string()),
        }),
        offset_encoding: None,
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn only_advertises_implemented_capabilities() {
        let capabilities = capabilities().capabilities;
        assert!(capabilities.semantic_tokens_provider.is_some());
        assert!(capabilities.references_provider.is_some());
        assert!(capabilities.document_symbol_provider.is_some());
        assert!(capabilities.document_highlight_provider.is_some());
        assert!(capabilities.code_action_provider.is_none());
        assert!(capabilities.definition_provider.is_none());
        assert!(capabilities.rename_provider.is_none());
        assert!(capabilities.document_formatting_provider.is_none());
        assert!(capabilities.hover_provider.is_none());
    }
}