Add inlay hint settings
This commit is contained in:
parent
ea837a183b
commit
1ed52276e0
4 changed files with 75 additions and 4 deletions
|
@ -73,6 +73,16 @@
|
|||
// Whether to show git diff indicators in the scrollbar.
|
||||
"git_diff": true
|
||||
},
|
||||
// Inlay hint related settings
|
||||
"inlay_hints": {
|
||||
// Global switch to toggle hints on and off, switched off by default.
|
||||
"enabled": false,
|
||||
// Toggle certain types of hints on and off, all switched on by default.
|
||||
"show_type_hints": true,
|
||||
"show_parameter_hints": true,
|
||||
// Corresponds to null/None LSP hint type value.
|
||||
"show_other_hints": true
|
||||
},
|
||||
"project_panel": {
|
||||
// Whether to show the git status in the project panel.
|
||||
"git_status": true,
|
||||
|
|
|
@ -74,7 +74,8 @@ pub use multi_buffer::{
|
|||
use multi_buffer::{MultiBufferChunks, ToOffsetUtf16};
|
||||
use ordered_float::OrderedFloat;
|
||||
use project::{
|
||||
FormatTrigger, InlayHint, Location, LocationLink, Project, ProjectPath, ProjectTransaction,
|
||||
FormatTrigger, InlayHint, InlayHintKind, Location, LocationLink, Project, ProjectPath,
|
||||
ProjectTransaction,
|
||||
};
|
||||
use scroll::{
|
||||
autoscroll::Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager, ScrollbarAutoHide,
|
||||
|
@ -2590,11 +2591,20 @@ impl Editor {
|
|||
}
|
||||
}
|
||||
|
||||
fn refresh_inlays(&self, cx: &mut ViewContext<Self>) {
|
||||
fn refresh_inlays(&mut self, cx: &mut ViewContext<Self>) {
|
||||
if self.mode != EditorMode::Full {
|
||||
return;
|
||||
}
|
||||
|
||||
let inlay_hint_settings = settings::get::<EditorSettings>(cx).inlay_hints;
|
||||
if !inlay_hint_settings.enabled {
|
||||
let to_remove = self.inlay_cache.clear();
|
||||
self.display_map.update(cx, |display_map, cx| {
|
||||
display_map.splice_inlays(to_remove, Vec::new(), cx);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
struct InlayRequestKey {
|
||||
buffer_path: PathBuf,
|
||||
buffer_version: Global,
|
||||
|
@ -2619,6 +2629,9 @@ impl Editor {
|
|||
excerpt_id,
|
||||
};
|
||||
|
||||
// TODO kb split this into 2 different steps:
|
||||
// 1. cache population
|
||||
// 2. cache querying + hint filters on top (needs to store previous filter settings)
|
||||
let task = cx.spawn(|editor, mut cx| async move {
|
||||
if inlays_up_to_date {
|
||||
anyhow::Ok((key, None))
|
||||
|
@ -2646,9 +2659,20 @@ impl Editor {
|
|||
Some(task) => {
|
||||
match task.await.context("inlays for buffer task")? {
|
||||
Some(mut new_inlays) => {
|
||||
let mut allowed_inlay_hint_types = Vec::new();
|
||||
if inlay_hint_settings.show_type_hints {
|
||||
allowed_inlay_hint_types.push(Some(InlayHintKind::Type));
|
||||
}
|
||||
if inlay_hint_settings.show_parameter_hints {
|
||||
allowed_inlay_hint_types.push(Some(InlayHintKind::Parameter));
|
||||
}
|
||||
if inlay_hint_settings.show_other_hints {
|
||||
allowed_inlay_hint_types.push(None);
|
||||
}
|
||||
new_inlays.retain(|inlay| {
|
||||
let inlay_offset = inlay.position.offset;
|
||||
query_start <= inlay_offset && inlay_offset <= query_end
|
||||
allowed_inlay_hint_types.contains(&inlay.kind)
|
||||
&& query_start <= inlay_offset && inlay_offset <= query_end
|
||||
});
|
||||
Some(new_inlays)
|
||||
},
|
||||
|
@ -2713,7 +2737,7 @@ impl Editor {
|
|||
to_remove,
|
||||
to_insert,
|
||||
} = editor.update(&mut cx, |editor, _| {
|
||||
editor.inlay_cache.update_inlays(inlay_updates)
|
||||
dbg!(editor.inlay_cache.update_inlays(inlay_updates))
|
||||
})?;
|
||||
|
||||
editor.update(&mut cx, |editor, cx| {
|
||||
|
@ -7318,6 +7342,7 @@ impl Editor {
|
|||
|
||||
fn settings_changed(&mut self, cx: &mut ViewContext<Self>) {
|
||||
self.refresh_copilot_suggestions(true, cx);
|
||||
self.refresh_inlays(cx);
|
||||
}
|
||||
|
||||
pub fn set_searchable(&mut self, searchable: bool) {
|
||||
|
|
|
@ -9,6 +9,7 @@ pub struct EditorSettings {
|
|||
pub show_completions_on_input: bool,
|
||||
pub use_on_type_format: bool,
|
||||
pub scrollbar: Scrollbar,
|
||||
pub inlay_hints: InlayHints,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
|
@ -17,6 +18,14 @@ pub struct Scrollbar {
|
|||
pub git_diff: bool,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
pub struct InlayHints {
|
||||
pub enabled: bool,
|
||||
pub show_type_hints: bool,
|
||||
pub show_parameter_hints: bool,
|
||||
pub show_other_hints: bool,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum ShowScrollbar {
|
||||
|
@ -33,6 +42,7 @@ pub struct EditorSettingsContent {
|
|||
pub show_completions_on_input: Option<bool>,
|
||||
pub use_on_type_format: Option<bool>,
|
||||
pub scrollbar: Option<ScrollbarContent>,
|
||||
pub inlay_hints: Option<InlayHintsContent>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
|
@ -41,6 +51,14 @@ pub struct ScrollbarContent {
|
|||
pub git_diff: Option<bool>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||
pub struct InlayHintsContent {
|
||||
pub enabled: Option<bool>,
|
||||
pub show_type_hints: Option<bool>,
|
||||
pub show_parameter_hints: Option<bool>,
|
||||
pub show_other_hints: Option<bool>,
|
||||
}
|
||||
|
||||
impl Setting for EditorSettings {
|
||||
const KEY: Option<&'static str> = None;
|
||||
|
||||
|
|
|
@ -229,4 +229,22 @@ impl InlayCache {
|
|||
to_insert,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn clear(&mut self) -> Vec<InlayId> {
|
||||
self.inlays_per_buffer
|
||||
.drain()
|
||||
.map(|(_, buffer_inlays)| {
|
||||
buffer_inlays
|
||||
.inlays_per_excerpts
|
||||
.into_iter()
|
||||
.map(|(_, excerpt_inlays)| {
|
||||
excerpt_inlays
|
||||
.into_ordered_elements()
|
||||
.map(|(_, (id, _))| id)
|
||||
})
|
||||
.flatten()
|
||||
})
|
||||
.flatten()
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue