Properly filter out new hints outside of excerpts' visible ranges
This commit is contained in:
parent
ba3d1e4dba
commit
a68e68a0d9
2 changed files with 17 additions and 14 deletions
|
@ -32,7 +32,7 @@ use collections::{BTreeMap, Bound, HashMap, HashSet, VecDeque};
|
||||||
use copilot::Copilot;
|
use copilot::Copilot;
|
||||||
pub use display_map::DisplayPoint;
|
pub use display_map::DisplayPoint;
|
||||||
use display_map::*;
|
use display_map::*;
|
||||||
pub use editor_settings::EditorSettings;
|
pub use editor_settings::{EditorSettings, InlayHints, InlayHintsContent};
|
||||||
pub use element::{
|
pub use element::{
|
||||||
Cursor, EditorElement, HighlightedRange, HighlightedRangeLine, LineWithInvisibles,
|
Cursor, EditorElement, HighlightedRange, HighlightedRangeLine, LineWithInvisibles,
|
||||||
};
|
};
|
||||||
|
|
|
@ -45,6 +45,17 @@ struct ExcerptQuery {
|
||||||
cache_version: usize,
|
cache_version: usize,
|
||||||
invalidate: InvalidationStrategy,
|
invalidate: InvalidationStrategy,
|
||||||
}
|
}
|
||||||
|
impl ExcerptQuery {
|
||||||
|
fn contains_position(&self, position: text::Anchor, buffer_snapshot: &BufferSnapshot) -> bool {
|
||||||
|
self.excerpt_range_start
|
||||||
|
.cmp(&position, buffer_snapshot)
|
||||||
|
.is_le()
|
||||||
|
&& self
|
||||||
|
.excerpt_range_end
|
||||||
|
.cmp(&position, buffer_snapshot)
|
||||||
|
.is_ge()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub enum InvalidationStrategy {
|
pub enum InvalidationStrategy {
|
||||||
|
@ -284,7 +295,7 @@ fn new_update_task(
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
let cached_excerpt_hints = Arc::get_mut(cached_excerpt_hints)
|
let cached_excerpt_hints = Arc::get_mut(cached_excerpt_hints)
|
||||||
.expect("Cached excerot hints were dropped with the task");
|
.expect("Cached excerpt hints were dropped with the task");
|
||||||
|
|
||||||
match new_update.cache_version.cmp(&cached_excerpt_hints.version) {
|
match new_update.cache_version.cmp(&cached_excerpt_hints.version) {
|
||||||
cmp::Ordering::Less => return,
|
cmp::Ordering::Less => return,
|
||||||
|
@ -460,6 +471,9 @@ fn new_excerpt_hints_update_result(
|
||||||
|
|
||||||
let mut excerpt_hints_to_persist = HashMap::default();
|
let mut excerpt_hints_to_persist = HashMap::default();
|
||||||
for new_hint in new_excerpt_hints {
|
for new_hint in new_excerpt_hints {
|
||||||
|
if !query.contains_position(new_hint.position, buffer_snapshot) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
let missing_from_cache = match &cached_excerpt_hints {
|
let missing_from_cache = match &cached_excerpt_hints {
|
||||||
Some(cached_excerpt_hints) => {
|
Some(cached_excerpt_hints) => {
|
||||||
match cached_excerpt_hints.hints.binary_search_by(|probe| {
|
match cached_excerpt_hints.hints.binary_search_by(|probe| {
|
||||||
|
@ -494,18 +508,7 @@ fn new_excerpt_hints_update_result(
|
||||||
visible_hints
|
visible_hints
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|hint| hint.position.excerpt_id == query.excerpt_id)
|
.filter(|hint| hint.position.excerpt_id == query.excerpt_id)
|
||||||
.filter(|hint| {
|
.filter(|hint| query.contains_position(hint.position.text_anchor, buffer_snapshot))
|
||||||
query
|
|
||||||
.excerpt_range_start
|
|
||||||
.cmp(&hint.position.text_anchor, buffer_snapshot)
|
|
||||||
.is_le()
|
|
||||||
})
|
|
||||||
.filter(|hint| {
|
|
||||||
query
|
|
||||||
.excerpt_range_end
|
|
||||||
.cmp(&hint.position.text_anchor, buffer_snapshot)
|
|
||||||
.is_ge()
|
|
||||||
})
|
|
||||||
.map(|inlay_hint| inlay_hint.id)
|
.map(|inlay_hint| inlay_hint.id)
|
||||||
.filter(|hint_id| !excerpt_hints_to_persist.contains_key(hint_id)),
|
.filter(|hint_id| !excerpt_hints_to_persist.contains_key(hint_id)),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue