From af99d0ef42e6f16232e6eefec8d43e679e0362f7 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Sat, 18 Sep 2021 11:46:22 -0700 Subject: [PATCH] Attempt to assign a language when a new buffer is saved --- zed/src/editor.rs | 5 +++++ zed/src/editor/buffer.rs | 13 ++++++++++++- zed/src/worktree.rs | 7 +++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/zed/src/editor.rs b/zed/src/editor.rs index 98f0b4a0231e8d2cfba9eab21f2a88d72ff602e0..25403d3aae44c3ef22c735700f80bfd1ea46f0dd 100644 --- a/zed/src/editor.rs +++ b/zed/src/editor.rs @@ -4,6 +4,7 @@ mod element; pub mod movement; use crate::{ + language::Language, settings::Settings, theme::Theme, time::ReplicaId, @@ -449,6 +450,10 @@ impl Editor { } } + pub fn language<'a>(&self, cx: &'a AppContext) -> Option<&'a Arc> { + self.buffer.read(cx).language() + } + pub fn set_placeholder_text( &mut self, placeholder_text: impl Into>, diff --git a/zed/src/editor/buffer.rs b/zed/src/editor/buffer.rs index 97e0202cec4a6295e478b2078ad5d393df22ab50..43e5693bd43b2eaf6edbae60ef026648881e6827 100644 --- a/zed/src/editor/buffer.rs +++ b/zed/src/editor/buffer.rs @@ -714,9 +714,16 @@ impl Buffer { path: impl Into>, cx: &mut ModelContext, ) -> Task> { + let path = path.into(); let handle = cx.handle(); let text = self.visible_text.clone(); let version = self.version.clone(); + + if let Some(language) = worktree.read(cx).languages().select_language(&path).cloned() { + self.language = Some(language); + self.reparse(cx); + } + let save_as = worktree.update(cx, |worktree, cx| { worktree .as_local_mut() @@ -871,7 +878,11 @@ impl Buffer { cx.spawn(move |this, mut cx| async move { let new_tree = parse_task.await; this.update(&mut cx, move |this, cx| { - let parse_again = this.version > parsed_version; + let language_changed = + this.language.as_ref().map_or(true, |curr_language| { + !Arc::ptr_eq(curr_language, &language) + }); + let parse_again = this.version > parsed_version || language_changed; *this.syntax_tree.lock() = Some(SyntaxTree { tree: new_tree, dirty: false, diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index 7b2fea91756c42a5cb20b05a0314d1a40e61029a..f952bef22f44d1a7c420eb97e3ea13922e62078c 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -268,6 +268,13 @@ impl Worktree { } } + pub fn languages(&self) -> &Arc { + match self { + Worktree::Local(worktree) => &worktree.languages, + Worktree::Remote(worktree) => &worktree.languages, + } + } + pub fn snapshot(&self) -> Snapshot { match self { Worktree::Local(worktree) => worktree.snapshot(),