From 0dd7694ff531a5ae049fd754ddef5787a2a76e11 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 31 May 2023 15:10:30 -0700 Subject: [PATCH] Make language_settings take a language, not a language name --- crates/copilot/src/copilot.rs | 6 +---- crates/copilot_button/src/copilot_button.rs | 27 +++++++++------------ crates/editor/src/display_map.rs | 7 +++--- crates/editor/src/editor.rs | 6 ++--- crates/editor/src/multi_buffer.rs | 8 +++--- crates/language/src/buffer.rs | 10 ++------ crates/language/src/language_settings.rs | 11 +++++---- crates/project/src/lsp_command.rs | 3 +-- crates/project/src/project.rs | 16 +++++------- crates/zed/src/languages/yaml.rs | 7 ++++-- 10 files changed, 41 insertions(+), 60 deletions(-) diff --git a/crates/copilot/src/copilot.rs b/crates/copilot/src/copilot.rs index 9343bd33f6..7834603552 100644 --- a/crates/copilot/src/copilot.rs +++ b/crates/copilot/src/copilot.rs @@ -785,11 +785,7 @@ impl Copilot { let buffer = buffer.read(cx); let uri = registered_buffer.uri.clone(); let position = position.to_point_utf16(buffer); - let settings = language_settings( - buffer.language_at(position).map(|l| l.name()).as_deref(), - buffer.file(), - cx, - ); + let settings = language_settings(buffer.language_at(position).as_ref(), buffer.file(), cx); let tab_size = settings.tab_size; let hard_tabs = settings.hard_tabs; let relative_path = buffer diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index 27fd2dcb7c..e34fddd9b9 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -11,7 +11,7 @@ use gpui::{ }; use language::{ language_settings::{self, all_language_settings, AllLanguageSettings}, - File, + File, Language, }; use settings::{update_settings_file, SettingsStore}; use std::{path::Path, sync::Arc}; @@ -29,7 +29,7 @@ pub struct CopilotButton { popup_menu: ViewHandle, editor_subscription: Option<(Subscription, usize)>, editor_enabled: Option, - language: Option>, + language: Option>, file: Option>, fs: Arc, } @@ -200,14 +200,13 @@ impl CopilotButton { if let Some(language) = self.language.clone() { let fs = fs.clone(); - let language_enabled = - language_settings::language_settings(Some(language.as_ref()), None, cx) - .show_copilot_suggestions; + let language_enabled = language_settings::language_settings(Some(&language), None, cx) + .show_copilot_suggestions; menu_options.push(ContextMenuItem::handler( format!( "{} Suggestions for {}", if language_enabled { "Hide" } else { "Show" }, - language + language.name() ), move |cx| toggle_copilot_for_language(language.clone(), fs.clone(), cx), )); @@ -279,18 +278,14 @@ impl CopilotButton { let editor = editor.read(cx); let snapshot = editor.buffer().read(cx).snapshot(cx); let suggestion_anchor = editor.selections.newest_anchor().start; - let language_name = snapshot - .language_at(suggestion_anchor) - .map(|language| language.name()); + let language = snapshot.language_at(suggestion_anchor); let file = snapshot.file_at(suggestion_anchor).cloned(); self.editor_enabled = Some( - all_language_settings(self.file.as_ref(), cx).copilot_enabled( - language_name.as_deref(), - file.as_ref().map(|file| file.path().as_ref()), - ), + all_language_settings(self.file.as_ref(), cx) + .copilot_enabled(language, file.as_ref().map(|file| file.path().as_ref())), ); - self.language = language_name; + self.language = language.cloned(); self.file = file; cx.notify() @@ -374,12 +369,12 @@ fn toggle_copilot_globally(fs: Arc, cx: &mut AppContext) { }); } -fn toggle_copilot_for_language(language: Arc, fs: Arc, cx: &mut AppContext) { +fn toggle_copilot_for_language(language: Arc, fs: Arc, cx: &mut AppContext) { let show_copilot_suggestions = all_language_settings(None, cx).copilot_enabled(Some(&language), None); update_settings_file::(fs, cx, move |file| { file.languages - .entry(language) + .entry(language.name()) .or_default() .show_copilot_suggestions = Some(!show_copilot_suggestions); }); diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index f8d6f0bc40..b0483db68d 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -272,12 +272,11 @@ impl DisplayMap { } fn tab_size(buffer: &ModelHandle, cx: &mut ModelContext) -> NonZeroU32 { - let language_name = buffer + let language = buffer .read(cx) .as_singleton() - .and_then(|buffer| buffer.read(cx).language()) - .map(|language| language.name()); - language_settings(language_name.as_deref(), None, cx).tab_size + .and_then(|buffer| buffer.read(cx).language()); + language_settings(language.as_deref(), None, cx).tab_size } #[cfg(test)] diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1b62192999..9a9f36c577 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3208,11 +3208,9 @@ impl Editor { cx: &mut ViewContext, ) -> bool { let file = snapshot.file_at(location); - let language_name = snapshot - .language_at(location) - .map(|language| language.name()); + let language = snapshot.language_at(location); let settings = all_language_settings(file, cx); - settings.copilot_enabled(language_name.as_deref(), file.map(|f| f.path().as_ref())) + settings.copilot_enabled(language, file.map(|f| f.path().as_ref())) } fn has_active_copilot_suggestion(&self, cx: &AppContext) -> bool { diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index 1cf30a1676..b7b2b89c8c 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -1381,10 +1381,10 @@ impl MultiBuffer { let mut file = None; if let Some((buffer, offset)) = self.point_to_buffer_offset(point, cx) { let buffer = buffer.read(cx); - language = buffer.language_at(offset).map(|l| l.name()); + language = buffer.language_at(offset); file = buffer.file(); } - language_settings(language.as_deref(), file, cx) + language_settings(language.as_ref(), file, cx) } pub fn for_each_buffer(&self, mut f: impl FnMut(&ModelHandle)) { @@ -2794,10 +2794,10 @@ impl MultiBufferSnapshot { let mut language = None; let mut file = None; if let Some((buffer, offset)) = self.point_to_buffer_offset(point) { - language = buffer.language_at(offset).map(|l| l.name()); + language = buffer.language_at(offset); file = buffer.file(); } - language_settings(language.as_deref(), file, cx) + language_settings(language, file, cx) } pub fn language_scope_at<'a, T: ToOffset>(&'a self, point: T) -> Option { diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 90a86d065c..7acb36a92f 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1807,8 +1807,7 @@ impl BufferSnapshot { } pub fn language_indent_size_at(&self, position: T, cx: &AppContext) -> IndentSize { - let language_name = self.language_at(position).map(|language| language.name()); - let settings = language_settings(language_name.as_deref(), self.file(), cx); + let settings = language_settings(self.language_at(position), self.file(), cx); if settings.hard_tabs { IndentSize::tab() } else { @@ -2132,12 +2131,7 @@ impl BufferSnapshot { position: D, cx: &'a AppContext, ) -> &'a LanguageSettings { - let language = self.language_at(position); - language_settings( - language.map(|l| l.name()).as_deref(), - self.file.as_ref(), - cx, - ) + language_settings(self.language_at(position), self.file.as_ref(), cx) } pub fn language_scope_at(&self, position: D) -> Option { diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 31d819b449..b03dd6a6b9 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -1,4 +1,4 @@ -use crate::File; +use crate::{File, Language}; use anyhow::Result; use collections::HashMap; use globset::GlobMatcher; @@ -15,7 +15,7 @@ pub fn init(cx: &mut AppContext) { } pub fn language_settings<'a>( - language: Option<&str>, + language: Option<&Arc>, file: Option<&Arc>, cx: &'a AppContext, ) -> &'a LanguageSettings { @@ -23,7 +23,7 @@ pub fn language_settings<'a>( file.map(|f| (f.worktree_id(), f.path().as_ref())), cx, ) - .language(language) + .language(language.map(|l| l.name()).as_deref()) } pub fn all_language_settings<'a>( @@ -170,7 +170,7 @@ impl AllLanguageSettings { .any(|glob| glob.is_match(path)) } - pub fn copilot_enabled(&self, language_name: Option<&str>, path: Option<&Path>) -> bool { + pub fn copilot_enabled(&self, language: Option<&Arc>, path: Option<&Path>) -> bool { if !self.copilot.feature_enabled { return false; } @@ -181,7 +181,8 @@ impl AllLanguageSettings { } } - self.language(language_name).show_copilot_suggestions + self.language(language.map(|l| l.name()).as_deref()) + .show_copilot_suggestions } } diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index f349566535..7dab8eff30 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1716,8 +1716,7 @@ impl LspCommand for OnTypeFormatting { .await?; let tab_size = buffer.read_with(&cx, |buffer, cx| { - let language_name = buffer.language().map(|language| language.name()); - language_settings(language_name.as_deref(), buffer.file(), cx).tab_size + language_settings(buffer.language(), buffer.file(), cx).tab_size }); Ok(Self { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index a106632e36..bec4338596 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -694,8 +694,7 @@ impl Project { if let Some(buffer) = buffer.upgrade(cx) { let buffer = buffer.read(cx); if let Some((file, language)) = buffer.file().zip(buffer.language()) { - let settings = - language_settings(Some(language.name().as_ref()), Some(file), cx); + let settings = language_settings(Some(language), Some(file), cx); if settings.enable_language_server { if let Some(file) = File::from_dyn(Some(file)) { language_servers_to_start @@ -719,9 +718,7 @@ impl Project { let file = worktree.and_then(|tree| { tree.update(cx, |tree, cx| tree.root_file(cx).map(|f| f as _)) }); - if !language_settings(Some(&language.name()), file.as_ref(), cx) - .enable_language_server - { + if !language_settings(Some(language), file.as_ref(), cx).enable_language_server { language_servers_to_stop.push((*worktree_id, started_lsp_name.clone())); } } @@ -2361,7 +2358,7 @@ impl Project { cx: &mut ModelContext, ) { if !language_settings( - Some(&language.name()), + Some(&language), worktree .update(cx, |tree, cx| tree.root_file(cx)) .map(|f| f as _) @@ -3465,8 +3462,7 @@ impl Project { let mut project_transaction = ProjectTransaction::default(); for (buffer, buffer_abs_path, language_server) in &buffers_with_paths_and_servers { let settings = buffer.read_with(&cx, |buffer, cx| { - let language_name = buffer.language().map(|language| language.name()); - language_settings(language_name.as_deref(), buffer.file(), cx).clone() + language_settings(buffer.language(), buffer.file(), cx).clone() }); let remove_trailing_whitespace = settings.remove_trailing_whitespace_on_save; @@ -4477,10 +4473,10 @@ impl Project { ) -> Task>> { let (position, tab_size) = buffer.read_with(cx, |buffer, cx| { let position = position.to_point_utf16(buffer); - let language_name = buffer.language_at(position).map(|l| l.name()); ( position, - language_settings(language_name.as_deref(), buffer.file(), cx).tab_size, + language_settings(buffer.language_at(position).as_ref(), buffer.file(), cx) + .tab_size, ) }); self.request_lsp( diff --git a/crates/zed/src/languages/yaml.rs b/crates/zed/src/languages/yaml.rs index d66602ee04..7f87a7caed 100644 --- a/crates/zed/src/languages/yaml.rs +++ b/crates/zed/src/languages/yaml.rs @@ -3,7 +3,7 @@ use async_trait::async_trait; use futures::{future::BoxFuture, FutureExt, StreamExt}; use gpui::AppContext; use language::{ - language_settings::language_settings, LanguageServerBinary, LanguageServerName, LspAdapter, + language_settings::all_language_settings, LanguageServerBinary, LanguageServerName, LspAdapter, }; use node_runtime::NodeRuntime; use serde_json::Value; @@ -101,13 +101,16 @@ impl LspAdapter for YamlLspAdapter { } fn workspace_configuration(&self, cx: &mut AppContext) -> Option> { + let tab_size = all_language_settings(None, cx) + .language(Some("YAML")) + .tab_size; Some( future::ready(serde_json::json!({ "yaml": { "keyOrdering": false }, "[yaml]": { - "editor.tabSize": language_settings(Some("YAML"), None, cx).tab_size, + "editor.tabSize": tab_size, } })) .boxed(),