Skip to main content

lsp_max/composition/
language_server_impl.rs

1//! `impl LanguageServer for ComposedServer` — delegates to route_request/route_notification.
2
3use 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}