1use serde_json::Value;
4
5use crate::jsonrpc::{Error, Result};
6use crate::LanguageServer;
7use lsp_types_max::request::*;
8use lsp_types_max::*;
9
10use super::server::ComposedServer;
11
12#[async_trait::async_trait]
13impl LanguageServer for ComposedServer {
14 async fn initialize(&self, params: InitializeParams) -> Result<InitializeResult> {
15 self.route_request("initialize", params)
16 .await?
17 .ok_or_else(Error::internal_error)
18 }
19
20 async fn initialized(&self, params: InitializedParams) {
21 tracing::trace!("--- ComposedServer::initialized start");
22 self.route_notification("initialized", params).await;
23 tracing::trace!("--- ComposedServer::initialized end");
24 }
25
26 async fn shutdown(&self) -> Result<()> {
27 self.route_request::<_, ()>("shutdown", ())
28 .await?
29 .ok_or_else(Error::internal_error)
30 }
31
32 async fn did_open(&self, params: DidOpenTextDocumentParams) {
33 self.route_notification("textDocument/didOpen", params)
34 .await;
35 }
36
37 async fn did_change(&self, params: DidChangeTextDocumentParams) {
38 self.route_notification("textDocument/didChange", params)
39 .await;
40 }
41
42 async fn will_save(&self, params: WillSaveTextDocumentParams) {
43 self.route_notification("textDocument/willSave", params)
44 .await;
45 }
46
47 async fn will_save_wait_until(
48 &self,
49 params: WillSaveTextDocumentParams,
50 ) -> Result<Option<Vec<TextEdit>>> {
51 self.route_request("textDocument/willSaveWaitUntil", params)
52 .await
53 .map(|o| o.flatten())
54 }
55
56 async fn did_save(&self, params: DidSaveTextDocumentParams) {
57 self.route_notification("textDocument/didSave", params)
58 .await;
59 }
60
61 async fn did_close(&self, params: DidCloseTextDocumentParams) {
62 self.route_notification("textDocument/didClose", params)
63 .await;
64 }
65
66 async fn goto_declaration(
67 &self,
68 params: GotoDeclarationParams,
69 ) -> Result<Option<GotoDeclarationResponse>> {
70 self.route_request("textDocument/declaration", params)
71 .await
72 .map(|o| o.flatten())
73 }
74
75 async fn goto_definition(
76 &self,
77 params: GotoDefinitionParams,
78 ) -> Result<Option<GotoDefinitionResponse>> {
79 self.route_request("textDocument/definition", params)
80 .await
81 .map(|o| o.flatten())
82 }
83
84 async fn goto_type_definition(
85 &self,
86 params: GotoTypeDefinitionParams,
87 ) -> Result<Option<GotoTypeDefinitionResponse>> {
88 self.route_request("textDocument/typeDefinition", params)
89 .await
90 .map(|o| o.flatten())
91 }
92
93 async fn goto_implementation(
94 &self,
95 params: GotoImplementationParams,
96 ) -> Result<Option<GotoImplementationResponse>> {
97 self.route_request("textDocument/implementation", params)
98 .await
99 .map(|o| o.flatten())
100 }
101
102 async fn references(&self, params: ReferenceParams) -> Result<Option<Vec<Location>>> {
103 self.route_request("textDocument/references", params)
104 .await
105 .map(|o| o.flatten())
106 }
107
108 async fn prepare_call_hierarchy(
109 &self,
110 params: CallHierarchyPrepareParams,
111 ) -> Result<Option<Vec<CallHierarchyItem>>> {
112 self.route_request("textDocument/prepareCallHierarchy", params)
113 .await
114 .map(|o| o.flatten())
115 }
116
117 async fn incoming_calls(
118 &self,
119 params: CallHierarchyIncomingCallsParams,
120 ) -> Result<Option<Vec<CallHierarchyIncomingCall>>> {
121 self.route_request("callHierarchy/incomingCalls", params)
122 .await
123 .map(|o| o.flatten())
124 }
125
126 async fn outgoing_calls(
127 &self,
128 params: CallHierarchyOutgoingCallsParams,
129 ) -> Result<Option<Vec<CallHierarchyOutgoingCall>>> {
130 self.route_request("callHierarchy/outgoingCalls", params)
131 .await
132 .map(|o| o.flatten())
133 }
134
135 async fn prepare_type_hierarchy(
136 &self,
137 params: TypeHierarchyPrepareParams,
138 ) -> Result<Option<Vec<TypeHierarchyItem>>> {
139 self.route_request("textDocument/prepareTypeHierarchy", params)
140 .await
141 .map(|o| o.flatten())
142 }
143
144 async fn supertypes(
145 &self,
146 params: TypeHierarchySupertypesParams,
147 ) -> Result<Option<Vec<TypeHierarchyItem>>> {
148 self.route_request("typeHierarchy/supertypes", params)
149 .await
150 .map(|o| o.flatten())
151 }
152
153 async fn subtypes(
154 &self,
155 params: TypeHierarchySubtypesParams,
156 ) -> Result<Option<Vec<TypeHierarchyItem>>> {
157 self.route_request("typeHierarchy/subtypes", params)
158 .await
159 .map(|o| o.flatten())
160 }
161
162 async fn document_highlight(
163 &self,
164 params: DocumentHighlightParams,
165 ) -> Result<Option<Vec<DocumentHighlight>>> {
166 self.route_request("textDocument/documentHighlight", params)
167 .await
168 .map(|o| o.flatten())
169 }
170
171 async fn document_link(&self, params: DocumentLinkParams) -> Result<Option<Vec<DocumentLink>>> {
172 self.route_request("textDocument/documentLink", params)
173 .await
174 .map(|o| o.flatten())
175 }
176
177 async fn document_link_resolve(&self, params: DocumentLink) -> Result<DocumentLink> {
178 self.route_request("documentLink/resolve", params)
179 .await?
180 .ok_or_else(Error::internal_error)
181 }
182
183 async fn hover(&self, params: HoverParams) -> Result<Option<Hover>> {
184 self.route_request("textDocument/hover", params)
185 .await
186 .map(|o| o.flatten())
187 }
188
189 async fn completion(&self, params: CompletionParams) -> Result<Option<CompletionResponse>> {
190 self.route_request("textDocument/completion", params)
191 .await
192 .map(|o| o.flatten())
193 }
194
195 async fn completion_resolve(&self, params: CompletionItem) -> Result<CompletionItem> {
196 self.route_request("completionItem/resolve", params)
197 .await?
198 .ok_or_else(Error::internal_error)
199 }
200
201 async fn semantic_tokens_full(
202 &self,
203 params: SemanticTokensParams,
204 ) -> Result<Option<SemanticTokensResult>> {
205 self.route_request("textDocument/semanticTokens/full", params)
206 .await
207 .map(|o| o.flatten())
208 }
209
210 async fn semantic_tokens_full_delta(
211 &self,
212 params: SemanticTokensDeltaParams,
213 ) -> Result<Option<SemanticTokensFullDeltaResult>> {
214 self.route_request("textDocument/semanticTokens/full/delta", params)
215 .await
216 .map(|o| o.flatten())
217 }
218
219 async fn semantic_tokens_range(
220 &self,
221 params: SemanticTokensRangeParams,
222 ) -> Result<Option<SemanticTokensRangeResult>> {
223 self.route_request("textDocument/semanticTokens/range", params)
224 .await
225 .map(|o| o.flatten())
226 }
227
228 async fn code_lens(&self, params: CodeLensParams) -> Result<Option<Vec<CodeLens>>> {
229 self.route_request("textDocument/codeLens", params)
230 .await
231 .map(|o| o.flatten())
232 }
233
234 async fn code_lens_resolve(&self, params: CodeLens) -> Result<CodeLens> {
235 self.route_request("codeLens/resolve", params)
236 .await?
237 .ok_or_else(Error::internal_error)
238 }
239
240 async fn folding_range(&self, params: FoldingRangeParams) -> Result<Option<Vec<FoldingRange>>> {
241 self.route_request("textDocument/foldingRange", params)
242 .await
243 .map(|o| o.flatten())
244 }
245
246 async fn selection_range(
247 &self,
248 params: SelectionRangeParams,
249 ) -> Result<Option<Vec<SelectionRange>>> {
250 self.route_request("textDocument/selectionRange", params)
251 .await
252 .map(|o| o.flatten())
253 }
254
255 async fn document_symbol(
256 &self,
257 params: DocumentSymbolParams,
258 ) -> Result<Option<DocumentSymbolResponse>> {
259 self.route_request("textDocument/documentSymbol", params)
260 .await
261 .map(|o| o.flatten())
262 }
263
264 async fn symbol(
265 &self,
266 params: WorkspaceSymbolParams,
267 ) -> Result<Option<Vec<SymbolInformation>>> {
268 self.route_request("workspace/symbol", params)
269 .await
270 .map(|o| o.flatten())
271 }
272
273 async fn symbol_resolve(&self, params: WorkspaceSymbol) -> Result<WorkspaceSymbol> {
274 self.route_request("workspaceSymbol/resolve", params)
275 .await?
276 .ok_or_else(Error::internal_error)
277 }
278
279 async fn did_change_configuration(&self, params: DidChangeConfigurationParams) {
280 self.route_notification("workspace/didChangeConfiguration", params)
281 .await;
282 }
283
284 async fn did_change_workspace_folders(&self, params: DidChangeWorkspaceFoldersParams) {
285 self.route_notification("workspace/didChangeWorkspaceFolders", params)
286 .await;
287 }
288
289 async fn will_create_files(&self, params: CreateFilesParams) -> Result<Option<WorkspaceEdit>> {
290 self.route_request("workspace/willCreateFiles", params)
291 .await
292 .map(|o| o.flatten())
293 }
294
295 async fn did_create_files(&self, params: CreateFilesParams) {
296 self.route_notification("workspace/didCreateFiles", params)
297 .await;
298 }
299
300 async fn will_rename_files(&self, params: RenameFilesParams) -> Result<Option<WorkspaceEdit>> {
301 self.route_request("workspace/willRenameFiles", params)
302 .await
303 .map(|o| o.flatten())
304 }
305
306 async fn did_rename_files(&self, params: RenameFilesParams) {
307 self.route_notification("workspace/didRenameFiles", params)
308 .await;
309 }
310
311 async fn will_delete_files(&self, params: DeleteFilesParams) -> Result<Option<WorkspaceEdit>> {
312 self.route_request("workspace/willDeleteFiles", params)
313 .await
314 .map(|o| o.flatten())
315 }
316
317 async fn did_delete_files(&self, params: DeleteFilesParams) {
318 self.route_notification("workspace/didDeleteFiles", params)
319 .await;
320 }
321
322 async fn did_change_watched_files(&self, params: DidChangeWatchedFilesParams) {
323 self.route_notification("workspace/didChangeWatchedFiles", params)
324 .await;
325 }
326
327 async fn execute_command(&self, params: ExecuteCommandParams) -> Result<Option<Value>> {
328 self.route_request("workspace/executeCommand", params)
329 .await
330 .map(|o| o.flatten())
331 }
332
333 async fn signature_help(&self, params: SignatureHelpParams) -> Result<Option<SignatureHelp>> {
334 self.route_request("textDocument/signatureHelp", params)
335 .await
336 .map(|o| o.flatten())
337 }
338
339 async fn code_action(&self, params: CodeActionParams) -> Result<Option<CodeActionResponse>> {
340 self.route_request("textDocument/codeAction", params)
341 .await
342 .map(|o| o.flatten())
343 }
344
345 async fn code_action_resolve(&self, params: CodeAction) -> Result<CodeAction> {
346 self.route_request("codeAction/resolve", params)
347 .await?
348 .ok_or_else(Error::internal_error)
349 }
350
351 async fn document_color(&self, params: DocumentColorParams) -> Result<Vec<ColorInformation>> {
352 self.route_request("textDocument/documentColor", params)
353 .await
354 .map(|o| o.unwrap_or_default())
355 }
356
357 async fn color_presentation(
358 &self,
359 params: ColorPresentationParams,
360 ) -> Result<Vec<ColorPresentation>> {
361 self.route_request("textDocument/colorPresentation", params)
362 .await
363 .map(|o| o.unwrap_or_default())
364 }
365
366 async fn formatting(&self, params: DocumentFormattingParams) -> Result<Option<Vec<TextEdit>>> {
367 self.route_request("textDocument/formatting", params)
368 .await
369 .map(|o| o.flatten())
370 }
371
372 async fn range_formatting(
373 &self,
374 params: DocumentRangeFormattingParams,
375 ) -> Result<Option<Vec<TextEdit>>> {
376 self.route_request("textDocument/rangeFormatting", params)
377 .await
378 .map(|o| o.flatten())
379 }
380
381 async fn on_type_formatting(
382 &self,
383 params: DocumentOnTypeFormattingParams,
384 ) -> Result<Option<Vec<TextEdit>>> {
385 self.route_request("textDocument/onTypeFormatting", params)
386 .await
387 .map(|o| o.flatten())
388 }
389
390 async fn rename(&self, params: RenameParams) -> Result<Option<WorkspaceEdit>> {
391 self.route_request("textDocument/rename", params)
392 .await
393 .map(|o| o.flatten())
394 }
395
396 async fn prepare_rename(
397 &self,
398 params: TextDocumentPositionParams,
399 ) -> Result<Option<PrepareRenameResponse>> {
400 self.route_request("textDocument/prepareRename", params)
401 .await
402 .map(|o| o.flatten())
403 }
404
405 async fn linked_editing_range(
406 &self,
407 params: LinkedEditingRangeParams,
408 ) -> Result<Option<LinkedEditingRanges>> {
409 self.route_request("textDocument/linkedEditingRange", params)
410 .await
411 .map(|o| o.flatten())
412 }
413
414 async fn moniker(&self, params: MonikerParams) -> Result<Option<Vec<Moniker>>> {
415 self.route_request("textDocument/moniker", params)
416 .await
417 .map(|o| o.flatten())
418 }
419
420 async fn inlay_hint(&self, params: InlayHintParams) -> Result<Option<Vec<InlayHint>>> {
421 self.route_request("textDocument/inlayHint", params)
422 .await
423 .map(|o| o.flatten())
424 }
425
426 async fn inlay_hint_resolve(&self, params: InlayHint) -> Result<InlayHint> {
427 self.route_request("inlayHint/resolve", params)
428 .await?
429 .ok_or_else(Error::internal_error)
430 }
431
432 async fn inline_value(&self, params: InlineValueParams) -> Result<Option<Vec<InlineValue>>> {
433 self.route_request("textDocument/inlineValue", params)
434 .await
435 .map(|o| o.flatten())
436 }
437
438 async fn diagnostic(
439 &self,
440 params: DocumentDiagnosticParams,
441 ) -> Result<DocumentDiagnosticReportResult> {
442 self.route_request("textDocument/diagnostic", params)
443 .await?
444 .ok_or_else(Error::internal_error)
445 }
446
447 async fn workspace_diagnostic(
448 &self,
449 params: WorkspaceDiagnosticParams,
450 ) -> Result<WorkspaceDiagnosticReportResult> {
451 self.route_request("workspace/diagnostic", params)
452 .await?
453 .ok_or_else(Error::internal_error)
454 }
455
456 async fn inline_completion(
457 &self,
458 params: InlineCompletionParams,
459 ) -> Result<Option<InlineCompletionResponse>> {
460 self.route_request("textDocument/inlineCompletion", params)
461 .await
462 .map(|o| o.flatten())
463 }
464
465 async fn text_document_content(
466 &self,
467 params: max_protocol::lsp_3_18::TextDocumentContentParams,
468 ) -> Result<max_protocol::lsp_3_18::TextDocumentContentResult> {
469 self.route_request("workspace/textDocumentContent", params)
470 .await?
471 .ok_or_else(Error::internal_error)
472 }
473
474 async fn ranges_formatting(
475 &self,
476 params: max_protocol::lsp_3_18::DocumentRangesFormattingParams,
477 ) -> Result<Option<Vec<max_protocol::lsp_3_18::TextEdit>>> {
478 self.route_request("textDocument/rangesFormatting", params)
479 .await
480 .map(|o| o.flatten())
481 }
482
483 async fn did_open_notebook_document(&self, params: DidOpenNotebookDocumentParams) {
484 self.route_notification("notebookDocument/didOpen", params)
485 .await;
486 }
487
488 async fn did_change_notebook_document(&self, params: DidChangeNotebookDocumentParams) {
489 self.route_notification("notebookDocument/didChange", params)
490 .await;
491 }
492
493 async fn did_save_notebook_document(&self, params: DidSaveNotebookDocumentParams) {
494 self.route_notification("notebookDocument/didSave", params)
495 .await;
496 }
497
498 async fn did_close_notebook_document(&self, params: DidCloseNotebookDocumentParams) {
499 self.route_notification("notebookDocument/didClose", params)
500 .await;
501 }
502
503 async fn work_done_progress_cancel(&self, params: WorkDoneProgressCancelParams) {
504 self.route_notification("window/workDoneProgress/cancel", params)
505 .await;
506 }
507
508 async fn set_trace(&self, params: SetTraceParams) {
509 self.route_notification("$/setTrace", params).await;
510 }
511
512 async fn progress(&self, params: ProgressParams) {
513 self.route_notification("$/progress", params).await;
514 }
515}