Assign diagnostics on buffer even if it doesn't have a language

This shouldn't be necessary in practice but makes testing easier.
This commit is contained in:
Nathan Sobo 2022-01-22 09:54:25 -07:00
parent 8bf628c17b
commit 83418204b6
2 changed files with 49 additions and 45 deletions

View file

@ -869,19 +869,19 @@ impl Buffer {
} }
let version = version.map(|version| version as usize); let version = version.map(|version| version as usize);
let content = if let Some(version) = version { let content =
let language_server = self.language_server.as_mut().unwrap(); if let Some((version, language_server)) = version.zip(self.language_server.as_mut()) {
language_server language_server
.pending_snapshots .pending_snapshots
.retain(|&v, _| v >= version); .retain(|&v, _| v >= version);
let snapshot = language_server let snapshot = language_server
.pending_snapshots .pending_snapshots
.get(&version) .get(&version)
.ok_or_else(|| anyhow!("missing snapshot"))?; .ok_or_else(|| anyhow!("missing snapshot"))?;
&snapshot.buffer_snapshot &snapshot.buffer_snapshot
} else { } else {
self.deref() self.deref()
}; };
diagnostics.sort_unstable_by(|a, b| { diagnostics.sort_unstable_by(|a, b| {
Ordering::Equal Ordering::Equal

View file

@ -627,40 +627,44 @@ impl Project {
(file.path().clone(), file.full_path()) (file.path().clone(), file.full_path())
}; };
// Set the buffer's language // If the buffer has a language, set it and start/assign the language server
let language = self.languages.select_language(&full_path)?.clone(); if let Some(language) = self.languages.select_language(&full_path) {
buffer.update(cx, |buffer, cx| {
buffer.set_language(Some(language.clone()), cx);
});
// For local worktrees, start a language server if needed.
// Also assign the language server and any previously stored diagnostics to the buffer.
let worktree = worktree.read(cx);
if let Some(local_worktree) = worktree.as_local() {
let worktree_id = local_worktree.id();
let diagnostics = local_worktree.diagnostics_for_path(&path);
let worktree_abs_path = local_worktree.abs_path().clone();
let language_server = match self
.language_servers
.entry((worktree_id, language.name().to_string()))
{
hash_map::Entry::Occupied(e) => Some(e.get().clone()),
hash_map::Entry::Vacant(e) => Self::start_language_server(
self.client.clone(),
language,
&worktree_abs_path,
cx,
)
.map(|server| e.insert(server).clone()),
};
buffer.update(cx, |buffer, cx| { buffer.update(cx, |buffer, cx| {
buffer.set_language_server(language_server, cx); buffer.set_language(Some(language.clone()), cx);
if let Some(diagnostics) = diagnostics {
buffer.update_diagnostics(None, diagnostics, cx).log_err();
}
}); });
// For local worktrees, start a language server if needed.
// Also assign the language server and any previously stored diagnostics to the buffer.
if let Some(local_worktree) = worktree.read(cx).as_local() {
let worktree_id = local_worktree.id();
let worktree_abs_path = local_worktree.abs_path().clone();
let language_server = match self
.language_servers
.entry((worktree_id, language.name().to_string()))
{
hash_map::Entry::Occupied(e) => Some(e.get().clone()),
hash_map::Entry::Vacant(e) => Self::start_language_server(
self.client.clone(),
language.clone(),
&worktree_abs_path,
cx,
)
.map(|server| e.insert(server).clone()),
};
buffer.update(cx, |buffer, cx| {
buffer.set_language_server(language_server, cx);
});
}
}
if let Some(local_worktree) = worktree.read(cx).as_local() {
if let Some(diagnostics) = local_worktree.diagnostics_for_path(&path) {
buffer.update(cx, |buffer, cx| {
buffer.update_diagnostics(None, diagnostics, cx).log_err();
});
}
} }
None None