1use lsp_types::{
4 CompletionOptions, HoverProviderCapability, SemanticTokenModifier as LspModifier,
5 SemanticTokenType as LspTokenType, SemanticTokensFullOptions, SemanticTokensLegend,
6 SemanticTokensOptions, SemanticTokensServerCapabilities, ServerCapabilities,
7 TextDocumentSyncCapability, TextDocumentSyncKind,
8};
9
10const COMPLETION_TRIGGER_CHARACTERS: [&str; 5] = ["@", ".", "$", "=", ":"];
14
15pub fn server_capabilities() -> ServerCapabilities {
17 ServerCapabilities {
18 text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
19 completion_provider: Some(CompletionOptions {
20 trigger_characters: Some(
21 COMPLETION_TRIGGER_CHARACTERS
22 .iter()
23 .map(|c| c.to_string())
24 .collect(),
25 ),
26 ..Default::default()
27 }),
28 definition_provider: Some(lsp_types::OneOf::Left(true)),
29 hover_provider: Some(HoverProviderCapability::Simple(true)),
30 semantic_tokens_provider: Some(SemanticTokensServerCapabilities::SemanticTokensOptions(
31 SemanticTokensOptions {
32 work_done_progress_options: Default::default(),
33 legend: semantic_token_legend(),
34 range: Some(false),
35 full: Some(SemanticTokensFullOptions::Bool(true)),
36 },
37 )),
38 ..Default::default()
39 }
40}
41
42fn semantic_token_legend() -> SemanticTokensLegend {
47 SemanticTokensLegend {
48 token_types: vec![
49 LspTokenType::KEYWORD, LspTokenType::NUMBER, LspTokenType::STRING, LspTokenType::COMMENT, LspTokenType::OPERATOR, LspTokenType::PROPERTY, LspTokenType::new("punctuation"), LspTokenType::MACRO, LspTokenType::DECORATOR, LspTokenType::new("sectionMarker"), LspTokenType::new("extensionMarker"), LspTokenType::new("extensionIdent"), ],
62 token_modifiers: vec![
63 LspModifier::DECLARATION, LspModifier::DEFINITION, LspModifier::new("sectionHeader"), ],
67 }
68}