Skip to content

Commit 00ccfee

Browse files
committed
Add richer LSP server example (#20017)
1 parent 0ac6559 commit 00ccfee

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

crates/rust-analyzer/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,7 @@ in-rust-tree = [
106106

107107
[lints]
108108
workspace = true
109+
110+
[[example]]
111+
name = "rust_analyzer_lsp_example"
112+
path = "examples/rust_analyzer_lsp_example/main.rs"
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use anyhow::Result;
2+
use lsp_server::{Connection, Message};
3+
use lsp_types::{
4+
request::{Completion, Formatting, Request as LspRequest},
5+
CompletionParams,
6+
DidChangeTextDocumentParams,
7+
DocumentFormattingParams,
8+
OneOf,
9+
ServerCapabilities,
10+
TextDocumentSyncKind,
11+
TextDocumentSyncOptions,
12+
};
13+
use serde_json::json;
14+
15+
fn main() -> Result<()> {
16+
// Set up a JSON-RPC connection over stdio
17+
let (connection, io_threads) = Connection::stdio();
18+
19+
// Perform the initialize handshake and advertise capabilities
20+
let (init_id, _init_params) = connection.initialize_start()?;
21+
let capabilities = ServerCapabilities {
22+
text_document_sync: Some(
23+
TextDocumentSyncOptions {
24+
change: Some(TextDocumentSyncKind::FULL),
25+
..Default::default()
26+
}
27+
.into(),
28+
),
29+
completion_provider: Some(Default::default()),
30+
document_formatting_provider: Some(OneOf::Left(true)),
31+
..Default::default()
32+
};
33+
connection.initialize_finish(init_id, json!({ "capabilities": capabilities }))?;
34+
35+
// Enter the main message loop
36+
for message in connection.receiver.iter() {
37+
match message {
38+
Message::Notification(notification)
39+
if notification.method == "textDocument/didChange" =>
40+
{
41+
let params: DidChangeTextDocumentParams =
42+
serde_json::from_value(notification.params).unwrap();
43+
eprintln!("Document changed: {}", params.text_document.uri);
44+
}
45+
Message::Request(request) if request.method == Completion::METHOD => {
46+
let _: CompletionParams = serde_json::from_value(request.params).unwrap();
47+
let response = lsp_server::Response::new_ok(
48+
request.id,
49+
json!({ "isIncomplete": false, "items": [] }),
50+
);
51+
connection.sender.send(Message::Response(response)).unwrap();
52+
}
53+
Message::Request(request) if request.method == Formatting::METHOD => {
54+
let _: DocumentFormattingParams =
55+
serde_json::from_value(request.params).unwrap();
56+
let response = lsp_server::Response::new_ok(request.id, json!([]));
57+
connection.sender.send(Message::Response(response)).unwrap();
58+
}
59+
Message::Request(request) if connection.handle_shutdown(&request)? => break,
60+
_ => {} // ignore all other messages
61+
}
62+
}
63+
64+
io_threads.join().unwrap();
65+
Ok(())
66+
}

0 commit comments

Comments
 (0)