diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 80cc81a4c39658edc55702ede88b857cd95dd410..55afd2f572161b9dbebe0031d21f79ac29d7a975 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -1,7 +1,10 @@ use anyhow::Result; use collections::HashMap; use gpui::AppContext; -use schemars::JsonSchema; +use schemars::{ + schema::{InstanceType, ObjectValidation, Schema, SchemaObject}, + JsonSchema, +}; use serde::{Deserialize, Serialize}; use std::{num::NonZeroU32, path::Path, sync::Arc}; @@ -247,6 +250,61 @@ impl settings::Setting for AllLanguageSettings { languages, }) } + + fn json_schema( + generator: &mut schemars::gen::SchemaGenerator, + params: &settings::SettingsJsonSchemaParams, + ) -> schemars::schema::RootSchema { + let mut root_schema = generator.root_schema_for::(); + + // Create a schema for a 'languages overrides' object, associating editor + // settings with specific langauges. + assert!(root_schema + .definitions + .contains_key("LanguageSettingsContent")); + + let languages_object_schema = SchemaObject { + instance_type: Some(InstanceType::Object.into()), + object: Some(Box::new(ObjectValidation { + properties: params + .language_names + .iter() + .map(|name| { + ( + name.clone(), + Schema::new_ref("#/definitions/LanguageSettingsContent".into()), + ) + }) + .collect(), + ..Default::default() + })), + ..Default::default() + }; + + root_schema + .definitions + .extend([("Languages".into(), languages_object_schema.into())]); + + root_schema + .schema + .object + .as_mut() + .unwrap() + .properties + .extend([ + ( + "languages".to_owned(), + Schema::new_ref("#/definitions/Languages".into()), + ), + // For backward compatibility + ( + "language_overrides".to_owned(), + Schema::new_ref("#/definitions/Languages".into()), + ), + ]); + + root_schema + } } fn merge_settings(settings: &mut LanguageSettings, src: &LanguageSettingsContent) { diff --git a/crates/settings/src/settings.rs b/crates/settings/src/settings.rs index cd63776f5f0e4058819e06a1326df25b333afd95..0e4cd4d9228b977eb7b8ec273ca446355abf53e3 100644 --- a/crates/settings/src/settings.rs +++ b/crates/settings/src/settings.rs @@ -10,7 +10,7 @@ use gpui::{ }; use schemars::{ gen::SchemaGenerator, - schema::{InstanceType, ObjectValidation, Schema, SchemaObject, SingleOrVec}, + schema::{InstanceType, Schema, SchemaObject}, JsonSchema, }; use serde::{Deserialize, Serialize}; @@ -80,7 +80,7 @@ impl Setting for Settings { // Create a schema for a theme name. let theme_name_schema = SchemaObject { - instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::String))), + instance_type: Some(InstanceType::String.into()), enum_values: Some( params .theme_names @@ -92,51 +92,20 @@ impl Setting for Settings { ..Default::default() }; - // Create a schema for a 'languages overrides' object, associating editor - // settings with specific langauges. - assert!(root_schema.definitions.contains_key("EditorSettings")); - - let languages_object_schema = SchemaObject { - instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Object))), - object: Some(Box::new(ObjectValidation { - properties: params - .language_names - .iter() - .map(|name| { - ( - name.clone(), - Schema::new_ref("#/definitions/EditorSettings".into()), - ) - }) - .collect(), - ..Default::default() - })), - ..Default::default() - }; - - // Add these new schemas as definitions, and modify properties of the root - // schema to reference them. - root_schema.definitions.extend([ - ("ThemeName".into(), theme_name_schema.into()), - ("Languages".into(), languages_object_schema.into()), - ]); - let root_schema_object = &mut root_schema.schema.object.as_mut().unwrap(); + root_schema + .definitions + .extend([("ThemeName".into(), theme_name_schema.into())]); - root_schema_object.properties.extend([ - ( + root_schema + .schema + .object + .as_mut() + .unwrap() + .properties + .extend([( "theme".to_owned(), Schema::new_ref("#/definitions/ThemeName".into()), - ), - ( - "languages".to_owned(), - Schema::new_ref("#/definitions/Languages".into()), - ), - // For backward compatibility - ( - "language_overrides".to_owned(), - Schema::new_ref("#/definitions/Languages".into()), - ), - ]); + )]); root_schema } diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index c389a7bf84fefc8d985ed0c6fc4bac2786ef927f..cdc765918997113a67698064d7b04122ef8e2254 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -308,7 +308,8 @@ impl SettingsStore { default_settings_content: &str, cx: &AppContext, ) -> Result<()> { - self.default_deserialized_settings = Some(serde_json::from_str(default_settings_content)?); + self.default_deserialized_settings = + Some(parse_json_with_comments(default_settings_content)?); self.recompute_values(None, cx)?; Ok(()) } @@ -319,7 +320,7 @@ impl SettingsStore { user_settings_content: &str, cx: &AppContext, ) -> Result<()> { - self.user_deserialized_settings = Some(serde_json::from_str(user_settings_content)?); + self.user_deserialized_settings = Some(parse_json_with_comments(user_settings_content)?); self.recompute_values(None, cx)?; Ok(()) } @@ -333,7 +334,7 @@ impl SettingsStore { ) -> Result<()> { if let Some(content) = settings_content { self.local_deserialized_settings - .insert(path.clone(), serde_json::from_str(content)?); + .insert(path.clone(), parse_json_with_comments(content)?); } else { self.local_deserialized_settings.remove(&path); } diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 9ce3db7c3497fdccc4dbc3c63d3be9fd9e8cb093..3466daebe9a8c8943509a5711d0f2de71d4ca33f 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -160,6 +160,7 @@ fn main() { project::Project::init(&client, cx); client::init(&client, cx); command_palette::init(cx); + language::init(cx); editor::init(cx); go_to_line::init(cx); file_finder::init(cx);