| Crates.io | async-lsp-client |
| lib.rs | async-lsp-client |
| version | 0.2.3 |
| created_at | 2024-09-25 09:26:16.075514+00 |
| updated_at | 2025-04-15 06:27:56.382246+00 |
| description | The client used to connect to the LSP server. |
| homepage | https://github.com/ren-wei/async-lsp-client |
| repository | https://github.com/ren-wei/async-lsp-client |
| max_upload_size | |
| id | 1386170 |
| size | 40,292 |
The client used to connect to the LSP server.
It starts a new process as the LSP server and uses the standard input and output as a channel, connects and controls to send requests, responses, and notifications, and receives requests or notifications from the LSP server.
Based on tower-lsp, we have designed a series of concise APIs for accessing the LSP server. At the same time, it supports request cancellation for tower-lsp.
let (server, rx) = LspServer::new("deno", ["lsp"]);
// initialize request
let initializeResult = server.initialize(initializeParams).await;
// initialized notification
server.initialized();
// shutdown request
server.shutdown();
// exit notification
server.exit();
// DidOpenTextDocument
server.send_notification::<DidOpenTextDocument>(DidOpenTextDocumentParams { ... }).await;
// DidChangeTextDocument
server.send_notification::<DidChangeTextDocument>(DidChangeTextDocumentParams { ... }).await;
// DidCloseTextDocument
server.send_notification::<DidCloseTextDocument>(DidCloseTextDocumentParams { ... }).await;
// other
// hover
server.send_request::<HoverRequest>(HoverParams { ... }).await;
// completion
server.send_request::<Completion>(CompletionParams { ... }).await;
// goto definition
server.send_request::<GotoDefinition>(GotoDefinitionParams { ... }).await;
// other
The rx is used to receive messages from the server. Usually, the message is received in another thread.
let server_ = server.clone(); // Clone the server is used to move.
tokio::spawn(async move {
loop {
if let Some(message) = rx.recv().await {
// Process messages
match message {
ServerMessage::Notification(_) => {},
// For requests, you need to send a response
ServerMessage::Request(req) => {
let id = req.id().unwrap().clone();
match req.method() {
WorkspaceConfiguration::METHOD => {
server_.send_response::<WorkspaceConfiguration>(id, vec![])
.await
}
WorkDoneProgressCreate::METHOD => {
server_
.send_response::<WorkDoneProgressCreate>(id, ())
.await;
}
_ => {
server_
.send_error_response(
id,
jsonrpc::Error {
code: jsonrpc::ErrorCode::MethodNotFound,
message: std::borrow::Cow::Borrowed("Method Not Found"),
data: req.params().cloned(),
},
)
.await;
}
}
}
}
} else {
break;
}
}
});
tracing enable this feature uses the debug! macro of the tracing package to output messages between the server and the client.