Skip to content

Commit 281faa9

Browse files
committed
Add config hover_show_adtFieldsOrVariants to handle hovering limitation for ADTs
1 parent 9cced6d commit 281faa9

File tree

5 files changed

+59
-51
lines changed

5 files changed

+59
-51
lines changed

crates/hir/src/display.rs

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -188,28 +188,12 @@ impl HirDisplay for Struct {
188188
StructKind::Record => {
189189
let has_where_clause = write_where_clause(def_id, f)?;
190190
if let Some(limit) = f.entity_limit {
191-
let fields = self.fields(f.db);
192-
let count = fields.len().min(limit);
193-
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
194-
if count == 0 {
195-
if fields.is_empty() {
196-
f.write_str("{}")?;
197-
} else {
198-
f.write_str("{ /* … */ }")?;
199-
}
200-
} else {
201-
f.write_str(" {\n")?;
202-
for field in &fields[..count] {
203-
f.write_str(" ")?;
204-
field.hir_fmt(f)?;
205-
f.write_str(",\n")?;
206-
}
207-
208-
if fields.len() > count {
209-
f.write_str(" /* … */\n")?;
210-
}
211-
f.write_str("}")?;
212-
}
191+
display_fields_or_variants(
192+
&self.fields(f.db),
193+
has_where_clause,
194+
limit,
195+
f,
196+
)?;
213197
}
214198
}
215199
StructKind::Unit => _ = write_where_clause(def_id, f)?,
@@ -226,18 +210,15 @@ impl HirDisplay for Enum {
226210
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
227211
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
228212
write_generic_params(def_id, f)?;
229-
let has_where_clause = write_where_clause(def_id, f)?;
230213

231-
let variants = self.variants(f.db);
232-
if !variants.is_empty() {
233-
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
234-
f.write_str("{\n")?;
235-
for variant in variants {
236-
f.write_str(" ")?;
237-
variant.hir_fmt(f)?;
238-
f.write_str(",\n")?;
239-
}
240-
f.write_str("}")?;
214+
let has_where_clause = write_where_clause(def_id, f)?;
215+
if let Some(limit) = f.entity_limit {
216+
display_fields_or_variants(
217+
&self.variants(f.db),
218+
has_where_clause,
219+
limit,
220+
f,
221+
)?;
241222
}
242223

243224
Ok(())
@@ -251,22 +232,49 @@ impl HirDisplay for Union {
251232
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
252233
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
253234
write_generic_params(def_id, f)?;
235+
254236
let has_where_clause = write_where_clause(def_id, f)?;
237+
if let Some(limit) = f.entity_limit {
238+
display_fields_or_variants(
239+
&self.fields(f.db),
240+
has_where_clause,
241+
limit,
242+
f,
243+
)?;
244+
}
245+
Ok(())
246+
}
247+
}
255248

256-
let fields = self.fields(f.db);
257-
if !fields.is_empty() {
258-
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
259-
f.write_str("{\n")?;
260-
for field in self.fields(f.db) {
261-
f.write_str(" ")?;
262-
field.hir_fmt(f)?;
263-
f.write_str(",\n")?;
264-
}
265-
f.write_str("}")?;
249+
fn display_fields_or_variants<T: HirDisplay>(
250+
fields_or_variants: &[T],
251+
has_where_clause: bool,
252+
limit: usize,
253+
f: &mut HirFormatter<'_>,
254+
)-> Result<(), HirDisplayError> {
255+
let count = fields_or_variants.len().min(limit);
256+
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
257+
if count == 0 {
258+
if fields_or_variants.is_empty() {
259+
f.write_str("{}")?;
260+
} else {
261+
f.write_str("{ /* … */ }")?;
262+
}
263+
} else {
264+
f.write_str("{\n")?;
265+
for field in &fields_or_variants[..count] {
266+
f.write_str(" ")?;
267+
field.hir_fmt(f)?;
268+
f.write_str(",\n")?;
266269
}
267270

268-
Ok(())
271+
if fields_or_variants.len() > count {
272+
f.write_str(" /* … */\n")?;
273+
}
274+
f.write_str("}")?;
269275
}
276+
277+
Ok(())
270278
}
271279

272280
impl HirDisplay for Field {

crates/ide/src/hover.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub struct HoverConfig {
3333
pub keywords: bool,
3434
pub format: HoverDocFormat,
3535
pub max_trait_assoc_items_count: Option<usize>,
36-
pub max_struct_field_count: Option<usize>,
36+
pub max_adt_fields_or_variants_count: Option<usize>,
3737
}
3838

3939
#[derive(Copy, Clone, Debug, PartialEq, Eq)]

crates/ide/src/hover/render.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,8 @@ pub(super) fn definition(
410410
Definition::Trait(trait_) => {
411411
trait_.display_limited(db, config.max_trait_assoc_items_count).to_string()
412412
}
413-
Definition::Adt(Adt::Struct(struct_)) => {
414-
struct_.display_limited(db, config.max_struct_field_count).to_string()
413+
Definition::Adt(adt) => {
414+
adt.display_limited(db, config.max_adt_fields_or_variants_count).to_string()
415415
}
416416
_ => def.label(db),
417417
};

crates/ide/src/static_index.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl StaticIndex<'_> {
167167
keywords: true,
168168
format: crate::HoverDocFormat::Markdown,
169169
max_trait_assoc_items_count: None,
170-
max_struct_field_count: None,
170+
max_adt_fields_or_variants_count: Some(10),
171171
};
172172
let tokens = tokens.filter(|token| {
173173
matches!(

crates/rust-analyzer/src/config.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,8 @@ config_data! {
378378
/// How to render the size information in a memory layout hover.
379379
hover_memoryLayout_size: Option<MemoryLayoutHoverRenderKindDef> = "\"both\"",
380380

381-
/// How many fields of a struct to display when hovering a struct.
382-
hover_show_structFields: Option<usize> = "null",
381+
/// How many fields or variants of an ADT (struct, enum or union) to display when hovering on. Show all if empty.
382+
hover_show_adtFieldsOrVariants: Option<usize> = "10",
383383
/// How many associated items of a trait to display when hovering a trait.
384384
hover_show_traitAssocItems: Option<usize> = "null",
385385

@@ -1725,7 +1725,7 @@ impl Config {
17251725
},
17261726
keywords: self.data.hover_documentation_keywords_enable,
17271727
max_trait_assoc_items_count: self.data.hover_show_traitAssocItems,
1728-
max_struct_field_count: self.data.hover_show_structFields,
1728+
max_adt_fields_or_variants_count: self.data.hover_show_adtFieldsOrVariants,
17291729
}
17301730
}
17311731

0 commit comments

Comments
 (0)