From debd8701cda982965662a146fb2d643749fa8bd4 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Tue, 16 Sep 2025 15:37:34 -0600 Subject: [PATCH] Extension host --- crates/call/src/call_settings.rs | 21 +++++------- .../extension_host/src/extension_settings.rs | 34 +++++++++---------- crates/languages/src/lib.rs | 4 +-- crates/settings/src/settings_content.rs | 18 ++++++++++ 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/crates/call/src/call_settings.rs b/crates/call/src/call_settings.rs index 6fa10a77da327a2e02f15c2793e9d35b9a1f583e..cce8142903c17ec41244d346a79feb8f4cad70e6 100644 --- a/crates/call/src/call_settings.rs +++ b/crates/call/src/call_settings.rs @@ -1,35 +1,32 @@ -use anyhow::Result; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; use util::MergeFrom; -#[derive(Deserialize, Debug)] +#[derive(Debug)] pub struct CallSettings { pub mute_on_join: bool, pub share_on_join: bool, } impl Settings for CallSettings { - fn from_defaults(content: &settings::SettingsContent, cx: &mut App) -> Self { - let call = content.call.unwrap(); + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + let call = content.calls.clone().unwrap(); CallSettings { mute_on_join: call.mute_on_join.unwrap(), share_on_join: call.share_on_join.unwrap(), } } - fn refine(&mut self, content: &settings::SettingsContent, cx: &mut App) { - if let Some(call) = content.call.clone() { - self.mute_on_join.merge_from(call.mute_on_join); - self.share_on_join.merge_from(call.share_on_join); + fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) { + if let Some(call) = content.calls.clone() { + self.mute_on_join.merge_from(&call.mute_on_join); + self.share_on_join.merge_from(&call.share_on_join); } } fn import_from_vscode( _vscode: &settings::VsCodeSettings, - _current: &settings::SettingsContent, + _current: &mut settings::SettingsContent, ) { } } diff --git a/crates/extension_host/src/extension_settings.rs b/crates/extension_host/src/extension_settings.rs index fa5a613c55a76a0b5660b114d49acc17fcf79120..b9e1609b42d6e7fa2f4dab63486a77a13f29824f 100644 --- a/crates/extension_host/src/extension_settings.rs +++ b/crates/extension_host/src/extension_settings.rs @@ -1,13 +1,9 @@ -use anyhow::Result; use collections::HashMap; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::Settings; use std::sync::Arc; -#[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] +#[derive(Debug, Default, Clone)] pub struct ExtensionSettings { /// The extensions that should be automatically installed by Zed. /// @@ -15,9 +11,7 @@ pub struct ExtensionSettings { /// available out-of-the-box. /// /// Default: { "html": true } - #[serde(default)] pub auto_install_extensions: HashMap, bool>, - #[serde(default)] pub auto_update_extensions: HashMap, bool>, } @@ -39,18 +33,24 @@ impl ExtensionSettings { } impl Settings for ExtensionSettings { - type FileContent = Self; + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + Self { + auto_install_extensions: content.extension.auto_install_extensions.clone(), + auto_update_extensions: content.extension.auto_update_extensions.clone(), + } + } - fn load(sources: SettingsSources, _cx: &mut App) -> Result { - SettingsSources::::json_merge_with( - [sources.default] - .into_iter() - .chain(sources.user) - .chain(sources.server), - ) + fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) { + self.auto_install_extensions + .extend(content.extension.auto_install_extensions.clone()); + self.auto_update_extensions + .extend(content.extension.auto_update_extensions.clone()); } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) { + fn import_from_vscode( + _vscode: &settings::VsCodeSettings, + _current: &mut settings::SettingsContent, + ) { // settingsSync.ignoredExtensions controls autoupdate for vscode extensions, but we // don't have a mapping to zed-extensions. there's also extensions.autoCheckUpdates // and extensions.autoUpdate which are global switches, we don't support those yet diff --git a/crates/languages/src/lib.rs b/crates/languages/src/lib.rs index f83e9b3b8620dc9887d49313522eec2603c4273e..8ab84ed835a448649c732251fb4715fa8a776a85 100644 --- a/crates/languages/src/lib.rs +++ b/crates/languages/src/lib.rs @@ -312,8 +312,8 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime SettingsStore::update_global(cx, |settings, cx| { settings .set_extension_settings( - ExtensionsSettingsContent { - languages: language_settings.clone(), + settings::ExtensionsSettingsContent { + all_languages: language_settings.clone(), }, cx, ) diff --git a/crates/settings/src/settings_content.rs b/crates/settings/src/settings_content.rs index 3267d7cab3d13bd58f66193bbeb01d093b465cbe..8f279e5e4db2bfd2d17d78d7de4d8a550dd848e2 100644 --- a/crates/settings/src/settings_content.rs +++ b/crates/settings/src/settings_content.rs @@ -15,6 +15,7 @@ use release_channel::ReleaseChannel; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::env; +use std::sync::Arc; pub use util::serde::default_true; use crate::ActiveSettingsProfileName; @@ -27,6 +28,9 @@ pub struct SettingsContent { #[serde(flatten)] pub theme: ThemeSettingsContent, + #[serde(flatten)] + pub extension: ExtensionSettingsContent, + pub agent: Option, pub agent_servers: Option, @@ -327,3 +331,17 @@ pub struct CallSettingsContent { /// Default: false pub share_on_join: Option, } + +#[derive(Deserialize, Serialize, PartialEq, Debug, Default, Clone, JsonSchema)] +pub struct ExtensionSettingsContent { + /// The extensions that should be automatically installed by Zed. + /// + /// This is used to make functionality provided by extensions (e.g., language support) + /// available out-of-the-box. + /// + /// Default: { "html": true } + #[serde(default)] + pub auto_install_extensions: HashMap, bool>, + #[serde(default)] + pub auto_update_extensions: HashMap, bool>, +}