From 6ad9a66cf95ac4fcec2875987f68fc22b0f791c3 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 17 Jun 2025 12:09:08 +0200 Subject: [PATCH] extensions: Add "Debug Adapters" category to the extension store (#32845) Closes #ISSUE Release Notes: - N/A --- .../20221109000000_test_schema.sql | 1 + ...g_adapter_provides_field_to_extensions.sql | 2 ++ crates/collab/src/db/queries/extensions.rs | 7 +++++ .../collab/src/db/tables/extension_version.rs | 5 ++++ crates/debugger_ui/src/debugger_panel.rs | 29 ++++++++++++++----- crates/extension_cli/src/main.rs | 4 +++ crates/extensions_ui/src/extensions_ui.rs | 2 ++ crates/rpc/src/extension.rs | 1 + crates/zed_actions/src/lib.rs | 1 + docs/src/debugger.md | 3 +- 10 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 crates/collab/migrations/20250617082236_add_debug_adapter_provides_field_to_extensions.sql diff --git a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql index 506920434e..63c8ab8ef4 100644 --- a/crates/collab/migrations.sqlite/20221109000000_test_schema.sql +++ b/crates/collab/migrations.sqlite/20221109000000_test_schema.sql @@ -465,6 +465,7 @@ CREATE TABLE extension_versions ( provides_slash_commands BOOLEAN NOT NULL DEFAULT FALSE, provides_indexed_docs_providers BOOLEAN NOT NULL DEFAULT FALSE, provides_snippets BOOLEAN NOT NULL DEFAULT FALSE, + provides_debug_adapters BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (extension_id, version) ); diff --git a/crates/collab/migrations/20250617082236_add_debug_adapter_provides_field_to_extensions.sql b/crates/collab/migrations/20250617082236_add_debug_adapter_provides_field_to_extensions.sql new file mode 100644 index 0000000000..8455a82f9e --- /dev/null +++ b/crates/collab/migrations/20250617082236_add_debug_adapter_provides_field_to_extensions.sql @@ -0,0 +1,2 @@ +alter table extension_versions +add column provides_debug_adapters bool not null default false diff --git a/crates/collab/src/db/queries/extensions.rs b/crates/collab/src/db/queries/extensions.rs index fe6e5a0377..90f88179c5 100644 --- a/crates/collab/src/db/queries/extensions.rs +++ b/crates/collab/src/db/queries/extensions.rs @@ -321,6 +321,9 @@ impl Database { provides_snippets: ActiveValue::Set( version.provides.contains(&ExtensionProvides::Snippets), ), + provides_debug_adapters: ActiveValue::Set( + version.provides.contains(&ExtensionProvides::DebugAdapters), + ), download_count: ActiveValue::NotSet, } })) @@ -431,6 +434,10 @@ fn apply_provides_filter( condition = condition.add(extension_version::Column::ProvidesSnippets.eq(true)); } + if provides_filter.contains(&ExtensionProvides::DebugAdapters) { + condition = condition.add(extension_version::Column::ProvidesDebugAdapters.eq(true)); + } + condition } diff --git a/crates/collab/src/db/tables/extension_version.rs b/crates/collab/src/db/tables/extension_version.rs index 8c41c41a65..8072624871 100644 --- a/crates/collab/src/db/tables/extension_version.rs +++ b/crates/collab/src/db/tables/extension_version.rs @@ -27,6 +27,7 @@ pub struct Model { pub provides_slash_commands: bool, pub provides_indexed_docs_providers: bool, pub provides_snippets: bool, + pub provides_debug_adapters: bool, } impl Model { @@ -68,6 +69,10 @@ impl Model { provides.insert(ExtensionProvides::Snippets); } + if self.provides_debug_adapters { + provides.insert(ExtensionProvides::DebugAdapters); + } + provides } } diff --git a/crates/debugger_ui/src/debugger_panel.rs b/crates/debugger_ui/src/debugger_panel.rs index 1bbcba92f8..6e8fcdb2aa 100644 --- a/crates/debugger_ui/src/debugger_panel.rs +++ b/crates/debugger_ui/src/debugger_panel.rs @@ -1430,14 +1430,27 @@ impl Render for DebugPanel { ), ) .child( - h_flex().flex_shrink().child( - Button::new("spawn-new-session-empty-state", "New Session") - .size(ButtonSize::Large) - .on_click(|_, window, cx| { - window.dispatch_action(crate::Start.boxed_clone(), cx); - }), - ), - ), + v_flex().gap_4().items_center() + .justify_center() + .child( + h_flex().flex_shrink().child( + Button::new("spawn-new-session-empty-state", "New Session") + .size(ButtonSize::Large) + .on_click(|_, window, cx| { + window.dispatch_action(crate::Start.boxed_clone(), cx); + }) + ) + ) + .child( + h_flex().flex_shrink().child( + Button::new("spawn-new-session-install-extensions", "Install Debug Extensions") + .label_size(LabelSize::Small) + .on_click(|_, window, cx| { + window.dispatch_action(zed_actions::Extensions { category_filter: Some(zed_actions::ExtensionCategoryFilter::DebugAdapters)}.boxed_clone(), cx); + }) + ) + ) + ) ) } }) diff --git a/crates/extension_cli/src/main.rs b/crates/extension_cli/src/main.rs index 88d84da01e..9314819151 100644 --- a/crates/extension_cli/src/main.rs +++ b/crates/extension_cli/src/main.rs @@ -152,6 +152,10 @@ fn extension_provides(manifest: &ExtensionManifest) -> BTreeSet ExtensionProvides::Snippets, + ExtensionCategoryFilter::DebugAdapters => ExtensionProvides::DebugAdapters, }); let existing = workspace @@ -175,6 +176,7 @@ fn extension_provides_label(provides: ExtensionProvides) -> &'static str { ExtensionProvides::SlashCommands => "Slash Commands", ExtensionProvides::IndexedDocsProviders => "Indexed Docs Providers", ExtensionProvides::Snippets => "Snippets", + ExtensionProvides::DebugAdapters => "Debug Adapters", } } diff --git a/crates/rpc/src/extension.rs b/crates/rpc/src/extension.rs index a0e00e9e47..1ee55d5cce 100644 --- a/crates/rpc/src/extension.rs +++ b/crates/rpc/src/extension.rs @@ -45,6 +45,7 @@ pub enum ExtensionProvides { SlashCommands, IndexedDocsProviders, Snippets, + DebugAdapters, } #[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] diff --git a/crates/zed_actions/src/lib.rs b/crates/zed_actions/src/lib.rs index 3ad4534493..2afc8d38e6 100644 --- a/crates/zed_actions/src/lib.rs +++ b/crates/zed_actions/src/lib.rs @@ -53,6 +53,7 @@ pub enum ExtensionCategoryFilter { SlashCommands, IndexedDocsProviders, Snippets, + DebugAdapters, } #[derive(PartialEq, Clone, Default, Debug, Deserialize, JsonSchema)] diff --git a/docs/src/debugger.md b/docs/src/debugger.md index 776b903c8a..96430b5944 100644 --- a/docs/src/debugger.md +++ b/docs/src/debugger.md @@ -29,7 +29,8 @@ Zed supports a variety of debug adapters for different programming languages out These adapters enable Zed to provide a consistent debugging experience across multiple languages while leveraging the specific features and capabilities of each debugger. -> Is your desired debugger not listed? You can contribute by adding support for your favorite language or debugger. Check out our [debugger extensions](extensions/debugger-extensions.md) documentation for more information. +> Is your desired debugger not listed? You can install a [Debug Adapter extension](https://zed.dev/extensions?filter=debug-adapters) to add support for your favorite debugger. +> If that's not enough, you can contribute by creating an extension yourself. Check out our [debugger extensions](extensions/debugger-extensions.md) documentation for more information. ## Getting Started