diff --git a/crates/dap/src/adapters.rs b/crates/dap/src/adapters.rs index 7179466853a8873ea7c605bb43ee8d803b3d670b..ebab0ecb1b4d14bec7be31348e253994ea7a570d 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 1181118123d559baa46b6e37ef73f74a9418c44b..cfaa74828ddb2c5571cf3012245758cac45244f3 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 9400359d05cc9a767d9168e4b13ba8459161d3ed..8f86f43fca917acb262570c1335270c51092ee8d 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 cde64af9976fb5b5ad665ec8ba33f060f6c8f0d0..d228d60d150ee0e28f1b3f2f6affdb71c8d1fb80 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 2c3f44ffbc7ee09c2274ba53e5555de400bcb2a5..8971605a5c330398c781d5dd9deeee04f702a9bc 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 02c9b53237026181733e38cfce3dd8dd9493527f..d921abd94801dc20b211396f56725ea8c27d27c5 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 0c17a8c1d0a6be7f7c28945d46a2500ed2bb2464..1d787d9a6803de7f1de2886f8dd148a61d1fd398 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 6d91155a5a0a64b140440deda2660715cb5f7e16..1f0fdb7c3fea2f244c359abe76334e67665e52d9 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 2b532abce967dcc170ce66c12db2659c57714c76..a67e1da602c2d546e1774efa9136410842f8e87e 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 dbc217abbfdf9678f8273073695ba3c206508cf3..4099c8670981e7f510a7c3982962fc4652552b1b 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 99fbb28b6c3e49de3f5d779180cd99f10fe2d0ee..77b2cf699dc5fa7f516aa0d72c1beab4ad8e53a4 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 8cee926dda3e210bccd419e0572eeb4695e2e7be..c46404e19073fe7549b035061c8837a80b76042c 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 fc00f1b06fb45fe213902516b634a3cbc3675c20..3618b9956ad757debe605695229688f970cc39b2 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); }