Update block diagnostics (#28006)
Release Notes: - "Block" diagnostics (that show up in the diagnostics view, or when using `f8`/`shift-f8`) are rendered more clearly - `f8`/`shift-f8` now always go to the "next" or "prev" diagnostic, regardless of the state of the editor  --------- Co-authored-by: Kirill Bulatov <mail4score@gmail.com> Co-authored-by: Julia Ryan <juliaryan3.14@gmail.com>
This commit is contained in:
parent
ccf9aef767
commit
afabcd1547
17 changed files with 1794 additions and 1987 deletions
|
@ -1578,7 +1578,27 @@ impl MultiBuffer {
|
|||
let excerpt_ranges = build_excerpt_ranges(ranges, context_line_count, &buffer_snapshot);
|
||||
|
||||
let (new, counts) = Self::merge_excerpt_ranges(&excerpt_ranges);
|
||||
self.set_excerpt_ranges_for_path(
|
||||
self.set_merged_excerpt_ranges_for_path(
|
||||
path,
|
||||
buffer,
|
||||
excerpt_ranges,
|
||||
&buffer_snapshot,
|
||||
new,
|
||||
counts,
|
||||
cx,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn set_excerpt_ranges_for_path(
|
||||
&mut self,
|
||||
path: PathKey,
|
||||
buffer: Entity<Buffer>,
|
||||
buffer_snapshot: &BufferSnapshot,
|
||||
excerpt_ranges: Vec<ExcerptRange<Point>>,
|
||||
cx: &mut Context<Self>,
|
||||
) -> (Vec<Range<Anchor>>, bool) {
|
||||
let (new, counts) = Self::merge_excerpt_ranges(&excerpt_ranges);
|
||||
self.set_merged_excerpt_ranges_for_path(
|
||||
path,
|
||||
buffer,
|
||||
excerpt_ranges,
|
||||
|
@ -1612,11 +1632,11 @@ impl MultiBuffer {
|
|||
|
||||
multi_buffer
|
||||
.update(cx, move |multi_buffer, cx| {
|
||||
let (ranges, _) = multi_buffer.set_excerpt_ranges_for_path(
|
||||
let (ranges, _) = multi_buffer.set_merged_excerpt_ranges_for_path(
|
||||
path_key,
|
||||
buffer,
|
||||
excerpt_ranges,
|
||||
buffer_snapshot,
|
||||
&buffer_snapshot,
|
||||
new,
|
||||
counts,
|
||||
cx,
|
||||
|
@ -1629,12 +1649,12 @@ impl MultiBuffer {
|
|||
}
|
||||
|
||||
/// Sets excerpts, returns `true` if at least one new excerpt was added.
|
||||
fn set_excerpt_ranges_for_path(
|
||||
fn set_merged_excerpt_ranges_for_path(
|
||||
&mut self,
|
||||
path: PathKey,
|
||||
buffer: Entity<Buffer>,
|
||||
ranges: Vec<ExcerptRange<Point>>,
|
||||
buffer_snapshot: BufferSnapshot,
|
||||
buffer_snapshot: &BufferSnapshot,
|
||||
new: Vec<ExcerptRange<Point>>,
|
||||
counts: Vec<usize>,
|
||||
cx: &mut Context<Self>,
|
||||
|
@ -1665,6 +1685,7 @@ impl MultiBuffer {
|
|||
let mut counts: Vec<usize> = Vec::new();
|
||||
for range in expanded_ranges {
|
||||
if let Some(last_range) = merged_ranges.last_mut() {
|
||||
debug_assert!(last_range.context.start <= range.context.start);
|
||||
if last_range.context.end >= range.context.start {
|
||||
last_range.context.end = range.context.end;
|
||||
*counts.last_mut().unwrap() += 1;
|
||||
|
@ -5878,13 +5899,14 @@ impl MultiBufferSnapshot {
|
|||
buffer_id: BufferId,
|
||||
group_id: usize,
|
||||
) -> impl Iterator<Item = DiagnosticEntry<Point>> + '_ {
|
||||
self.lift_buffer_metadata(Point::zero()..self.max_point(), move |buffer, _| {
|
||||
self.lift_buffer_metadata(Point::zero()..self.max_point(), move |buffer, range| {
|
||||
if buffer.remote_id() != buffer_id {
|
||||
return None;
|
||||
};
|
||||
Some(
|
||||
buffer
|
||||
.diagnostic_group(group_id)
|
||||
.diagnostics_in_range(range, false)
|
||||
.filter(move |diagnostic| diagnostic.diagnostic.group_id == group_id)
|
||||
.map(move |DiagnosticEntry { diagnostic, range }| (range, diagnostic)),
|
||||
)
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue