diff --git a/crates/dap/src/adapters.rs b/crates/dap/src/adapters.rs index 7179466853..ebab0ecb1b 100644 --- a/crates/dap/src/adapters.rs +++ b/crates/dap/src/adapters.rs @@ -386,7 +386,7 @@ pub trait DebugAdapter: 'static + Send + Sync { } } - fn dap_schema(&self) -> serde_json::Value; + async fn dap_schema(&self) -> serde_json::Value; } #[cfg(any(test, feature = "test-support"))] @@ -434,7 +434,7 @@ impl DebugAdapter for FakeAdapter { DebugAdapterName(Self::ADAPTER_NAME.into()) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { serde_json::Value::Null } diff --git a/crates/dap/src/registry.rs b/crates/dap/src/registry.rs index 1181118123..cfaa74828d 100644 --- a/crates/dap/src/registry.rs +++ b/crates/dap/src/registry.rs @@ -64,13 +64,16 @@ impl DapRegistry { ); } - pub fn adapters_schema(&self) -> task::AdapterSchemas { + pub async fn adapters_schema(&self) -> task::AdapterSchemas { let mut schemas = AdapterSchemas(vec![]); - for (name, adapter) in self.0.read().adapters.iter() { + // Clone to avoid holding lock over await points + let adapters = self.0.read().adapters.clone(); + + for (name, adapter) in adapters.into_iter() { schemas.0.push(AdapterSchema { - adapter: name.clone().into(), - schema: adapter.dap_schema(), + adapter: name.into(), + schema: adapter.dap_schema().await, }); } diff --git a/crates/dap_adapters/src/codelldb.rs b/crates/dap_adapters/src/codelldb.rs index 9400359d05..8f86f43fca 100644 --- a/crates/dap_adapters/src/codelldb.rs +++ b/crates/dap_adapters/src/codelldb.rs @@ -175,7 +175,7 @@ impl DebugAdapter for CodeLldbDebugAdapter { }) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "properties": { "request": { diff --git a/crates/dap_adapters/src/gdb.rs b/crates/dap_adapters/src/gdb.rs index cde64af997..d228d60d15 100644 --- a/crates/dap_adapters/src/gdb.rs +++ b/crates/dap_adapters/src/gdb.rs @@ -61,7 +61,7 @@ impl DebugAdapter for GdbDebugAdapter { }) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "oneOf": [ { diff --git a/crates/dap_adapters/src/go.rs b/crates/dap_adapters/src/go.rs index 2c3f44ffbc..8971605a5c 100644 --- a/crates/dap_adapters/src/go.rs +++ b/crates/dap_adapters/src/go.rs @@ -27,7 +27,7 @@ impl DebugAdapter for GoDebugAdapter { Some(SharedString::new_static("Go").into()) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { // Create common properties shared between launch and attach let common_properties = json!({ "debugAdapter": { diff --git a/crates/dap_adapters/src/javascript.rs b/crates/dap_adapters/src/javascript.rs index 02c9b53237..d921abd948 100644 --- a/crates/dap_adapters/src/javascript.rs +++ b/crates/dap_adapters/src/javascript.rs @@ -170,7 +170,7 @@ impl DebugAdapter for JsDebugAdapter { }) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "oneOf": [ { diff --git a/crates/dap_adapters/src/php.rs b/crates/dap_adapters/src/php.rs index 0c17a8c1d0..1d787d9a68 100644 --- a/crates/dap_adapters/src/php.rs +++ b/crates/dap_adapters/src/php.rs @@ -101,7 +101,7 @@ impl PhpDebugAdapter { #[async_trait(?Send)] impl DebugAdapter for PhpDebugAdapter { - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "properties": { "request": { diff --git a/crates/dap_adapters/src/python.rs b/crates/dap_adapters/src/python.rs index 6d91155a5a..1f0fdb7c3f 100644 --- a/crates/dap_adapters/src/python.rs +++ b/crates/dap_adapters/src/python.rs @@ -210,7 +210,7 @@ impl DebugAdapter for PythonDebugAdapter { } } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "properties": { "request": { diff --git a/crates/dap_adapters/src/ruby.rs b/crates/dap_adapters/src/ruby.rs index 2b532abce9..a67e1da602 100644 --- a/crates/dap_adapters/src/ruby.rs +++ b/crates/dap_adapters/src/ruby.rs @@ -31,7 +31,7 @@ impl DebugAdapter for RubyDebugAdapter { Some(SharedString::new_static("Ruby").into()) } - fn dap_schema(&self) -> serde_json::Value { + async fn dap_schema(&self) -> serde_json::Value { json!({ "oneOf": [ { diff --git a/crates/debug_adapter_extension/src/extension_dap_adapter.rs b/crates/debug_adapter_extension/src/extension_dap_adapter.rs index dbc217abbf..4099c86709 100644 --- a/crates/debug_adapter_extension/src/extension_dap_adapter.rs +++ b/crates/debug_adapter_extension/src/extension_dap_adapter.rs @@ -61,8 +61,8 @@ impl DebugAdapter for ExtensionDapAdapter { self.debug_adapter_name.as_ref().into() } - fn dap_schema(&self) -> serde_json::Value { - serde_json::Value::Null + async fn dap_schema(&self) -> serde_json::Value { + self.extension.get_dap_schema().await.unwrap_or_default() } async fn get_binary( diff --git a/crates/extension/src/extension.rs b/crates/extension/src/extension.rs index 99fbb28b6c..77b2cf699d 100644 --- a/crates/extension/src/extension.rs +++ b/crates/extension/src/extension.rs @@ -144,7 +144,7 @@ pub trait Extension: Send + Sync + 'static { worktree: Arc, ) -> Result; - async fn dap_schema(&self) -> Result; + async fn get_dap_schema(&self) -> Result; } pub fn parse_wasm_extension_version( diff --git a/crates/extension_host/src/wasm_host.rs b/crates/extension_host/src/wasm_host.rs index 8cee926dda..c46404e190 100644 --- a/crates/extension_host/src/wasm_host.rs +++ b/crates/extension_host/src/wasm_host.rs @@ -399,7 +399,7 @@ impl extension::Extension for WasmExtension { .await } - async fn dap_schema(&self) -> Result { + async fn get_dap_schema(&self) -> Result { self.call(|extension, store| { async move { extension diff --git a/crates/languages/src/json.rs b/crates/languages/src/json.rs index fc00f1b06f..3618b9956a 100644 --- a/crates/languages/src/json.rs +++ b/crates/languages/src/json.rs @@ -26,7 +26,7 @@ use std::{ str::FromStr, sync::Arc, }; -use task::{TaskTemplate, TaskTemplates, VariableName}; +use task::{AdapterSchemas, TaskTemplate, TaskTemplates, VariableName}; use util::{ResultExt, archive::extract_zip, fs::remove_matching, maybe, merge_json_value_into}; const SERVER_PATH: &str = @@ -76,7 +76,11 @@ impl JsonLspAdapter { } } - fn get_workspace_config(language_names: Vec, cx: &mut App) -> Value { + fn get_workspace_config( + language_names: Vec, + adapter_schemas: AdapterSchemas, + cx: &mut App, + ) -> Value { let keymap_schema = KeymapFile::generate_json_schema_for_registered_actions(cx); let font_names = &cx.text_system().all_font_names(); let settings_schema = cx.global::().json_schema( @@ -87,7 +91,6 @@ impl JsonLspAdapter { cx, ); - let adapter_schemas = cx.global::().adapters_schema(); let tasks_schema = task::TaskTemplates::generate_json_schema(); let debug_schema = task::DebugTaskFile::generate_json_schema(&adapter_schemas); let snippets_schema = snippet_provider::format::VsSnippetsFile::generate_json_schema(); @@ -163,8 +166,15 @@ impl JsonLspAdapter { } } let mut writer = self.workspace_config.write().await; - let config = - cx.update(|cx| Self::get_workspace_config(self.languages.language_names(), cx))?; + + let adapter_schemas = cx + .read_global::(|dap_registry, _| dap_registry.to_owned())? + .adapters_schema() + .await; + + let config = cx.update(|cx| { + Self::get_workspace_config(self.languages.language_names().clone(), adapter_schemas, cx) + })?; writer.replace(config.clone()); return Ok(config); }