Skip to content

Commit

Permalink
Change remaining Client notification methods to async fn
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ebkalderon committed Aug 16, 2020
1 parent 456856b commit 2296412
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 84 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ impl LanguageServer for Backend {
}

async fn initialized(&self, _: InitializedParams) {
self.client.log_message(MessageType::Info, "server initialized!");
self.client
.log_message(MessageType::Info, "server initialized!")
.await;
}

async fn shutdown(&self) -> Result<()> {
Expand Down
20 changes: 12 additions & 8 deletions examples/custom_notification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ impl CustomNotificationParams {
}
}

#[derive(Debug)]
enum CustomNotification {}

impl Notification for CustomNotification {
type Params = CustomNotificationParams;

const METHOD: &'static str = "custom/notification";
}

Expand Down Expand Up @@ -54,13 +54,17 @@ impl LanguageServer for Backend {

async fn execute_command(&self, params: ExecuteCommandParams) -> Result<Option<Value>> {
if params.command == "custom.notification" {
self.client.send_custom_notification::<CustomNotification>(
CustomNotificationParams::new("Hello", "Message"),
);
self.client.log_message(
MessageType::Info,
format!("Command executed with params: {:?}", params),
);
self.client
.send_custom_notification::<CustomNotification>(CustomNotificationParams::new(
"Hello", "Message",
))
.await;
self.client
.log_message(
MessageType::Info,
format!("Command executed with params: {:?}", params),
)
.await;
Ok(None)
} else {
Err(Error::invalid_request())
Expand Down
38 changes: 26 additions & 12 deletions examples/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ impl LanguageServer for Backend {
}

async fn initialized(&self, _: InitializedParams) {
self.client.log_message(MessageType::Info, "initialized!");
self.client
.log_message(MessageType::Info, "initialized!")
.await;
}

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

async fn did_change_workspace_folders(&self, _: DidChangeWorkspaceFoldersParams) {
self.client
.log_message(MessageType::Info, "workspace folders changed!");
.log_message(MessageType::Info, "workspace folders changed!")
.await;
}

async fn did_change_configuration(&self, _: DidChangeConfigurationParams) {
self.client
.log_message(MessageType::Info, "configuration changed!");
.log_message(MessageType::Info, "configuration changed!")
.await;
}

async fn did_change_watched_files(&self, _: DidChangeWatchedFilesParams) {
self.client
.log_message(MessageType::Info, "watched files have changed!");
.log_message(MessageType::Info, "watched files have changed!")
.await;
}

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

match self.client.apply_edit(WorkspaceEdit::default()).await {
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "edit applied"),
Ok(_) => self.client.log_message(MessageType::Info, "edit rejected"),
Err(err) => self.client.log_message(MessageType::Error, err),
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "applied").await,
Ok(_) => self.client.log_message(MessageType::Info, "rejected").await,
Err(err) => self.client.log_message(MessageType::Error, err).await,
}

Ok(None)
}

async fn did_open(&self, _: DidOpenTextDocumentParams) {
self.client.log_message(MessageType::Info, "file opened!");
self.client
.log_message(MessageType::Info, "file opened!")
.await;
}

async fn did_change(&self, _: DidChangeTextDocumentParams) {
self.client.log_message(MessageType::Info, "file changed!");
self.client
.log_message(MessageType::Info, "file changed!")
.await;
}

async fn did_save(&self, _: DidSaveTextDocumentParams) {
self.client.log_message(MessageType::Info, "file saved!");
self.client
.log_message(MessageType::Info, "file saved!")
.await;
}

async fn did_close(&self, _: DidCloseTextDocumentParams) {
self.client.log_message(MessageType::Info, "file closed!");
self.client
.log_message(MessageType::Info, "file closed!")
.await;
}

async fn completion(&self, _: CompletionParams) -> Result<Option<CompletionResponse>> {
Expand Down
38 changes: 26 additions & 12 deletions examples/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ impl LanguageServer for Backend {
}

async fn initialized(&self, _: InitializedParams) {
self.client.log_message(MessageType::Info, "initialized!");
self.client
.log_message(MessageType::Info, "initialized!")
.await;
}

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

async fn did_change_workspace_folders(&self, _: DidChangeWorkspaceFoldersParams) {
self.client
.log_message(MessageType::Info, "workspace folders changed!");
.log_message(MessageType::Info, "workspace folders changed!")
.await;
}

async fn did_change_configuration(&self, _: DidChangeConfigurationParams) {
self.client
.log_message(MessageType::Info, "configuration changed!");
.log_message(MessageType::Info, "configuration changed!")
.await;
}

async fn did_change_watched_files(&self, _: DidChangeWatchedFilesParams) {
self.client
.log_message(MessageType::Info, "watched files have changed!");
.log_message(MessageType::Info, "watched files have changed!")
.await;
}

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

match self.client.apply_edit(WorkspaceEdit::default()).await {
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "edit applied"),
Ok(_) => self.client.log_message(MessageType::Info, "edit rejected"),
Err(err) => self.client.log_message(MessageType::Error, err),
Ok(res) if res.applied => self.client.log_message(MessageType::Info, "applied").await,
Ok(_) => self.client.log_message(MessageType::Info, "rejected").await,
Err(err) => self.client.log_message(MessageType::Error, err).await,
}

Ok(None)
}

async fn did_open(&self, _: DidOpenTextDocumentParams) {
self.client.log_message(MessageType::Info, "file opened!");
self.client
.log_message(MessageType::Info, "file opened!")
.await;
}

async fn did_change(&self, _: DidChangeTextDocumentParams) {
self.client.log_message(MessageType::Info, "file changed!");
self.client
.log_message(MessageType::Info, "file changed!")
.await;
}

async fn did_save(&self, _: DidSaveTextDocumentParams) {
self.client.log_message(MessageType::Info, "file saved!");
self.client
.log_message(MessageType::Info, "file saved!")
.await;
}

async fn did_close(&self, _: DidCloseTextDocumentParams) {
self.client.log_message(MessageType::Info, "file closed!");
self.client
.log_message(MessageType::Info, "file closed!")
.await;
}

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

0 comments on commit 2296412

Please sign in to comment.