Use `async_maybe!` instead of inline IIFEs (#6906)

Marshall Bowers created

This PR replaces instances where we were using an async IIFE with the
`async_maybe!` macro.

Release Notes:

- N/A

Change summary

crates/copilot/src/copilot.rs          |  7 ++++---
crates/zed/src/languages/c.rs          |  5 +++--
crates/zed/src/languages/css.rs        |  6 +++---
crates/zed/src/languages/deno.rs       | 12 ++++++++----
crates/zed/src/languages/go.rs         |  6 +++---
crates/zed/src/languages/html.rs       |  6 +++---
crates/zed/src/languages/json.rs       |  6 +++---
crates/zed/src/languages/php.rs        |  6 +++---
crates/zed/src/languages/rust.rs       |  5 +++--
crates/zed/src/languages/svelte.rs     |  6 +++---
crates/zed/src/languages/tailwind.rs   |  6 +++---
crates/zed/src/languages/typescript.rs | 16 ++++++++++------
crates/zed/src/languages/vue.rs        |  6 +++---
crates/zed/src/languages/yaml.rs       |  6 +++---
14 files changed, 55 insertions(+), 44 deletions(-)

Detailed changes

crates/copilot/src/copilot.rs 🔗

@@ -28,7 +28,8 @@ use std::{
     sync::Arc,
 };
 use util::{
-    fs::remove_matching, github::latest_github_release, http::HttpClient, paths, ResultExt,
+    async_maybe, fs::remove_matching, github::latest_github_release, http::HttpClient, paths,
+    ResultExt,
 };
 
 actions!(
@@ -992,7 +993,7 @@ async fn get_copilot_lsp(http: Arc<dyn HttpClient>) -> anyhow::Result<PathBuf> {
         e @ Err(..) => {
             e.log_err();
             // Fetch a cached binary, if it exists
-            (|| async move {
+            async_maybe!({
                 let mut last_version_dir = None;
                 let mut entries = fs::read_dir(paths::COPILOT_DIR.as_path()).await?;
                 while let Some(entry) = entries.next().await {
@@ -1012,7 +1013,7 @@ async fn get_copilot_lsp(http: Arc<dyn HttpClient>) -> anyhow::Result<PathBuf> {
                         last_version_dir
                     ))
                 }
-            })()
+            })
             .await
         }
     }

crates/zed/src/languages/c.rs 🔗

@@ -6,6 +6,7 @@ use lsp::LanguageServerBinary;
 use smol::fs::{self, File};
 use std::{any::Any, path::PathBuf, sync::Arc};
 use util::{
+    async_maybe,
     fs::remove_matching,
     github::{latest_github_release, GitHubLspBinaryVersion},
     ResultExt,
@@ -244,7 +245,7 @@ impl super::LspAdapter for CLspAdapter {
 }
 
 async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_clangd_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -266,7 +267,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
                 clangd_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/css.rs 🔗

@@ -12,7 +12,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 const SERVER_PATH: &'static str =
     "node_modules/vscode-langservers-extracted/bin/vscode-css-language-server";
@@ -102,7 +102,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -124,7 +124,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/deno.rs 🔗

@@ -10,8 +10,12 @@ use serde_json::json;
 use settings::Settings;
 use smol::{fs, fs::File};
 use std::{any::Any, env::consts, ffi::OsString, path::PathBuf, sync::Arc};
-use util::{fs::remove_matching, github::latest_github_release};
-use util::{github::GitHubLspBinaryVersion, ResultExt};
+use util::{
+    async_maybe,
+    fs::remove_matching,
+    github::{latest_github_release, GitHubLspBinaryVersion},
+    ResultExt,
+};
 
 #[derive(Clone, Serialize, Deserialize, JsonSchema)]
 pub struct DenoSettings {
@@ -196,7 +200,7 @@ impl LspAdapter for DenoLspAdapter {
 }
 
 async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -217,7 +221,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
         }
 
         Err(anyhow!("no cached binary"))
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/go.rs 🔗

@@ -18,7 +18,7 @@ use std::{
         Arc,
     },
 };
-use util::{fs::remove_matching, github::latest_github_release, ResultExt};
+use util::{async_maybe, fs::remove_matching, github::latest_github_release, ResultExt};
 
 fn server_binary_arguments() -> Vec<OsString> {
     vec!["-mode=stdio".into()]
@@ -329,7 +329,7 @@ impl super::LspAdapter for GoLspAdapter {
 }
 
 async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_binary_path = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -352,7 +352,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
         } else {
             Err(anyhow!("no cached binary"))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/html.rs 🔗

@@ -12,7 +12,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 const SERVER_PATH: &'static str =
     "node_modules/vscode-langservers-extracted/bin/vscode-html-language-server";
@@ -102,7 +102,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -124,7 +124,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/json.rs 🔗

@@ -16,7 +16,7 @@ use std::{
     path::{Path, PathBuf},
     sync::{Arc, OnceLock},
 };
-use util::{paths, ResultExt};
+use util::{async_maybe, paths, ResultExt};
 
 const SERVER_PATH: &'static str =
     "node_modules/vscode-json-languageserver/bin/vscode-json-languageserver";
@@ -158,7 +158,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -181,7 +181,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/php.rs 🔗

@@ -14,7 +14,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 fn intelephense_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
     vec![server_path.into(), "--stdio".into()]
@@ -108,7 +108,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -130,7 +130,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/rust.rs 🔗

@@ -9,6 +9,7 @@ use regex::Regex;
 use smol::fs::{self, File};
 use std::{any::Any, borrow::Cow, env::consts, path::PathBuf, str, sync::Arc};
 use util::{
+    async_maybe,
     fs::remove_matching,
     github::{latest_github_release, GitHubLspBinaryVersion},
     ResultExt,
@@ -272,7 +273,7 @@ impl LspAdapter for RustLspAdapter {
 }
 
 async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -283,7 +284,7 @@ async fn get_cached_server_binary(container_dir: PathBuf) -> Option<LanguageServ
             path: last.ok_or_else(|| anyhow!("no cached binary"))?,
             arguments: Default::default(),
         })
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/svelte.rs 🔗

@@ -12,7 +12,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 const SERVER_PATH: &'static str = "node_modules/svelte-language-server/bin/server.js";
 
@@ -105,7 +105,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -127,7 +127,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/tailwind.rs 🔗

@@ -14,7 +14,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 const SERVER_PATH: &'static str = "node_modules/.bin/tailwindcss-language-server";
 
@@ -135,7 +135,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -157,7 +157,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/typescript.rs 🔗

@@ -15,8 +15,12 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::{fs::remove_matching, github::latest_github_release};
-use util::{github::GitHubLspBinaryVersion, ResultExt};
+use util::{
+    async_maybe,
+    fs::remove_matching,
+    github::{latest_github_release, GitHubLspBinaryVersion},
+    ResultExt,
+};
 
 fn typescript_server_binary_arguments(server_path: &Path) -> Vec<OsString> {
     vec![server_path.into(), "--stdio".into()]
@@ -172,7 +176,7 @@ async fn get_cached_ts_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let old_server_path = container_dir.join(TypeScriptLspAdapter::OLD_SERVER_PATH);
         let new_server_path = container_dir.join(TypeScriptLspAdapter::NEW_SERVER_PATH);
         if new_server_path.exists() {
@@ -191,7 +195,7 @@ async fn get_cached_ts_server_binary(
                 container_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }
@@ -324,7 +328,7 @@ async fn get_cached_eslint_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         // This is unfortunate but we don't know what the version is to build a path directly
         let mut dir = fs::read_dir(&container_dir).await?;
         let first = dir.next().await.ok_or(anyhow!("missing first file"))??;
@@ -337,7 +341,7 @@ async fn get_cached_eslint_server_binary(
             path: node.binary_path().await?,
             arguments: eslint_server_binary_arguments(&server_path),
         })
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/vue.rs 🔗

@@ -13,7 +13,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 pub struct VueLspVersion {
     vue_version: String,
@@ -188,7 +188,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: Arc<dyn NodeRuntime>,
 ) -> Option<(LanguageServerBinary, TypescriptPath)> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -214,7 +214,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }

crates/zed/src/languages/yaml.rs 🔗

@@ -15,7 +15,7 @@ use std::{
     path::{Path, PathBuf},
     sync::Arc,
 };
-use util::ResultExt;
+use util::{async_maybe, ResultExt};
 
 const SERVER_PATH: &'static str = "node_modules/yaml-language-server/bin/yaml-language-server";
 
@@ -110,7 +110,7 @@ async fn get_cached_server_binary(
     container_dir: PathBuf,
     node: &dyn NodeRuntime,
 ) -> Option<LanguageServerBinary> {
-    (|| async move {
+    async_maybe!({
         let mut last_version_dir = None;
         let mut entries = fs::read_dir(&container_dir).await?;
         while let Some(entry) = entries.next().await {
@@ -132,7 +132,7 @@ async fn get_cached_server_binary(
                 last_version_dir
             ))
         }
-    })()
+    })
     .await
     .log_err()
 }