mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 22:54:58 +00:00
Add render configs for memory layout hovers
This commit is contained in:
parent
76d86502f7
commit
3c862507b9
12 changed files with 400 additions and 163 deletions
|
@ -14,7 +14,7 @@ use flycheck::FlycheckConfig;
|
|||
use ide::{
|
||||
AssistConfig, CallableSnippets, CompletionConfig, DiagnosticsConfig, ExprFillDefaultMode,
|
||||
HighlightConfig, HighlightRelatedConfig, HoverConfig, HoverDocFormat, InlayHintsConfig,
|
||||
JoinLinesConfig, Snippet, SnippetScope,
|
||||
JoinLinesConfig, MemoryLayoutHoverConfig, MemoryLayoutHoverRenderKind, Snippet, SnippetScope,
|
||||
};
|
||||
use ide_db::{
|
||||
imports::insert_use::{ImportGranularity, InsertUseConfig, PrefixKind},
|
||||
|
@ -317,8 +317,16 @@ config_data! {
|
|||
hover_documentation_keywords_enable: bool = "true",
|
||||
/// Use markdown syntax for links on hover.
|
||||
hover_links_enable: bool = "true",
|
||||
/// How to render the align information in a memory layout hover.
|
||||
hover_memoryLayout_alignment: Option<MemoryLayoutHoverRenderKindDef> = "\"hexadecimal\"",
|
||||
/// Whether to show memory layout data on hover.
|
||||
hover_memoryLayout_enable: bool = "true",
|
||||
/// How to render the niche information in a memory layout hover.
|
||||
hover_memoryLayout_niches: Option<bool> = "false",
|
||||
/// How to render the offset information in a memory layout hover.
|
||||
hover_memoryLayout_offset: Option<MemoryLayoutHoverRenderKindDef> = "\"hexadecimal\"",
|
||||
/// How to render the size information in a memory layout hover.
|
||||
hover_memoryLayout_size: Option<MemoryLayoutHoverRenderKindDef> = "\"both\"",
|
||||
|
||||
/// Whether to enforce the import granularity setting for all files. If set to false rust-analyzer will try to keep import styles consistent per file.
|
||||
imports_granularity_enforce: bool = "false",
|
||||
|
@ -1514,9 +1522,19 @@ impl Config {
|
|||
}
|
||||
|
||||
pub fn hover(&self) -> HoverConfig {
|
||||
let mem_kind = |kind| match kind {
|
||||
MemoryLayoutHoverRenderKindDef::Both => MemoryLayoutHoverRenderKind::Both,
|
||||
MemoryLayoutHoverRenderKindDef::Decimal => MemoryLayoutHoverRenderKind::Decimal,
|
||||
MemoryLayoutHoverRenderKindDef::Hexadecimal => MemoryLayoutHoverRenderKind::Hexadecimal,
|
||||
};
|
||||
HoverConfig {
|
||||
links_in_hover: self.data.hover_links_enable,
|
||||
memory_layout: self.data.hover_memoryLayout_enable,
|
||||
memory_layout: self.data.hover_memoryLayout_enable.then_some(MemoryLayoutHoverConfig {
|
||||
size: self.data.hover_memoryLayout_size.map(mem_kind),
|
||||
offset: self.data.hover_memoryLayout_offset.map(mem_kind),
|
||||
alignment: self.data.hover_memoryLayout_alignment.map(mem_kind),
|
||||
niches: self.data.hover_memoryLayout_niches.unwrap_or_default(),
|
||||
}),
|
||||
documentation: self.data.hover_documentation_enable,
|
||||
format: {
|
||||
let is_markdown = try_or_def!(self
|
||||
|
@ -1726,6 +1744,9 @@ mod de_unit_v {
|
|||
named_unit_variant!(reborrow);
|
||||
named_unit_variant!(fieldless);
|
||||
named_unit_variant!(with_block);
|
||||
named_unit_variant!(decimal);
|
||||
named_unit_variant!(hexadecimal);
|
||||
named_unit_variant!(both);
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug, Clone, Copy)]
|
||||
|
@ -1956,6 +1977,18 @@ enum WorkspaceSymbolSearchKindDef {
|
|||
AllSymbols,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug, Copy, Clone)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
#[serde(untagged)]
|
||||
pub enum MemoryLayoutHoverRenderKindDef {
|
||||
#[serde(deserialize_with = "de_unit_v::decimal")]
|
||||
Decimal,
|
||||
#[serde(deserialize_with = "de_unit_v::hexadecimal")]
|
||||
Hexadecimal,
|
||||
#[serde(deserialize_with = "de_unit_v::both")]
|
||||
Both,
|
||||
}
|
||||
|
||||
macro_rules! _config_data {
|
||||
(struct $name:ident {
|
||||
$(
|
||||
|
@ -2038,7 +2071,9 @@ fn get_field<T: DeserializeOwned>(
|
|||
None
|
||||
}
|
||||
})
|
||||
.unwrap_or_else(|| serde_json::from_str(default).unwrap())
|
||||
.unwrap_or_else(|| {
|
||||
serde_json::from_str(default).unwrap_or_else(|e| panic!("{e} on: `{default}`"))
|
||||
})
|
||||
}
|
||||
|
||||
fn schema(fields: &[(&'static str, &'static str, &[&str], &str)]) -> serde_json::Value {
|
||||
|
@ -2366,6 +2401,22 @@ fn field_props(field: &str, ty: &str, doc: &[&str], default: &str) -> serde_json
|
|||
"`hide`: Shows `...` for every closure type",
|
||||
],
|
||||
},
|
||||
"Option<MemoryLayoutHoverRenderKindDef>" => set! {
|
||||
"anyOf": [
|
||||
{
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"enum": ["both", "decimal", "hexadecimal", ],
|
||||
"enumDescriptions": [
|
||||
"Render as 12 (0xC)",
|
||||
"Render as 12",
|
||||
"Render as 0xC"
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
_ => panic!("missing entry for {ty}: {default}"),
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue