From 5f8226457ee6e1346a224ae6b0329f014ea883f7 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Fri, 7 Nov 2025 14:27:14 -0800 Subject: [PATCH] Automate settings registration (#42238) Release Notes: - N/A --------- Co-authored-by: Nia --- Cargo.lock | 4 -- crates/acp_thread/src/acp_thread.rs | 2 - crates/action_log/src/action_log.rs | 2 - crates/agent/Cargo.toml | 1 - crates/agent/src/agent.rs | 4 +- crates/agent/src/edit_agent.rs | 2 +- crates/agent/src/edit_agent/evals.rs | 5 -- crates/agent/src/native_agent_server.rs | 2 - crates/agent/src/tests/mod.rs | 6 -- crates/agent/src/tools/edit_file_tool.rs | 5 -- crates/agent/src/tools/find_path_tool.rs | 2 - crates/agent/src/tools/grep_tool.rs | 2 - crates/agent/src/tools/list_directory_tool.rs | 2 - crates/agent/src/tools/open_tool.rs | 2 - crates/agent/src/tools/read_file_tool.rs | 2 - crates/agent_servers/Cargo.toml | 2 - crates/agent_servers/src/e2e_tests.rs | 15 ++--- crates/agent_settings/src/agent_settings.rs | 8 +-- crates/agent_ui/src/acp/entry_view_state.rs | 10 +--- crates/agent_ui/src/acp/message_editor.rs | 6 -- crates/agent_ui/src/acp/thread_view.rs | 6 -- .../add_llm_provider_modal.rs | 10 +--- crates/agent_ui/src/agent_diff.rs | 13 +--- crates/agent_ui/src/agent_ui.rs | 2 - crates/agent_ui/src/buffer_codegen.rs | 7 +-- crates/agent_ui/src/context.rs | 2 - .../src/context_picker/completion_provider.rs | 9 --- crates/agent_ui/src/text_thread_editor.rs | 6 +- .../src/file_command.rs | 2 - .../src/assistant_text_thread_tests.rs | 4 -- crates/audio/src/audio.rs | 1 - crates/audio/src/audio_settings.rs | 4 +- crates/auto_update/src/auto_update.rs | 7 +-- crates/call/src/call_impl/mod.rs | 4 -- crates/call/src/call_settings.rs | 4 +- crates/channel/src/channel_store_tests.rs | 1 - crates/client/src/client.rs | 15 ++--- crates/client/src/telemetry.rs | 2 - crates/collab/src/tests/debug_panel_tests.rs | 3 - .../remote_editing_collaboration_tests.rs | 5 -- crates/collab/src/tests/test_server.rs | 3 - crates/collab_ui/src/collab_ui.rs | 4 -- crates/collab_ui/src/panel_settings.rs | 6 +- crates/command_palette/src/command_palette.rs | 3 - crates/copilot/Cargo.toml | 1 - .../src/copilot_completion_provider.rs | 5 -- crates/dap/src/client.rs | 5 +- crates/dap/src/debugger_settings.rs | 3 +- crates/debugger_ui/src/debugger_ui.rs | 3 - crates/debugger_ui/src/tests.rs | 3 - crates/diagnostics/src/diagnostics_tests.rs | 4 -- .../src/edit_prediction_context.rs | 2 - .../src/syntax_index.rs | 2 - crates/editor/benches/editor_render.rs | 5 -- crates/editor/src/display_map.rs | 5 +- crates/editor/src/editor.rs | 6 -- crates/editor/src/editor_settings.rs | 4 +- crates/editor/src/editor_tests.rs | 4 -- crates/editor/src/git/blame.rs | 5 -- crates/editor/src/inlays/inlay_hints.rs | 4 -- crates/editor/src/movement.rs | 5 +- .../src/test/editor_lsp_test_context.rs | 2 - crates/eval/src/eval.rs | 6 -- crates/extension_host/src/extension_host.rs | 2 - .../extension_host/src/extension_settings.rs | 4 +- .../src/extension_store_test.rs | 9 +-- crates/file_finder/src/file_finder.rs | 5 -- .../file_finder/src/file_finder_settings.rs | 4 +- crates/file_finder/src/file_finder_tests.rs | 3 - .../file_finder/src/open_path_prompt_tests.rs | 3 - crates/git_hosting_providers/src/settings.rs | 8 +-- crates/git_ui/src/file_diff_view.rs | 4 -- crates/git_ui/src/git_panel.rs | 7 +-- crates/git_ui/src/git_panel_settings.rs | 4 +- crates/git_ui/src/git_ui.rs | 4 -- crates/git_ui/src/project_diff.rs | 3 - crates/git_ui/src/text_diff_view.rs | 4 -- crates/go_to_line/src/cursor_position.rs | 4 +- crates/go_to_line/src/go_to_line.rs | 7 +-- crates/image_viewer/src/image_viewer.rs | 1 - .../image_viewer/src/image_viewer_settings.rs | 4 +- crates/journal/src/journal.rs | 6 +- .../src/ui_components/keystroke_input.rs | 3 - crates/language/src/buffer_tests.rs | 1 - crates/language/src/language.rs | 7 --- crates/language/src/language_settings.rs | 9 +-- crates/language_models/src/language_models.rs | 1 - crates/language_models/src/settings.rs | 9 +-- .../language_tools/src/lsp_log_view_tests.rs | 5 -- crates/languages/src/bash.rs | 1 - crates/languages/src/c.rs | 1 - crates/languages/src/python.rs | 1 - crates/languages/src/rust.rs | 1 - crates/languages/src/typescript.rs | 7 +-- crates/markdown/examples/markdown.rs | 1 - crates/markdown/examples/markdown_as_child.rs | 1 - crates/outline/src/outline.rs | 3 - crates/outline_panel/src/outline_panel.rs | 9 --- .../src/outline_panel_settings.rs | 3 +- crates/project/src/agent_server_store.rs | 4 +- crates/project/src/context_server_store.rs | 1 - crates/project/src/git_store/conflict_set.rs | 9 --- crates/project/src/git_store/git_traversal.rs | 1 - crates/project/src/image_store.rs | 2 - crates/project/src/project.rs | 14 +---- crates/project/src/project_settings.rs | 6 +- crates/project/src/project_tests.rs | 2 - crates/project_panel/src/project_panel.rs | 6 -- .../src/project_panel_settings.rs | 7 ++- .../project_panel/src/project_panel_tests.rs | 9 --- crates/project_symbols/src/project_symbols.rs | 3 - crates/recent_projects/src/recent_projects.rs | 9 +-- .../recent_projects/src/remote_connections.rs | 3 +- crates/remote_server/src/headless_project.rs | 5 +- .../remote_server/src/remote_editing_tests.rs | 8 +-- crates/remote_server/src/unix.rs | 2 - crates/repl/src/jupyter_settings.rs | 4 +- crates/repl/src/repl.rs | 4 -- crates/repl/src/repl_settings.rs | 4 +- crates/search/src/buffer_search.rs | 4 -- crates/search/src/project_search.rs | 4 -- crates/settings/Cargo.toml | 2 +- crates/settings/src/base_keymap_setting.rs | 6 +- crates/settings/src/settings.rs | 8 ++- crates/settings/src/settings_store.rs | 59 ++++++++++++++----- crates/settings_macros/src/settings_macros.rs | 24 ++++++++ .../src/settings_profile_selector.rs | 6 -- crates/settings_ui/src/settings_ui.rs | 3 - crates/storybook/Cargo.toml | 2 - crates/storybook/src/storybook.rs | 5 -- crates/tab_switcher/src/tab_switcher_tests.rs | 3 - crates/tasks_ui/src/tasks_ui.rs | 3 - crates/terminal/src/terminal.rs | 4 -- crates/terminal/src/terminal_settings.rs | 6 +- crates/terminal_view/src/terminal_panel.rs | 4 -- .../src/terminal_path_like_target.rs | 3 - crates/terminal_view/src/terminal_view.rs | 4 -- crates/theme/src/settings.rs | 4 +- crates/theme/src/theme.rs | 1 - crates/title_bar/src/title_bar.rs | 1 - crates/title_bar/src/title_bar_settings.rs | 4 +- crates/vim/src/test/vim_test_context.rs | 4 -- crates/vim/src/vim.rs | 4 +- crates/vim_mode_setting/Cargo.toml | 1 - .../vim_mode_setting/src/vim_mode_setting.rs | 11 +--- crates/workspace/src/item.rs | 5 +- crates/workspace/src/pane.rs | 2 - crates/workspace/src/workspace.rs | 13 ---- crates/workspace/src/workspace_settings.rs | 11 ++-- crates/worktree/src/worktree_settings.rs | 4 +- crates/worktree/src/worktree_tests.rs | 8 +-- crates/worktree_benchmarks/src/main.rs | 1 - crates/zed/src/main.rs | 4 +- crates/zed/src/zed.rs | 9 --- crates/zed/src/zed/open_listener.rs | 3 - crates/zeta/src/license_detection.rs | 4 +- crates/zeta/src/zeta.rs | 3 - crates/zeta2/src/udiff.rs | 2 - crates/zeta2/src/zeta2.rs | 2 - crates/zeta_cli/src/headless.rs | 5 -- crates/zlog_settings/src/zlog_settings.rs | 6 +- 161 files changed, 196 insertions(+), 599 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4553c965950a6f7f0ce74ee7c53265bd1c05c0c3..08ead914af69281a21c763b874bc57e8c84ac90d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -250,7 +250,6 @@ dependencies = [ "acp_tools", "action_log", "agent-client-protocol", - "agent_settings", "anyhow", "async-trait", "client", @@ -16218,7 +16217,6 @@ dependencies = [ "log", "menu", "picker", - "project", "reqwest_client", "rust-embed", "settings", @@ -16228,7 +16226,6 @@ dependencies = [ "theme", "title_bar", "ui", - "workspace", ] [[package]] @@ -18814,7 +18811,6 @@ dependencies = [ name = "vim_mode_setting" version = "0.1.0" dependencies = [ - "gpui", "settings", ] diff --git a/crates/acp_thread/src/acp_thread.rs b/crates/acp_thread/src/acp_thread.rs index ab534f691a657454daa97c11c625d0baef694809..a63dabf1fb25258b6f4255a5c67682165371b255 100644 --- a/crates/acp_thread/src/acp_thread.rs +++ b/crates/acp_thread/src/acp_thread.rs @@ -2377,8 +2377,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); - language::init(cx); }); } diff --git a/crates/action_log/src/action_log.rs b/crates/action_log/src/action_log.rs index 15c3fce5129faf022a574aa73c1c696fe4a12419..78265007a5abe3e724166610013ade776d82dbeb 100644 --- a/crates/action_log/src/action_log.rs +++ b/crates/action_log/src/action_log.rs @@ -1013,8 +1013,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/agent/Cargo.toml b/crates/agent/Cargo.toml index e962c876a38f788607706aad4e53ee5e0488b08d..cacbbd6e4e4423e2560fb963ef59daddce2309dc 100644 --- a/crates/agent/Cargo.toml +++ b/crates/agent/Cargo.toml @@ -63,7 +63,6 @@ streaming_diff.workspace = true strsim.workspace = true task.workspace = true telemetry.workspace = true -terminal.workspace = true text.workspace = true thiserror.workspace = true ui.workspace = true diff --git a/crates/agent/src/agent.rs b/crates/agent/src/agent.rs index 8f2c90667bf21943692cd87eed1153234dc6f89d..0e9372373a65ac5fee9870cf58e2b0d9c11427d2 100644 --- a/crates/agent/src/agent.rs +++ b/crates/agent/src/agent.rs @@ -1627,9 +1627,7 @@ mod internal_tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); - agent_settings::init(cx); - language::init(cx); + LanguageModelRegistry::test(cx); }); } diff --git a/crates/agent/src/edit_agent.rs b/crates/agent/src/edit_agent.rs index 829287f65478d56d793ed506c44a8331580cc4c5..2ecf3429d46540ea309052e833c3e40ea2a53cb5 100644 --- a/crates/agent/src/edit_agent.rs +++ b/crates/agent/src/edit_agent.rs @@ -1394,7 +1394,7 @@ mod tests { async fn init_test(cx: &mut TestAppContext) -> EditAgent { cx.update(settings::init); - cx.update(Project::init_settings); + let project = Project::test(FakeFs::new(cx.executor()), [], cx).await; let model = Arc::new(FakeLanguageModel::default()); let action_log = cx.new(|_| ActionLog::new(project.clone())); diff --git a/crates/agent/src/edit_agent/evals.rs b/crates/agent/src/edit_agent/evals.rs index 2cc6a6b4242a07b688d1232cd39d13797c70b02b..54aa6ae5c95022ee1ef022aed78d46533de356be 100644 --- a/crates/agent/src/edit_agent/evals.rs +++ b/crates/agent/src/edit_agent/evals.rs @@ -1468,14 +1468,9 @@ impl EditAgentTest { gpui_tokio::init(cx); let http_client = Arc::new(ReqwestClient::user_agent("agent tests").unwrap()); cx.set_http_client(http_client); - - client::init_settings(cx); let client = Client::production(cx); let user_store = cx.new(|cx| UserStore::new(client.clone(), cx)); - settings::init(cx); - Project::init_settings(cx); - language::init(cx); language_model::init(client.clone(), cx); language_models::init(user_store, client.clone(), cx); }); diff --git a/crates/agent/src/native_agent_server.rs b/crates/agent/src/native_agent_server.rs index b28009223b7a7f2232b440282a0d6f61907f442c..4c78c5a3f85b6628f9784fe7ecbadc8531b017d0 100644 --- a/crates/agent/src/native_agent_server.rs +++ b/crates/agent/src/native_agent_server.rs @@ -88,8 +88,6 @@ mod tests { async |fs, project, cx| { let auth = cx.update(|cx| { prompt_store::init(cx); - terminal::init(cx); - let registry = language_model::LanguageModelRegistry::read_global(cx); let auth = registry .provider(&language_model::ANTHROPIC_PROVIDER_ID) diff --git a/crates/agent/src/tests/mod.rs b/crates/agent/src/tests/mod.rs index 20fc40f242831552630f1e15f59917fd80b1ecdb..d80edca35de03578d0d557eb320dc77471a3b8fb 100644 --- a/crates/agent/src/tests/mod.rs +++ b/crates/agent/src/tests/mod.rs @@ -1851,7 +1851,6 @@ async fn test_agent_connection(cx: &mut TestAppContext) { // Initialize language model system with test provider cx.update(|cx| { gpui_tokio::init(cx); - client::init_settings(cx); let http_client = FakeHttpClient::with_404_response(); let clock = Arc::new(clock::FakeSystemClock::new()); @@ -1859,9 +1858,7 @@ async fn test_agent_connection(cx: &mut TestAppContext) { let user_store = cx.new(|cx| UserStore::new(client.clone(), cx)); language_model::init(client.clone(), cx); language_models::init(user_store, client.clone(), cx); - Project::init_settings(cx); LanguageModelRegistry::test(cx); - agent_settings::init(cx); }); cx.executor().forbid_parking(); @@ -2395,8 +2392,6 @@ async fn setup(cx: &mut TestAppContext, model: TestModel) -> ThreadTest { cx.update(|cx| { settings::init(cx); - Project::init_settings(cx); - agent_settings::init(cx); match model { TestModel::Fake => {} @@ -2404,7 +2399,6 @@ async fn setup(cx: &mut TestAppContext, model: TestModel) -> ThreadTest { gpui_tokio::init(cx); let http_client = ReqwestClient::user_agent("agent tests").unwrap(); cx.set_http_client(Arc::new(http_client)); - client::init_settings(cx); let client = Client::production(cx); let user_store = cx.new(|cx| UserStore::new(client.clone(), cx)); language_model::init(client.clone(), cx); diff --git a/crates/agent/src/tools/edit_file_tool.rs b/crates/agent/src/tools/edit_file_tool.rs index 0adff2dee3571f09b40ee69896c05e50c56b51b9..a507044ce51dce5e55c53106c11d8a9b2c2a3d28 100644 --- a/crates/agent/src/tools/edit_file_tool.rs +++ b/crates/agent/src/tools/edit_file_tool.rs @@ -562,7 +562,6 @@ fn resolve_path( mod tests { use super::*; use crate::{ContextServerRegistry, Templates}; - use client::TelemetrySettings; use fs::Fs; use gpui::{TestAppContext, UpdateGlobal}; use language_model::fake_provider::FakeLanguageModel; @@ -1753,10 +1752,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - TelemetrySettings::register(cx); - agent_settings::AgentSettings::register(cx); - Project::init_settings(cx); }); } } diff --git a/crates/agent/src/tools/find_path_tool.rs b/crates/agent/src/tools/find_path_tool.rs index 59f203cec98a17fda9e46f6fc222f3157d125060..41954ee31b2a4529e75541e78eff278a521307da 100644 --- a/crates/agent/src/tools/find_path_tool.rs +++ b/crates/agent/src/tools/find_path_tool.rs @@ -246,8 +246,6 @@ mod test { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } } diff --git a/crates/agent/src/tools/grep_tool.rs b/crates/agent/src/tools/grep_tool.rs index 7e78a3d1c4ba5492faf1ac7c879ab315366d724e..827852524559c7981ed180d406552daef95c47a0 100644 --- a/crates/agent/src/tools/grep_tool.rs +++ b/crates/agent/src/tools/grep_tool.rs @@ -778,8 +778,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/agent/src/tools/list_directory_tool.rs b/crates/agent/src/tools/list_directory_tool.rs index cd8b46ddebc2d9ffb953f8aabef10c30a33dde37..b7ceba5abf39ecd9a50a07b627a35f7231f4a339 100644 --- a/crates/agent/src/tools/list_directory_tool.rs +++ b/crates/agent/src/tools/list_directory_tool.rs @@ -223,8 +223,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/agent/src/tools/open_tool.rs b/crates/agent/src/tools/open_tool.rs index b98ae9af3bd98cd44bc9348e72519ceea53c6292..8826d1529ce43df0ea4a3e21795386874168de58 100644 --- a/crates/agent/src/tools/open_tool.rs +++ b/crates/agent/src/tools/open_tool.rs @@ -163,8 +163,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } } diff --git a/crates/agent/src/tools/read_file_tool.rs b/crates/agent/src/tools/read_file_tool.rs index f3ce8e35f2856a3dd53770eef48ec1091fe9b116..52f88aa4db03a2bc01b0fd10fe99f8bad04c24f1 100644 --- a/crates/agent/src/tools/read_file_tool.rs +++ b/crates/agent/src/tools/read_file_tool.rs @@ -509,8 +509,6 @@ mod test { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/agent_servers/Cargo.toml b/crates/agent_servers/Cargo.toml index d427290736f140e51cc9d9fc7285aa71fd9b2548..9a04fb763d0a5abe5d7dcf8df87048dd4cfd51dc 100644 --- a/crates/agent_servers/Cargo.toml +++ b/crates/agent_servers/Cargo.toml @@ -21,7 +21,6 @@ acp_tools.workspace = true acp_thread.workspace = true action_log.workspace = true agent-client-protocol.workspace = true -agent_settings.workspace = true anyhow.workspace = true async-trait.workspace = true client.workspace = true @@ -33,7 +32,6 @@ gpui.workspace = true gpui_tokio = { workspace = true, optional = true } http_client.workspace = true indoc.workspace = true -language.workspace = true language_model.workspace = true language_models.workspace = true log.workspace = true diff --git a/crates/agent_servers/src/e2e_tests.rs b/crates/agent_servers/src/e2e_tests.rs index 60480caa541ba1c39dba62ed709c157fd67fede0..7618625278121cc1426f06ed8626a68759f34995 100644 --- a/crates/agent_servers/src/e2e_tests.rs +++ b/crates/agent_servers/src/e2e_tests.rs @@ -6,7 +6,9 @@ use gpui::{AppContext, Entity, TestAppContext}; use indoc::indoc; #[cfg(test)] use project::agent_server_store::BuiltinAgentServerSettings; -use project::{FakeFs, Project, agent_server_store::AllAgentServersSettings}; +use project::{FakeFs, Project}; +#[cfg(test)] +use settings::Settings; use std::{ path::{Path, PathBuf}, sync::Arc, @@ -452,29 +454,22 @@ pub use common_e2e_tests; // Helpers pub async fn init_test(cx: &mut TestAppContext) -> Arc { - use settings::Settings; - env_logger::try_init().ok(); cx.update(|cx| { let settings_store = settings::SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); - language::init(cx); gpui_tokio::init(cx); let http_client = reqwest_client::ReqwestClient::user_agent("agent tests").unwrap(); cx.set_http_client(Arc::new(http_client)); - client::init_settings(cx); let client = client::Client::production(cx); let user_store = cx.new(|cx| client::UserStore::new(client.clone(), cx)); language_model::init(client.clone(), cx); language_models::init(user_store, client, cx); - agent_settings::init(cx); - AllAgentServersSettings::register(cx); #[cfg(test)] - AllAgentServersSettings::override_global( - AllAgentServersSettings { + project::agent_server_store::AllAgentServersSettings::override_global( + project::agent_server_store::AllAgentServersSettings { claude: Some(BuiltinAgentServerSettings { path: Some("claude-code-acp".into()), args: None, diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index c573f2688159619474051e1f7cfefb957f7154a8..084ac7c3e7a1be4920126f857145e64b65a255dd 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -10,7 +10,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::{ DefaultAgentView, DockPosition, LanguageModelParameters, LanguageModelSelection, - NotifyWhenAgentWaiting, Settings, + NotifyWhenAgentWaiting, RegisterSetting, Settings, }; pub use crate::agent_profile::*; @@ -19,11 +19,7 @@ pub const SUMMARIZE_THREAD_PROMPT: &str = include_str!("prompts/summarize_thread pub const SUMMARIZE_THREAD_DETAILED_PROMPT: &str = include_str!("prompts/summarize_thread_detailed_prompt.txt"); -pub fn init(cx: &mut App) { - AgentSettings::register(cx); -} - -#[derive(Clone, Debug)] +#[derive(Clone, Debug, RegisterSetting)] pub struct AgentSettings { pub enabled: bool, pub button: bool, diff --git a/crates/agent_ui/src/acp/entry_view_state.rs b/crates/agent_ui/src/acp/entry_view_state.rs index 382d0ee3c96ef002372046ee6a6111f8e814f892..60f39e47dceb6daebc72bba7e3e4a5fc70676dd6 100644 --- a/crates/agent_ui/src/acp/entry_view_state.rs +++ b/crates/agent_ui/src/acp/entry_view_state.rs @@ -401,10 +401,9 @@ mod tests { use acp_thread::{AgentConnection, StubAgentConnection}; use agent::HistoryStore; use agent_client_protocol as acp; - use agent_settings::AgentSettings; use assistant_text_thread::TextThreadStore; use buffer_diff::{DiffHunkStatus, DiffHunkStatusKind}; - use editor::{EditorSettings, RowInfo}; + use editor::RowInfo; use fs::FakeFs; use gpui::{AppContext as _, SemanticVersion, TestAppContext}; @@ -413,7 +412,7 @@ mod tests { use pretty_assertions::assert_matches; use project::Project; use serde_json::json; - use settings::{Settings as _, SettingsStore}; + use settings::SettingsStore; use util::path; use workspace::Workspace; @@ -539,13 +538,8 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - AgentSettings::register(cx); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - EditorSettings::register(cx); }); } } diff --git a/crates/agent_ui/src/acp/message_editor.rs b/crates/agent_ui/src/acp/message_editor.rs index 04fe4b2bfdac736fbfba7abecf68b2391d9b8192..8259cc5b0dc6076a4e636e7da0879324bbc2461a 100644 --- a/crates/agent_ui/src/acp/message_editor.rs +++ b/crates/agent_ui/src/acp/message_editor.rs @@ -1901,10 +1901,8 @@ mod tests { let app_state = cx.update(AppState::test); cx.update(|cx| { - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); let project = Project::test(app_state.fs.clone(), [path!("/dir").as_ref()], cx).await; @@ -2077,10 +2075,8 @@ mod tests { let app_state = cx.update(AppState::test); cx.update(|cx| { - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); app_state @@ -2907,10 +2903,8 @@ mod tests { let app_state = cx.update(AppState::test); cx.update(|cx| { - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); app_state diff --git a/crates/agent_ui/src/acp/thread_view.rs b/crates/agent_ui/src/acp/thread_view.rs index 13cd3988ae69a2203c77e1545bff2170f10b6f0c..daf2249909fc9a29df6969dba1ad51cc099c891c 100644 --- a/crates/agent_ui/src/acp/thread_view.rs +++ b/crates/agent_ui/src/acp/thread_view.rs @@ -5993,7 +5993,6 @@ pub(crate) mod tests { use acp_thread::StubAgentConnection; use agent_client_protocol::SessionId; use assistant_text_thread::TextThreadStore; - use editor::EditorSettings; use fs::FakeFs; use gpui::{EventEmitter, SemanticVersion, TestAppContext, VisualTestContext}; use project::Project; @@ -6511,13 +6510,8 @@ pub(crate) mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - AgentSettings::register(cx); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - EditorSettings::register(cx); prompt_store::init(cx) }); } diff --git a/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs b/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs index 8f4fdeacf303c9869e903bde95326c80fba10126..f41b59132d8c0dfe5ed39fe84775e61b8131cc0a 100644 --- a/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs +++ b/crates/agent_ui/src/agent_configuration/add_llm_provider_modal.rs @@ -515,16 +515,14 @@ impl Render for AddLlmProviderModal { #[cfg(test)] mod tests { use super::*; - use editor::EditorSettings; use fs::FakeFs; use gpui::{TestAppContext, VisualTestContext}; - use language::language_settings; use language_model::{ LanguageModelProviderId, LanguageModelProviderName, fake_provider::FakeLanguageModelProvider, }; use project::Project; - use settings::{Settings as _, SettingsStore}; + use settings::SettingsStore; use util::path; #[gpui::test] @@ -730,13 +728,9 @@ mod tests { cx.update(|cx| { let store = SettingsStore::test(cx); cx.set_global(store); - workspace::init_settings(cx); - Project::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); - language_settings::init(cx); - EditorSettings::register(cx); + language_model::init_settings(cx); - language_models::init_settings(cx); }); let fs = FakeFs::new(cx.executor()); diff --git a/crates/agent_ui/src/agent_diff.rs b/crates/agent_ui/src/agent_diff.rs index 7199c49546154dfcc0b23c67876e6a49b190c804..85e3264458364f10d1c90d7c18c3609c9c7a7fd4 100644 --- a/crates/agent_ui/src/agent_diff.rs +++ b/crates/agent_ui/src/agent_diff.rs @@ -1717,12 +1717,11 @@ mod tests { use super::*; use crate::Keep; use acp_thread::AgentConnection as _; - use agent_settings::AgentSettings; use editor::EditorSettings; use gpui::{TestAppContext, UpdateGlobal, VisualTestContext}; use project::{FakeFs, Project}; use serde_json::json; - use settings::{Settings, SettingsStore}; + use settings::SettingsStore; use std::{path::Path, rc::Rc}; use util::path; @@ -1731,13 +1730,8 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - AgentSettings::register(cx); prompt_store::init(cx); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); - EditorSettings::register(cx); language_model::init_settings(cx); }); @@ -1890,13 +1884,8 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - AgentSettings::register(cx); prompt_store::init(cx); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); - EditorSettings::register(cx); language_model::init_settings(cx); workspace::register_project_item::(cx); }); diff --git a/crates/agent_ui/src/agent_ui.rs b/crates/agent_ui/src/agent_ui.rs index e4ac00bba52f91a5eea3d668337eef38a39ad249..781374f117d24b2265a16a5aa9260690850d10d4 100644 --- a/crates/agent_ui/src/agent_ui.rs +++ b/crates/agent_ui/src/agent_ui.rs @@ -247,8 +247,6 @@ pub fn init( is_eval: bool, cx: &mut App, ) { - AgentSettings::register(cx); - assistant_text_thread::init(client.clone(), cx); rules_library::init(cx); if !is_eval { diff --git a/crates/agent_ui/src/buffer_codegen.rs b/crates/agent_ui/src/buffer_codegen.rs index 215e2a74d7be9cbcb18442dcefa1581d08eec7b2..51c3c5ad3cb2b89c85e3a276ff34af5cc46115f9 100644 --- a/crates/agent_ui/src/buffer_codegen.rs +++ b/crates/agent_ui/src/buffer_codegen.rs @@ -1082,10 +1082,7 @@ mod tests { }; use gpui::TestAppContext; use indoc::indoc; - use language::{ - Buffer, Language, LanguageConfig, LanguageMatcher, Point, language_settings, - tree_sitter_rust, - }; + use language::{Buffer, Language, LanguageConfig, LanguageMatcher, Point, tree_sitter_rust}; use language_model::{LanguageModelRegistry, TokenUsage}; use rand::prelude::*; use settings::SettingsStore; @@ -1465,8 +1462,6 @@ mod tests { fn init_test(cx: &mut TestAppContext) { cx.update(LanguageModelRegistry::test); cx.set_global(cx.update(SettingsStore::test)); - cx.update(Project::init_settings); - cx.update(language_settings::init); } fn simulate_response_stream( diff --git a/crates/agent_ui/src/context.rs b/crates/agent_ui/src/context.rs index 022f4e4d2ff4ce79aa17efce241b84f1a0640ae3..0bbf4d45ee56bf8220987f52fd7a1f6aa0a73055 100644 --- a/crates/agent_ui/src/context.rs +++ b/crates/agent_ui/src/context.rs @@ -1075,8 +1075,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/agent_ui/src/context_picker/completion_provider.rs b/crates/agent_ui/src/context_picker/completion_provider.rs index 2dd950b1138f53527c91814131a3bd505979bb09..1fa128cde82dba900136ad6d136aad858512f169 100644 --- a/crates/agent_ui/src/context_picker/completion_provider.rs +++ b/crates/agent_ui/src/context_picker/completion_provider.rs @@ -1182,10 +1182,8 @@ mod tests { let app_state = cx.update(AppState::test); cx.update(|cx| { - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); app_state @@ -1486,10 +1484,8 @@ mod tests { let app_state = cx.update(AppState::test); cx.update(|cx| { - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); app_state @@ -1686,11 +1682,6 @@ mod tests { let store = SettingsStore::test(cx); cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); - client::init_settings(cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); - editor::init_settings(cx); }); } } diff --git a/crates/agent_ui/src/text_thread_editor.rs b/crates/agent_ui/src/text_thread_editor.rs index 44c80a2258d1146fb7a5f2fb6124d08d61d8cb57..be77ec05fe3afbecab5373bd97ec23ee77dd614a 100644 --- a/crates/agent_ui/src/text_thread_editor.rs +++ b/crates/agent_ui/src/text_thread_editor.rs @@ -3223,11 +3223,7 @@ mod tests { prompt_store::init(cx); LanguageModelRegistry::test(cx); cx.set_global(settings_store); - language::init(cx); - agent_settings::init(cx); - Project::init_settings(cx); + theme::init(theme::LoadThemes::JustBase, cx); - workspace::init_settings(cx); - editor::init_settings(cx); } } diff --git a/crates/assistant_slash_commands/src/file_command.rs b/crates/assistant_slash_commands/src/file_command.rs index 6fe1a410d3551fe72737500ad8b143a392645d1b..a17e198ed300f00f70d35149cbe0286af3a65a57 100644 --- a/crates/assistant_slash_commands/src/file_command.rs +++ b/crates/assistant_slash_commands/src/file_command.rs @@ -577,8 +577,6 @@ mod test { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); // release_channel::init(SemanticVersion::default(), cx); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/assistant_text_thread/src/assistant_text_thread_tests.rs b/crates/assistant_text_thread/src/assistant_text_thread_tests.rs index fbd5dcafa6e142538f1f5821bc9e0a89ccbfd881..75a414dfc4428b3c101a72454bb185b5a171d692 100644 --- a/crates/assistant_text_thread/src/assistant_text_thread_tests.rs +++ b/crates/assistant_text_thread/src/assistant_text_thread_tests.rs @@ -22,7 +22,6 @@ use language_model::{ }; use parking_lot::Mutex; use pretty_assertions::assert_eq; -use project::Project; use prompt_store::PromptBuilder; use rand::prelude::*; use serde_json::json; @@ -1411,9 +1410,6 @@ fn init_test(cx: &mut App) { prompt_store::init(cx); LanguageModelRegistry::test(cx); cx.set_global(settings_store); - language::init(cx); - agent_settings::init(cx); - Project::init_settings(cx); } #[derive(Clone)] diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index 9ad5a36a374d87b2cdcc6434377da3652af97786..2c1f770530107733c9d9f3bbf39be5cc9d9ff05e 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -48,7 +48,6 @@ pub const LEGACY_CHANNEL_COUNT: NonZero = nz!(2); pub const REPLAY_DURATION: Duration = Duration::from_secs(30); pub fn init(cx: &mut App) { - AudioSettings::register(cx); LIVE_SETTINGS.initialize(cx); } diff --git a/crates/audio/src/audio_settings.rs b/crates/audio/src/audio_settings.rs index 61a993c3358e5e2bf39b626a0764833508bee742..f86246292833bf285904cbc27f675f8ad1ebc856 100644 --- a/crates/audio/src/audio_settings.rs +++ b/crates/audio/src/audio_settings.rs @@ -1,9 +1,9 @@ use std::sync::atomic::{AtomicBool, Ordering}; use gpui::App; -use settings::{Settings, SettingsStore}; +use settings::{RegisterSetting, Settings, SettingsStore}; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, RegisterSetting)] pub struct AudioSettings { /// Opt into the new audio system. /// diff --git a/crates/auto_update/src/auto_update.rs b/crates/auto_update/src/auto_update.rs index 561f4f3ea3749a6d6146714372df0c33f3e3e877..1997beaf11cb2b1d29cc759c5e5f8a6ad6f51eb8 100644 --- a/crates/auto_update/src/auto_update.rs +++ b/crates/auto_update/src/auto_update.rs @@ -10,7 +10,7 @@ use http_client::{AsyncBody, HttpClient, HttpClientWithUrl}; use paths::remote_servers_dir; use release_channel::{AppCommitSha, ReleaseChannel}; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsStore}; +use settings::{RegisterSetting, Settings, SettingsStore}; use smol::{fs, io::AsyncReadExt}; use smol::{fs::File, process::Command}; use std::mem; @@ -120,7 +120,7 @@ impl Drop for MacOsUnmounter<'_> { } } -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, RegisterSetting)] struct AutoUpdateSetting(bool); /// Whether or not to automatically check for updates. @@ -138,8 +138,6 @@ struct GlobalAutoUpdate(Option>); impl Global for GlobalAutoUpdate {} pub fn init(http_client: Arc, cx: &mut App) { - AutoUpdateSetting::register(cx); - cx.observe_new(|workspace: &mut Workspace, _window, _cx| { workspace.register_action(|_, action, window, cx| check(action, window, cx)); @@ -1028,7 +1026,6 @@ mod tests { .set_user_settings("{}", cx) .expect("Unable to set user settings"); cx.set_global(store); - AutoUpdateSetting::register(cx); assert!(AutoUpdateSetting::get_global(cx).0); }); } diff --git a/crates/call/src/call_impl/mod.rs b/crates/call/src/call_impl/mod.rs index 156a80faba61d2a4946bafa5943c167284d14a97..b4fcdb2552a440f897504910a99f30a182134c09 100644 --- a/crates/call/src/call_impl/mod.rs +++ b/crates/call/src/call_impl/mod.rs @@ -1,7 +1,6 @@ pub mod participant; pub mod room; -use crate::call_settings::CallSettings; use anyhow::{Context as _, Result, anyhow}; use audio::Audio; use client::{ChannelId, Client, TypedEnvelope, User, UserStore, ZED_ALWAYS_ACTIVE, proto}; @@ -14,7 +13,6 @@ use gpui::{ use postage::watch; use project::Project; use room::Event; -use settings::Settings; use std::sync::Arc; pub use livekit_client::{RemoteVideoTrack, RemoteVideoTrackView, RemoteVideoTrackViewEvent}; @@ -26,8 +24,6 @@ struct GlobalActiveCall(Entity); impl Global for GlobalActiveCall {} pub fn init(client: Arc, user_store: Entity, cx: &mut App) { - CallSettings::register(cx); - let active_call = cx.new(|cx| ActiveCall::new(client, user_store, cx)); cx.set_global(GlobalActiveCall(active_call)); } diff --git a/crates/call/src/call_settings.rs b/crates/call/src/call_settings.rs index 6c2b25ae60269b7004916cb1ed020cc67006af0b..1b10a8bc34f7d38c11e7587bb44a677adce0d0d1 100644 --- a/crates/call/src/call_settings.rs +++ b/crates/call/src/call_settings.rs @@ -1,6 +1,6 @@ -use settings::Settings; +use settings::{RegisterSetting, Settings}; -#[derive(Debug)] +#[derive(Debug, RegisterSetting)] pub struct CallSettings { pub mute_on_join: bool, pub share_on_join: bool, diff --git a/crates/channel/src/channel_store_tests.rs b/crates/channel/src/channel_store_tests.rs index fbdfe9f8b59f2b5e47720bb497c56b47c8abb77e..c3a6e80955605be096ba9b1cdb6975b5ab2ee389 100644 --- a/crates/channel/src/channel_store_tests.rs +++ b/crates/channel/src/channel_store_tests.rs @@ -237,7 +237,6 @@ fn init_test(cx: &mut App) -> Entity { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); release_channel::init(SemanticVersion::default(), cx); - client::init_settings(cx); let clock = Arc::new(FakeSystemClock::new()); let http = FakeHttpClient::with_404_response(); diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 5aff87155f3a0328aa017060604b5fc79604731e..3e220b0275270c04098ebb8cf3f5564cc3ca0342 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -30,7 +30,7 @@ use rand::prelude::*; use release_channel::{AppVersion, ReleaseChannel}; use rpc::proto::{AnyTypedEnvelope, EnvelopedMessage, PeerId, RequestMessage}; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsContent}; +use settings::{RegisterSetting, Settings, SettingsContent}; use std::{ any::TypeId, convert::TryFrom, @@ -95,7 +95,7 @@ actions!( ] ); -#[derive(Deserialize)] +#[derive(Deserialize, RegisterSetting)] pub struct ClientSettings { pub server_url: String, } @@ -113,7 +113,7 @@ impl Settings for ClientSettings { } } -#[derive(Deserialize, Default)] +#[derive(Deserialize, Default, RegisterSetting)] pub struct ProxySettings { pub proxy: Option, } @@ -140,12 +140,6 @@ impl Settings for ProxySettings { } } -pub fn init_settings(cx: &mut App) { - TelemetrySettings::register(cx); - ClientSettings::register(cx); - ProxySettings::register(cx); -} - pub fn init(client: &Arc, cx: &mut App) { let client = Arc::downgrade(client); cx.on_action({ @@ -508,7 +502,7 @@ impl Drop for PendingEntitySubscription { } } -#[derive(Copy, Clone, Deserialize, Debug)] +#[derive(Copy, Clone, Deserialize, Debug, RegisterSetting)] pub struct TelemetrySettings { pub diagnostics: bool, pub metrics: bool, @@ -2177,7 +2171,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - init_settings(cx); }); } } diff --git a/crates/client/src/telemetry.rs b/crates/client/src/telemetry.rs index 35c8d0d7d022a96068914a10898d88c46f8dabd6..d2ec4726400df16fa10730b4d3516167640637fc 100644 --- a/crates/client/src/telemetry.rs +++ b/crates/client/src/telemetry.rs @@ -179,8 +179,6 @@ impl Telemetry { let release_channel = ReleaseChannel::try_global(cx).map(|release_channel| release_channel.display_name()); - TelemetrySettings::register(cx); - let state = Arc::new(Mutex::new(TelemetryState { settings: *TelemetrySettings::get_global(cx), architecture: env::consts::ARCH, diff --git a/crates/collab/src/tests/debug_panel_tests.rs b/crates/collab/src/tests/debug_panel_tests.rs index 95a2e80ac4f88295727e9fa314d0a752d0afc43e..d1659e5114b9ba5bfd09514e092c60fa74ad4f8e 100644 --- a/crates/collab/src/tests/debug_panel_tests.rs +++ b/crates/collab/src/tests/debug_panel_tests.rs @@ -23,9 +23,6 @@ pub fn init_test(cx: &mut gpui::TestAppContext) { cx.update(|cx| { theme::init(theme::LoadThemes::JustBase, cx); command_palette_hooks::init(cx); - language::init(cx); - workspace::init_settings(cx); - project::Project::init_settings(cx); debugger_ui::init(cx); editor::init(cx); }); diff --git a/crates/collab/src/tests/remote_editing_collaboration_tests.rs b/crates/collab/src/tests/remote_editing_collaboration_tests.rs index 7fb76ffd16dda9f556a22eeefd78c72f80dc1457..883bfa18725b02e4359aba371710c6e96efef73b 100644 --- a/crates/collab/src/tests/remote_editing_collaboration_tests.rs +++ b/crates/collab/src/tests/remote_editing_collaboration_tests.rs @@ -84,7 +84,6 @@ async fn test_sharing_an_ssh_remote_project( let node = NodeRuntime::unavailable(); let languages = Arc::new(LanguageRegistry::new(server_cx.executor())); let _headless_project = server_cx.new(|cx| { - client::init_settings(cx); HeadlessProject::new( HeadlessAppState { session: server_ssh, @@ -245,7 +244,6 @@ async fn test_ssh_collaboration_git_branches( let node = NodeRuntime::unavailable(); let languages = Arc::new(LanguageRegistry::new(server_cx.executor())); let headless_project = server_cx.new(|cx| { - client::init_settings(cx); HeadlessProject::new( HeadlessAppState { session: server_ssh, @@ -450,7 +448,6 @@ async fn test_ssh_collaboration_formatting_with_prettier( server_cx.update(HeadlessProject::init); let remote_http_client = Arc::new(BlockedHttpClient); let _headless_project = server_cx.new(|cx| { - client::init_settings(cx); HeadlessProject::new( HeadlessAppState { session: server_ssh, @@ -612,7 +609,6 @@ async fn test_remote_server_debugger( let node = NodeRuntime::unavailable(); let languages = Arc::new(LanguageRegistry::new(server_cx.executor())); let _headless_project = server_cx.new(|cx| { - client::init_settings(cx); HeadlessProject::new( HeadlessAppState { session: server_ssh, @@ -721,7 +717,6 @@ async fn test_slow_adapter_startup_retries( let node = NodeRuntime::unavailable(); let languages = Arc::new(LanguageRegistry::new(server_cx.executor())); let _headless_project = server_cx.new(|cx| { - client::init_settings(cx); HeadlessProject::new( HeadlessAppState { session: server_ssh, diff --git a/crates/collab/src/tests/test_server.rs b/crates/collab/src/tests/test_server.rs index fbff269494f3f1ae5fb48d124ad090e61a558f31..0afaccf80cae609ae3264b9b5e374964b01b6f38 100644 --- a/crates/collab/src/tests/test_server.rs +++ b/crates/collab/src/tests/test_server.rs @@ -174,7 +174,6 @@ impl TestServer { cx.set_global(settings); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - client::init_settings(cx); }); let clock = Arc::new(FakeSystemClock::new()); @@ -345,7 +344,6 @@ impl TestServer { theme::init(theme::LoadThemes::JustBase, cx); Project::init(&client, cx); client::init(&client, cx); - language::init(cx); editor::init(cx); workspace::init(app_state.clone(), cx); call::init(client.clone(), user_store.clone(), cx); @@ -359,7 +357,6 @@ impl TestServer { ); language_model::LanguageModelRegistry::test(cx); assistant_text_thread::init(client.clone(), cx); - agent_settings::init(cx); }); client diff --git a/crates/collab_ui/src/collab_ui.rs b/crates/collab_ui/src/collab_ui.rs index c43e865ef2dcbcd05a9b75cdde5e06bb0679de89..6a4b2b93d7a5cc970a374c5dc2732fd58b3a98a5 100644 --- a/crates/collab_ui/src/collab_ui.rs +++ b/crates/collab_ui/src/collab_ui.rs @@ -13,14 +13,10 @@ use gpui::{ }; pub use panel_settings::{CollaborationPanelSettings, NotificationPanelSettings}; use release_channel::ReleaseChannel; -use settings::Settings; use ui::px; use workspace::AppState; pub fn init(app_state: &Arc, cx: &mut App) { - CollaborationPanelSettings::register(cx); - NotificationPanelSettings::register(cx); - channel_view::init(cx); collab_panel::init(cx); notification_panel::init(cx); diff --git a/crates/collab_ui/src/panel_settings.rs b/crates/collab_ui/src/panel_settings.rs index cd19835c164161543030f552650ec35d7e6e0fe6..ebd021be4b56f4051feae01f3fef7a063c3a8214 100644 --- a/crates/collab_ui/src/panel_settings.rs +++ b/crates/collab_ui/src/panel_settings.rs @@ -1,16 +1,16 @@ use gpui::Pixels; -use settings::Settings; +use settings::{RegisterSetting, Settings}; use ui::px; use workspace::dock::DockPosition; -#[derive(Debug)] +#[derive(Debug, RegisterSetting)] pub struct CollaborationPanelSettings { pub button: bool, pub dock: DockPosition, pub default_width: Pixels, } -#[derive(Debug)] +#[derive(Debug, RegisterSetting)] pub struct NotificationPanelSettings { pub button: bool, pub dock: DockPosition, diff --git a/crates/command_palette/src/command_palette.rs b/crates/command_palette/src/command_palette.rs index aacc7c5262c87bf8bcf2d17f7bbda1a63b020f91..d971bca1f01e878d7517c1d13f525dfbf8e47afa 100644 --- a/crates/command_palette/src/command_palette.rs +++ b/crates/command_palette/src/command_palette.rs @@ -28,7 +28,6 @@ use workspace::{ModalView, Workspace, WorkspaceSettings}; use zed_actions::{OpenZedUrl, command_palette::Toggle}; pub fn init(cx: &mut App) { - client::init_settings(cx); command_palette_hooks::init(cx); cx.observe_new(CommandPalette::register).detach(); } @@ -789,13 +788,11 @@ mod tests { cx.update(|cx| { let app_state = AppState::test(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); editor::init(cx); menu::init(); go_to_line::init(cx); workspace::init(app_state.clone(), cx); init(cx); - Project::init_settings(cx); cx.bind_keys(KeymapFile::load_panic_on_failure( r#"[ { diff --git a/crates/copilot/Cargo.toml b/crates/copilot/Cargo.toml index d9ea4709eadcfab2f6a91c793ac63933dbae545a..0d3b19c0c7bd264f8ed10e53289376055f833307 100644 --- a/crates/copilot/Cargo.toml +++ b/crates/copilot/Cargo.toml @@ -26,7 +26,6 @@ test-support = [ [dependencies] anyhow.workspace = true chrono.workspace = true -client.workspace = true collections.workspace = true command_palette_hooks.workspace = true dirs.workspace = true diff --git a/crates/copilot/src/copilot_completion_provider.rs b/crates/copilot/src/copilot_completion_provider.rs index 6027c081ccef31bfdeb83cb944dcba861bc95da8..ba8ae82508896884f1b6e9741e7ccd6fd78dce76 100644 --- a/crates/copilot/src/copilot_completion_provider.rs +++ b/crates/copilot/src/copilot_completion_provider.rs @@ -1115,11 +1115,6 @@ mod tests { let store = SettingsStore::test(cx); cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); - client::init_settings(cx); - language::init(cx); - editor::init_settings(cx); - Project::init_settings(cx); - workspace::init_settings(cx); SettingsStore::update_global(cx, |store: &mut SettingsStore, cx| { store.update_user_settings(cx, |settings| f(&mut settings.project.all_languages)); }); diff --git a/crates/dap/src/client.rs b/crates/dap/src/client.rs index 15801e989169677f6e42bdd7b9c5642d82ea644a..0e3db35107836adfed411415582ff89f46706f36 100644 --- a/crates/dap/src/client.rs +++ b/crates/dap/src/client.rs @@ -256,7 +256,7 @@ impl DebugAdapterClient { #[cfg(test)] mod tests { use super::*; - use crate::{client::DebugAdapterClient, debugger_settings::DebuggerSettings}; + use crate::client::DebugAdapterClient; use dap_types::{ Capabilities, InitializeRequestArguments, InitializeRequestArgumentsPathFormat, RunInTerminalRequestArguments, StartDebuggingRequestArguments, @@ -265,7 +265,7 @@ mod tests { }; use gpui::TestAppContext; use serde_json::json; - use settings::{Settings, SettingsStore}; + use settings::SettingsStore; use std::sync::{ Arc, atomic::{AtomicBool, Ordering}, @@ -277,7 +277,6 @@ mod tests { cx.update(|cx| { let settings = SettingsStore::test(cx); cx.set_global(settings); - DebuggerSettings::register(cx); }); } diff --git a/crates/dap/src/debugger_settings.rs b/crates/dap/src/debugger_settings.rs index dc38c9a0616ff8d37bdfd33f269a4fec9a6395b2..8b2f1bf8d6c5e00fdb6b38eca4d7b43727bd88a4 100644 --- a/crates/dap/src/debugger_settings.rs +++ b/crates/dap/src/debugger_settings.rs @@ -1,6 +1,7 @@ use dap_types::SteppingGranularity; -use settings::{Settings, SettingsContent}; +use settings::{RegisterSetting, Settings, SettingsContent}; +#[derive(Debug, RegisterSetting)] pub struct DebuggerSettings { /// Determines the stepping granularity. /// diff --git a/crates/debugger_ui/src/debugger_ui.rs b/crates/debugger_ui/src/debugger_ui.rs index 78cc9e9bd28beb31474c12662d7e118eae6f066e..0e38719c19b636918b441440568e8588e29b039e 100644 --- a/crates/debugger_ui/src/debugger_ui.rs +++ b/crates/debugger_ui/src/debugger_ui.rs @@ -1,6 +1,5 @@ use std::any::TypeId; -use dap::debugger_settings::DebuggerSettings; use debugger_panel::DebugPanel; use editor::Editor; use gpui::{Action, App, DispatchPhase, EntityInputHandler, actions}; @@ -10,7 +9,6 @@ use project::debugger::{self, breakpoint_store::SourceBreakpoint, session::Threa use schemars::JsonSchema; use serde::Deserialize; use session::DebugSession; -use settings::Settings; use stack_trace_view::StackTraceView; use tasks_ui::{Spawn, TaskOverrides}; use ui::{FluentBuilder, InteractiveElement}; @@ -115,7 +113,6 @@ actions!( ); pub fn init(cx: &mut App) { - DebuggerSettings::register(cx); workspace::FollowableViewRegistry::register::(cx); cx.observe_new(|workspace: &mut Workspace, _, _| { diff --git a/crates/debugger_ui/src/tests.rs b/crates/debugger_ui/src/tests.rs index ac3fdf1f18c8250e0d8c3b897682652e694e2170..4f020e7cd4d62250b101e01d586ca02beefecd71 100644 --- a/crates/debugger_ui/src/tests.rs +++ b/crates/debugger_ui/src/tests.rs @@ -43,9 +43,6 @@ pub fn init_test(cx: &mut gpui::TestAppContext) { terminal_view::init(cx); theme::init(theme::LoadThemes::JustBase, cx); command_palette_hooks::init(cx); - language::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); editor::init(cx); crate::init(cx); dap_adapters::init(cx); diff --git a/crates/diagnostics/src/diagnostics_tests.rs b/crates/diagnostics/src/diagnostics_tests.rs index 4b167f8cea678f1c853b0c42bf652335e79c9ddb..3d1d3840108c6842d57190bd56fd9db3984af7c6 100644 --- a/crates/diagnostics/src/diagnostics_tests.rs +++ b/crates/diagnostics/src/diagnostics_tests.rs @@ -2021,10 +2021,6 @@ fn init_test(cx: &mut TestAppContext) { let settings = SettingsStore::test(cx); cx.set_global(settings); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - client::init_settings(cx); - workspace::init_settings(cx); - Project::init_settings(cx); crate::init(cx); editor::init(cx); }); diff --git a/crates/edit_prediction_context/src/edit_prediction_context.rs b/crates/edit_prediction_context/src/edit_prediction_context.rs index f52a2259cf83ff992a904b6b5c9b3ceea7c0a71e..65623a825c2f7e2db42b98174748e5f04fb91d2a 100644 --- a/crates/edit_prediction_context/src/edit_prediction_context.rs +++ b/crates/edit_prediction_context/src/edit_prediction_context.rs @@ -236,8 +236,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); let fs = FakeFs::new(cx.executor()); diff --git a/crates/edit_prediction_context/src/syntax_index.rs b/crates/edit_prediction_context/src/syntax_index.rs index 76aa10c076d95aa10bd830bace23ad7b410d8102..f489a083341b66c7cca3cdad76a9c7ea16fdc959 100644 --- a/crates/edit_prediction_context/src/syntax_index.rs +++ b/crates/edit_prediction_context/src/syntax_index.rs @@ -972,8 +972,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); let fs = FakeFs::new(cx.executor()); diff --git a/crates/editor/benches/editor_render.rs b/crates/editor/benches/editor_render.rs index 0ae1af5537fb62a7658ccd306545503b818c28ae..cb7f37810aad04f8c6a73440c7da93658224ba26 100644 --- a/crates/editor/benches/editor_render.rs +++ b/crates/editor/benches/editor_render.rs @@ -4,7 +4,6 @@ use editor::{ actions::{DeleteToPreviousWordStart, SelectAll, SplitSelectionIntoLines}, }; use gpui::{AppContext, Focusable as _, TestAppContext, TestDispatcher}; -use project::Project; use rand::{Rng as _, SeedableRng as _, rngs::StdRng}; use settings::SettingsStore; use ui::IntoElement; @@ -125,10 +124,6 @@ pub fn benches() { assets::Assets.load_test_fonts(cx); theme::init(theme::LoadThemes::JustBase, cx); // release_channel::init(SemanticVersion::default(), cx); - client::init_settings(cx); - language::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); editor::init(cx); }); diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 850c4ca61c0c3a5a295f85b191df18177dc5f403..ebcc53b09bfbb9466a80d639d17cadfe2927a27e 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -1577,7 +1577,7 @@ pub mod tests { LanguageMatcher, }; use lsp::LanguageServerId; - use project::Project; + use rand::{Rng, prelude::*}; use settings::{SettingsContent, SettingsStore}; use smol::stream::StreamExt; @@ -2966,10 +2966,7 @@ pub mod tests { fn init_test(cx: &mut App, f: impl Fn(&mut SettingsContent)) { let settings = SettingsStore::test(cx); cx.set_global(settings); - workspace::init_settings(cx); - language::init(cx); crate::init(cx); - Project::init_settings(cx); theme::init(LoadThemes::JustBase, cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, f); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index cb93bd94438812e37ba62fbdd2cb43dfa2507adf..c7c6fee74216cf872be3e201034bb139458afa45 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -310,13 +310,7 @@ pub enum HideMouseCursorOrigin { MovementAction, } -pub fn init_settings(cx: &mut App) { - EditorSettings::register(cx); -} - pub fn init(cx: &mut App) { - init_settings(cx); - cx.set_global(GlobalBlameRenderer(Arc::new(()))); workspace::register_project_item::(cx); diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index 635bb5f4aca11b3328393b846ca1ea2b3c192899..9e78ca4ef7f829d74907d3fdb33c561d55f9d2dc 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -8,12 +8,12 @@ pub use settings::{ GoToDefinitionFallback, HideMouseMode, MinimapThumb, MinimapThumbBorder, MultiCursorModifier, ScrollBeyondLastLine, ScrollbarDiagnostics, SeedQuerySetting, ShowMinimap, SnippetSortOrder, }; -use settings::{RelativeLineNumbers, Settings}; +use settings::{RegisterSetting, RelativeLineNumbers, Settings}; use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; /// Imports from the VSCode settings at /// https://code.visualstudio.com/docs/reference/default-settings -#[derive(Clone)] +#[derive(Clone, RegisterSetting)] pub struct EditorSettings { pub cursor_blink: bool, pub cursor_shape: Option, diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 1c387b021106fb4532585f3c1c8638ee0e9fe1c4..bf11a9661cc327c1187a47b4995fe044fcdeb060 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -25700,10 +25700,6 @@ pub(crate) fn init_test(cx: &mut TestAppContext, f: fn(&mut AllLanguageSettingsC cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - client::init_settings(cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); crate::init(cx); }); zlog::init_test(); diff --git a/crates/editor/src/git/blame.rs b/crates/editor/src/git/blame.rs index b36a57a7e47bf148fff4201ec87ac7c868658a04..52eab4f817acad25deebbfa6d807020f9ce1ac80 100644 --- a/crates/editor/src/git/blame.rs +++ b/crates/editor/src/git/blame.rs @@ -764,11 +764,6 @@ mod tests { theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - client::init_settings(cx); - workspace::init_settings(cx); - Project::init_settings(cx); - crate::init(cx); }); } diff --git a/crates/editor/src/inlays/inlay_hints.rs b/crates/editor/src/inlays/inlay_hints.rs index 41920d3645c908ca933a1019818869ac8c203830..50d4ed8df9871902033bfb4b55d85eed4ace51f1 100644 --- a/crates/editor/src/inlays/inlay_hints.rs +++ b/crates/editor/src/inlays/inlay_hints.rs @@ -3951,10 +3951,6 @@ let c = 3;"# cx.set_global(settings_store); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - client::init_settings(cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); crate::init(cx); }); diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index 418fa4fcb442b1de133972457497c0e592e77d15..a83545aaf26b0e148345c185f4f39910e97a727e 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -877,7 +877,7 @@ mod tests { }; use gpui::{AppContext as _, font, px}; use language::Capability; - use project::{Project, project_settings::DiagnosticSeverity}; + use project::project_settings::DiagnosticSeverity; use settings::SettingsStore; use util::post_inc; @@ -1346,10 +1346,7 @@ mod tests { fn init_test(cx: &mut gpui::App) { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); crate::init(cx); - Project::init_settings(cx); } } diff --git a/crates/editor/src/test/editor_lsp_test_context.rs b/crates/editor/src/test/editor_lsp_test_context.rs index 3132e2e6d5976754d0bdb7fea312fa152d4c35ac..427f0bd0de4d56bd01f6a1525ec8aaaf83fe3870 100644 --- a/crates/editor/src/test/editor_lsp_test_context.rs +++ b/crates/editor/src/test/editor_lsp_test_context.rs @@ -54,10 +54,8 @@ impl EditorLspTestContext { cx.update(|cx| { assets::Assets.load_test_fonts(cx); - language::init(cx); crate::init(cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); }); let file_name = format!( diff --git a/crates/eval/src/eval.rs b/crates/eval/src/eval.rs index c5b34a63eec33a45e6d1c75e73fa473f845c5e36..d04dad8e99961480ce5f08328fa97aeabf5eda10 100644 --- a/crates/eval/src/eval.rs +++ b/crates/eval/src/eval.rs @@ -23,7 +23,6 @@ use gpui_tokio::Tokio; use language::LanguageRegistry; use language_model::{ConfiguredModel, LanguageModel, LanguageModelRegistry, SelectedModel}; use node_runtime::{NodeBinaryOptions, NodeRuntime}; -use project::Project; use project::project_settings::ProjectSettings; use prompt_store::PromptBuilder; use release_channel::AppVersion; @@ -354,7 +353,6 @@ pub fn init(cx: &mut App) -> Arc { let settings_store = SettingsStore::new(cx, &settings::default_settings()); cx.set_global(settings_store); - client::init_settings(cx); // Set User-Agent so we can download language servers from GitHub let user_agent = format!( @@ -376,8 +374,6 @@ pub fn init(cx: &mut App) -> Arc { }; cx.set_http_client(Arc::new(http)); - Project::init_settings(cx); - let client = Client::production(cx); cx.set_http_client(client.http_client()); @@ -422,8 +418,6 @@ pub fn init(cx: &mut App) -> Arc { let node_runtime = NodeRuntime::new(client.http_client(), None, rx); let extension_host_proxy = ExtensionHostProxy::global(cx); - - language::init(cx); debug_adapter_extension::init(extension_host_proxy.clone(), cx); language_extension::init(LspAccess::Noop, extension_host_proxy, languages.clone()); language_model::init(client.clone(), cx); diff --git a/crates/extension_host/src/extension_host.rs b/crates/extension_host/src/extension_host.rs index 04b03352d83fd3323770a00a13c4377dc111535a..7a2e13972e31091a22b0390a51732d68393c99a0 100644 --- a/crates/extension_host/src/extension_host.rs +++ b/crates/extension_host/src/extension_host.rs @@ -200,8 +200,6 @@ pub fn init( node_runtime: NodeRuntime, cx: &mut App, ) { - ExtensionSettings::register(cx); - let store = cx.new(move |cx| { ExtensionStore::new( paths::extensions_dir().clone(), diff --git a/crates/extension_host/src/extension_settings.rs b/crates/extension_host/src/extension_settings.rs index 2f6b66ed0999a541febf368c7f75f22f89fcd6d0..736dd6b87ae53a5ffd57b5697aaf3890cedb6f03 100644 --- a/crates/extension_host/src/extension_settings.rs +++ b/crates/extension_host/src/extension_settings.rs @@ -2,10 +2,10 @@ use collections::HashMap; use extension::{ DownloadFileCapability, ExtensionCapability, NpmInstallPackageCapability, ProcessExecCapability, }; -use settings::Settings; +use settings::{RegisterSetting, Settings}; use std::sync::Arc; -#[derive(Debug, Default, Clone)] +#[derive(Debug, Default, Clone, RegisterSetting)] pub struct ExtensionSettings { /// The extensions that should be automatically installed by Zed. /// diff --git a/crates/extension_host/src/extension_store_test.rs b/crates/extension_host/src/extension_store_test.rs index af09b3e4fb28be1a7f339ac4be6b1e789bcff0f0..4104fdff1aa7b1d105c5fc5eae54ebe94c160f5a 100644 --- a/crates/extension_host/src/extension_store_test.rs +++ b/crates/extension_host/src/extension_store_test.rs @@ -1,7 +1,7 @@ use crate::{ Event, ExtensionIndex, ExtensionIndexEntry, ExtensionIndexLanguageEntry, - ExtensionIndexThemeEntry, ExtensionManifest, ExtensionSettings, ExtensionStore, - GrammarManifestEntry, RELOAD_DEBOUNCE_DURATION, SchemaVersion, + ExtensionIndexThemeEntry, ExtensionManifest, ExtensionStore, GrammarManifestEntry, + RELOAD_DEBOUNCE_DURATION, SchemaVersion, }; use async_compression::futures::bufread::GzipEncoder; use collections::{BTreeMap, HashSet}; @@ -19,7 +19,7 @@ use project::{DEFAULT_COMPLETION_CONTEXT, Project}; use release_channel::AppVersion; use reqwest_client::ReqwestClient; use serde_json::json; -use settings::{Settings as _, SettingsStore}; +use settings::SettingsStore; use std::{ ffi::OsString, path::{Path, PathBuf}, @@ -865,9 +865,6 @@ fn init_test(cx: &mut TestAppContext) { release_channel::init(SemanticVersion::default(), cx); extension::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - Project::init_settings(cx); - ExtensionSettings::register(cx); - language::init(cx); gpui_tokio::init(cx); }); } diff --git a/crates/file_finder/src/file_finder.rs b/crates/file_finder/src/file_finder.rs index d78d789b9b0c8041975da6337620b840896a61f6..6f64dc20d0b97f1b12fb627c72209df555e6f1a7 100644 --- a/crates/file_finder/src/file_finder.rs +++ b/crates/file_finder/src/file_finder.rs @@ -90,12 +90,7 @@ pub struct FileFinder { init_modifiers: Option, } -pub fn init_settings(cx: &mut App) { - FileFinderSettings::register(cx); -} - pub fn init(cx: &mut App) { - init_settings(cx); cx.observe_new(FileFinder::register).detach(); cx.observe_new(OpenPathPrompt::register).detach(); cx.observe_new(OpenPathPrompt::register_new_path).detach(); diff --git a/crates/file_finder/src/file_finder_settings.rs b/crates/file_finder/src/file_finder_settings.rs index 4d826211c70b24c9f9bad7e23b8981fa8cb7bdd0..36f05e89bd7a1c73d849e3d72f05a092d0c8ec34 100644 --- a/crates/file_finder/src/file_finder_settings.rs +++ b/crates/file_finder/src/file_finder_settings.rs @@ -1,8 +1,8 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::Settings; +use settings::{RegisterSetting, Settings}; -#[derive(Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Deserialize, Debug, Clone, Copy, PartialEq, RegisterSetting)] pub struct FileFinderSettings { pub file_icons: bool, pub modal_max_width: FileFinderWidth, diff --git a/crates/file_finder/src/file_finder_tests.rs b/crates/file_finder/src/file_finder_tests.rs index 16aa4f899607e902f4077753d350c7d950db4c3c..690265562e1c36e685574ec590819d8f513c128a 100644 --- a/crates/file_finder/src/file_finder_tests.rs +++ b/crates/file_finder/src/file_finder_tests.rs @@ -3206,11 +3206,8 @@ fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); super::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }) } diff --git a/crates/file_finder/src/open_path_prompt_tests.rs b/crates/file_finder/src/open_path_prompt_tests.rs index 5e8874cd01e06bb05f4ff6918bc02ea6883ea064..dea188034bfa7ae46f5b17c50424b40331fadb75 100644 --- a/crates/file_finder/src/open_path_prompt_tests.rs +++ b/crates/file_finder/src/open_path_prompt_tests.rs @@ -397,11 +397,8 @@ fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); super::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }) } diff --git a/crates/git_hosting_providers/src/settings.rs b/crates/git_hosting_providers/src/settings.rs index 9a1625c8debac5fc83004eae26e6b9673a17290c..9bf6c1022b04cc60b0fbaead5177f9fe8e6e0280 100644 --- a/crates/git_hosting_providers/src/settings.rs +++ b/crates/git_hosting_providers/src/settings.rs @@ -2,15 +2,15 @@ use std::sync::Arc; use git::GitHostingProviderRegistry; use gpui::App; -use settings::{GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsStore}; +use settings::{ + GitHostingProviderConfig, GitHostingProviderKind, RegisterSetting, Settings, SettingsStore, +}; use url::Url; use util::ResultExt as _; use crate::{Bitbucket, Github, Gitlab}; pub(crate) fn init(cx: &mut App) { - GitHostingProviderSettings::register(cx); - init_git_hosting_provider_settings(cx); } @@ -52,7 +52,7 @@ fn update_git_hosting_providers_from_settings(cx: &mut App) { provider_registry.set_setting_providers(iter); } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, RegisterSetting)] pub struct GitHostingProviderSettings { pub git_hosting_providers: Vec, } diff --git a/crates/git_ui/src/file_diff_view.rs b/crates/git_ui/src/file_diff_view.rs index 387bda808708cf38beded2fe17edd92466885672..815eaf871ef17f055e60df34cff3e9b9741fb3fb 100644 --- a/crates/git_ui/src/file_diff_view.rs +++ b/crates/git_ui/src/file_diff_view.rs @@ -370,10 +370,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); - editor::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); }); } diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index ae8ee5e0b373754e554b2b817c3be264fee0c7d4..cb292a62bf6ebf4ae3e3c90f269bd839b971e22e 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -4955,7 +4955,7 @@ mod tests { status::{StatusCode, UnmergedStatus, UnmergedStatusCode}, }; use gpui::{TestAppContext, UpdateGlobal, VisualTestContext}; - use project::{FakeFs, WorktreeSettings}; + use project::FakeFs; use serde_json::json; use settings::SettingsStore; use theme::LoadThemes; @@ -4970,13 +4970,8 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - AgentSettings::register(cx); - WorktreeSettings::register(cx); - workspace::init_settings(cx); theme::init(LoadThemes::JustBase, cx); - language::init(cx); editor::init(cx); - Project::init_settings(cx); crate::init(cx); }); } diff --git a/crates/git_ui/src/git_panel_settings.rs b/crates/git_ui/src/git_panel_settings.rs index 83259b228b59c5bb063473cc4a04710a0520808c..2a6c1e8882b3f9cce02060dbf8efb6a4826b6995 100644 --- a/crates/git_ui/src/git_panel_settings.rs +++ b/crates/git_ui/src/git_panel_settings.rs @@ -2,7 +2,7 @@ use editor::EditorSettings; use gpui::Pixels; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, StatusStyle}; +use settings::{RegisterSetting, Settings, StatusStyle}; use ui::{ px, scrollbars::{ScrollbarVisibility, ShowScrollbar}, @@ -14,7 +14,7 @@ pub struct ScrollbarSettings { pub show: Option, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, RegisterSetting)] pub struct GitPanelSettings { pub button: bool, pub dock: DockPosition, diff --git a/crates/git_ui/src/git_ui.rs b/crates/git_ui/src/git_ui.rs index a08add7f37a795dcba2bbf338fc83f90fbf7548f..b4e833f7af72cf7843d3797b51ea349b24c7adc5 100644 --- a/crates/git_ui/src/git_ui.rs +++ b/crates/git_ui/src/git_ui.rs @@ -1,6 +1,5 @@ use std::any::Any; -use ::settings::Settings; use command_palette_hooks::CommandPaletteFilter; use commit_modal::CommitModal; use editor::{Editor, actions::DiffClipboardWithSelectionData}; @@ -15,7 +14,6 @@ use git::{ repository::{Branch, Upstream, UpstreamTracking, UpstreamTrackingStatus}, status::{FileStatus, StatusCode, UnmergedStatus, UnmergedStatusCode}, }; -use git_panel_settings::GitPanelSettings; use gpui::{ Action, App, Context, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, SharedString, Window, actions, @@ -57,8 +55,6 @@ actions!( ); pub fn init(cx: &mut App) { - GitPanelSettings::register(cx); - editor::set_blame_renderer(blame_ui::GitBlameRenderer, cx); commit_view::init(cx); diff --git a/crates/git_ui/src/project_diff.rs b/crates/git_ui/src/project_diff.rs index b5906e75853a2ce4f691617013584ce20c26c83c..305e30d9d7a49d30aad09863e04dc11641f3017e 100644 --- a/crates/git_ui/src/project_diff.rs +++ b/crates/git_ui/src/project_diff.rs @@ -1587,9 +1587,6 @@ mod tests { let store = SettingsStore::test(cx); cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); editor::init(cx); crate::init(cx); }); diff --git a/crates/git_ui/src/text_diff_view.rs b/crates/git_ui/src/text_diff_view.rs index fd8cd3597377a6de78b3153ccc430afe81b1127e..28eafaf4992667966832eaadd77a2babced7d66c 100644 --- a/crates/git_ui/src/text_diff_view.rs +++ b/crates/git_ui/src/text_diff_view.rs @@ -458,10 +458,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); - editor::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); }); } diff --git a/crates/go_to_line/src/cursor_position.rs b/crates/go_to_line/src/cursor_position.rs index 2a67ff67479021353d7231939726a13b948bf4b7..286faa0b8d0185bbdb9b488fd8502cb7566dc388 100644 --- a/crates/go_to_line/src/cursor_position.rs +++ b/crates/go_to_line/src/cursor_position.rs @@ -1,6 +1,6 @@ use editor::{Editor, EditorEvent, MultiBufferSnapshot}; use gpui::{App, Entity, FocusHandle, Focusable, Styled, Subscription, Task, WeakEntity}; -use settings::Settings; +use settings::{RegisterSetting, Settings}; use std::{fmt::Write, num::NonZeroU32, time::Duration}; use text::{Point, Selection}; use ui::{ @@ -293,7 +293,7 @@ impl StatusItemView for CursorPosition { } } -#[derive(Clone, Copy, PartialEq, Eq)] +#[derive(Clone, Copy, PartialEq, Eq, RegisterSetting)] pub enum LineIndicatorFormat { Short, Long, diff --git a/crates/go_to_line/src/go_to_line.rs b/crates/go_to_line/src/go_to_line.rs index b9654ab14e1826c6d90c92878bbc4b55d1ef2959..461b0be659fc3ffb7b7bc984485dc68ece988500 100644 --- a/crates/go_to_line/src/go_to_line.rs +++ b/crates/go_to_line/src/go_to_line.rs @@ -1,6 +1,6 @@ pub mod cursor_position; -use cursor_position::{LineIndicatorFormat, UserCaretPosition}; +use cursor_position::UserCaretPosition; use editor::{ Anchor, Editor, MultiBufferSnapshot, RowHighlightOptions, SelectionEffects, ToOffset, ToPoint, actions::Tab, @@ -11,7 +11,6 @@ use gpui::{ Subscription, div, prelude::*, }; use language::Buffer; -use settings::Settings; use text::{Bias, Point}; use theme::ActiveTheme; use ui::prelude::*; @@ -19,7 +18,6 @@ use util::paths::FILE_ROW_COLUMN_DELIMITER; use workspace::{DismissDecision, ModalView}; pub fn init(cx: &mut App) { - LineIndicatorFormat::register(cx); cx.observe_new(GoToLine::register).detach(); } @@ -770,11 +768,8 @@ mod tests { fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); - language::init(cx); crate::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }) } diff --git a/crates/image_viewer/src/image_viewer.rs b/crates/image_viewer/src/image_viewer.rs index f9a2cc9e045ae67ac7d993250f87cf7ee23789c0..d7c2341723e798b18d559895d6ea478b491eeaf7 100644 --- a/crates/image_viewer/src/image_viewer.rs +++ b/crates/image_viewer/src/image_viewer.rs @@ -412,7 +412,6 @@ impl ProjectItem for ImageView { } pub fn init(cx: &mut App) { - ImageViewerSettings::register(cx); workspace::register_project_item::(cx); workspace::register_serializable_item::(cx); } diff --git a/crates/image_viewer/src/image_viewer_settings.rs b/crates/image_viewer/src/image_viewer_settings.rs index 839d5fbfe44fc624351953018c1437e9fa2c32e0..c490d1c46f4c18fc7cc976bc419c61718cca4ca3 100644 --- a/crates/image_viewer/src/image_viewer_settings.rs +++ b/crates/image_viewer/src/image_viewer_settings.rs @@ -1,8 +1,8 @@ pub use settings::ImageFileSizeUnit; -use settings::Settings; +use settings::{RegisterSetting, Settings}; /// The settings for the image viewer. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, RegisterSetting)] pub struct ImageViewerSettings { /// The unit to use for displaying image file sizes. /// diff --git a/crates/journal/src/journal.rs b/crates/journal/src/journal.rs index 9062081f66da0e920b99af8816432b4f006d2295..9e73e0da550e806b4a642942766414a4b28249ae 100644 --- a/crates/journal/src/journal.rs +++ b/crates/journal/src/journal.rs @@ -3,7 +3,7 @@ use editor::scroll::Autoscroll; use editor::{Editor, SelectionEffects}; use gpui::{App, AppContext as _, Context, Window, actions}; pub use settings::HourFormat; -use settings::Settings; +use settings::{RegisterSetting, Settings}; use std::{ fs::OpenOptions, path::{Path, PathBuf}, @@ -20,7 +20,7 @@ actions!( ); /// Settings specific to journaling -#[derive(Clone, Debug)] +#[derive(Clone, Debug, RegisterSetting)] pub struct JournalSettings { /// The path of the directory where journal entries are stored. /// @@ -44,8 +44,6 @@ impl settings::Settings for JournalSettings { } pub fn init(_: Arc, cx: &mut App) { - JournalSettings::register(cx); - cx.observe_new( |workspace: &mut Workspace, _window, _cx: &mut Context| { workspace.register_action(|workspace, _: &NewJournalEntry, window, cx| { diff --git a/crates/keymap_editor/src/ui_components/keystroke_input.rs b/crates/keymap_editor/src/ui_components/keystroke_input.rs index e264df3b62bc3c5c78acc38ed906e81837dfbf94..5f85e5124f84dc6fc9a9f3ab95e72f15dc5fefeb 100644 --- a/crates/keymap_editor/src/ui_components/keystroke_input.rs +++ b/crates/keymap_editor/src/ui_components/keystroke_input.rs @@ -1102,9 +1102,6 @@ mod tests { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - project::Project::init_settings(cx); - workspace::init_settings(cx); }); let fs = FakeFs::new(cx.executor()); diff --git a/crates/language/src/buffer_tests.rs b/crates/language/src/buffer_tests.rs index ec584abf4876b38da38459ccae900631957258d1..4f3f760ba8b841c45031cd1a811f6bb1e8fd2534 100644 --- a/crates/language/src/buffer_tests.rs +++ b/crates/language/src/buffer_tests.rs @@ -3922,7 +3922,6 @@ fn assert_bracket_pairs( fn init_settings(cx: &mut App, f: fn(&mut AllLanguageSettingsContent)) { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - crate::init(cx); cx.update_global::(|settings, cx| { settings.update_user_settings(cx, |content| f(&mut content.project.all_languages)); }); diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index bbca0e43ad76e8f9d23e3c49ce0af21ec970f3d7..75f53524efc40e2cfaf06c5bbe893b7c5af5883c 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -88,13 +88,6 @@ pub use syntax_map::{ pub use text::{AnchorRangeExt, LineEnding}; pub use tree_sitter::{Node, Parser, Tree, TreeCursor}; -/// Initializes the `language` crate. -/// -/// This should be called before making use of items from the create. -pub fn init(cx: &mut App) { - language_settings::init(cx); -} - static QUERY_CURSORS: Mutex> = Mutex::new(vec![]); static PARSERS: Mutex> = Mutex::new(vec![]); diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index b485065689832995cdb100ae47a4f1f197ad1a70..f0235cb51b5fcbf3cdcc4a4bf46bd12adbfd674e 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -15,15 +15,10 @@ pub use settings::{ Formatter, FormatterList, InlayHintKind, LanguageSettingsContent, LspInsertMode, RewrapBehavior, ShowWhitespaceSetting, SoftWrap, WordsCompletionMode, }; -use settings::{Settings, SettingsLocation, SettingsStore}; +use settings::{RegisterSetting, Settings, SettingsLocation, SettingsStore}; use shellexpand; use std::{borrow::Cow, num::NonZeroU32, path::Path, sync::Arc}; -/// Initializes the language settings. -pub fn init(cx: &mut App) { - AllLanguageSettings::register(cx); -} - /// Returns the settings for the specified language from the provided file. pub fn language_settings<'a>( language: Option, @@ -50,7 +45,7 @@ pub fn all_language_settings<'a>( } /// The settings for all languages. -#[derive(Debug, Clone)] +#[derive(Debug, Clone, RegisterSetting)] pub struct AllLanguageSettings { /// The edit prediction settings. pub edit_predictions: EditPredictionSettings, diff --git a/crates/language_models/src/language_models.rs b/crates/language_models/src/language_models.rs index 1b7243780ad30d737118046c8fc71fe9e4186fa6..d771dba3733540cdb720416c21d5d0cb76b9d3be 100644 --- a/crates/language_models/src/language_models.rs +++ b/crates/language_models/src/language_models.rs @@ -28,7 +28,6 @@ use crate::provider::x_ai::XAiLanguageModelProvider; pub use crate::settings::*; pub fn init(user_store: Entity, client: Arc, cx: &mut App) { - crate::settings::init_settings(cx); let registry = LanguageModelRegistry::global(cx); registry.update(cx, |registry, cx| { register_language_model_providers(registry, user_store, client.clone(), cx); diff --git a/crates/language_models/src/settings.rs b/crates/language_models/src/settings.rs index ce29be38431055ddce992552607259066ab9f3cb..edff1f768e9fc6d2ad9333133b20d88c7676c24d 100644 --- a/crates/language_models/src/settings.rs +++ b/crates/language_models/src/settings.rs @@ -1,8 +1,7 @@ use std::sync::Arc; use collections::HashMap; -use gpui::App; -use settings::Settings; +use settings::RegisterSetting; use crate::provider::{ anthropic::AnthropicSettings, bedrock::AmazonBedrockSettings, cloud::ZedDotDevSettings, @@ -12,11 +11,7 @@ use crate::provider::{ vercel::VercelSettings, x_ai::XAiSettings, }; -/// Initializes the language model settings. -pub fn init_settings(cx: &mut App) { - AllLanguageModelSettings::register(cx); -} - +#[derive(Debug, RegisterSetting)] pub struct AllLanguageModelSettings { pub anthropic: AnthropicSettings, pub bedrock: AmazonBedrockSettings, diff --git a/crates/language_tools/src/lsp_log_view_tests.rs b/crates/language_tools/src/lsp_log_view_tests.rs index c521c03a2fe5fd457445ec0a42cebfd3db0010ba..16b3ff7ed6f4ff9f5ac7ffa9aaa89ad3f1cb2932 100644 --- a/crates/language_tools/src/lsp_log_view_tests.rs +++ b/crates/language_tools/src/lsp_log_view_tests.rs @@ -109,12 +109,7 @@ fn init_test(cx: &mut gpui::TestAppContext) { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - workspace::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - language::init(cx); - client::init_settings(cx); - Project::init_settings(cx); - editor::init_settings(cx); }); } diff --git a/crates/languages/src/bash.rs b/crates/languages/src/bash.rs index 8fabd4cf43aa4a79fa868854064942252deb4117..482556ba5f9ae7abe992c93fab34a7635004a51e 100644 --- a/crates/languages/src/bash.rs +++ b/crates/languages/src/bash.rs @@ -32,7 +32,6 @@ mod tests { cx.update(|cx| { let test_settings = SettingsStore::test(cx); cx.set_global(test_settings); - language::init(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |s| { s.project.all_languages.defaults.tab_size = NonZeroU32::new(2) diff --git a/crates/languages/src/c.rs b/crates/languages/src/c.rs index 8e90cf821368c0c88781b2d10e82ad9eaa05989c..5957dde04d4fbf43763647675733cc0ecab3c9ab 100644 --- a/crates/languages/src/c.rs +++ b/crates/languages/src/c.rs @@ -402,7 +402,6 @@ mod tests { cx.update(|cx| { let test_settings = SettingsStore::test(cx); cx.set_global(test_settings); - language::init(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |s| { s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index 1ec4618284961928c9e290f77c1ebeeffb9ee70c..1c28a7b36a74b66efb1f66e8914b78a48db8a339 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -2271,7 +2271,6 @@ mod tests { cx.update(|cx| { let test_settings = SettingsStore::test(cx); cx.set_global(test_settings); - language::init(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |s| { s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); diff --git a/crates/languages/src/rust.rs b/crates/languages/src/rust.rs index 4b56a617735ab1a5932a56a4f6e51397721d8a86..5efbf46c7b59e923c01cba165b29fceec2869504 100644 --- a/crates/languages/src/rust.rs +++ b/crates/languages/src/rust.rs @@ -1445,7 +1445,6 @@ mod tests { cx.update(|cx| { let test_settings = SettingsStore::test(cx); cx.set_global(test_settings); - language::init(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |s| { s.project.all_languages.defaults.tab_size = NonZeroU32::new(2); diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index dfee49bbcf279ae34d9a4f3ee38987878397d810..00e4113ba188c0b2025eaba275044fd948310562 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -1091,8 +1091,7 @@ mod tests { use std::path::Path; use gpui::{AppContext as _, BackgroundExecutor, TestAppContext}; - use language::language_settings; - use project::{FakeFs, Project}; + use project::FakeFs; use serde_json::json; use task::TaskTemplates; use unindent::Unindent; @@ -1432,8 +1431,6 @@ mod tests { async fn test_package_json_discovery(executor: BackgroundExecutor, cx: &mut TestAppContext) { cx.update(|cx| { settings::init(cx); - Project::init_settings(cx); - language_settings::init(cx); }); let package_json_1 = json!({ @@ -1593,8 +1590,6 @@ mod tests { ) { cx.update(|cx| { settings::init(cx); - Project::init_settings(cx); - language_settings::init(cx); }); // Test case with all test runners present diff --git a/crates/markdown/examples/markdown.rs b/crates/markdown/examples/markdown.rs index b4cb2a2503dcb6e097c34e4c8aad718f89e30272..c8d67eda038b35e529e6b1a36bc20bf5af757afa 100644 --- a/crates/markdown/examples/markdown.rs +++ b/crates/markdown/examples/markdown.rs @@ -38,7 +38,6 @@ pub fn main() { Application::new().with_assets(Assets).run(|cx| { let store = SettingsStore::test(cx); cx.set_global(store); - language::init(cx); cx.bind_keys([KeyBinding::new("cmd-c", markdown::Copy, None)]); let node_runtime = NodeRuntime::unavailable(); diff --git a/crates/markdown/examples/markdown_as_child.rs b/crates/markdown/examples/markdown_as_child.rs index 3e731506f545dd2166336241cb82742435784fea..6affa243ae5cc5f4cac1dc7fea0af9b9cc183aa6 100644 --- a/crates/markdown/examples/markdown_as_child.rs +++ b/crates/markdown/examples/markdown_as_child.rs @@ -22,7 +22,6 @@ pub fn main() { Application::new().with_assets(Assets).run(|cx| { let store = SettingsStore::test(cx); cx.set_global(store); - language::init(cx); cx.bind_keys([KeyBinding::new("cmd-c", markdown::Copy, None)]); let node_runtime = NodeRuntime::unavailable(); diff --git a/crates/outline/src/outline.rs b/crates/outline/src/outline.rs index 9e49fabb474d765aa79703ef55c1c98842bee209..7ffbd5ef440996718337d839730a159b1f6593b7 100644 --- a/crates/outline/src/outline.rs +++ b/crates/outline/src/outline.rs @@ -575,11 +575,8 @@ mod tests { fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); - language::init(cx); crate::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }) } diff --git a/crates/outline_panel/src/outline_panel.rs b/crates/outline_panel/src/outline_panel.rs index ea9a8dec6868ac49f407ac51b63219289b770770..ee271c9ad92cde8fe8f7da54fb1cc1ae74d20ea9 100644 --- a/crates/outline_panel/src/outline_panel.rs +++ b/crates/outline_panel/src/outline_panel.rs @@ -656,13 +656,7 @@ struct SerializedOutlinePanel { active: Option, } -pub fn init_settings(cx: &mut App) { - OutlinePanelSettings::register(cx); -} - pub fn init(cx: &mut App) { - init_settings(cx); - cx.observe_new(|workspace: &mut Workspace, _, _| { workspace.register_action(|workspace, _: &ToggleFocus, window, cx| { workspace.toggle_panel_focus::(window, cx); @@ -6823,10 +6817,7 @@ outline: struct OutlineEntryExcerpt theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); project_search::init(cx); buffer_search::init(cx); super::init(cx); diff --git a/crates/outline_panel/src/outline_panel_settings.rs b/crates/outline_panel/src/outline_panel_settings.rs index 77fb15ddeb273b6fbe928e5f364f4a135321e7be..b2b1a6fe685c18853087d3eb04edeef2ceebd89f 100644 --- a/crates/outline_panel/src/outline_panel_settings.rs +++ b/crates/outline_panel/src/outline_panel_settings.rs @@ -1,9 +1,10 @@ use editor::EditorSettings; use gpui::{App, Pixels}; +use settings::RegisterSetting; pub use settings::{DockSide, Settings, ShowIndentGuides}; use ui::scrollbars::{ScrollbarVisibility, ShowScrollbar}; -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, Copy, PartialEq, RegisterSetting)] pub struct OutlinePanelSettings { pub button: bool, pub default_width: Pixels, diff --git a/crates/project/src/agent_server_store.rs b/crates/project/src/agent_server_store.rs index 2fc218cf0c1930b5e06e91f84486d563bec7c8fc..ef8079bd014ecc7b26102aafc931029f9ab1cafa 100644 --- a/crates/project/src/agent_server_store.rs +++ b/crates/project/src/agent_server_store.rs @@ -20,7 +20,7 @@ use remote::RemoteClient; use rpc::{AnyProtoClient, TypedEnvelope, proto}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::SettingsStore; +use settings::{RegisterSetting, SettingsStore}; use task::Shell; use util::{ResultExt as _, debug_panic}; @@ -1618,7 +1618,7 @@ pub const GEMINI_NAME: &'static str = "gemini"; pub const CLAUDE_CODE_NAME: &'static str = "claude"; pub const CODEX_NAME: &'static str = "codex"; -#[derive(Default, Clone, JsonSchema, Debug, PartialEq)] +#[derive(Default, Clone, JsonSchema, Debug, PartialEq, RegisterSetting)] pub struct AllAgentServersSettings { pub gemini: Option, pub claude: Option, diff --git a/crates/project/src/context_server_store.rs b/crates/project/src/context_server_store.rs index cab9401e7257523cdc90633a6c515798479b460b..8316bd7466d113c9211d79afb6e4d1a325e32e52 100644 --- a/crates/project/src/context_server_store.rs +++ b/crates/project/src/context_server_store.rs @@ -1307,7 +1307,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); let mut settings = ProjectSettings::get_global(cx).clone(); for (id, config) in context_server_configurations { settings.context_servers.insert(id, config); diff --git a/crates/project/src/git_store/conflict_set.rs b/crates/project/src/git_store/conflict_set.rs index 160a384a4a0ff4481c97b6eda75faded28f01624..7d99571b5b88d7f5d37d56d47ff32a71fd5a29ff 100644 --- a/crates/project/src/git_store/conflict_set.rs +++ b/crates/project/src/git_store/conflict_set.rs @@ -268,13 +268,10 @@ mod tests { status::{UnmergedStatus, UnmergedStatusCode}, }; use gpui::{BackgroundExecutor, TestAppContext}; - use language::language_settings::AllLanguageSettings; use serde_json::json; - use settings::Settings as _; use text::{Buffer, BufferId, Point, ReplicaId, ToOffset as _}; use unindent::Unindent as _; use util::{path, rel_path::rel_path}; - use worktree::WorktreeSettings; #[test] fn test_parse_conflicts_in_buffer() { @@ -488,9 +485,6 @@ mod tests { zlog::init_test(); cx.update(|cx| { settings::init(cx); - WorktreeSettings::register(cx); - Project::init_settings(cx); - AllLanguageSettings::register(cx); }); let initial_text = " one @@ -589,9 +583,6 @@ mod tests { zlog::init_test(); cx.update(|cx| { settings::init(cx); - WorktreeSettings::register(cx); - Project::init_settings(cx); - AllLanguageSettings::register(cx); }); let initial_text = " diff --git a/crates/project/src/git_store/git_traversal.rs b/crates/project/src/git_store/git_traversal.rs index ca4a22b14d3682790282744b4834980d669b8d93..39857951ad5afa207489c9f00399ec51e5e7dfdc 100644 --- a/crates/project/src/git_store/git_traversal.rs +++ b/crates/project/src/git_store/git_traversal.rs @@ -688,7 +688,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); }); } diff --git a/crates/project/src/image_store.rs b/crates/project/src/image_store.rs index b6dcf32b1bd84757cdc0c9c453e7743bbbe3d909..71bee30b99dfa89694885d34e20849869df123f0 100644 --- a/crates/project/src/image_store.rs +++ b/crates/project/src/image_store.rs @@ -920,8 +920,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 17f811034a5112831bf0d8fe4e21abee15cc7a9c..9cc95da3b4c86daffd32af89d4f26509c97269fa 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -35,7 +35,6 @@ mod yarn; use dap::inline_value::{InlineValueLocation, VariableLookupKind, VariableScope}; use crate::{ - agent_server_store::AllAgentServersSettings, git_store::GitStore, lsp_store::{SymbolLocation, log_store::LogKind}, }; @@ -101,7 +100,7 @@ use rpc::{ }; use search::{SearchInputKind, SearchQuery, SearchResult}; use search_history::SearchHistory; -use settings::{InvalidSettingsError, Settings, SettingsLocation, SettingsStore}; +use settings::{InvalidSettingsError, RegisterSetting, Settings, SettingsLocation, SettingsStore}; use smol::channel::Receiver; use snippet::Snippet; use snippet_provider::SnippetProvider; @@ -996,7 +995,7 @@ pub enum PulledDiagnostics { /// Whether to disable all AI features in Zed. /// /// Default: false -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, RegisterSetting)] pub struct DisableAiSettings { pub disable_ai: bool, } @@ -1010,16 +1009,8 @@ impl settings::Settings for DisableAiSettings { } impl Project { - pub fn init_settings(cx: &mut App) { - WorktreeSettings::register(cx); - ProjectSettings::register(cx); - DisableAiSettings::register(cx); - AllAgentServersSettings::register(cx); - } - pub fn init(client: &Arc, cx: &mut App) { connection_manager::init(client.clone(), cx); - Self::init_settings(cx); let client: AnyProtoClient = client.clone().into(); client.add_entity_message_handler(Self::handle_add_collaborator); @@ -5759,7 +5750,6 @@ mod disable_ai_settings_tests { async fn test_disable_ai_settings_security(cx: &mut TestAppContext) { cx.update(|cx| { settings::init(cx); - Project::init_settings(cx); // Test 1: Default is false (AI enabled) assert!( diff --git a/crates/project/src/project_settings.rs b/crates/project/src/project_settings.rs index d1ff7a9e8d661b0d642b307281dd8a7ba9b76b41..10ffc986fa798011c28261d2ff899da66261669a 100644 --- a/crates/project/src/project_settings.rs +++ b/crates/project/src/project_settings.rs @@ -20,8 +20,8 @@ use serde::{Deserialize, Serialize}; pub use settings::DirenvSettings; pub use settings::LspSettings; use settings::{ - DapSettingsContent, InvalidSettingsError, LocalSettingsKind, Settings, SettingsLocation, - SettingsStore, parse_json_with_comments, watch_config_file, + DapSettingsContent, InvalidSettingsError, LocalSettingsKind, RegisterSetting, Settings, + SettingsLocation, SettingsStore, parse_json_with_comments, watch_config_file, }; use std::{path::PathBuf, sync::Arc, time::Duration}; use task::{DebugTaskFile, TaskTemplates, VsCodeDebugTaskFile, VsCodeTaskFile}; @@ -33,7 +33,7 @@ use crate::{ worktree_store::{WorktreeStore, WorktreeStoreEvent}, }; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, RegisterSetting)] pub struct ProjectSettings { /// Configuration for language servers. /// diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index c5062a850b5b98943d9c7b47e37055a46b21e03c..65a7803d64a122c4f9a3774a09a47ec91455da5f 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -10091,8 +10091,6 @@ pub fn init_test(cx: &mut gpui::TestAppContext) { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); release_channel::init(SemanticVersion::default(), cx); - language::init(cx); - Project::init_settings(cx); }); } diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 5d669b2d9afef4b773244c4d76a3698287788b93..38fd1d08c9802bd04c7e5faf60c171d492ed996f 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -360,13 +360,7 @@ impl FoldedAncestors { } } -pub fn init_settings(cx: &mut App) { - ProjectPanelSettings::register(cx); -} - pub fn init(cx: &mut App) { - init_settings(cx); - cx.observe_new(|workspace: &mut Workspace, _, _| { workspace.register_action(|workspace, _: &ToggleFocus, window, cx| { workspace.toggle_panel_focus::(window, cx); diff --git a/crates/project_panel/src/project_panel_settings.rs b/crates/project_panel/src/project_panel_settings.rs index 632537fc0213f3702755144c045e58fcb737ed30..623fdda310ec872ee3919cb944d8f1f817d10448 100644 --- a/crates/project_panel/src/project_panel_settings.rs +++ b/crates/project_panel/src/project_panel_settings.rs @@ -2,13 +2,16 @@ use editor::EditorSettings; use gpui::Pixels; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{DockSide, ProjectPanelEntrySpacing, Settings, ShowDiagnostics, ShowIndentGuides}; +use settings::{ + DockSide, ProjectPanelEntrySpacing, RegisterSetting, Settings, ShowDiagnostics, + ShowIndentGuides, +}; use ui::{ px, scrollbars::{ScrollbarVisibility, ShowScrollbar}, }; -#[derive(Deserialize, Debug, Clone, Copy, PartialEq)] +#[derive(Deserialize, Debug, Clone, Copy, PartialEq, RegisterSetting)] pub struct ProjectPanelSettings { pub button: bool, pub hide_gitignore: bool, diff --git a/crates/project_panel/src/project_panel_tests.rs b/crates/project_panel/src/project_panel_tests.rs index 2ff389a6abd8298156b93671e105667c03a4889d..51f028afd5ac07c15e55f15d68f75293fab3481a 100644 --- a/crates/project_panel/src/project_panel_tests.rs +++ b/crates/project_panel/src/project_panel_tests.rs @@ -7333,14 +7333,8 @@ fn init_test(cx: &mut TestAppContext) { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - editor::init_settings(cx); crate::init(cx); - workspace::init_settings(cx); - client::init_settings(cx); - Project::init_settings(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |settings| { @@ -7358,12 +7352,9 @@ fn init_test_with_editor(cx: &mut TestAppContext) { cx.update(|cx| { let app_state = AppState::test(cx); theme::init(theme::LoadThemes::JustBase, cx); - init_settings(cx); - language::init(cx); editor::init(cx); crate::init(cx); workspace::init(app_state, cx); - Project::init_settings(cx); cx.update_global::(|store, cx| { store.update_user_settings(cx, |settings| { diff --git a/crates/project_symbols/src/project_symbols.rs b/crates/project_symbols/src/project_symbols.rs index 7d3350633d6e76ae3a880d21e22efe6b700f1d4a..245f43e11a22bb3980dbbd7936109db2546287d5 100644 --- a/crates/project_symbols/src/project_symbols.rs +++ b/crates/project_symbols/src/project_symbols.rs @@ -439,9 +439,6 @@ mod tests { cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); release_channel::init(SemanticVersion::default(), cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); editor::init(cx); }); } diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index 0f4257985407ba0745738847978e1da6b8fae3d2..8aab66533c59b7dae17cc7864d6a7e716d3ee948 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -34,8 +34,6 @@ use workspace::{ use zed_actions::{OpenRecent, OpenRemote}; pub fn init(cx: &mut App) { - SshSettings::register(cx); - #[cfg(target_os = "windows")] cx.on_action(|open_wsl: &zed_actions::wsl_actions::OpenFolderInWsl, cx| { let create_new_window = open_wsl.create_new_window; @@ -762,10 +760,9 @@ impl Render for MatchTooltip { mod tests { use std::path::PathBuf; - use dap::debugger_settings::DebuggerSettings; use editor::Editor; use gpui::{TestAppContext, UpdateGlobal, WindowHandle}; - use project::Project; + use serde_json::json; use settings::SettingsStore; use util::path; @@ -911,12 +908,8 @@ mod tests { fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); - language::init(cx); crate::init(cx); editor::init(cx); - workspace::init_settings(cx); - DebuggerSettings::register(cx); - Project::init_settings(cx); state }) } diff --git a/crates/recent_projects/src/remote_connections.rs b/crates/recent_projects/src/remote_connections.rs index 82fa72723286a1a3497ed0baebdb5db830a50b99..ef6ce2e8deda150f352a88a466822a44ed02b55b 100644 --- a/crates/recent_projects/src/remote_connections.rs +++ b/crates/recent_projects/src/remote_connections.rs @@ -23,7 +23,7 @@ use remote::{ SshConnectionOptions, }; pub use settings::SshConnection; -use settings::{ExtendingVec, Settings, WslConnection}; +use settings::{ExtendingVec, RegisterSetting, Settings, WslConnection}; use theme::ThemeSettings; use ui::{ ActiveTheme, Color, CommonAnimationExt, Context, Icon, IconName, IconSize, InteractiveElement, @@ -32,6 +32,7 @@ use ui::{ use util::paths::PathWithPosition; use workspace::{AppState, ModalView, Workspace}; +#[derive(RegisterSetting)] pub struct SshSettings { pub ssh_connections: ExtendingVec, pub wsl_connections: ExtendingVec, diff --git a/crates/remote_server/src/headless_project.rs b/crates/remote_server/src/headless_project.rs index e9d34f4bdb94db401c7786f55fca6c4e429af15d..31d55b50eb04d0d0955af34873a432b3e5304fcf 100644 --- a/crates/remote_server/src/headless_project.rs +++ b/crates/remote_server/src/headless_project.rs @@ -28,7 +28,7 @@ use rpc::{ proto::{self, REMOTE_SERVER_PEER_ID, REMOTE_SERVER_PROJECT_ID}, }; -use settings::{Settings as _, initial_server_settings_content}; +use settings::initial_server_settings_content; use smol::stream::StreamExt; use std::{ num::NonZeroU64, @@ -74,9 +74,6 @@ pub struct HeadlessAppState { impl HeadlessProject { pub fn init(cx: &mut App) { settings::init(cx); - language::init(cx); - project::Project::init_settings(cx); - extension_host::ExtensionSettings::register(cx); log_store::init(true, cx); } diff --git a/crates/remote_server/src/remote_editing_tests.rs b/crates/remote_server/src/remote_editing_tests.rs index 969363fb2bd02e7bc514cd68d488ca57aef9f0b9..de0d58e50dbc036723365ca6099efabff1f8449d 100644 --- a/crates/remote_server/src/remote_editing_tests.rs +++ b/crates/remote_server/src/remote_editing_tests.rs @@ -1493,10 +1493,7 @@ async fn test_remote_git_diffs_when_recv_update_repository_delay( .await .unwrap(); let buffer_id = cx.update(|cx| buffer.read(cx).remote_id()); - cx.update(|cx| { - workspace::init_settings(cx); - editor::init_settings(cx); - }); + let cx = cx.add_empty_window(); let editor = cx.new_window_entity(|window, cx| { Editor::for_buffer(buffer, Some(project.clone()), window, cx) @@ -1853,8 +1850,6 @@ pub async fn init_test( let proxy = Arc::new(ExtensionHostProxy::new()); server_cx.update(HeadlessProject::init); let headless = server_cx.new(|cx| { - client::init_settings(cx); - HeadlessProject::new( crate::HeadlessAppState { session: ssh_server_client, @@ -1906,7 +1901,6 @@ fn build_project(ssh: Entity, cx: &mut TestAppContext) -> Entity

, } diff --git a/crates/repl/src/repl.rs b/crates/repl/src/repl.rs index f6005f1ed73ac07697af48297643b30be113c83c..be6491d9cdc61ec4b2a9f9fe950f8da00d0fb691 100644 --- a/crates/repl/src/repl.rs +++ b/crates/repl/src/repl.rs @@ -15,7 +15,6 @@ use async_dispatcher::{Dispatcher, Runnable, set_dispatcher}; use gpui::{App, PlatformDispatcher}; use project::Fs; pub use runtimelib::ExecutionState; -use settings::Settings as _; pub use crate::jupyter_settings::JupyterSettings; pub use crate::kernels::{Kernel, KernelSpecification, KernelStatus}; @@ -31,9 +30,6 @@ pub const KERNEL_DOCS_URL: &str = "https://zed.dev/docs/repl#changing-kernels"; pub fn init(fs: Arc, cx: &mut App) { set_dispatcher(zed_dispatcher(cx)); - JupyterSettings::register(cx); - ::editor::init_settings(cx); - ReplSettings::register(cx); repl_sessions_ui::init(cx); ReplStore::init(fs, cx); } diff --git a/crates/repl/src/repl_settings.rs b/crates/repl/src/repl_settings.rs index 1cd96ca47705e90c56fb1b3e25e41eb8edce0c87..9faed72e557dd2e8abf503de0e34b61bd95e2a9c 100644 --- a/crates/repl/src/repl_settings.rs +++ b/crates/repl/src/repl_settings.rs @@ -1,7 +1,7 @@ -use settings::Settings; +use settings::{RegisterSetting, Settings}; /// Settings for configuring REPL display and behavior. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, RegisterSetting)] pub struct ReplSettings { /// Maximum number of lines to keep in REPL's scrollback buffer. /// Clamped with [4, 256] range. diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index d9616d85c8dddf84cde9692863cb77894e9a78e7..d4b8e0b3eb9edb3612ba04dcd33deb61ed883755 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -1532,7 +1532,6 @@ mod tests { }; use gpui::{Hsla, TestAppContext, UpdateGlobal, VisualTestContext}; use language::{Buffer, Point}; - use project::Project; use settings::{SearchSettingsContent, SettingsStore}; use smol::stream::StreamExt as _; use unindent::Unindent as _; @@ -1542,11 +1541,8 @@ mod tests { cx.update(|cx| { let store = settings::SettingsStore::test(cx); cx.set_global(store); - workspace::init_settings(cx); editor::init(cx); - language::init(cx); - Project::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); crate::init(cx); }); diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index a6d0db1fa03b3c406d3de2dcf40efb07528fcdd3..001b7e3fbb09b8d4888f2e4744ca8ecb1096d7a6 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -4547,11 +4547,7 @@ pub mod tests { theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - client::init_settings(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); crate::init(cx); }); } diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml index 10b69fbb6fa924df5b4644fa05579e7b451b34da..af0d5a55f363fd6d96f281f2db50f803baae7d14 100644 --- a/crates/settings/Cargo.toml +++ b/crates/settings/Cargo.toml @@ -25,6 +25,7 @@ futures.workspace = true gpui.workspace = true inventory.workspace = true log.workspace = true +migrator.workspace = true paths.workspace = true release_channel.workspace = true rust-embed.workspace = true @@ -40,7 +41,6 @@ smallvec.workspace = true strum.workspace = true util.workspace = true zlog.workspace = true -migrator.workspace = true [dev-dependencies] fs = { workspace = true, features = ["test-support"] } diff --git a/crates/settings/src/base_keymap_setting.rs b/crates/settings/src/base_keymap_setting.rs index 4915bdd85319e4abaf3ea575d387a39cc14f302d..8e872dae4076c313a066a8ac904a1814bc81bc67 100644 --- a/crates/settings/src/base_keymap_setting.rs +++ b/crates/settings/src/base_keymap_setting.rs @@ -3,12 +3,14 @@ use std::fmt::{Display, Formatter}; use crate::{self as settings, settings_content::BaseKeymapContent}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::Settings; +use settings::{RegisterSetting, Settings}; /// Base key bindings scheme. Base keymaps can be overridden with user keymaps. /// /// Default: VSCode -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Default)] +#[derive( + Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq, Default, RegisterSetting, +)] pub enum BaseKeymap { #[default] VSCode, diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index cb48f47b1cc496d81a8c727c174e32df63d5a701..fc097d474e92a66ca5b981e2a3235b33f42fb1bf 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -9,6 +9,13 @@ mod settings_store; mod vscode_import; pub use settings_content::*; +pub use settings_macros::RegisterSetting; + +#[doc(hidden)] +pub mod private { + pub use crate::settings_store::{RegisteredSetting, SettingValue}; + pub use inventory; +} use gpui::{App, Global}; use rust_embed::RustEmbed; @@ -81,7 +88,6 @@ pub struct SettingsAssets; pub fn init(cx: &mut App) { let settings = SettingsStore::new(cx, &default_settings()); cx.set_global(settings); - BaseKeymap::register(cx); SettingsStore::observe_active_settings_profile_name(cx).detach(); } diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index 32cd16ba3379a79489af8487237364886046a659..5c4a97fa1373232972aac99a2f2abb1ae2810d97 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -124,6 +124,14 @@ pub trait Settings: 'static + Send + Sync + Sized { } } +pub struct RegisteredSetting { + pub settings_value: fn() -> Box, + pub from_settings: fn(&SettingsContent) -> Box, + pub id: fn() -> TypeId, +} + +inventory::collect!(RegisteredSetting); + #[derive(Clone, Copy, Debug)] pub struct SettingsLocation<'a> { pub worktree_id: WorktreeId, @@ -220,13 +228,17 @@ pub enum LocalSettingsKind { impl Global for SettingsStore {} +#[doc(hidden)] #[derive(Debug)] -struct SettingValue { - global_value: Option, - local_values: Vec<(WorktreeId, Arc, T)>, +pub struct SettingValue { + #[doc(hidden)] + pub global_value: Option, + #[doc(hidden)] + pub local_values: Vec<(WorktreeId, Arc, T)>, } -trait AnySettingValue: 'static + Send + Sync { +#[doc(hidden)] +pub trait AnySettingValue: 'static + Send + Sync { fn setting_type_name(&self) -> &'static str; fn from_settings(&self, s: &SettingsContent) -> Box; @@ -250,7 +262,7 @@ impl SettingsStore { let (setting_file_updates_tx, mut setting_file_updates_rx) = mpsc::unbounded(); let default_settings: Rc = parse_json_with_comments(default_settings).unwrap(); - Self { + let mut this = Self { setting_values: Default::default(), default_settings: default_settings.clone(), global_settings: None, @@ -268,7 +280,11 @@ impl SettingsStore { } }), file_errors: BTreeMap::default(), - } + }; + + this.load_settings_types(); + + this } pub fn observe_active_settings_profile_name(cx: &mut App) -> gpui::Subscription { @@ -288,19 +304,34 @@ impl SettingsStore { /// Add a new type of setting to the store. pub fn register_setting(&mut self) { - let setting_type_id = TypeId::of::(); - let entry = self.setting_values.entry(setting_type_id); + self.register_setting_internal(&RegisteredSetting { + settings_value: || { + Box::new(SettingValue:: { + global_value: None, + local_values: Vec::new(), + }) + }, + from_settings: |content| Box::new(T::from_settings(content)), + id: || TypeId::of::(), + }); + } + + fn load_settings_types(&mut self) { + for registered_setting in inventory::iter::() { + self.register_setting_internal(registered_setting); + } + } + + fn register_setting_internal(&mut self, registered_setting: &RegisteredSetting) { + let entry = self.setting_values.entry((registered_setting.id)()); if matches!(entry, hash_map::Entry::Occupied(_)) { return; } - let setting_value = entry.or_insert(Box::new(SettingValue:: { - global_value: None, - local_values: Vec::new(), - })); - let value = T::from_settings(&self.merged_settings); - setting_value.set_global_value(Box::new(value)); + let setting_value = entry.or_insert((registered_setting.settings_value)()); + let value = (registered_setting.from_settings)(&self.merged_settings); + setting_value.set_global_value(value); } /// Get the value of a setting. diff --git a/crates/settings_macros/src/settings_macros.rs b/crates/settings_macros/src/settings_macros.rs index 1a7c391847e5093754f241ffccb079cc5ddd1a6b..f6da25d7bc0c3f5bd4b3670305086ac28c0f685f 100644 --- a/crates/settings_macros/src/settings_macros.rs +++ b/crates/settings_macros/src/settings_macros.rs @@ -76,3 +76,27 @@ pub fn derive_merge_from(input: TokenStream) -> TokenStream { TokenStream::from(expanded) } + +/// Registers the setting type with the SettingsStore. Note that you need to +/// have `gpui` in your dependencies for this to work. +#[proc_macro_derive(RegisterSetting)] +pub fn derive_register_setting(input: TokenStream) -> TokenStream { + let input = syn::parse_macro_input!(input as DeriveInput); + let type_name = &input.ident; + + quote! { + settings::private::inventory::submit! { + settings::private::RegisteredSetting { + settings_value: || { + Box::new(settings::private::SettingValue::<#type_name> { + global_value: None, + local_values: Vec::new(), + }) + }, + from_settings: |content| Box::new(<#type_name as settings::Settings>::from_settings(content)), + id: || std::any::TypeId::of::<#type_name>(), + } + } + } + .into() +} diff --git a/crates/settings_profile_selector/src/settings_profile_selector.rs b/crates/settings_profile_selector/src/settings_profile_selector.rs index 4eecf3b290d37548d4fe3a1312f5572164b89907..42d714283a4e1ed569bd03a5386ab16988a8014a 100644 --- a/crates/settings_profile_selector/src/settings_profile_selector.rs +++ b/crates/settings_profile_selector/src/settings_profile_selector.rs @@ -280,10 +280,8 @@ fn display_name(profile_name: &Option) -> String { #[cfg(test)] mod tests { use super::*; - use client; use editor; use gpui::{TestAppContext, UpdateGlobal, VisualTestContext}; - use language; use menu::{Cancel, Confirm, SelectNext, SelectPrevious}; use project::{FakeFs, Project}; use serde_json::json; @@ -302,12 +300,8 @@ mod tests { cx.set_global(settings_store); settings::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - client::init_settings(cx); - language::init(cx); super::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }); diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index 24c5fa06be377a01b46064d7cbc5bba852f3997f..ea0e8760116c254f7777ecdd2fab1e956be6fe6a 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -3651,9 +3651,6 @@ pub mod test { pub fn register_settings(cx: &mut App) { settings::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - workspace::init_settings(cx); - project::Project::init_settings(cx); - language::init(cx); editor::init(cx); menu::init(); } diff --git a/crates/storybook/Cargo.toml b/crates/storybook/Cargo.toml index 638d070cba14cb871d33d53a0df0acb19ecb3840..148f036134a944283d9c07c69641a4fbcd49a134 100644 --- a/crates/storybook/Cargo.toml +++ b/crates/storybook/Cargo.toml @@ -26,7 +26,6 @@ language.workspace = true log.workspace = true menu.workspace = true picker.workspace = true -project.workspace = true reqwest_client.workspace = true rust-embed.workspace = true settings.workspace = true @@ -36,7 +35,6 @@ strum = { workspace = true, features = ["derive"] } theme.workspace = true title_bar = { workspace = true, features = ["stories"] } ui = { workspace = true, features = ["stories"] } -workspace.workspace = true [dev-dependencies] gpui = { workspace = true, features = ["test-support"] } diff --git a/crates/storybook/src/storybook.rs b/crates/storybook/src/storybook.rs index 592ee7bc7ac5cc92125fc7b4aa5846b4338884d7..42ca921e63b753c2bc938054e48708dfff6a04d5 100644 --- a/crates/storybook/src/storybook.rs +++ b/crates/storybook/src/storybook.rs @@ -14,14 +14,12 @@ use gpui::{ div, px, size, }; use log::LevelFilter; -use project::Project; use reqwest_client::ReqwestClient; use settings::{KeymapFile, Settings}; use simplelog::SimpleLogger; use strum::IntoEnumIterator; use theme::ThemeSettings; use ui::prelude::*; -use workspace; use crate::app_menus::app_menus; use crate::assets::Assets; @@ -85,10 +83,7 @@ fn main() { theme::ThemeSelection::Static(settings::ThemeName(theme_name.into())); ThemeSettings::override_global(theme_settings, cx); - language::init(cx); editor::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); init(cx); load_storybook_keymap(cx); cx.set_menus(app_menus()); diff --git a/crates/tab_switcher/src/tab_switcher_tests.rs b/crates/tab_switcher/src/tab_switcher_tests.rs index 43ce58496445fcc3936fe62b2fc0ac108652d382..52c96225655d2717879a27f6e7f9bbbe9bc4e7cb 100644 --- a/crates/tab_switcher/src/tab_switcher_tests.rs +++ b/crates/tab_switcher/src/tab_switcher_tests.rs @@ -284,11 +284,8 @@ fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); super::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); state }) } diff --git a/crates/tasks_ui/src/tasks_ui.rs b/crates/tasks_ui/src/tasks_ui.rs index ce925cdd7e2f60497fb9e6d37c44332958875530..b0185f98568399326ab0e45ffe713f7f1dc504fb 100644 --- a/crates/tasks_ui/src/tasks_ui.rs +++ b/crates/tasks_ui/src/tasks_ui.rs @@ -602,11 +602,8 @@ mod tests { pub(crate) fn init_test(cx: &mut TestAppContext) -> Arc { cx.update(|cx| { let state = AppState::test(cx); - language::init(cx); crate::init(cx); editor::init(cx); - workspace::init_settings(cx); - Project::init_settings(cx); TaskStore::init(None); state }) diff --git a/crates/terminal/src/terminal.rs b/crates/terminal/src/terminal.rs index 6ec5cd9ab8d6231c4a62549142901beb02a660c0..8283f5fad77ff3b6a4020db06439714d38bf119b 100644 --- a/crates/terminal/src/terminal.rs +++ b/crates/terminal/src/terminal.rs @@ -182,10 +182,6 @@ impl EventListener for ZedListener { } } -pub fn init(cx: &mut App) { - TerminalSettings::register(cx); -} - #[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct TerminalBounds { pub cell_width: Pixels, diff --git a/crates/terminal/src/terminal_settings.rs b/crates/terminal/src/terminal_settings.rs index b8576a1de308d8bf3bd098907018b94cb73eefa0..01def426d887309f657efeef1172facec3e16b42 100644 --- a/crates/terminal/src/terminal_settings.rs +++ b/crates/terminal/src/terminal_settings.rs @@ -8,8 +8,8 @@ use serde::{Deserialize, Serialize}; pub use settings::AlternateScroll; use settings::{ - ShowScrollbar, TerminalBlink, TerminalDockPosition, TerminalLineHeight, VenvSettings, - WorkingDirectory, merge_from::MergeFrom, + RegisterSetting, ShowScrollbar, TerminalBlink, TerminalDockPosition, TerminalLineHeight, + VenvSettings, WorkingDirectory, merge_from::MergeFrom, }; use task::Shell; use theme::FontFamilyName; @@ -19,7 +19,7 @@ pub struct Toolbar { pub breadcrumbs: bool, } -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Deserialize, RegisterSetting)] pub struct TerminalSettings { pub shell: Shell, pub working_directory: WorkingDirectory, diff --git a/crates/terminal_view/src/terminal_panel.rs b/crates/terminal_view/src/terminal_panel.rs index 6568eac324552a293d64060c07f6299d2edf9f8d..941689514d806acffb54fc0bfb8ecad86c1d2e70 100644 --- a/crates/terminal_view/src/terminal_panel.rs +++ b/crates/terminal_view/src/terminal_panel.rs @@ -1971,10 +1971,6 @@ mod tests { let store = SettingsStore::test(cx); cx.set_global(store); theme::init(theme::LoadThemes::JustBase, cx); - client::init_settings(cx); - language::init(cx); - Project::init_settings(cx); - workspace::init_settings(cx); editor::init(cx); crate::init(cx); }); diff --git a/crates/terminal_view/src/terminal_path_like_target.rs b/crates/terminal_view/src/terminal_path_like_target.rs index 8a9b824286508f26c824b18c6ba9a0dbc16e90bd..fa401966459c5ce3bc14918bf5b64089de4c50ed 100644 --- a/crates/terminal_view/src/terminal_path_like_target.rs +++ b/crates/terminal_view/src/terminal_path_like_target.rs @@ -534,10 +534,7 @@ mod tests { let fs = app_cx.update(AppState::test).fs.as_fake().clone(); app_cx.update(|cx| { - terminal::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - Project::init_settings(cx); - language::init(cx); editor::init(cx); }); diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 7208f28a80149d39d056a4767c7b8742f1147009..2bdce16125e3a70eaa94779cf0297c62e87f9cac 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -95,7 +95,6 @@ actions!( pub fn init(cx: &mut App) { assistant_slash_command::init(cx); terminal_panel::init(cx); - terminal::init(cx); register_serializable_item::(cx); @@ -1692,10 +1691,7 @@ mod tests { pub async fn init_test(cx: &mut TestAppContext) -> (Entity, Entity) { let params = cx.update(AppState::test); cx.update(|cx| { - terminal::init(cx); theme::init(theme::LoadThemes::JustBase, cx); - Project::init_settings(cx); - language::init(cx); }); let project = Project::test(params.fs.clone(), [], cx).await; diff --git a/crates/theme/src/settings.rs b/crates/theme/src/settings.rs index 3ac0f410efbdb4418236959e06d1b6772f7e3684..024eca7a5c7d82e9306468e30b53fa897f470adf 100644 --- a/crates/theme/src/settings.rs +++ b/crates/theme/src/settings.rs @@ -12,7 +12,7 @@ use refineable::Refineable; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; pub use settings::{FontFamilyName, IconThemeName, ThemeMode, ThemeName}; -use settings::{Settings, SettingsContent}; +use settings::{RegisterSetting, Settings, SettingsContent}; use std::sync::Arc; const MIN_FONT_SIZE: Pixels = px(6.0); @@ -94,7 +94,7 @@ impl From for UiDensity { } /// Customizable settings for the UI and theme system. -#[derive(Clone, PartialEq)] +#[derive(Clone, PartialEq, RegisterSetting)] pub struct ThemeSettings { /// The UI font size. Determines the size of text in the UI, /// as well as the size of a [gpui::Rems] unit. diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index fab173484d999711590e6600a92e6ac870bee54e..aef975416f7698bfad0ba50de08269c9000a1dec 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -108,7 +108,6 @@ pub fn init(themes_to_load: LoadThemes, cx: &mut App) { ThemeRegistry::global(cx).load_bundled_themes(); } - ThemeSettings::register(cx); FontFamilyCache::init_global(cx); let theme = GlobalTheme::configured_theme(cx); diff --git a/crates/title_bar/src/title_bar.rs b/crates/title_bar/src/title_bar.rs index 18a4592edb153dd204bf8df72b1d37fbc81567d5..0652744a36b2a9e0b09347553a6d16f6c5344dbe 100644 --- a/crates/title_bar/src/title_bar.rs +++ b/crates/title_bar/src/title_bar.rs @@ -66,7 +66,6 @@ actions!( ); pub fn init(cx: &mut App) { - TitleBarSettings::register(cx); SystemWindowTabs::init(cx); cx.observe_new(|workspace: &mut Workspace, window, cx| { diff --git a/crates/title_bar/src/title_bar_settings.rs b/crates/title_bar/src/title_bar_settings.rs index bc9b1acbaa06cf60396e61ff68470c8a544e3f5d..29fae4d31eb33ac70a22c21010f09350847439c2 100644 --- a/crates/title_bar/src/title_bar_settings.rs +++ b/crates/title_bar/src/title_bar_settings.rs @@ -1,6 +1,6 @@ -use settings::{Settings, SettingsContent}; +use settings::{RegisterSetting, Settings, SettingsContent}; -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, RegisterSetting)] pub struct TitleBarSettings { pub show_branch_icon: bool, pub show_onboarding_banner: bool, diff --git a/crates/vim/src/test/vim_test_context.rs b/crates/vim/src/test/vim_test_context.rs index 0ea300e30cbc93d60856890d2ca986dbc024127f..6300e3a3fcc079e064ef0e26c3e218b4032aa890 100644 --- a/crates/vim/src/test/vim_test_context.rs +++ b/crates/vim/src/test/vim_test_context.rs @@ -25,10 +25,6 @@ impl VimTestContext { git_ui::init(cx); crate::init(cx); search::init(cx); - workspace::init_settings(cx); - language::init(cx); - editor::init_settings(cx); - project::Project::init_settings(cx); theme::init(theme::LoadThemes::JustBase, cx); settings_ui::init(cx); }); diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index 40b8dc4b56723c94e9d9a873e05d5b00cdbf9987..6ffdbcce910c10229dc7c2e6df95055c5c812f28 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -40,6 +40,7 @@ use normal::search::SearchSubmit; use object::Object; use schemars::JsonSchema; use serde::Deserialize; +use settings::RegisterSetting; pub use settings::{ ModeContent, Settings, SettingsStore, UseSystemClipboard, update_settings_file, }; @@ -268,8 +269,6 @@ actions!( /// Initializes the `vim` crate. pub fn init(cx: &mut App) { - vim_mode_setting::init(cx); - VimSettings::register(cx); VimGlobals::register(cx); cx.observe_new(Vim::register).detach(); @@ -1943,6 +1942,7 @@ impl Vim { } } +#[derive(RegisterSetting)] struct VimSettings { pub default_mode: Mode, pub toggle_relative_line_numbers: bool, diff --git a/crates/vim_mode_setting/Cargo.toml b/crates/vim_mode_setting/Cargo.toml index 6306d125b27a5342a61f503520692c099ab9c4f6..0ae75d9d55136a499492893afdf14398073c6df3 100644 --- a/crates/vim_mode_setting/Cargo.toml +++ b/crates/vim_mode_setting/Cargo.toml @@ -12,5 +12,4 @@ workspace = true path = "src/vim_mode_setting.rs" [dependencies] -gpui.workspace = true settings.workspace = true diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 4caa95b2b412755bd4663a024197c074cb0f1b51..e229913a80b0bedcd4ef7b872f1559b98c803d0c 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -4,15 +4,9 @@ //! disable Vim/Helix modes without having to depend on the `vim` crate in its //! entirety. -use gpui::App; -use settings::{Settings, SettingsContent}; - -/// Initializes the `vim_mode_setting` crate. -pub fn init(cx: &mut App) { - VimModeSetting::register(cx); - HelixModeSetting::register(cx); -} +use settings::{RegisterSetting, Settings, SettingsContent}; +#[derive(RegisterSetting)] pub struct VimModeSetting(pub bool); impl Settings for VimModeSetting { @@ -21,6 +15,7 @@ impl Settings for VimModeSetting { } } +#[derive(RegisterSetting)] pub struct HelixModeSetting(pub bool); impl Settings for HelixModeSetting { diff --git a/crates/workspace/src/item.rs b/crates/workspace/src/item.rs index ee9a10d9c5344cfa372bf88a95e46de1705ee093..e68b5a99ee352bb1f5c0242f68e9ab894362497e 100644 --- a/crates/workspace/src/item.rs +++ b/crates/workspace/src/item.rs @@ -17,7 +17,8 @@ use gpui::{ }; use project::{Project, ProjectEntryId, ProjectPath}; pub use settings::{ - ActivateOnClose, ClosePosition, Settings, SettingsLocation, ShowCloseButton, ShowDiagnostics, + ActivateOnClose, ClosePosition, RegisterSetting, Settings, SettingsLocation, ShowCloseButton, + ShowDiagnostics, }; use smallvec::SmallVec; use std::{ @@ -50,6 +51,7 @@ impl Default for SaveOptions { } } +#[derive(RegisterSetting)] pub struct ItemSettings { pub git_status: bool, pub close_position: ClosePosition, @@ -59,6 +61,7 @@ pub struct ItemSettings { pub show_close_button: ShowCloseButton, } +#[derive(RegisterSetting)] pub struct PreviewTabsSettings { pub enabled: bool, pub enable_preview_from_file_finder: bool, diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index c72183240061018bd979b2eb34c28c517da620f5..24f4254232b33975d77f227a6fa2af57d49c25fd 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -6873,8 +6873,6 @@ mod tests { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); theme::init(LoadThemes::JustBase, cx); - crate::init_settings(cx); - Project::init_settings(cx); }); } diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 2f8095deab4717f95180439f57c295c7d8a7ed14..7e35510652b1118e9dc8ffa18491d3c2a7904c75 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -527,14 +527,6 @@ impl From for i64 { } } -pub fn init_settings(cx: &mut App) { - WorkspaceSettings::register(cx); - ItemSettings::register(cx); - PreviewTabsSettings::register(cx); - TabBarSettings::register(cx); - StatusBarSettings::register(cx); -} - fn prompt_and_open_paths(app_state: Arc, options: PathPromptOptions, cx: &mut App) { let paths = cx.prompt_for_paths(options); cx.spawn( @@ -568,7 +560,6 @@ fn prompt_and_open_paths(app_state: Arc, options: PathPromptOptions, c } pub fn init(app_state: Arc, cx: &mut App) { - init_settings(cx); component::init(); theme_preview::init(cx); toast_layer::init(cx); @@ -987,7 +978,6 @@ impl AppState { theme::init(theme::LoadThemes::JustBase, cx); client::init(&client, cx); - crate::init_settings(cx); Arc::new(Self { client, @@ -11341,9 +11331,6 @@ mod tests { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); theme::init(theme::LoadThemes::JustBase, cx); - language::init(cx); - crate::init_settings(cx); - Project::init_settings(cx); }); } diff --git a/crates/workspace/src/workspace_settings.rs b/crates/workspace/src/workspace_settings.rs index f061227f2cb264b1be1234364ca1e8de7a462e86..24958df7c6d5d36fee243022d700ccf56a570a19 100644 --- a/crates/workspace/src/workspace_settings.rs +++ b/crates/workspace/src/workspace_settings.rs @@ -3,13 +3,12 @@ use std::num::NonZeroUsize; use crate::DockPosition; use collections::HashMap; use serde::Deserialize; -pub use settings::AutosaveSetting; pub use settings::{ - BottomDockLayout, PaneSplitDirectionHorizontal, PaneSplitDirectionVertical, - RestoreOnStartupBehavior, + AutosaveSetting, BottomDockLayout, InactiveOpacity, PaneSplitDirectionHorizontal, + PaneSplitDirectionVertical, RegisterSetting, RestoreOnStartupBehavior, Settings, }; -use settings::{InactiveOpacity, Settings}; +#[derive(RegisterSetting)] pub struct WorkspaceSettings { pub active_pane_modifiers: ActivePanelModifiers, pub bottom_dock_layout: settings::BottomDockLayout, @@ -53,7 +52,7 @@ pub struct ActivePanelModifiers { pub inactive_opacity: Option, } -#[derive(Deserialize)] +#[derive(Deserialize, RegisterSetting)] pub struct TabBarSettings { pub show: bool, pub show_nav_history_buttons: bool, @@ -121,7 +120,7 @@ impl Settings for TabBarSettings { } } -#[derive(Deserialize)] +#[derive(Deserialize, RegisterSetting)] pub struct StatusBarSettings { pub show: bool, pub active_language_button: bool, diff --git a/crates/worktree/src/worktree_settings.rs b/crates/worktree/src/worktree_settings.rs index 3240978cc8694e1ce3cdc809a0929bc558f91766..94e83a16decd6b5d68498944e26ddcabecd27eed 100644 --- a/crates/worktree/src/worktree_settings.rs +++ b/crates/worktree/src/worktree_settings.rs @@ -1,14 +1,14 @@ use std::path::Path; use anyhow::Context as _; -use settings::Settings; +use settings::{RegisterSetting, Settings}; use util::{ ResultExt, paths::{PathMatcher, PathStyle}, rel_path::RelPath, }; -#[derive(Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq, RegisterSetting)] pub struct WorktreeSettings { pub project_name: Option, /// Whether to prevent this project from being shared in public channels. diff --git a/crates/worktree/src/worktree_tests.rs b/crates/worktree/src/worktree_tests.rs index fcd842846b4308c15cc5f01bbdd47e72598ce821..e8d98b3508bd14f7ea8baaf1b985b42293eb078d 100644 --- a/crates/worktree/src/worktree_tests.rs +++ b/crates/worktree/src/worktree_tests.rs @@ -1,7 +1,4 @@ -use crate::{ - Entry, EntryKind, Event, PathChange, Worktree, WorktreeModelHandle, - worktree_settings::WorktreeSettings, -}; +use crate::{Entry, EntryKind, Event, PathChange, Worktree, WorktreeModelHandle}; use anyhow::Result; use fs::{FakeFs, Fs, RealFs, RemoveOptions}; use git::GITIGNORE; @@ -12,7 +9,7 @@ use pretty_assertions::assert_eq; use rand::prelude::*; use serde_json::json; -use settings::{Settings, SettingsStore}; +use settings::SettingsStore; use std::{ env, fmt::Write, @@ -2269,6 +2266,5 @@ fn init_test(cx: &mut gpui::TestAppContext) { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - WorktreeSettings::register(cx); }); } diff --git a/crates/worktree_benchmarks/src/main.rs b/crates/worktree_benchmarks/src/main.rs index ca86687aff2d4f5f060ca620205dba5d8da6a73a..00f268b75fc5f1e7d6033ec46f3718ea39cdccda 100644 --- a/crates/worktree_benchmarks/src/main.rs +++ b/crates/worktree_benchmarks/src/main.rs @@ -19,7 +19,6 @@ fn main() { app.run(|cx| { settings::init(cx); - WorktreeSettings::register(cx); let fs = Arc::new(RealFs::new(None, cx.background_executor().clone())); cx.spawn(async move |cx| { diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index be1c2464cc38c6710fdadffe41b94bf28c8abde4..14308450e2adda064de4ded30a7649441b4d2d25 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -409,7 +409,7 @@ pub fn main() { handle_settings_changed, ); handle_keymap_file_changes(user_keymap_file_rx, cx); - client::init_settings(cx); + let user_agent = format!( "Zed/{} ({}; {})", AppVersion::global(cx), @@ -468,7 +468,6 @@ pub fn main() { let node_runtime = NodeRuntime::new(client.http_client(), Some(shell_env_loaded_rx), rx); debug_adapter_extension::init(extension_host_proxy.clone(), cx); - language::init(cx); languages::init(languages.clone(), fs.clone(), node_runtime.clone(), cx); let user_store = cx.new(|cx| UserStore::new(client.clone(), cx)); let workspace_store = cx.new(|cx| WorkspaceStore::new(client.clone(), cx)); @@ -573,7 +572,6 @@ pub fn main() { supermaven::init(app_state.client.clone(), cx); language_model::init(app_state.client.clone(), cx); language_models::init(app_state.user_store.clone(), app_state.client.clone(), cx); - agent_settings::init(cx); acp_tools::init(cx); zeta2_tools::init(cx); web_search::init(cx); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index f50d6cf5f8bc1e5e2acadc19a4d7dcc5045000b6..d83e1eafc197ae394aceac7a205818074fb7173f 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -1408,9 +1408,6 @@ pub fn handle_keymap_file_changes( mut user_keymap_file_rx: mpsc::UnboundedReceiver, cx: &mut App, ) { - BaseKeymap::register(cx); - vim_mode_setting::init(cx); - let (base_keymap_tx, mut base_keymap_rx) = mpsc::unbounded(); let (keyboard_layout_tx, mut keyboard_layout_rx) = mpsc::unbounded(); let mut old_base_keymap = *BaseKeymap::get_global(cx); @@ -4331,10 +4328,8 @@ mod tests { theme::init(theme::LoadThemes::JustBase, cx); client::init(&app_state.client, cx); - language::init(cx); workspace::init(app_state.clone(), cx); onboarding::init(cx); - Project::init_settings(cx); app_state }) } @@ -4797,21 +4792,17 @@ mod tests { let state = Arc::get_mut(&mut app_state).unwrap(); state.build_window_options = build_window_options; - app_state.languages.add(markdown_language()); gpui_tokio::init(cx); - vim_mode_setting::init(cx); theme::init(theme::LoadThemes::JustBase, cx); audio::init(cx); channel::init(&app_state.client, app_state.user_store.clone(), cx); call::init(app_state.client.clone(), app_state.user_store.clone(), cx); notifications::init(app_state.client.clone(), app_state.user_store.clone(), cx); workspace::init(app_state.clone(), cx); - Project::init_settings(cx); release_channel::init(SemanticVersion::default(), cx); command_palette::init(cx); - language::init(cx); editor::init(cx); collab_ui::init(&app_state, cx); git_ui::init(cx); diff --git a/crates/zed/src/zed/open_listener.rs b/crates/zed/src/zed/open_listener.rs index 3abb76715d67e3d288cf812fc6a4bff58ac3ddfe..13b636731798ebe13bb7c9ae8d97bf52356ea0b2 100644 --- a/crates/zed/src/zed/open_listener.rs +++ b/crates/zed/src/zed/open_listener.rs @@ -665,9 +665,6 @@ mod tests { #[gpui::test] fn test_parse_ssh_url(cx: &mut TestAppContext) { let _app_state = init_test(cx); - cx.update(|cx| { - SshSettings::register(cx); - }); let request = cx.update(|cx| { OpenRequest::parse( RawOpenRequest { diff --git a/crates/zeta/src/license_detection.rs b/crates/zeta/src/license_detection.rs index 44dae09d0a18e5732b9c52ce73cdf71abecc81b0..d4d4825615f19e5e5654f7bd78439d9eaa39e4c1 100644 --- a/crates/zeta/src/license_detection.rs +++ b/crates/zeta/src/license_detection.rs @@ -390,8 +390,7 @@ mod tests { use gpui::TestAppContext; use rand::Rng as _; use serde_json::json; - use settings::{Settings as _, SettingsStore}; - use worktree::WorktreeSettings; + use settings::SettingsStore; use super::*; @@ -720,7 +719,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - WorktreeSettings::register(cx); }); } diff --git a/crates/zeta/src/zeta.rs b/crates/zeta/src/zeta.rs index 3bd614b480793c07c0c7b7e4f2578cd2b6cba6bd..0b939bdee27851a9ec9975b586c9a7bcad67484f 100644 --- a/crates/zeta/src/zeta.rs +++ b/crates/zeta/src/zeta.rs @@ -2079,9 +2079,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - client::init_settings(cx); - Project::init_settings(cx); }); } diff --git a/crates/zeta2/src/udiff.rs b/crates/zeta2/src/udiff.rs index 866ab6f7cead61ba5add462404bd594080e3098e..b30eb22741a1e701e2e744445f2a01c1f0ed0d03 100644 --- a/crates/zeta2/src/udiff.rs +++ b/crates/zeta2/src/udiff.rs @@ -1015,8 +1015,6 @@ mod tests { cx.update(|cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - Project::init_settings(cx); - language::init(cx); }); FakeFs::new(cx.background_executor.clone()) diff --git a/crates/zeta2/src/zeta2.rs b/crates/zeta2/src/zeta2.rs index 7dd5f8d27dcef5455a14854faa8426d4badac4b8..503964c88f18562dbf10197bfc330ffe49add8d5 100644 --- a/crates/zeta2/src/zeta2.rs +++ b/crates/zeta2/src/zeta2.rs @@ -2095,8 +2095,6 @@ mod tests { cx.update(move |cx| { let settings_store = SettingsStore::test(cx); cx.set_global(settings_store); - language::init(cx); - Project::init_settings(cx); zlog::init_test(); let (req_tx, req_rx) = mpsc::unbounded(); diff --git a/crates/zeta_cli/src/headless.rs b/crates/zeta_cli/src/headless.rs index bb4cb010cba6ea29a9bcd6d8cc0dc93475dbc2a0..35fbf1313e21bac33f8dfb5325fae365ae133aee 100644 --- a/crates/zeta_cli/src/headless.rs +++ b/crates/zeta_cli/src/headless.rs @@ -7,7 +7,6 @@ use gpui_tokio::Tokio; use language::LanguageRegistry; use language_extension::LspAccess; use node_runtime::{NodeBinaryOptions, NodeRuntime}; -use project::Project; use project::project_settings::ProjectSettings; use release_channel::AppVersion; use reqwest_client::ReqwestClient; @@ -33,7 +32,6 @@ pub fn init(cx: &mut App) -> ZetaCliAppState { let settings_store = SettingsStore::new(cx, &settings::default_settings()); cx.set_global(settings_store); - client::init_settings(cx); // Set User-Agent so we can download language servers from GitHub let user_agent = format!( @@ -55,8 +53,6 @@ pub fn init(cx: &mut App) -> ZetaCliAppState { }; cx.set_http_client(Arc::new(http)); - Project::init_settings(cx); - let client = Client::production(cx); cx.set_http_client(client.http_client()); @@ -102,7 +98,6 @@ pub fn init(cx: &mut App) -> ZetaCliAppState { let extension_host_proxy = ExtensionHostProxy::global(cx); - language::init(cx); debug_adapter_extension::init(extension_host_proxy.clone(), cx); language_extension::init(LspAccess::Noop, extension_host_proxy, languages.clone()); language_model::init(client.clone(), cx); diff --git a/crates/zlog_settings/src/zlog_settings.rs b/crates/zlog_settings/src/zlog_settings.rs index abbce9a98c3106de0093a8586313fbda9750b12b..cb09375b9a6c471ad3e5a220c628a8ffdc0d4072 100644 --- a/crates/zlog_settings/src/zlog_settings.rs +++ b/crates/zlog_settings/src/zlog_settings.rs @@ -2,11 +2,9 @@ use collections::HashMap; use gpui::App; -use settings::{Settings, SettingsStore}; +use settings::{RegisterSetting, Settings, SettingsStore}; pub fn init(cx: &mut App) { - ZlogSettings::register(cx); - cx.observe_global::(|cx| { let zlog_settings = ZlogSettings::get_global(cx); zlog::filter::refresh_from_settings(&zlog_settings.scopes); @@ -14,7 +12,7 @@ pub fn init(cx: &mut App) { .detach(); } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, RegisterSetting)] pub struct ZlogSettings { /// A map of log scopes to the desired log level. /// Useful for filtering out noisy logs or enabling more verbose logging.