Minor cleanup in Buffer::update_diagnostics

This commit is contained in:
Max Brunsfeld 2021-12-21 14:07:50 -08:00
parent bc906fef9c
commit 3c26f67ea3
2 changed files with 14 additions and 17 deletions

View file

@ -730,6 +730,9 @@ 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 = if let Some(version) = version {
let language_server = self.language_server.as_mut().unwrap(); let language_server = self.language_server.as_mut().unwrap();
language_server
.pending_snapshots
.retain(|&v, _| v >= version);
let snapshot = language_server let snapshot = language_server
.pending_snapshots .pending_snapshots
.get(&version) .get(&version)
@ -756,6 +759,10 @@ impl Buffer {
let entry = &mut diagnostics[ix]; let entry = &mut diagnostics[ix];
let mut start = entry.range.start; let mut start = entry.range.start;
let mut end = entry.range.end; let mut end = entry.range.end;
// Some diagnostics are based on files on disk instead of buffers'
// current contents. Adjust these diagnostics' ranges to reflect
// any unsaved edits.
if entry if entry
.diagnostic .diagnostic
.source .source
@ -781,6 +788,8 @@ impl Buffer {
entry.range = content.clip_point_utf16(start, Bias::Left) entry.range = content.clip_point_utf16(start, Bias::Left)
..content.clip_point_utf16(end, Bias::Right); ..content.clip_point_utf16(end, Bias::Right);
// Expand empty ranges by one character
if entry.range.start == entry.range.end { if entry.range.start == entry.range.end {
entry.range.end.column += 1; entry.range.end.column += 1;
entry.range.end = content.clip_point_utf16(entry.range.end, Bias::Right); entry.range.end = content.clip_point_utf16(entry.range.end, Bias::Right);
@ -794,19 +803,6 @@ impl Buffer {
drop(edits_since_save); drop(edits_since_save);
self.diagnostics = DiagnosticSet::new(diagnostics, content); self.diagnostics = DiagnosticSet::new(diagnostics, content);
if let Some(version) = version {
let language_server = self.language_server.as_mut().unwrap();
let versions_to_delete = language_server
.pending_snapshots
.range(..version)
.map(|(v, _)| *v)
.collect::<Vec<_>>();
for version in versions_to_delete {
language_server.pending_snapshots.remove(&version);
}
}
self.diagnostics_update_count += 1; self.diagnostics_update_count += 1;
cx.notify(); cx.notify();
cx.emit(Event::DiagnosticsUpdated); cx.emit(Event::DiagnosticsUpdated);

View file

@ -9,10 +9,9 @@ use anyhow::{anyhow, Result};
pub use buffer::Operation; pub use buffer::Operation;
pub use buffer::*; pub use buffer::*;
pub use diagnostic_set::DiagnosticEntry; pub use diagnostic_set::DiagnosticEntry;
use gpui::{executor::Background, AppContext}; use gpui::AppContext;
use highlight_map::HighlightMap; use highlight_map::HighlightMap;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use lsp::LanguageServer;
use parking_lot::Mutex; use parking_lot::Mutex;
use serde::Deserialize; use serde::Deserialize;
use std::{collections::HashSet, path::Path, str, sync::Arc}; use std::{collections::HashSet, path::Path, str, sync::Arc};
@ -48,7 +47,7 @@ pub struct LanguageServerConfig {
pub disk_based_diagnostic_sources: HashSet<String>, pub disk_based_diagnostic_sources: HashSet<String>,
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
#[serde(skip)] #[serde(skip)]
pub fake_server: Option<(Arc<LanguageServer>, Arc<std::sync::atomic::AtomicBool>)>, pub fake_server: Option<(Arc<lsp::LanguageServer>, Arc<std::sync::atomic::AtomicBool>)>,
} }
#[derive(Clone, Debug, Deserialize)] #[derive(Clone, Debug, Deserialize)]
@ -219,7 +218,9 @@ impl Grammar {
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
impl LanguageServerConfig { impl LanguageServerConfig {
pub async fn fake(executor: Arc<Background>) -> (Self, lsp::FakeLanguageServer) { pub async fn fake(
executor: Arc<gpui::executor::Background>,
) -> (Self, lsp::FakeLanguageServer) {
let (server, fake) = lsp::LanguageServer::fake(executor).await; let (server, fake) = lsp::LanguageServer::fake(executor).await;
fake.started fake.started
.store(false, std::sync::atomic::Ordering::SeqCst); .store(false, std::sync::atomic::Ordering::SeqCst);