diff --git a/crates/copilot/src/copilot.rs b/crates/copilot/src/copilot.rs index 1084222648..9343bd33f6 100644 --- a/crates/copilot/src/copilot.rs +++ b/crates/copilot/src/copilot.rs @@ -787,7 +787,7 @@ impl Copilot { let position = position.to_point_utf16(buffer); let settings = language_settings( buffer.language_at(position).map(|l| l.name()).as_deref(), - buffer.file().map(|f| f.as_ref()), + buffer.file(), cx, ); let tab_size = settings.tab_size; diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index 4cb7c15bd9..27fd2dcb7c 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -285,7 +285,7 @@ impl CopilotButton { let file = snapshot.file_at(suggestion_anchor).cloned(); self.editor_enabled = Some( - all_language_settings(self.file.as_ref().map(|f| f.as_ref()), cx).copilot_enabled( + all_language_settings(self.file.as_ref(), cx).copilot_enabled( language_name.as_deref(), file.as_ref().map(|file| file.path().as_ref()), ), diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 4a9237f563..1b62192999 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -3211,7 +3211,7 @@ impl Editor { let language_name = snapshot .language_at(location) .map(|language| language.name()); - let settings = all_language_settings(file.map(|f| f.as_ref() as _), cx); + let settings = all_language_settings(file, cx); settings.copilot_enabled(language_name.as_deref(), file.map(|f| f.path().as_ref())) } @@ -7093,8 +7093,7 @@ impl Editor { .get("vim_mode") == Some(&serde_json::Value::Bool(true)); let telemetry_settings = *settings::get::(cx); - let copilot_enabled = - all_language_settings(file.map(|f| f.as_ref()), cx).copilot_enabled(None, None); + let copilot_enabled = all_language_settings(file, cx).copilot_enabled(None, None); let copilot_enabled_for_language = self .buffer .read(cx) diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index 597feb832b..1cf30a1676 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -1382,7 +1382,7 @@ impl MultiBuffer { 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()); - file = buffer.file().map(|f| f.as_ref()); + file = buffer.file(); } language_settings(language.as_deref(), file, cx) } @@ -2795,7 +2795,7 @@ impl MultiBufferSnapshot { let mut file = None; if let Some((buffer, offset)) = self.point_to_buffer_offset(point) { language = buffer.language_at(offset).map(|l| l.name()); - file = buffer.file().map(|f| f.as_ref()); + file = buffer.file(); } language_settings(language.as_deref(), file, cx) } diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index ddec085e2a..90a86d065c 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1808,11 +1808,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().map(|f| f.as_ref()), - cx, - ); + let settings = language_settings(language_name.as_deref(), self.file(), cx); if settings.hard_tabs { IndentSize::tab() } else { @@ -2139,7 +2135,7 @@ impl BufferSnapshot { let language = self.language_at(position); language_settings( language.map(|l| l.name()).as_deref(), - self.file.as_ref().map(AsRef::as_ref), + self.file.as_ref(), cx, ) } diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index e4e283bd7e..31d819b449 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -16,7 +16,7 @@ pub fn init(cx: &mut AppContext) { pub fn language_settings<'a>( language: Option<&str>, - file: Option<&dyn File>, + file: Option<&Arc>, cx: &'a AppContext, ) -> &'a LanguageSettings { settings::get_local::( @@ -27,7 +27,7 @@ pub fn language_settings<'a>( } pub fn all_language_settings<'a>( - file: Option<&dyn File>, + file: Option<&Arc>, cx: &'a AppContext, ) -> &'a AllLanguageSettings { settings::get_local::( diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index 0a8b5f8a2e..f349566535 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1717,8 +1717,7 @@ impl LspCommand for OnTypeFormatting { let tab_size = buffer.read_with(&cx, |buffer, cx| { let language_name = buffer.language().map(|language| language.name()); - let file = buffer.file().map(|f| f.as_ref()); - language_settings(language_name.as_deref(), file, cx).tab_size + language_settings(language_name.as_deref(), buffer.file(), cx).tab_size }); Ok(Self { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index c871bf0b96..a106632e36 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -693,12 +693,14 @@ impl Project { for buffer in self.opened_buffers.values() { if let Some(buffer) = buffer.upgrade(cx) { let buffer = buffer.read(cx); - if let Some((file, language)) = File::from_dyn(buffer.file()).zip(buffer.language()) - { + if let Some((file, language)) = buffer.file().zip(buffer.language()) { let settings = language_settings(Some(language.name().as_ref()), Some(file), cx); if settings.enable_language_server { - language_servers_to_start.push((file.worktree.clone(), language.clone())); + if let Some(file) = File::from_dyn(Some(file)) { + language_servers_to_start + .push((file.worktree.clone(), language.clone())); + } } } } @@ -714,10 +716,10 @@ impl Project { }); if let Some(language) = language { let worktree = self.worktree_for_id(*worktree_id, cx); - let file = worktree.and_then(|tree| tree.update(cx, |tree, cx| tree.root_file(cx))); - // let settings = - // language_settings(Some(language.name().as_ref()), Some(file), cx); - if !language_settings(Some(&language.name()), file.as_ref().map(|f| f as _), cx) + 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 { language_servers_to_stop.push((*worktree_id, started_lsp_name.clone())); @@ -2362,8 +2364,8 @@ impl Project { Some(&language.name()), worktree .update(cx, |tree, cx| tree.root_file(cx)) - .as_ref() - .map(|f| f as _), + .map(|f| f as _) + .as_ref(), cx, ) .enable_language_server @@ -3464,12 +3466,7 @@ impl Project { 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().map(|f| f.as_ref()), - cx, - ) - .clone() + language_settings(language_name.as_deref(), buffer.file(), cx).clone() }); let remove_trailing_whitespace = settings.remove_trailing_whitespace_on_save; @@ -4481,10 +4478,9 @@ impl Project { 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()); - let file = buffer.file().map(|f| f.as_ref()); ( position, - language_settings(language_name.as_deref(), file, cx).tab_size, + language_settings(language_name.as_deref(), buffer.file(), cx).tab_size, ) }); self.request_lsp( diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index 577b22d730..ee6752412d 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -99,18 +99,22 @@ async fn test_managing_project_specific_settings( let settings_a = language_settings( None, - Some(&File::for_entry( - tree.entry_for_path("a/a.rs").unwrap().clone(), - worktree.clone(), - )), + Some( + &(File::for_entry( + tree.entry_for_path("a/a.rs").unwrap().clone(), + worktree.clone(), + ) as _), + ), cx, ); let settings_b = language_settings( None, - Some(&File::for_entry( - tree.entry_for_path("b/b.rs").unwrap().clone(), - worktree.clone(), - )), + Some( + &(File::for_entry( + tree.entry_for_path("b/b.rs").unwrap().clone(), + worktree.clone(), + ) as _), + ), cx, ); diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 5d121adc63..a33a0fc050 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -678,16 +678,9 @@ impl Worktree { } } - pub fn root_file(&self, cx: &mut ModelContext) -> Option { + pub fn root_file(&self, cx: &mut ModelContext) -> Option> { let entry = self.root_entry()?; - Some(File { - worktree: cx.handle(), - path: entry.path.clone(), - mtime: entry.mtime, - entry_id: entry.id, - is_local: self.is_local(), - is_deleted: false, - }) + Some(File::for_entry(entry.clone(), cx.handle())) } } @@ -2463,15 +2456,15 @@ impl language::LocalFile for File { } impl File { - pub fn for_entry(entry: Entry, worktree: ModelHandle) -> Self { - Self { + pub fn for_entry(entry: Entry, worktree: ModelHandle) -> Arc { + Arc::new(Self { worktree, path: entry.path.clone(), mtime: entry.mtime, entry_id: entry.id, is_local: true, is_deleted: false, - } + }) } pub fn from_proto(