Introduce a new language-overrideable `enable_language_server` setting

Antonio Scandurra created

Change summary

crates/settings/src/settings.rs | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)

Detailed changes

crates/settings/src/settings.rs 🔗

@@ -28,6 +28,7 @@ pub struct Settings {
     pub soft_wrap: SoftWrap,
     pub preferred_line_length: u32,
     pub format_on_save: bool,
+    pub enable_language_server: bool,
     pub language_overrides: HashMap<Arc<str>, LanguageOverride>,
     pub theme: Arc<Theme>,
 }
@@ -38,6 +39,7 @@ pub struct LanguageOverride {
     pub soft_wrap: Option<SoftWrap>,
     pub preferred_line_length: Option<u32>,
     pub format_on_save: Option<bool>,
+    pub enable_language_server: Option<bool>,
 }
 
 #[derive(Copy, Clone, Debug, Deserialize, PartialEq, Eq, JsonSchema)]
@@ -60,6 +62,8 @@ pub struct SettingsFileContent {
     pub vim_mode: Option<bool>,
     #[serde(default)]
     pub format_on_save: Option<bool>,
+    #[serde(default)]
+    pub enable_language_server: Option<bool>,
     #[serde(flatten)]
     pub editor: LanguageOverride,
     #[serde(default)]
@@ -84,6 +88,7 @@ impl Settings {
             preferred_line_length: 80,
             language_overrides: Default::default(),
             format_on_save: true,
+            enable_language_server: true,
             projects_online_by_default: true,
             theme,
         })
@@ -127,6 +132,13 @@ impl Settings {
             .unwrap_or(self.format_on_save)
     }
 
+    pub fn enable_language_server(&self, language: Option<&str>) -> bool {
+        language
+            .and_then(|language| self.language_overrides.get(language))
+            .and_then(|settings| settings.enable_language_server)
+            .unwrap_or(self.enable_language_server)
+    }
+
     #[cfg(any(test, feature = "test-support"))]
     pub fn test(cx: &gpui::AppContext) -> Settings {
         Settings {
@@ -138,6 +150,7 @@ impl Settings {
             soft_wrap: SoftWrap::None,
             preferred_line_length: 80,
             format_on_save: true,
+            enable_language_server: true,
             language_overrides: Default::default(),
             projects_online_by_default: true,
             theme: gpui::fonts::with_font_cache(cx.font_cache().clone(), || Default::default()),
@@ -177,6 +190,10 @@ impl Settings {
         merge(&mut self.default_buffer_font_size, data.buffer_font_size);
         merge(&mut self.vim_mode, data.vim_mode);
         merge(&mut self.format_on_save, data.format_on_save);
+        merge(
+            &mut self.enable_language_server,
+            data.enable_language_server,
+        );
         merge(&mut self.soft_wrap, data.editor.soft_wrap);
         merge(&mut self.tab_size, data.editor.tab_size);
         merge(
@@ -193,6 +210,10 @@ impl Settings {
             merge_option(&mut target.tab_size, settings.tab_size);
             merge_option(&mut target.soft_wrap, settings.soft_wrap);
             merge_option(&mut target.format_on_save, settings.format_on_save);
+            merge_option(
+                &mut target.enable_language_server,
+                settings.enable_language_server,
+            );
             merge_option(
                 &mut target.preferred_line_length,
                 settings.preferred_line_length,