1use async_lsp::lsp_types::{self as lsp, CompletionOptions};
2
3pub struct STeXSemanticTokens;
4impl STeXSemanticTokens {
5 pub const NAME: u32 = 0; pub const KEYWORD: u32 = 1; pub const SYMBOL: u32 = 2; pub const DECLARATION: u32 = 3; pub const REF_MACRO: u32 = 4; pub const VARIABLE: u32 = 5; pub const LOCAL: u32 = 6; pub const OPERATOR: u32 = 7; pub const TYPE_PARAMETER: u32 = 8; pub const TYPE: u32 = 9; pub const ENUM: u32 = 10; pub const MODIFIER: u32 = 11; pub const COMMENT: u32 = 12; pub const DECORATOR: u32 = 13; }
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 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 ]
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, },
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 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}