Skip to content

Commit 2296412

Browse files
committed
Change remaining Client notification methods to async fn
This not only guarantees a correct order of operations, but it eliminates the very last internal call to `tokio::spawn()` in the project. The only thing currently tying us to `tokio` specifically is the `AsyncRead`/`AsyncWrite` traits.
1 parent 456856b commit 2296412

File tree

6 files changed

+136
-84
lines changed

6 files changed

+136
-84
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ impl LanguageServer for Backend {
5555
}
5656

5757
async fn initialized(&self, _: InitializedParams) {
58-
self.client.log_message(MessageType::Info, "server initialized!");
58+
self.client
59+
.log_message(MessageType::Info, "server initialized!")
60+
.await;
5961
}
6062

6163
async fn shutdown(&self) -> Result<()> {

examples/custom_notification.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ impl CustomNotificationParams {
2020
}
2121
}
2222

23-
#[derive(Debug)]
2423
enum CustomNotification {}
2524

2625
impl Notification for CustomNotification {
2726
type Params = CustomNotificationParams;
27+
2828
const METHOD: &'static str = "custom/notification";
2929
}
3030

@@ -54,13 +54,17 @@ impl LanguageServer for Backend {
5454

5555
async fn execute_command(&self, params: ExecuteCommandParams) -> Result<Option<Value>> {
5656
if params.command == "custom.notification" {
57-
self.client.send_custom_notification::<CustomNotification>(
58-
CustomNotificationParams::new("Hello", "Message"),
59-
);
60-
self.client.log_message(
61-
MessageType::Info,
62-
format!("Command executed with params: {:?}", params),
63-
);
57+
self.client
58+
.send_custom_notification::<CustomNotification>(CustomNotificationParams::new(
59+
"Hello", "Message",
60+
))
61+
.await;
62+
self.client
63+
.log_message(
64+
MessageType::Info,
65+
format!("Command executed with params: {:?}", params),
66+
)
67+
.await;
6468
Ok(None)
6569
} else {
6670
Err(Error::invalid_request())

examples/stdio.rs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ impl LanguageServer for Backend {
4040
}
4141

4242
async fn initialized(&self, _: InitializedParams) {
43-
self.client.log_message(MessageType::Info, "initialized!");
43+
self.client
44+
.log_message(MessageType::Info, "initialized!")
45+
.await;
4446
}
4547

4648
async fn shutdown(&self) -> Result<()> {
@@ -49,46 +51,58 @@ impl LanguageServer for Backend {
4951

5052
async fn did_change_workspace_folders(&self, _: DidChangeWorkspaceFoldersParams) {
5153
self.client
52-
.log_message(MessageType::Info, "workspace folders changed!");
54+
.log_message(MessageType::Info, "workspace folders changed!")
55+
.await;
5356
}
5457

5558
async fn did_change_configuration(&self, _: DidChangeConfigurationParams) {
5659
self.client
57-
.log_message(MessageType::Info, "configuration changed!");
60+
.log_message(MessageType::Info, "configuration changed!")
61+
.await;
5862
}
5963

6064
async fn did_change_watched_files(&self, _: DidChangeWatchedFilesParams) {
6165
self.client
62-
.log_message(MessageType::Info, "watched files have changed!");
66+
.log_message(MessageType::Info, "watched files have changed!")
67+
.await;
6368
}
6469

6570
async fn execute_command(&self, _: ExecuteCommandParams) -> Result<Option<Value>> {
6671
self.client
67-
.log_message(MessageType::Info, "command executed!");
72+
.log_message(MessageType::Info, "command executed!")
73+
.await;
6874

6975
match self.client.apply_edit(WorkspaceEdit::default()).await {
70-
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "edit applied"),
71-
Ok(_) => self.client.log_message(MessageType::Info, "edit rejected"),
72-
Err(err) => self.client.log_message(MessageType::Error, err),
76+
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "applied").await,
77+
Ok(_) => self.client.log_message(MessageType::Info, "rejected").await,
78+
Err(err) => self.client.log_message(MessageType::Error, err).await,
7379
}
7480

7581
Ok(None)
7682
}
7783

7884
async fn did_open(&self, _: DidOpenTextDocumentParams) {
79-
self.client.log_message(MessageType::Info, "file opened!");
85+
self.client
86+
.log_message(MessageType::Info, "file opened!")
87+
.await;
8088
}
8189

8290
async fn did_change(&self, _: DidChangeTextDocumentParams) {
83-
self.client.log_message(MessageType::Info, "file changed!");
91+
self.client
92+
.log_message(MessageType::Info, "file changed!")
93+
.await;
8494
}
8595

8696
async fn did_save(&self, _: DidSaveTextDocumentParams) {
87-
self.client.log_message(MessageType::Info, "file saved!");
97+
self.client
98+
.log_message(MessageType::Info, "file saved!")
99+
.await;
88100
}
89101

90102
async fn did_close(&self, _: DidCloseTextDocumentParams) {
91-
self.client.log_message(MessageType::Info, "file closed!");
103+
self.client
104+
.log_message(MessageType::Info, "file closed!")
105+
.await;
92106
}
93107

94108
async fn completion(&self, _: CompletionParams) -> Result<Option<CompletionResponse>> {

examples/tcp.rs

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ impl LanguageServer for Backend {
4141
}
4242

4343
async fn initialized(&self, _: InitializedParams) {
44-
self.client.log_message(MessageType::Info, "initialized!");
44+
self.client
45+
.log_message(MessageType::Info, "initialized!")
46+
.await;
4547
}
4648

4749
async fn shutdown(&self) -> Result<()> {
@@ -50,46 +52,58 @@ impl LanguageServer for Backend {
5052

5153
async fn did_change_workspace_folders(&self, _: DidChangeWorkspaceFoldersParams) {
5254
self.client
53-
.log_message(MessageType::Info, "workspace folders changed!");
55+
.log_message(MessageType::Info, "workspace folders changed!")
56+
.await;
5457
}
5558

5659
async fn did_change_configuration(&self, _: DidChangeConfigurationParams) {
5760
self.client
58-
.log_message(MessageType::Info, "configuration changed!");
61+
.log_message(MessageType::Info, "configuration changed!")
62+
.await;
5963
}
6064

6165
async fn did_change_watched_files(&self, _: DidChangeWatchedFilesParams) {
6266
self.client
63-
.log_message(MessageType::Info, "watched files have changed!");
67+
.log_message(MessageType::Info, "watched files have changed!")
68+
.await;
6469
}
6570

6671
async fn execute_command(&self, _: ExecuteCommandParams) -> Result<Option<Value>> {
6772
self.client
68-
.log_message(MessageType::Info, "command executed!");
73+
.log_message(MessageType::Info, "command executed!")
74+
.await;
6975

7076
match self.client.apply_edit(WorkspaceEdit::default()).await {
71-
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "edit applied"),
72-
Ok(_) => self.client.log_message(MessageType::Info, "edit rejected"),
73-
Err(err) => self.client.log_message(MessageType::Error, err),
77+
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "applied").await,
78+
Ok(_) => self.client.log_message(MessageType::Info, "rejected").await,
79+
Err(err) => self.client.log_message(MessageType::Error, err).await,
7480
}
7581

7682
Ok(None)
7783
}
7884

7985
async fn did_open(&self, _: DidOpenTextDocumentParams) {
80-
self.client.log_message(MessageType::Info, "file opened!");
86+
self.client
87+
.log_message(MessageType::Info, "file opened!")
88+
.await;
8189
}
8290

8391
async fn did_change(&self, _: DidChangeTextDocumentParams) {
84-
self.client.log_message(MessageType::Info, "file changed!");
92+
self.client
93+
.log_message(MessageType::Info, "file changed!")
94+
.await;
8595
}
8696

8797
async fn did_save(&self, _: DidSaveTextDocumentParams) {
88-
self.client.log_message(MessageType::Info, "file saved!");
98+
self.client
99+
.log_message(MessageType::Info, "file saved!")
100+
.await;
89101
}
90102

91103
async fn did_close(&self, _: DidCloseTextDocumentParams) {
92-
self.client.log_message(MessageType::Info, "file closed!");
104+
self.client
105+
.log_message(MessageType::Info, "file closed!")
106+
.await;
93107
}
94108

95109
async fn completion(&self, _: CompletionParams) -> Result<Option<CompletionResponse>> {

0 commit comments

Comments
 (0)