No more options

Conrad Irwin created

Change summary

crates/audio/src/audio_settings.rs              | 16 +-
crates/git_hosting_providers/src/settings.rs    | 20 +--
crates/language/src/language_settings.rs        | 99 +++++++++---------
crates/multi_buffer/src/multi_buffer.rs         |  2 
crates/settings/src/base_keymap_setting.rs      |  4 
crates/settings/src/settings_store.rs           | 60 +++++-----
crates/theme/src/settings.rs                    | 43 ++++---
crates/title_bar/src/title_bar_settings.rs      |  2 
crates/vim_mode_setting/src/vim_mode_setting.rs |  8 
crates/zlog_settings/src/zlog_settings.rs       |  8 
10 files changed, 131 insertions(+), 131 deletions(-)

Detailed changes

crates/audio/src/audio_settings.rs 🔗

@@ -4,7 +4,7 @@ use gpui::App;
 use settings::{Settings, SettingsStore};
 use util::MergeFrom as _;
 
-#[derive(Clone, Default, Debug)]
+#[derive(Clone, Debug)]
 pub struct AudioSettings {
     /// Opt into the new audio system.
     pub rodio_audio: bool, // default is false
@@ -23,13 +23,13 @@ pub struct AudioSettings {
 
 /// Configuration of audio in Zed
 impl Settings for AudioSettings {
-    fn from_default(content: &settings::SettingsContent, _cx: &mut App) -> Option<Self> {
-        let audio = &content.audio.as_ref()?;
-        Some(AudioSettings {
-            control_input_volume: audio.control_input_volume?,
-            control_output_volume: audio.control_output_volume?,
-            rodio_audio: audio.rodio_audio?,
-        })
+    fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self {
+        let audio = &content.audio.as_ref().unwrap();
+        AudioSettings {
+            control_input_volume: audio.control_input_volume.unwrap(),
+            control_output_volume: audio.control_output_volume.unwrap(),
+            rodio_audio: audio.rodio_audio.unwrap(),
+        }
     }
 
     fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) {

crates/git_hosting_providers/src/settings.rs 🔗

@@ -2,12 +2,7 @@ use std::sync::Arc;
 
 use git::GitHostingProviderRegistry;
 use gpui::App;
-use schemars::JsonSchema;
-use serde::{Deserialize, Serialize};
-use settings::{
-    GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsKey, SettingsStore,
-    SettingsUi,
-};
+use settings::{GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsStore};
 use url::Url;
 use util::ResultExt as _;
 
@@ -57,19 +52,16 @@ fn update_git_hosting_providers_from_settings(cx: &mut App) {
     provider_registry.set_setting_providers(iter);
 }
 
-#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)]
-#[settings_key(None)]
+#[derive(Debug, Clone)]
 pub struct GitHostingProviderSettings {
-    /// The list of custom Git hosting providers.
-    #[serde(default)]
     pub git_hosting_providers: Vec<GitHostingProviderConfig>,
 }
 
 impl Settings for GitHostingProviderSettings {
-    fn from_default(content: &settings::SettingsContent, _cx: &mut App) -> Option<Self> {
-        Some(Self {
-            git_hosting_providers: content.git_hosting_providers.clone()?,
-        })
+    fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self {
+        Self {
+            git_hosting_providers: content.git_hosting_providers.clone().unwrap(),
+        }
     }
 
     fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) {

crates/language/src/language_settings.rs 🔗

@@ -374,45 +374,49 @@ fn merge_with_editorconfig(settings: &mut LanguageSettings, cfg: &EditorconfigPr
 }
 
 impl settings::Settings for AllLanguageSettings {
-    fn from_default(content: &settings::SettingsContent, cx: &mut App) -> Option<Self> {
+    fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self {
         let all_languages = &content.project.all_languages;
-        let defaults = &all_languages.defaults;
+        let defaults = all_languages.defaults.clone();
         let default_language_settings = LanguageSettings {
-            tab_size: defaults.tab_size?,
-            hard_tabs: defaults.hard_tabs?,
-            soft_wrap: defaults.soft_wrap?,
-            preferred_line_length: defaults.preferred_line_length?,
-            show_wrap_guides: defaults.show_wrap_guides?,
-            wrap_guides: defaults.wrap_guides.clone()?,
-            indent_guides: defaults.indent_guides.clone()?,
-            format_on_save: defaults.format_on_save.clone()?,
-            remove_trailing_whitespace_on_save: defaults.remove_trailing_whitespace_on_save?,
-            ensure_final_newline_on_save: defaults.ensure_final_newline_on_save?,
-            formatter: defaults.formatter.clone()?,
-            prettier: defaults.prettier.clone()?,
-            jsx_tag_auto_close: defaults.jsx_tag_auto_close.clone()?,
-            enable_language_server: defaults.enable_language_server?,
-            language_servers: defaults.language_servers.clone()?,
-            allow_rewrap: defaults.allow_rewrap?,
-            show_edit_predictions: defaults.show_edit_predictions?,
-            edit_predictions_disabled_in: defaults.edit_predictions_disabled_in.clone()?,
-            show_whitespaces: defaults.show_whitespaces?,
-            whitespace_map: defaults.whitespace_map.clone()?,
-            extend_comment_on_newline: defaults.extend_comment_on_newline?,
-            inlay_hints: defaults.inlay_hints.clone()?,
-            use_autoclose: defaults.use_autoclose?,
-            use_auto_surround: defaults.use_auto_surround?,
-            use_on_type_format: defaults.use_on_type_format?,
-            auto_indent: defaults.auto_indent?,
-            auto_indent_on_paste: defaults.auto_indent_on_paste?,
-            always_treat_brackets_as_autoclosed: defaults.always_treat_brackets_as_autoclosed?,
-            code_actions_on_format: defaults.code_actions_on_format.clone()?,
-            linked_edits: defaults.linked_edits?,
-            tasks: defaults.tasks.clone()?,
-            show_completions_on_input: defaults.show_completions_on_input?,
-            show_completion_documentation: defaults.show_completion_documentation?,
-            completions: defaults.completions.clone()?,
-            debuggers: defaults.debuggers.clone()?,
+            tab_size: defaults.tab_size.unwrap(),
+            hard_tabs: defaults.hard_tabs.unwrap(),
+            soft_wrap: defaults.soft_wrap.unwrap(),
+            preferred_line_length: defaults.preferred_line_length.unwrap(),
+            show_wrap_guides: defaults.show_wrap_guides.unwrap(),
+            wrap_guides: defaults.wrap_guides.unwrap(),
+            indent_guides: defaults.indent_guides.unwrap(),
+            format_on_save: defaults.format_on_save.unwrap(),
+            remove_trailing_whitespace_on_save: defaults
+                .remove_trailing_whitespace_on_save
+                .unwrap(),
+            ensure_final_newline_on_save: defaults.ensure_final_newline_on_save.unwrap(),
+            formatter: defaults.formatter.unwrap(),
+            prettier: defaults.prettier.unwrap(),
+            jsx_tag_auto_close: defaults.jsx_tag_auto_close.unwrap(),
+            enable_language_server: defaults.enable_language_server.unwrap(),
+            language_servers: defaults.language_servers.unwrap(),
+            allow_rewrap: defaults.allow_rewrap.unwrap(),
+            show_edit_predictions: defaults.show_edit_predictions.unwrap(),
+            edit_predictions_disabled_in: defaults.edit_predictions_disabled_in.unwrap(),
+            show_whitespaces: defaults.show_whitespaces.unwrap(),
+            whitespace_map: defaults.whitespace_map.unwrap(),
+            extend_comment_on_newline: defaults.extend_comment_on_newline.unwrap(),
+            inlay_hints: defaults.inlay_hints.unwrap(),
+            use_autoclose: defaults.use_autoclose.unwrap(),
+            use_auto_surround: defaults.use_auto_surround.unwrap(),
+            use_on_type_format: defaults.use_on_type_format.unwrap(),
+            auto_indent: defaults.auto_indent.unwrap(),
+            auto_indent_on_paste: defaults.auto_indent_on_paste.unwrap(),
+            always_treat_brackets_as_autoclosed: defaults
+                .always_treat_brackets_as_autoclosed
+                .unwrap(),
+            code_actions_on_format: defaults.code_actions_on_format.unwrap(),
+            linked_edits: defaults.linked_edits.unwrap(),
+            tasks: defaults.tasks.unwrap(),
+            show_completions_on_input: defaults.show_completions_on_input.unwrap(),
+            show_completion_documentation: defaults.show_completion_documentation.unwrap(),
+            completions: defaults.completions.unwrap(),
+            debuggers: defaults.debuggers.unwrap(),
         };
 
         let mut languages = HashMap::default();
@@ -426,16 +430,17 @@ impl settings::Settings for AllLanguageSettings {
             .features
             .as_ref()
             .and_then(|f| f.edit_prediction_provider);
-        let edit_predictions_mode = all_languages
-            .edit_predictions
-            .as_ref()
-            .map(|edit_predictions| edit_predictions.mode)?;
+        let edit_predictions_mode = all_languages.edit_predictions.as_ref().unwrap().mode;
 
         let disabled_globs: HashSet<&String> = all_languages
             .edit_predictions
             .as_ref()
-            .and_then(|c| c.disabled_globs.as_ref())
-            .map(|globs| globs.iter().collect())?;
+            .unwrap()
+            .disabled_globs
+            .as_ref()
+            .unwrap()
+            .iter()
+            .collect();
 
         let copilot_settings = all_languages
             .edit_predictions
@@ -460,14 +465,14 @@ impl settings::Settings for AllLanguageSettings {
             let mut builder = GlobSetBuilder::new();
 
             for pattern in patterns {
-                builder.add(Glob::new(pattern).log_err()?);
+                builder.add(Glob::new(pattern).unwrap());
             }
 
-            file_types.insert(language.clone(), builder.build().log_err()?);
+            file_types.insert(language.clone(), builder.build().unwrap());
             file_globs.insert(language.clone(), patterns.clone());
         }
 
-        Some(Self {
+        Self {
             edit_predictions: EditPredictionSettings {
                 provider: if let Some(provider) = edit_prediction_provider {
                     provider
@@ -492,7 +497,7 @@ impl settings::Settings for AllLanguageSettings {
             languages,
             file_types,
             file_globs,
-        })
+        }
     }
 
     fn refine(&mut self, content: &SettingsContent, _cx: &mut App) {

crates/multi_buffer/src/multi_buffer.rs 🔗

@@ -5913,7 +5913,7 @@ impl MultiBufferSnapshot {
                             end_row: last_row,
                             depth: next_depth,
                             tab_size,
-                            settings: settings.indent_guides,
+                            settings: settings.indent_guides.clone(),
                         });
                     }
                 }

crates/settings/src/base_keymap_setting.rs 🔗

@@ -139,8 +139,8 @@ pub struct BaseKeymapSetting {
 }
 
 impl Settings for BaseKeymap {
-    fn from_default(s: &crate::settings_content::SettingsContent, _cx: &mut App) -> Option<Self> {
-        s.base_keymap.map(Into::into)
+    fn from_defaults(s: &crate::settings_content::SettingsContent, _cx: &mut App) -> Self {
+        s.base_keymap.unwrap().into()
     }
 
     fn refine(&mut self, s: &settings_content::SettingsContent, _cx: &mut App) {

crates/settings/src/settings_store.rs 🔗

@@ -57,8 +57,15 @@ pub trait Settings: 'static + Send + Sync + Sized {
     /// user settings match the current version of the settings.
     const PRESERVED_KEYS: Option<&'static [&'static str]> = None;
 
-    fn from_default(content: &SettingsContent, cx: &mut App) -> Option<Self>;
+    /// Read the value from default.json.
+    /// This function *should* panic if default values are missing,
+    /// and you should add a default to default.json for documentation.
+    fn from_defaults(content: &SettingsContent, cx: &mut App) -> Self;
 
+    /// Update the value based on the content from the current file.
+    ///
+    /// This function *should not* panic if there are problems, as the
+    /// content of user-provided settings files may be incomplete or invalid.
     fn refine(&mut self, content: &SettingsContent, cx: &mut App);
 
     fn missing_default() -> anyhow::Error {
@@ -186,7 +193,7 @@ struct SettingValue<T> {
 trait AnySettingValue: 'static + Send + Sync {
     fn setting_type_name(&self) -> &'static str;
 
-    fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Option<Box<dyn Any>>;
+    fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Box<dyn Any>;
     fn refine(&self, value: &mut dyn Any, s: &[&SettingsContent], cx: &mut App);
 
     fn value_for_path(&self, path: Option<SettingsLocation>) -> &dyn Any;
@@ -277,12 +284,7 @@ impl SettingsStore {
         if let Some(server_settings) = self.server_settings.as_ref() {
             refinements.push(server_settings)
         }
-        let Some(mut value) = T::from_default(&self.default_settings, cx) else {
-            panic!(
-                "{}::from_default return None for default.json",
-                type_name::<T>()
-            )
-        };
+        let mut value = T::from_defaults(&self.default_settings, cx);
         for refinement in refinements {
             value.refine(refinement, cx)
         }
@@ -864,9 +866,7 @@ impl SettingsStore {
         for setting_value in self.setting_values.values_mut() {
             // If the global settings file changed, reload the global value for the field.
             if changed_local_path.is_none() {
-                let mut value = setting_value
-                    .from_default(&self.default_settings, cx)
-                    .unwrap();
+                let mut value = setting_value.from_default(&self.default_settings, cx);
                 setting_value.refine(value.as_mut(), &refinements, cx);
                 setting_value.set_global_value(value);
             }
@@ -898,9 +898,7 @@ impl SettingsStore {
                     continue;
                 }
 
-                let mut value = setting_value
-                    .from_default(&self.default_settings, cx)
-                    .unwrap();
+                let mut value = setting_value.from_default(&self.default_settings, cx);
                 setting_value.refine(value.as_mut(), &refinements, cx);
                 setting_value.refine(value.as_mut(), &project_settings_stack, cx);
                 setting_value.set_local_value(*root_id, directory_path.clone(), value);
@@ -984,8 +982,8 @@ impl Debug for SettingsStore {
 }
 
 impl<T: Settings> AnySettingValue for SettingValue<T> {
-    fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Option<Box<dyn Any>> {
-        T::from_default(s, cx).map(|result| Box::new(result) as _)
+    fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Box<dyn Any> {
+        Box::new(T::from_defaults(s, cx)) as _
     }
 
     fn refine(&self, value: &mut dyn Any, refinements: &[&SettingsContent], cx: &mut App) {
@@ -1063,10 +1061,10 @@ mod tests {
     }
 
     impl Settings for AutoUpdateSetting {
-        fn from_default(content: &SettingsContent, _: &mut App) -> Option<Self> {
-            content
-                .auto_update
-                .map(|auto_update| AutoUpdateSetting { auto_update })
+        fn from_defaults(content: &SettingsContent, _: &mut App) -> Self {
+            AutoUpdateSetting {
+                auto_update: content.auto_update.unwrap(),
+            }
         }
 
         fn refine(&mut self, content: &SettingsContent, _: &mut App) {
@@ -1085,12 +1083,12 @@ mod tests {
     }
 
     impl Settings for TitleBarSettings {
-        fn from_default(content: &SettingsContent, _: &mut App) -> Option<Self> {
-            let content = content.title_bar.clone()?;
-            Some(TitleBarSettings {
-                show: content.show?,
-                show_branch_name: content.show_branch_name?,
-            })
+        fn from_defaults(content: &SettingsContent, _: &mut App) -> Self {
+            let content = content.title_bar.clone().unwrap();
+            TitleBarSettings {
+                show: content.show.unwrap(),
+                show_branch_name: content.show_branch_name.unwrap(),
+            }
         }
 
         fn refine(&mut self, content: &SettingsContent, _: &mut App) {
@@ -1121,12 +1119,12 @@ mod tests {
     }
 
     impl Settings for DefaultLanguageSettings {
-        fn from_default(content: &SettingsContent, _: &mut App) -> Option<Self> {
+        fn from_defaults(content: &SettingsContent, _: &mut App) -> Self {
             let content = &content.project.all_languages.defaults;
-            Some(DefaultLanguageSettings {
-                tab_size: content.tab_size?,
-                preferred_line_length: content.preferred_line_length?,
-            })
+            DefaultLanguageSettings {
+                tab_size: content.tab_size.unwrap(),
+                preferred_line_length: content.preferred_line_length.unwrap(),
+            }
         }
 
         fn refine(&mut self, content: &SettingsContent, _: &mut App) {

crates/theme/src/settings.rs 🔗

@@ -796,31 +796,37 @@ fn font_fallbacks_from_settings(
 }
 
 impl settings::Settings for ThemeSettings {
-    fn from_default(content: &settings::SettingsContent, cx: &mut App) -> Option<Self> {
+    fn from_defaults(content: &settings::SettingsContent, cx: &mut App) -> Self {
         let content = &content.theme;
-        dbg!(&content);
+        // todo(settings_refactor). This should *not* require cx...
         let themes = ThemeRegistry::default_global(cx);
         let system_appearance = SystemAppearance::default_global(cx);
-        let theme_selection: ThemeSelection = content.theme.clone()?.into();
-        let icon_theme_selection: IconThemeSelection = content.icon_theme.clone()?.into();
-        let this = Self {
-            ui_font_size: content.ui_font_size?.into(),
+        let theme_selection: ThemeSelection = content.theme.clone().unwrap().into();
+        let icon_theme_selection: IconThemeSelection = content.icon_theme.clone().unwrap().into();
+        Self {
+            ui_font_size: content.ui_font_size.unwrap().into(),
             ui_font: Font {
-                family: content.ui_font_family.as_ref()?.0.clone().into(),
-                features: content.ui_font_features.clone()?,
+                family: content.ui_font_family.as_ref().unwrap().0.clone().into(),
+                features: content.ui_font_features.clone().unwrap(),
                 fallbacks: font_fallbacks_from_settings(content.ui_font_fallbacks.clone()),
-                weight: content.ui_font_weight.map(FontWeight)?,
+                weight: content.ui_font_weight.map(FontWeight).unwrap(),
                 style: Default::default(),
             },
             buffer_font: Font {
-                family: content.buffer_font_family.as_ref()?.0.clone().into(),
-                features: content.buffer_font_features.clone()?,
+                family: content
+                    .buffer_font_family
+                    .as_ref()
+                    .unwrap()
+                    .0
+                    .clone()
+                    .into(),
+                features: content.buffer_font_features.clone().unwrap(),
                 fallbacks: font_fallbacks_from_settings(content.buffer_font_fallbacks.clone()),
-                weight: content.buffer_font_weight.map(FontWeight)?,
+                weight: content.buffer_font_weight.map(FontWeight).unwrap(),
                 style: FontStyle::default(),
             },
-            buffer_font_size: content.buffer_font_size?.into(),
-            buffer_line_height: content.buffer_line_height?.into(),
+            buffer_font_size: content.buffer_font_size.unwrap().into(),
+            buffer_line_height: content.buffer_line_height.unwrap().into(),
             agent_font_size: content.agent_font_size.flatten().map(Into::into),
             active_theme: themes
                 .get(theme_selection.theme(*system_appearance))
@@ -831,13 +837,12 @@ impl settings::Settings for ThemeSettings {
             theme_overrides: HashMap::default(),
             active_icon_theme: themes
                 .get_icon_theme(icon_theme_selection.icon_theme(*system_appearance))
-                .ok()?,
+                .ok()
+                .unwrap(),
             icon_theme_selection: Some(icon_theme_selection),
             ui_density: content.ui_density.unwrap_or_default().into(),
-            unnecessary_code_fade: content.unnecessary_code_fade?,
-        };
-
-        Some(this)
+            unnecessary_code_fade: content.unnecessary_code_fade.unwrap(),
+        }
     }
 
     fn refine(&mut self, content: &SettingsContent, cx: &mut App) {

crates/title_bar/src/title_bar_settings.rs 🔗

@@ -24,7 +24,7 @@ pub struct TitleBarSettings {
 }
 
 impl Settings for TitleBarSettings {
-    fn from_default(s: &SettingsContent) -> Option<Self> {
+    fn from_defaults(s: &SettingsContent) -> Option<Self> {
         let content = s.title_bar?;
         TitleBarSettings {
             show: content.show?,

crates/vim_mode_setting/src/vim_mode_setting.rs 🔗

@@ -16,8 +16,8 @@ pub fn init(cx: &mut App) {
 pub struct VimModeSetting(pub bool);
 
 impl Settings for VimModeSetting {
-    fn from_default(content: &SettingsContent, _cx: &mut App) -> Option<Self> {
-        Some(Self(content.vim_mode?))
+    fn from_defaults(content: &SettingsContent, _cx: &mut App) -> Self {
+        Self(content.vim_mode.unwrap())
     }
 
     fn refine(&mut self, content: &SettingsContent, _cx: &mut App) {
@@ -34,8 +34,8 @@ impl Settings for VimModeSetting {
 pub struct HelixModeSetting(pub bool);
 
 impl Settings for HelixModeSetting {
-    fn from_default(content: &SettingsContent, _cx: &mut App) -> Option<Self> {
-        Some(Self(content.helix_mode?))
+    fn from_defaults(content: &SettingsContent, _cx: &mut App) -> Self {
+        Self(content.helix_mode.unwrap())
     }
 
     fn refine(&mut self, content: &SettingsContent, _cx: &mut App) {

crates/zlog_settings/src/zlog_settings.rs 🔗

@@ -24,10 +24,10 @@ pub struct ZlogSettings {
 }
 
 impl Settings for ZlogSettings {
-    fn from_default(content: &settings::SettingsContent, _: &mut App) -> Option<Self> {
-        Some(ZlogSettings {
-            scopes: content.log.clone()?,
-        })
+    fn from_defaults(content: &settings::SettingsContent, _: &mut App) -> Self {
+        ZlogSettings {
+            scopes: content.log.clone().unwrap(),
+        }
     }
 
     fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) {