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.
|
// Whether to show git diff indicators in the scrollbar.
|
||||||
"git_diff": true
|
"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": {
|
"project_panel": {
|
||||||
// Whether to show the git status in the project panel.
|
// Whether to show the git status in the project panel.
|
||||||
"git_status": true,
|
"git_status": true,
|
||||||
|
|
|
@ -74,7 +74,8 @@ pub use multi_buffer::{
|
||||||
use multi_buffer::{MultiBufferChunks, ToOffsetUtf16};
|
use multi_buffer::{MultiBufferChunks, ToOffsetUtf16};
|
||||||
use ordered_float::OrderedFloat;
|
use ordered_float::OrderedFloat;
|
||||||
use project::{
|
use project::{
|
||||||
FormatTrigger, InlayHint, Location, LocationLink, Project, ProjectPath, ProjectTransaction,
|
FormatTrigger, InlayHint, InlayHintKind, Location, LocationLink, Project, ProjectPath,
|
||||||
|
ProjectTransaction,
|
||||||
};
|
};
|
||||||
use scroll::{
|
use scroll::{
|
||||||
autoscroll::Autoscroll, OngoingScroll, ScrollAnchor, ScrollManager, ScrollbarAutoHide,
|
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 {
|
if self.mode != EditorMode::Full {
|
||||||
return;
|
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 {
|
struct InlayRequestKey {
|
||||||
buffer_path: PathBuf,
|
buffer_path: PathBuf,
|
||||||
buffer_version: Global,
|
buffer_version: Global,
|
||||||
|
@ -2619,6 +2629,9 @@ impl Editor {
|
||||||
excerpt_id,
|
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 {
|
let task = cx.spawn(|editor, mut cx| async move {
|
||||||
if inlays_up_to_date {
|
if inlays_up_to_date {
|
||||||
anyhow::Ok((key, None))
|
anyhow::Ok((key, None))
|
||||||
|
@ -2646,9 +2659,20 @@ impl Editor {
|
||||||
Some(task) => {
|
Some(task) => {
|
||||||
match task.await.context("inlays for buffer task")? {
|
match task.await.context("inlays for buffer task")? {
|
||||||
Some(mut new_inlays) => {
|
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| {
|
new_inlays.retain(|inlay| {
|
||||||
let inlay_offset = inlay.position.offset;
|
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)
|
Some(new_inlays)
|
||||||
},
|
},
|
||||||
|
@ -2713,7 +2737,7 @@ impl Editor {
|
||||||
to_remove,
|
to_remove,
|
||||||
to_insert,
|
to_insert,
|
||||||
} = editor.update(&mut cx, |editor, _| {
|
} = 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| {
|
editor.update(&mut cx, |editor, cx| {
|
||||||
|
@ -7318,6 +7342,7 @@ impl Editor {
|
||||||
|
|
||||||
fn settings_changed(&mut self, cx: &mut ViewContext<Self>) {
|
fn settings_changed(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
self.refresh_copilot_suggestions(true, cx);
|
self.refresh_copilot_suggestions(true, cx);
|
||||||
|
self.refresh_inlays(cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_searchable(&mut self, searchable: bool) {
|
pub fn set_searchable(&mut self, searchable: bool) {
|
||||||
|
|
|
@ -9,6 +9,7 @@ pub struct EditorSettings {
|
||||||
pub show_completions_on_input: bool,
|
pub show_completions_on_input: bool,
|
||||||
pub use_on_type_format: bool,
|
pub use_on_type_format: bool,
|
||||||
pub scrollbar: Scrollbar,
|
pub scrollbar: Scrollbar,
|
||||||
|
pub inlay_hints: InlayHints,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||||
|
@ -17,6 +18,14 @@ pub struct Scrollbar {
|
||||||
pub git_diff: bool,
|
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)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
pub enum ShowScrollbar {
|
pub enum ShowScrollbar {
|
||||||
|
@ -33,6 +42,7 @@ pub struct EditorSettingsContent {
|
||||||
pub show_completions_on_input: Option<bool>,
|
pub show_completions_on_input: Option<bool>,
|
||||||
pub use_on_type_format: Option<bool>,
|
pub use_on_type_format: Option<bool>,
|
||||||
pub scrollbar: Option<ScrollbarContent>,
|
pub scrollbar: Option<ScrollbarContent>,
|
||||||
|
pub inlay_hints: Option<InlayHintsContent>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
|
||||||
|
@ -41,6 +51,14 @@ pub struct ScrollbarContent {
|
||||||
pub git_diff: Option<bool>,
|
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 {
|
impl Setting for EditorSettings {
|
||||||
const KEY: Option<&'static str> = None;
|
const KEY: Option<&'static str> = None;
|
||||||
|
|
||||||
|
|
|
@ -229,4 +229,22 @@ impl InlayCache {
|
||||||
to_insert,
|
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