Attempt to assign a language when a new buffer is saved

This commit is contained in:
Nathan Sobo
2021-09-18 11:46:22 -07:00
parent cab577406d
commit af99d0ef42
3 changed files with 24 additions and 1 deletions

View File

@@ -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>>,

View File

@@ -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,

View File

@@ -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(),