Skip to main content

lsp_service/server/
handler.rs

1use crate::jsonrpc::{ErrorCode, Id, Message, Notification, Request, ResponseError};
2use lsp_types::{
3	notification::{Notification as _, *},
4	request::{Request as _, *},
5};
6use serde_json::{Value, from_value};
7use tracing::{debug, trace_span, warn};
8
9/// Answers `id` with what `answer` makes of `params` read as the parameters of `R`. Typing `answer` by `R` holds each
10/// [`Handler`] method to the parameters and result lsp-types gives its request.
11fn respond<R: lsp_types::request::Request>(
12	id: Id,
13	params: Value,
14	answer: impl FnOnce(R::Params) -> Result<R::Result, ResponseError>,
15) -> Message {
16	match from_value(params) {
17		Ok(params) => Message::from_result(id, answer(params)),
18		Err(error) => {
19			Message::from_result(id, Err::<(), _>(ResponseError::new(ErrorCode::InvalidParams, error.to_string())))
20		}
21	}
22}
23
24/// Hands `params`, read as the parameters of `N`, to `receive`.
25fn notified<N: lsp_types::notification::Notification>(params: Value, receive: impl FnOnce(N::Params)) {
26	match from_value(params) {
27		Ok(params) => receive(params),
28		Err(error) => warn!("Ignoring {} with invalid params: {error}", N::METHOD),
29	}
30}
31
32fn answer<H: Handler>(handler: &H, id: Id, method: &str, params: Value) -> Message {
33	match method {
34		ApplyWorkspaceEdit::METHOD => respond::<ApplyWorkspaceEdit>(id, params, |p| handler.apply_workspace_edit(p)),
35		CallHierarchyIncomingCalls::METHOD => {
36			respond::<CallHierarchyIncomingCalls>(id, params, |p| handler.call_hierarchy_incoming_calls(p))
37		}
38		CallHierarchyOutgoingCalls::METHOD => {
39			respond::<CallHierarchyOutgoingCalls>(id, params, |p| handler.call_hierarchy_outgoing_calls(p))
40		}
41		CallHierarchyPrepare::METHOD => {
42			respond::<CallHierarchyPrepare>(id, params, |p| handler.call_hierarchy_prepare(p))
43		}
44		CodeActionRequest::METHOD => respond::<CodeActionRequest>(id, params, |p| handler.code_action_request(p)),
45		CodeActionResolveRequest::METHOD => {
46			respond::<CodeActionResolveRequest>(id, params, |p| handler.code_action_resolve_request(p))
47		}
48		CodeLensRefresh::METHOD => respond::<CodeLensRefresh>(id, Value::Null, |()| handler.code_lens_refresh()),
49		CodeLensRequest::METHOD => respond::<CodeLensRequest>(id, params, |p| handler.code_lens_request(p)),
50		CodeLensResolve::METHOD => respond::<CodeLensResolve>(id, params, |p| handler.code_lens_resolve(p)),
51		ColorPresentationRequest::METHOD => {
52			respond::<ColorPresentationRequest>(id, params, |p| handler.color_presentation_request(p))
53		}
54		Completion::METHOD => respond::<Completion>(id, params, |p| handler.completion(p)),
55		DocumentColor::METHOD => respond::<DocumentColor>(id, params, |p| handler.document_color(p)),
56		DocumentDiagnosticRequest::METHOD => {
57			respond::<DocumentDiagnosticRequest>(id, params, |p| handler.document_diagnostic_request(p))
58		}
59		DocumentHighlightRequest::METHOD => {
60			respond::<DocumentHighlightRequest>(id, params, |p| handler.document_highlight_request(p))
61		}
62		DocumentLinkRequest::METHOD => respond::<DocumentLinkRequest>(id, params, |p| handler.document_link_request(p)),
63		DocumentLinkResolve::METHOD => respond::<DocumentLinkResolve>(id, params, |p| handler.document_link_resolve(p)),
64		DocumentSymbolRequest::METHOD => {
65			respond::<DocumentSymbolRequest>(id, params, |p| handler.document_symbol_request(p))
66		}
67		ExecuteCommand::METHOD => respond::<ExecuteCommand>(id, params, |p| handler.execute_command(p)),
68		FoldingRangeRequest::METHOD => respond::<FoldingRangeRequest>(id, params, |p| handler.folding_range_request(p)),
69		Formatting::METHOD => respond::<Formatting>(id, params, |p| handler.formatting(p)),
70		GotoDeclaration::METHOD => respond::<GotoDeclaration>(id, params, |p| handler.goto_declaration(p)),
71		GotoDefinition::METHOD => respond::<GotoDefinition>(id, params, |p| handler.goto_definition(p)),
72		GotoImplementation::METHOD => respond::<GotoImplementation>(id, params, |p| handler.goto_implementation(p)),
73		GotoTypeDefinition::METHOD => respond::<GotoTypeDefinition>(id, params, |p| handler.goto_type_definition(p)),
74		HoverRequest::METHOD => respond::<HoverRequest>(id, params, |p| handler.hover_request(p)),
75		Initialize::METHOD => respond::<Initialize>(id, params, |p| handler.initialize(p)),
76		InlayHintRefreshRequest::METHOD => {
77			respond::<InlayHintRefreshRequest>(id, Value::Null, |()| handler.inlay_hint_refresh_request())
78		}
79		InlayHintRequest::METHOD => respond::<InlayHintRequest>(id, params, |p| handler.inlay_hint_request(p)),
80		InlayHintResolveRequest::METHOD => {
81			respond::<InlayHintResolveRequest>(id, params, |p| handler.inlay_hint_resolve_request(p))
82		}
83		InlineValueRefreshRequest::METHOD => {
84			respond::<InlineValueRefreshRequest>(id, Value::Null, |()| handler.inline_value_refresh_request())
85		}
86		InlineValueRequest::METHOD => respond::<InlineValueRequest>(id, params, |p| handler.inline_value_request(p)),
87		LinkedEditingRange::METHOD => respond::<LinkedEditingRange>(id, params, |p| handler.linked_editing_range(p)),
88		MonikerRequest::METHOD => respond::<MonikerRequest>(id, params, |p| handler.moniker_request(p)),
89		OnTypeFormatting::METHOD => respond::<OnTypeFormatting>(id, params, |p| handler.on_type_formatting(p)),
90		PrepareRenameRequest::METHOD => {
91			respond::<PrepareRenameRequest>(id, params, |p| handler.prepare_rename_request(p))
92		}
93		RangeFormatting::METHOD => respond::<RangeFormatting>(id, params, |p| handler.range_formatting(p)),
94		References::METHOD => respond::<References>(id, params, |p| handler.references(p)),
95		RegisterCapability::METHOD => respond::<RegisterCapability>(id, params, |p| handler.register_capability(p)),
96		Rename::METHOD => respond::<Rename>(id, params, |p| handler.rename(p)),
97		ResolveCompletionItem::METHOD => {
98			respond::<ResolveCompletionItem>(id, params, |p| handler.resolve_completion_item(p))
99		}
100		SelectionRangeRequest::METHOD => {
101			respond::<SelectionRangeRequest>(id, params, |p| handler.selection_range_request(p))
102		}
103		SemanticTokensFullDeltaRequest::METHOD => {
104			respond::<SemanticTokensFullDeltaRequest>(id, params, |p| handler.semantic_tokens_full_delta_request(p))
105		}
106		SemanticTokensFullRequest::METHOD => {
107			respond::<SemanticTokensFullRequest>(id, params, |p| handler.semantic_tokens_full_request(p))
108		}
109		SemanticTokensRangeRequest::METHOD => {
110			respond::<SemanticTokensRangeRequest>(id, params, |p| handler.semantic_tokens_range_request(p))
111		}
112		SemanticTokensRefresh::METHOD => {
113			respond::<SemanticTokensRefresh>(id, Value::Null, |()| handler.semantic_tokens_refresh())
114		}
115		ShowDocument::METHOD => respond::<ShowDocument>(id, params, |p| handler.show_document(p)),
116		ShowMessageRequest::METHOD => respond::<ShowMessageRequest>(id, params, |p| handler.show_message_request(p)),
117		Shutdown::METHOD => respond::<Shutdown>(id, Value::Null, |()| handler.shutdown()),
118		SignatureHelpRequest::METHOD => {
119			respond::<SignatureHelpRequest>(id, params, |p| handler.signature_help_request(p))
120		}
121		TypeHierarchyPrepare::METHOD => {
122			respond::<TypeHierarchyPrepare>(id, params, |p| handler.type_hierarchy_prepare(p))
123		}
124		TypeHierarchySubtypes::METHOD => {
125			respond::<TypeHierarchySubtypes>(id, params, |p| handler.type_hierarchy_subtypes(p))
126		}
127		TypeHierarchySupertypes::METHOD => {
128			respond::<TypeHierarchySupertypes>(id, params, |p| handler.type_hierarchy_supertypes(p))
129		}
130		UnregisterCapability::METHOD => {
131			respond::<UnregisterCapability>(id, params, |p| handler.unregister_capability(p))
132		}
133		WillCreateFiles::METHOD => respond::<WillCreateFiles>(id, params, |p| handler.will_create_files(p)),
134		WillDeleteFiles::METHOD => respond::<WillDeleteFiles>(id, params, |p| handler.will_delete_files(p)),
135		WillRenameFiles::METHOD => respond::<WillRenameFiles>(id, params, |p| handler.will_rename_files(p)),
136		WillSaveWaitUntil::METHOD => respond::<WillSaveWaitUntil>(id, params, |p| handler.will_save_wait_until(p)),
137		WorkDoneProgressCreate::METHOD => {
138			respond::<WorkDoneProgressCreate>(id, params, |p| handler.work_done_progress_create(p))
139		}
140		WorkspaceConfiguration::METHOD => {
141			respond::<WorkspaceConfiguration>(id, params, |p| handler.workspace_configuration(p))
142		}
143		WorkspaceDiagnosticRefresh::METHOD => {
144			respond::<WorkspaceDiagnosticRefresh>(id, Value::Null, |()| handler.workspace_diagnostic_refresh())
145		}
146		WorkspaceDiagnosticRequest::METHOD => {
147			respond::<WorkspaceDiagnosticRequest>(id, params, |p| handler.workspace_diagnostic_request(p))
148		}
149		WorkspaceFoldersRequest::METHOD => {
150			respond::<WorkspaceFoldersRequest>(id, Value::Null, |()| handler.workspace_folders_request())
151		}
152		WorkspaceSymbolRequest::METHOD => {
153			respond::<WorkspaceSymbolRequest>(id, params, |p| handler.workspace_symbol_request(p))
154		}
155		WorkspaceSymbolResolve::METHOD => {
156			respond::<WorkspaceSymbolResolve>(id, params, |p| handler.workspace_symbol_resolve(p))
157		}
158		_ => Message::from_result(id, Err::<(), _>(ErrorCode::MethodNotFound.into())),
159	}
160}
161
162fn receive<H: Handler>(handler: &H, method: &str, params: Value) {
163	match method {
164		Cancel::METHOD => notified::<Cancel>(params, |p| handler.on_cancel(p)),
165		DidChangeConfiguration::METHOD => {
166			notified::<DidChangeConfiguration>(params, |p| handler.on_did_change_configuration(p))
167		}
168		DidChangeNotebookDocument::METHOD => {
169			notified::<DidChangeNotebookDocument>(params, |p| handler.on_did_change_notebook_document(p))
170		}
171		DidChangeTextDocument::METHOD => {
172			notified::<DidChangeTextDocument>(params, |p| handler.on_did_change_text_document(p))
173		}
174		DidChangeWatchedFiles::METHOD => {
175			notified::<DidChangeWatchedFiles>(params, |p| handler.on_did_change_watched_files(p))
176		}
177		DidChangeWorkspaceFolders::METHOD => {
178			notified::<DidChangeWorkspaceFolders>(params, |p| handler.on_did_change_workspace_folders(p))
179		}
180		DidCloseNotebookDocument::METHOD => {
181			notified::<DidCloseNotebookDocument>(params, |p| handler.on_did_close_notebook_document(p))
182		}
183		DidCloseTextDocument::METHOD => {
184			notified::<DidCloseTextDocument>(params, |p| handler.on_did_close_text_document(p))
185		}
186		DidCreateFiles::METHOD => notified::<DidCreateFiles>(params, |p| handler.on_did_create_files(p)),
187		DidDeleteFiles::METHOD => notified::<DidDeleteFiles>(params, |p| handler.on_did_delete_files(p)),
188		DidOpenNotebookDocument::METHOD => {
189			notified::<DidOpenNotebookDocument>(params, |p| handler.on_did_open_notebook_document(p))
190		}
191		DidOpenTextDocument::METHOD => {
192			notified::<DidOpenTextDocument>(params, |p| handler.on_did_open_text_document(p))
193		}
194		DidRenameFiles::METHOD => notified::<DidRenameFiles>(params, |p| handler.on_did_rename_files(p)),
195		DidSaveNotebookDocument::METHOD => {
196			notified::<DidSaveNotebookDocument>(params, |p| handler.on_did_save_notebook_document(p))
197		}
198		DidSaveTextDocument::METHOD => {
199			notified::<DidSaveTextDocument>(params, |p| handler.on_did_save_text_document(p))
200		}
201		Initialized::METHOD => notified::<Initialized>(params, |p| handler.on_initialized(p)),
202		LogMessage::METHOD => notified::<LogMessage>(params, |p| handler.on_log_message(p)),
203		LogTrace::METHOD => notified::<LogTrace>(params, |p| handler.on_log_trace(p)),
204		Progress::METHOD => notified::<Progress>(params, |p| handler.on_progress(p)),
205		PublishDiagnostics::METHOD => notified::<PublishDiagnostics>(params, |p| handler.on_publish_diagnostics(p)),
206		SetTrace::METHOD => notified::<SetTrace>(params, |p| handler.on_set_trace(p)),
207		ShowMessage::METHOD => notified::<ShowMessage>(params, |p| handler.on_show_message(p)),
208		TelemetryEvent::METHOD => notified::<TelemetryEvent>(params, |p| handler.on_telemetry_event(p)),
209		WillSaveTextDocument::METHOD => {
210			notified::<WillSaveTextDocument>(params, |p| handler.on_will_save_text_document(p))
211		}
212		WorkDoneProgressCancel::METHOD => {
213			notified::<WorkDoneProgressCancel>(params, |p| handler.on_work_done_progress_cance(p))
214		}
215		_ => debug!("Ignoring unhandled notification {method}"),
216	}
217}
218
219pub trait Handler: Sized + Send + Sync + 'static {
220	fn initialized(&self) -> bool {
221		false
222	}
223
224	fn handle(&self, message: Message) -> Option<Message> {
225		let span = trace_span!("Handling request", "{:#?}", message);
226		let _entered = span.enter();
227		if message.is_exit_notification() {
228			return None;
229		}
230		if !self.initialized() && !message.is_initialize_request() {
231			debug!("Skipping message {:?} before initialization", message);
232			return None;
233		}
234		match message {
235			Message::Request(Request { id, method, params }) => Some(answer(self, id, &method, params)),
236			Message::Notification(Notification { method, params }) => {
237				receive(self, &method, params);
238				None
239			}
240			Message::Response(_) => None,
241		}
242	}
243
244	// Requests
245
246	fn apply_workspace_edit(
247		&self,
248		_req: lsp_types::ApplyWorkspaceEditParams,
249	) -> Result<lsp_types::ApplyWorkspaceEditResponse, ResponseError> {
250		Err(ErrorCode::MethodNotFound.into())
251	}
252
253	fn call_hierarchy_incoming_calls(
254		&self,
255		_req: lsp_types::CallHierarchyIncomingCallsParams,
256	) -> Result<Option<Vec<lsp_types::CallHierarchyIncomingCall>>, ResponseError> {
257		Err(ErrorCode::MethodNotFound.into())
258	}
259
260	fn call_hierarchy_outgoing_calls(
261		&self,
262		_req: lsp_types::CallHierarchyOutgoingCallsParams,
263	) -> Result<Option<Vec<lsp_types::CallHierarchyOutgoingCall>>, ResponseError> {
264		Err(ErrorCode::MethodNotFound.into())
265	}
266
267	fn call_hierarchy_prepare(
268		&self,
269		_req: lsp_types::CallHierarchyPrepareParams,
270	) -> Result<Option<Vec<lsp_types::CallHierarchyItem>>, ResponseError> {
271		Err(ErrorCode::MethodNotFound.into())
272	}
273
274	fn code_action_request(
275		&self,
276		_req: lsp_types::CodeActionParams,
277	) -> Result<Option<lsp_types::CodeActionResponse>, ResponseError> {
278		Err(ErrorCode::MethodNotFound.into())
279	}
280
281	fn code_action_resolve_request(&self, _req: lsp_types::CodeAction) -> Result<lsp_types::CodeAction, ResponseError> {
282		Err(ErrorCode::MethodNotFound.into())
283	}
284
285	fn code_lens_refresh(&self) -> Result<(), ResponseError> {
286		Err(ErrorCode::MethodNotFound.into())
287	}
288
289	fn code_lens_request(
290		&self,
291		_req: lsp_types::CodeLensParams,
292	) -> Result<Option<Vec<lsp_types::CodeLens>>, ResponseError> {
293		Err(ErrorCode::MethodNotFound.into())
294	}
295
296	fn code_lens_resolve(&self, _req: lsp_types::CodeLens) -> Result<lsp_types::CodeLens, ResponseError> {
297		Err(ErrorCode::MethodNotFound.into())
298	}
299
300	fn color_presentation_request(
301		&self,
302		_req: lsp_types::ColorPresentationParams,
303	) -> Result<Vec<lsp_types::ColorPresentation>, ResponseError> {
304		Err(ErrorCode::MethodNotFound.into())
305	}
306
307	fn completion(
308		&self,
309		_req: lsp_types::CompletionParams,
310	) -> Result<Option<lsp_types::CompletionResponse>, ResponseError> {
311		Err(ErrorCode::MethodNotFound.into())
312	}
313
314	fn document_color(
315		&self,
316		_req: lsp_types::DocumentColorParams,
317	) -> Result<Vec<lsp_types::ColorInformation>, ResponseError> {
318		Err(ErrorCode::MethodNotFound.into())
319	}
320
321	fn document_diagnostic_request(
322		&self,
323		_req: lsp_types::DocumentDiagnosticParams,
324	) -> Result<lsp_types::DocumentDiagnosticReportResult, ResponseError> {
325		Err(ErrorCode::MethodNotFound.into())
326	}
327
328	fn document_highlight_request(
329		&self,
330		_req: lsp_types::DocumentHighlightParams,
331	) -> Result<Option<Vec<lsp_types::DocumentHighlight>>, ResponseError> {
332		Err(ErrorCode::MethodNotFound.into())
333	}
334
335	fn document_link_request(
336		&self,
337		_req: lsp_types::DocumentLinkParams,
338	) -> Result<Option<Vec<lsp_types::DocumentLink>>, ResponseError> {
339		Err(ErrorCode::MethodNotFound.into())
340	}
341
342	fn document_link_resolve(&self, _req: lsp_types::DocumentLink) -> Result<lsp_types::DocumentLink, ResponseError> {
343		Err(ErrorCode::MethodNotFound.into())
344	}
345
346	fn document_symbol_request(
347		&self,
348		_req: lsp_types::DocumentSymbolParams,
349	) -> Result<Option<lsp_types::DocumentSymbolResponse>, ResponseError> {
350		Err(ErrorCode::MethodNotFound.into())
351	}
352
353	fn execute_command(&self, _req: lsp_types::ExecuteCommandParams) -> Result<Option<Value>, ResponseError> {
354		Err(ErrorCode::MethodNotFound.into())
355	}
356
357	fn folding_range_request(
358		&self,
359		_req: lsp_types::FoldingRangeParams,
360	) -> Result<Option<Vec<lsp_types::FoldingRange>>, ResponseError> {
361		Err(ErrorCode::MethodNotFound.into())
362	}
363
364	fn formatting(
365		&self,
366		_req: lsp_types::DocumentFormattingParams,
367	) -> Result<Option<Vec<lsp_types::TextEdit>>, ResponseError> {
368		Err(ErrorCode::MethodNotFound.into())
369	}
370
371	fn goto_declaration(
372		&self,
373		_req: lsp_types::GotoDefinitionParams,
374	) -> Result<Option<lsp_types::GotoDefinitionResponse>, ResponseError> {
375		Err(ErrorCode::MethodNotFound.into())
376	}
377
378	fn goto_definition(
379		&self,
380		_req: lsp_types::GotoDefinitionParams,
381	) -> Result<Option<lsp_types::GotoDefinitionResponse>, ResponseError> {
382		Err(ErrorCode::MethodNotFound.into())
383	}
384
385	fn goto_implementation(
386		&self,
387		_req: lsp_types::GotoDefinitionParams,
388	) -> Result<Option<lsp_types::GotoDefinitionResponse>, ResponseError> {
389		Err(ErrorCode::MethodNotFound.into())
390	}
391
392	fn goto_type_definition(
393		&self,
394		_req: lsp_types::GotoDefinitionParams,
395	) -> Result<Option<lsp_types::GotoDefinitionResponse>, ResponseError> {
396		Err(ErrorCode::MethodNotFound.into())
397	}
398
399	fn hover_request(&self, _req: lsp_types::HoverParams) -> Result<Option<lsp_types::Hover>, ResponseError> {
400		Err(ErrorCode::MethodNotFound.into())
401	}
402
403	fn initialize(&self, _req: lsp_types::InitializeParams) -> Result<lsp_types::InitializeResult, ResponseError> {
404		Err(ErrorCode::MethodNotFound.into())
405	}
406
407	fn inlay_hint_refresh_request(&self) -> Result<(), ResponseError> {
408		Err(ErrorCode::MethodNotFound.into())
409	}
410
411	fn inlay_hint_request(
412		&self,
413		_req: lsp_types::InlayHintParams,
414	) -> Result<Option<Vec<lsp_types::InlayHint>>, ResponseError> {
415		Err(ErrorCode::MethodNotFound.into())
416	}
417
418	fn inlay_hint_resolve_request(&self, _req: lsp_types::InlayHint) -> Result<lsp_types::InlayHint, ResponseError> {
419		Err(ErrorCode::MethodNotFound.into())
420	}
421
422	fn inline_value_refresh_request(&self) -> Result<(), ResponseError> {
423		Err(ErrorCode::MethodNotFound.into())
424	}
425
426	fn inline_value_request(
427		&self,
428		_req: lsp_types::InlineValueParams,
429	) -> Result<Option<Vec<lsp_types::InlineValue>>, ResponseError> {
430		Err(ErrorCode::MethodNotFound.into())
431	}
432
433	fn linked_editing_range(
434		&self,
435		_req: lsp_types::LinkedEditingRangeParams,
436	) -> Result<Option<lsp_types::LinkedEditingRanges>, ResponseError> {
437		Err(ErrorCode::MethodNotFound.into())
438	}
439
440	fn moniker_request(
441		&self,
442		_req: lsp_types::MonikerParams,
443	) -> Result<Option<Vec<lsp_types::Moniker>>, ResponseError> {
444		Err(ErrorCode::MethodNotFound.into())
445	}
446
447	fn on_type_formatting(
448		&self,
449		_req: lsp_types::DocumentOnTypeFormattingParams,
450	) -> Result<Option<Vec<lsp_types::TextEdit>>, ResponseError> {
451		Err(ErrorCode::MethodNotFound.into())
452	}
453
454	fn prepare_rename_request(
455		&self,
456		_req: lsp_types::TextDocumentPositionParams,
457	) -> Result<Option<lsp_types::PrepareRenameResponse>, ResponseError> {
458		Err(ErrorCode::MethodNotFound.into())
459	}
460
461	fn range_formatting(
462		&self,
463		_req: lsp_types::DocumentRangeFormattingParams,
464	) -> Result<Option<Vec<lsp_types::TextEdit>>, ResponseError> {
465		Err(ErrorCode::MethodNotFound.into())
466	}
467
468	fn references(&self, _req: lsp_types::ReferenceParams) -> Result<Option<Vec<lsp_types::Location>>, ResponseError> {
469		Err(ErrorCode::MethodNotFound.into())
470	}
471
472	fn register_capability(&self, _req: lsp_types::RegistrationParams) -> Result<(), ResponseError> {
473		Err(ErrorCode::MethodNotFound.into())
474	}
475
476	fn rename(&self, _req: lsp_types::RenameParams) -> Result<Option<lsp_types::WorkspaceEdit>, ResponseError> {
477		Err(ErrorCode::MethodNotFound.into())
478	}
479
480	fn resolve_completion_item(
481		&self,
482		_req: lsp_types::CompletionItem,
483	) -> Result<lsp_types::CompletionItem, ResponseError> {
484		Err(ErrorCode::MethodNotFound.into())
485	}
486
487	fn selection_range_request(
488		&self,
489		_req: lsp_types::SelectionRangeParams,
490	) -> Result<Option<Vec<lsp_types::SelectionRange>>, ResponseError> {
491		Err(ErrorCode::MethodNotFound.into())
492	}
493
494	fn semantic_tokens_full_delta_request(
495		&self,
496		_req: lsp_types::SemanticTokensDeltaParams,
497	) -> Result<Option<lsp_types::SemanticTokensFullDeltaResult>, ResponseError> {
498		Err(ErrorCode::MethodNotFound.into())
499	}
500
501	fn semantic_tokens_full_request(
502		&self,
503		_req: lsp_types::SemanticTokensParams,
504	) -> Result<Option<lsp_types::SemanticTokensResult>, ResponseError> {
505		Err(ErrorCode::MethodNotFound.into())
506	}
507
508	fn semantic_tokens_range_request(
509		&self,
510		_req: lsp_types::SemanticTokensRangeParams,
511	) -> Result<Option<lsp_types::SemanticTokensRangeResult>, ResponseError> {
512		Err(ErrorCode::MethodNotFound.into())
513	}
514
515	fn semantic_tokens_refresh(&self) -> Result<(), ResponseError> {
516		Err(ErrorCode::MethodNotFound.into())
517	}
518
519	fn show_document(
520		&self,
521		_req: lsp_types::ShowDocumentParams,
522	) -> Result<lsp_types::ShowDocumentResult, ResponseError> {
523		Err(ErrorCode::MethodNotFound.into())
524	}
525
526	fn show_message_request(
527		&self,
528		_req: lsp_types::ShowMessageRequestParams,
529	) -> Result<Option<lsp_types::MessageActionItem>, ResponseError> {
530		Err(ErrorCode::MethodNotFound.into())
531	}
532
533	fn shutdown(&self) -> Result<(), ResponseError> {
534		Ok(())
535	}
536
537	fn signature_help_request(
538		&self,
539		_req: lsp_types::SignatureHelpParams,
540	) -> Result<Option<lsp_types::SignatureHelp>, ResponseError> {
541		Err(ErrorCode::MethodNotFound.into())
542	}
543
544	fn type_hierarchy_prepare(
545		&self,
546		_req: lsp_types::TypeHierarchyPrepareParams,
547	) -> Result<Option<Vec<lsp_types::TypeHierarchyItem>>, ResponseError> {
548		Err(ErrorCode::MethodNotFound.into())
549	}
550
551	fn type_hierarchy_subtypes(
552		&self,
553		_req: lsp_types::TypeHierarchySubtypesParams,
554	) -> Result<Option<Vec<lsp_types::TypeHierarchyItem>>, ResponseError> {
555		Err(ErrorCode::MethodNotFound.into())
556	}
557
558	fn type_hierarchy_supertypes(
559		&self,
560		_req: lsp_types::TypeHierarchySupertypesParams,
561	) -> Result<Option<Vec<lsp_types::TypeHierarchyItem>>, ResponseError> {
562		Err(ErrorCode::MethodNotFound.into())
563	}
564
565	fn unregister_capability(&self, _req: lsp_types::UnregistrationParams) -> Result<(), ResponseError> {
566		Err(ErrorCode::MethodNotFound.into())
567	}
568
569	fn will_create_files(
570		&self,
571		_req: lsp_types::CreateFilesParams,
572	) -> Result<Option<lsp_types::WorkspaceEdit>, ResponseError> {
573		Err(ErrorCode::MethodNotFound.into())
574	}
575
576	fn will_delete_files(
577		&self,
578		_req: lsp_types::DeleteFilesParams,
579	) -> Result<Option<lsp_types::WorkspaceEdit>, ResponseError> {
580		Err(ErrorCode::MethodNotFound.into())
581	}
582
583	fn will_rename_files(
584		&self,
585		_req: lsp_types::RenameFilesParams,
586	) -> Result<Option<lsp_types::WorkspaceEdit>, ResponseError> {
587		Err(ErrorCode::MethodNotFound.into())
588	}
589
590	fn will_save_wait_until(
591		&self,
592		_req: lsp_types::WillSaveTextDocumentParams,
593	) -> Result<Option<Vec<lsp_types::TextEdit>>, ResponseError> {
594		Err(ErrorCode::MethodNotFound.into())
595	}
596
597	fn work_done_progress_create(&self, _req: lsp_types::WorkDoneProgressCreateParams) -> Result<(), ResponseError> {
598		Err(ErrorCode::MethodNotFound.into())
599	}
600
601	fn workspace_configuration(&self, _req: lsp_types::ConfigurationParams) -> Result<Vec<Value>, ResponseError> {
602		Err(ErrorCode::MethodNotFound.into())
603	}
604
605	fn workspace_diagnostic_refresh(&self) -> Result<(), ResponseError> {
606		Err(ErrorCode::MethodNotFound.into())
607	}
608
609	fn workspace_diagnostic_request(
610		&self,
611		_req: lsp_types::WorkspaceDiagnosticParams,
612	) -> Result<lsp_types::WorkspaceDiagnosticReportResult, ResponseError> {
613		Err(ErrorCode::MethodNotFound.into())
614	}
615
616	fn workspace_folders_request(&self) -> Result<Option<Vec<lsp_types::WorkspaceFolder>>, ResponseError> {
617		Err(ErrorCode::MethodNotFound.into())
618	}
619
620	fn workspace_symbol_request(
621		&self,
622		_req: lsp_types::WorkspaceSymbolParams,
623	) -> Result<Option<lsp_types::WorkspaceSymbolResponse>, ResponseError> {
624		Err(ErrorCode::MethodNotFound.into())
625	}
626
627	fn workspace_symbol_resolve(
628		&self,
629		_req: lsp_types::WorkspaceSymbol,
630	) -> Result<lsp_types::WorkspaceSymbol, ResponseError> {
631		Err(ErrorCode::MethodNotFound.into())
632	}
633
634	// Notifications
635
636	fn on_cancel(&self, _req: lsp_types::CancelParams) {}
637	fn on_did_change_configuration(&self, _req: lsp_types::DidChangeConfigurationParams) {}
638	fn on_did_change_notebook_document(&self, _req: lsp_types::DidChangeNotebookDocumentParams) {}
639	fn on_did_change_text_document(&self, _req: lsp_types::DidChangeTextDocumentParams) {}
640	fn on_did_change_watched_files(&self, _req: lsp_types::DidChangeWatchedFilesParams) {}
641	fn on_did_change_workspace_folders(&self, _req: lsp_types::DidChangeWorkspaceFoldersParams) {}
642	fn on_did_close_notebook_document(&self, _req: lsp_types::DidCloseNotebookDocumentParams) {}
643	fn on_did_close_text_document(&self, _req: lsp_types::DidCloseTextDocumentParams) {}
644	fn on_did_create_files(&self, _req: lsp_types::CreateFilesParams) {}
645	fn on_did_delete_files(&self, _req: lsp_types::DeleteFilesParams) {}
646	fn on_did_open_notebook_document(&self, _req: lsp_types::DidOpenNotebookDocumentParams) {}
647	fn on_did_open_text_document(&self, _req: lsp_types::DidOpenTextDocumentParams) {}
648	fn on_did_rename_files(&self, _req: lsp_types::RenameFilesParams) {}
649	fn on_did_save_notebook_document(&self, _req: lsp_types::DidSaveNotebookDocumentParams) {}
650	fn on_did_save_text_document(&self, _req: lsp_types::DidSaveTextDocumentParams) {}
651	fn on_initialized(&self, _req: lsp_types::InitializedParams) {}
652	fn on_log_message(&self, _req: lsp_types::LogMessageParams) {}
653	fn on_log_trace(&self, _req: lsp_types::LogTraceParams) {}
654	fn on_progress(&self, _req: lsp_types::ProgressParams) {}
655	fn on_publish_diagnostics(&self, _req: lsp_types::PublishDiagnosticsParams) {}
656	fn on_set_trace(&self, _req: lsp_types::SetTraceParams) {}
657	fn on_show_message(&self, _req: lsp_types::ShowMessageParams) {}
658	fn on_telemetry_event(&self, _req: lsp_types::OneOf<lsp_types::LSPObject, lsp_types::LSPArray>) {}
659	fn on_will_save_text_document(&self, _req: lsp_types::WillSaveTextDocumentParams) {}
660	fn on_work_done_progress_cance(&self, _req: lsp_types::WorkDoneProgressCancelParams) {}
661}