Change summary
zed/src/editor.rs | 5 +++++
zed/src/editor/buffer.rs | 13 ++++++++++++-
zed/src/worktree.rs | 7 +++++++
3 files changed, 24 insertions(+), 1 deletion(-)
Detailed changes
@@ -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<Language>> {
+ self.buffer.read(cx).language()
+ }
+
pub fn set_placeholder_text(
&mut self,
placeholder_text: impl Into<Arc<str>>,
@@ -714,9 +714,16 @@ impl Buffer {
path: impl Into<Arc<Path>>,
cx: &mut ModelContext<Self>,
) -> Task<Result<()>> {
+ 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,
@@ -268,6 +268,13 @@ impl Worktree {
}
}
+ pub fn languages(&self) -> &Arc<LanguageRegistry> {
+ match self {
+ Worktree::Local(worktree) => &worktree.languages,
+ Worktree::Remote(worktree) => &worktree.languages,
+ }
+ }
+
pub fn snapshot(&self) -> Snapshot {
match self {
Worktree::Local(worktree) => worktree.snapshot(),