Skip to main content

flams_lsp/
capabilities.rs

1use async_lsp::lsp_types::{self as lsp, CompletionOptions};
2
3pub struct STeXSemanticTokens;
4impl STeXSemanticTokens {
5    pub const NAME: u32 = 0; // dark blue          light blue  !
6    pub const KEYWORD: u32 = 1; // violet             pink        !
7    pub const SYMBOL: u32 = 2; // brown              red         !
8    pub const DECLARATION: u32 = 3; // Dark Purple        dark brown  !
9    pub const REF_MACRO: u32 = 4; // Lime               cyan        !
10    pub const VARIABLE: u32 = 5; // ?
11    pub const LOCAL: u32 = 6; // light blue         dark blue   !
12    // -------------------
13    pub const OPERATOR: u32 = 7; // white
14    pub const TYPE_PARAMETER: u32 = 8; // math green
15    pub const TYPE: u32 = 9; // same
16    pub const ENUM: u32 = 10; // same
17    pub const MODIFIER: u32 = 11; // yellow / nothing
18    pub const COMMENT: u32 = 12; // dark green
19    pub const DECORATOR: u32 = 13; // yellow / nothing
20}
21
22lazy_static::lazy_static! {
23  pub static ref SEMANTIC_TOKENS : lsp::SemanticTokensLegend = lsp::SemanticTokensLegend {
24    token_types: vec![
25      lsp::SemanticTokenType::ENUM_MEMBER,
26      lsp::SemanticTokenType::KEYWORD,
27      lsp::SemanticTokenType::STRING,
28      lsp::SemanticTokenType::REGEXP,
29      lsp::SemanticTokenType::NUMBER,
30      lsp::SemanticTokenType::VARIABLE,
31      lsp::SemanticTokenType::PROPERTY,
32      // ------------------------------
33      lsp::SemanticTokenType::OPERATOR,
34      lsp::SemanticTokenType::TYPE_PARAMETER,
35      lsp::SemanticTokenType::TYPE,
36      lsp::SemanticTokenType::ENUM,
37      lsp::SemanticTokenType::MODIFIER,
38      lsp::SemanticTokenType::COMMENT,
39      lsp::SemanticTokenType::DECORATOR,
40    ],
41    token_modifiers: vec![
42      //lsp::SemanticTokenModifier::DEPRECATED,
43    ]
44  };
45}
46
47#[must_use]
48#[allow(clippy::too_many_lines)]
49pub fn capabilities() -> lsp::ServerCapabilities {
50    lsp::ServerCapabilities {
51        position_encoding: Some(lsp::PositionEncodingKind::UTF16),
52        text_document_sync: Some(lsp::TextDocumentSyncCapability::Options(
53            lsp::TextDocumentSyncOptions {
54                open_close: Some(true),
55                change: Some(lsp::TextDocumentSyncKind::INCREMENTAL),
56                will_save: Some(false),
57                will_save_wait_until: Some(false),
58                save: Some(lsp::TextDocumentSyncSaveOptions::Supported(true)),
59            },
60        )),
61        semantic_tokens_provider: Some(
62            lsp::SemanticTokensServerCapabilities::SemanticTokensRegistrationOptions(
63                lsp::SemanticTokensRegistrationOptions {
64                    text_document_registration_options: tdro(),
65                    semantic_tokens_options: lsp::SemanticTokensOptions {
66                        work_done_progress_options: lsp::WorkDoneProgressOptions {
67                            work_done_progress: Some(true),
68                        },
69                        range: Some(true),
70                        full: Some(lsp::SemanticTokensFullOptions::Delta { delta: Some(true) }),
71                        legend: SEMANTIC_TOKENS.clone(),
72                    },
73                    static_registration_options: lsp::StaticRegistrationOptions {
74                        id: Some("stex-sem-tokens".to_string()),
75                    },
76                },
77            ),
78        ),
79        moniker_provider: Some(lsp::OneOf::Right(
80            lsp::MonikerServerCapabilities::RegistrationOptions(lsp::MonikerRegistrationOptions {
81                text_document_registration_options: tdro(),
82                moniker_options: lsp::MonikerOptions {
83                    work_done_progress_options: lsp::WorkDoneProgressOptions {
84                        work_done_progress: Some(true),
85                    },
86                },
87            }),
88        )),
89        document_symbol_provider: Some(lsp::OneOf::Right(lsp::DocumentSymbolOptions {
90            label: Some("FLAMS".to_string()),
91            work_done_progress_options: lsp::WorkDoneProgressOptions {
92                work_done_progress: Some(true),
93            },
94        })),
95        workspace_symbol_provider: Some(lsp::OneOf::Right(lsp::WorkspaceSymbolOptions {
96            work_done_progress_options: lsp::WorkDoneProgressOptions {
97                work_done_progress: Some(true),
98            },
99            resolve_provider: Some(true),
100        })),
101        workspace: Some(lsp::WorkspaceServerCapabilities {
102            workspace_folders: Some(lsp::WorkspaceFoldersServerCapabilities {
103                supported: Some(true),
104                change_notifications: Some(lsp::OneOf::Right("flams-change-listener".to_string())),
105            }),
106            file_operations: Some(lsp::WorkspaceFileOperationsServerCapabilities {
107                did_create: Some(lsp::FileOperationRegistrationOptions {
108                    filters: fo_filter(),
109                }),
110                did_rename: Some(lsp::FileOperationRegistrationOptions {
111                    filters: fo_filter(),
112                }),
113                did_delete: Some(lsp::FileOperationRegistrationOptions {
114                    filters: fo_filter(),
115                }),
116                will_create: None,
117                will_delete: None,
118                will_rename: None,
119            }),
120        }),
121        references_provider: Some(lsp::OneOf::Right(lsp::ReferencesOptions {
122            work_done_progress_options: lsp::WorkDoneProgressOptions {
123                work_done_progress: Some(true),
124            },
125        })),
126        selection_range_provider: Some(lsp::SelectionRangeProviderCapability::RegistrationOptions(
127            lsp::SelectionRangeRegistrationOptions {
128                selection_range_options: lsp::SelectionRangeOptions {
129                    work_done_progress_options: lsp::WorkDoneProgressOptions {
130                        work_done_progress: Some(true),
131                    },
132                },
133                registration_options: lsp::StaticTextDocumentRegistrationOptions {
134                    id: Some("stex-selec-range".to_string()),
135                    document_selector: Some(doc_filter()),
136                },
137            },
138        )),
139        hover_provider: Some(lsp::HoverProviderCapability::Options(lsp::HoverOptions {
140            work_done_progress_options: lsp::WorkDoneProgressOptions {
141                work_done_progress: Some(true),
142            },
143        })),
144        completion_provider: Some(CompletionOptions {
145            resolve_provider: Some(true),
146            trigger_characters: None,
147            all_commit_characters: None,
148            work_done_progress_options: lsp::WorkDoneProgressOptions {
149                work_done_progress: Some(true),
150            },
151            completion_item: Some(lsp::CompletionOptionsCompletionItem {
152                label_details_support: Some(true),
153            }),
154        }),
155        signature_help_provider: Some(lsp::SignatureHelpOptions {
156            trigger_characters: None,
157            retrigger_characters: None,
158            work_done_progress_options: lsp::WorkDoneProgressOptions {
159                work_done_progress: Some(true),
160            },
161        }),
162        definition_provider: Some(lsp::OneOf::Right(lsp::DefinitionOptions {
163            work_done_progress_options: lsp::WorkDoneProgressOptions {
164                work_done_progress: Some(true),
165            },
166        })),
167        type_definition_provider: Some(lsp::TypeDefinitionProviderCapability::Options(
168            lsp::StaticTextDocumentRegistrationOptions {
169                document_selector: Some(doc_filter()),
170                id: Some("stex-type-def".to_string()),
171            },
172        )),
173        implementation_provider: Some(lsp::ImplementationProviderCapability::Options(
174            lsp::StaticTextDocumentRegistrationOptions {
175                document_selector: Some(doc_filter()),
176                id: Some("stex-impl".to_string()),
177            },
178        )),
179        declaration_provider: Some(lsp::DeclarationCapability::RegistrationOptions(
180            lsp::DeclarationRegistrationOptions {
181                declaration_options: lsp::DeclarationOptions {
182                    work_done_progress_options: lsp::WorkDoneProgressOptions {
183                        work_done_progress: Some(true),
184                    },
185                },
186                text_document_registration_options: tdro(),
187                static_registration_options: lsp::StaticRegistrationOptions {
188                    id: Some("stex-decl".to_string()),
189                },
190            },
191        )),
192        document_highlight_provider: Some(lsp::OneOf::Right(lsp::DocumentHighlightOptions {
193            work_done_progress_options: lsp::WorkDoneProgressOptions {
194                work_done_progress: Some(true),
195            },
196        })),
197        code_action_provider: Some(lsp::CodeActionProviderCapability::Options(
198            lsp::CodeActionOptions {
199                code_action_kinds: Some(vec![
200                    lsp::CodeActionKind::QUICKFIX,
201                    lsp::CodeActionKind::new("snify/annotate"),
202                    lsp::CodeActionKind::REFACTOR,
203                    lsp::CodeActionKind::SOURCE,
204                    lsp::CodeActionKind::SOURCE_ORGANIZE_IMPORTS,
205                    lsp::CodeActionKind::SOURCE_FIX_ALL,
206                ]),
207                work_done_progress_options: lsp::WorkDoneProgressOptions {
208                    work_done_progress: Some(true),
209                },
210                resolve_provider: Some(true),
211            },
212        )),
213        code_lens_provider: Some(lsp::CodeLensOptions {
214            resolve_provider: Some(true),
215        }),
216        folding_range_provider: Some(lsp::FoldingRangeProviderCapability::Options(
217            lsp::StaticTextDocumentColorProviderOptions {
218                document_selector: Some(doc_filter()),
219                id: Some("stex-folding-range".to_string()),
220            },
221        )),
222        document_link_provider: Some(lsp::DocumentLinkOptions {
223            work_done_progress_options: lsp::WorkDoneProgressOptions {
224                work_done_progress: Some(true),
225            },
226            resolve_provider: Some(true),
227        }),
228        execute_command_provider: Some(lsp::ExecuteCommandOptions {
229            commands: vec![],
230            work_done_progress_options: lsp::WorkDoneProgressOptions {
231                work_done_progress: Some(true),
232            },
233        }),
234        inline_value_provider: Some(lsp::OneOf::Right(
235            lsp::InlineValueServerCapabilities::RegistrationOptions(
236                lsp::InlineValueRegistrationOptions {
237                    text_document_registration_options: tdro(),
238                    static_registration_options: lsp::StaticRegistrationOptions {
239                        id: Some("stex-inline-value".to_string()),
240                    },
241                    inline_value_options: lsp::InlineValueOptions {
242                        work_done_progress_options: lsp::WorkDoneProgressOptions {
243                            work_done_progress: Some(true),
244                        },
245                    },
246                },
247            ),
248        )),
249        inlay_hint_provider: Some(lsp::OneOf::Right(
250            lsp::InlayHintServerCapabilities::RegistrationOptions(
251                lsp::InlayHintRegistrationOptions {
252                    text_document_registration_options: tdro(),
253                    static_registration_options: lsp::StaticRegistrationOptions {
254                        id: Some("stex-inlay-hint".to_string()),
255                    },
256                    inlay_hint_options: lsp::InlayHintOptions {
257                        resolve_provider: Some(false),
258                        work_done_progress_options: lsp::WorkDoneProgressOptions {
259                            work_done_progress: Some(true),
260                        },
261                    },
262                },
263            ),
264        )),
265        diagnostic_provider: Some(lsp::DiagnosticServerCapabilities::RegistrationOptions(
266            lsp::DiagnosticRegistrationOptions {
267                text_document_registration_options: tdro(),
268                static_registration_options: lsp::StaticRegistrationOptions {
269                    id: Some("stex-diagnostic".to_string()),
270                },
271                diagnostic_options: lsp::DiagnosticOptions {
272                    work_done_progress_options: lsp::WorkDoneProgressOptions {
273                        work_done_progress: Some(true),
274                    },
275                    identifier: Some("stex-diagnostic".to_string()),
276                    inter_file_dependencies: true,
277                    workspace_diagnostics: false, // <- this does not seem to work
278                },
279            },
280        )),
281        linked_editing_range_provider: Some(
282            lsp::LinkedEditingRangeServerCapabilities::RegistrationOptions(
283                lsp::LinkedEditingRangeRegistrationOptions {
284                    text_document_registration_options: tdro(),
285                    static_registration_options: lsp::StaticRegistrationOptions {
286                        id: Some("stex-linked-editing-range".to_string()),
287                    },
288                    linked_editing_range_options: lsp::LinkedEditingRangeOptions {
289                        work_done_progress_options: lsp::WorkDoneProgressOptions {
290                            work_done_progress: Some(true),
291                        },
292                    },
293                },
294            ),
295        ),
296        rename_provider: Some(lsp::OneOf::Right(lsp::RenameOptions {
297            work_done_progress_options: lsp::WorkDoneProgressOptions {
298                work_done_progress: Some(true),
299            },
300            prepare_provider: Some(true),
301        })),
302        document_formatting_provider: None,
303        document_range_formatting_provider: None,
304        document_on_type_formatting_provider: None,
305        color_provider: None,
306        call_hierarchy_provider: Some(lsp::CallHierarchyServerCapability::Simple(true)),
307        //inline_completion_provider:None,
308        experimental: None,
309    }
310}
311
312fn tdro() -> lsp::TextDocumentRegistrationOptions {
313    lsp::TextDocumentRegistrationOptions {
314        document_selector: Some(doc_filter()),
315    }
316}
317
318fn fo_filter() -> Vec<lsp::FileOperationFilter> {
319    vec![lsp::FileOperationFilter {
320        scheme: Some("file".to_string()),
321        pattern: lsp::FileOperationPattern {
322            glob: "**/*.tex".to_string(),
323            matches: Some(lsp::FileOperationPatternKind::File),
324            options: None,
325        },
326    }]
327}
328
329fn doc_filter() -> Vec<lsp::DocumentFilter> {
330    vec![
331        lsp::DocumentFilter {
332            language: Some("tex".to_string()),
333            scheme: Some("file".to_string()),
334            pattern: Some("**/*.tex".to_string()),
335        },
336        lsp::DocumentFilter {
337            language: Some("latex".to_string()),
338            scheme: Some("file".to_string()),
339            pattern: Some("**/*.tex".to_string()),
340        },
341    ]
342}