Detailed changes
@@ -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) {
@@ -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) {
@@ -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) {
@@ -5913,7 +5913,7 @@ impl MultiBufferSnapshot {
end_row: last_row,
depth: next_depth,
tab_size,
- settings: settings.indent_guides,
+ settings: settings.indent_guides.clone(),
});
}
}
@@ -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) {
@@ -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) {
@@ -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) {
@@ -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?,
@@ -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) {
@@ -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) {