diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index e8e199b233b7db4fdb61cfdfd21e7e94eb124723..30c9b7e69fd3d54a5664580c7c480ce0321ce854 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -6,7 +6,8 @@ mod tab_map; mod wrap_map; use crate::{ - Anchor, AnchorRangeExt, InlayHintLocation, MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint, + display_map::inlay_map::InlayProperties, Anchor, AnchorRangeExt, InlayHintLocation, + MultiBuffer, MultiBufferSnapshot, ToOffset, ToPoint, }; pub use block_map::{BlockMap, BlockPoint}; use collections::{HashMap, HashSet}; @@ -284,37 +285,34 @@ impl DisplayMap { .update(cx, |map, cx| map.set_wrap_width(width, cx)) } - pub fn set_inlay_hints( + pub fn splice_inlay_hints( &mut self, new_hints: &HashMap>, cx: &mut ModelContext, ) { - // TODO kb map this to Anchor and set to the map let multi_buffer = self.buffer.read(cx); + let multi_snapshot = multi_buffer.snapshot(cx); + + let mut hints_to_add = Vec::new(); + for (&location, hints) in new_hints { + for hint in hints { + let hint_anchor = + multi_snapshot.anchor_in_excerpt(location.excerpt_id, hint.position); + hints_to_add.push(( + location, + InlayProperties { + position: hint_anchor, + text: hint.text().trim_end().into(), + }, + )) + } + } - // multi_buffer.anchor_in_excerpt(excerpt_id, hint.position); - // TODO kb !!! rework things from buffer_id to excerpt_id - // let hint_anchor = multi_buffer - // .snapshot(cx) - // .anchor_in_excerpt(excerpt_id, hint.position); - - // self.inlay_map.splice( - // vec![], - // new_hints - // .into_iter() - // .filter_map(|hint| { - // let snapshot = buffers_to_local_id - // .get(&hint.buffer_id)? - // .read(cx) - // .snapshot(); - // Some(Inlay { - // position: hint.position, - // text: hint.text().trim_end().into(), - // }) - // }) - // .collect(), - // ) - todo!("TODO kb") + self.inlay_map.splice( + // TODO kb this is wrong, calc diffs in the editor instead. + self.inlay_map.inlays.keys().copied().collect(), + hints_to_add, + ); } fn tab_size(buffer: &ModelHandle, cx: &mut ModelContext) -> NonZeroU32 { diff --git a/crates/editor/src/display_map/inlay_map.rs b/crates/editor/src/display_map/inlay_map.rs index d944074558434c2947b4c602afc6671134795677..96ce0af74e3aa7dc8df7cd146248530ead0ac226 100644 --- a/crates/editor/src/display_map/inlay_map.rs +++ b/crates/editor/src/display_map/inlay_map.rs @@ -31,7 +31,7 @@ pub struct InlayId(usize); pub struct InlayMap { snapshot: Mutex, next_inlay_id: usize, - inlays: HashMap, + pub(super) inlays: HashMap, } #[derive(Clone)] diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index ffafef5cb936351e9dfdf0b7d366dee673aca31b..9560aa707e043bea70820b7f1c2750b6ed174a1f 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2698,12 +2698,11 @@ impl Editor { } } - // TODO kb wrong, need a splice here instead if !new_hints.is_empty() { editor .update(&mut cx, |editor, cx| { editor.display_map.update(cx, |display_map, cx| { - display_map.set_inlay_hints(&new_hints, cx); + display_map.splice_inlay_hints(&new_hints, cx); }); }) .log_err() diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 856bf523f7bf3c71fedc43c378fa35ad9445bb74..ce42f6df114766534e55f74300f44bdbac2e143a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2825,7 +2825,6 @@ impl Project { language_server .on_request::({ - let this = this.downgrade(); move |(), mut cx| async move { let this = this .upgrade(&cx)