From 1c85234bcdbc7c863e737e9f3329518beeb436c3 Mon Sep 17 00:00:00 2001 From: Young-Flash Date: Thu, 21 Mar 2024 17:58:29 +0800 Subject: [PATCH] limit struct field hover display nums --- crates/hir/src/display.rs | 35 ++++++++++++++++++++++------------ crates/ide/src/hover.rs | 1 + crates/ide/src/hover/render.rs | 3 +++ crates/ide/src/static_index.rs | 1 + 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs index c5d44c11f2..0fa2d80346 100644 --- a/crates/hir/src/display.rs +++ b/crates/hir/src/display.rs @@ -185,19 +185,30 @@ impl HirDisplay for Struct { write_where_clause(def_id, f)?; } StructKind::Record => { - let has_where_clause = write_where_clause(def_id, f)?; - let fields = self.fields(f.db); - f.write_char(if !has_where_clause { ' ' } else { '\n' })?; - if fields.is_empty() { - f.write_str("{}")?; - } else { - f.write_str("{\n")?; - for field in self.fields(f.db) { - f.write_str(" ")?; - field.hir_fmt(f)?; - f.write_str(",\n")?; + if let Some(limit) = f.entity_limit { + let has_where_clause = write_where_clause(def_id, f)?; + let fields = self.fields(f.db); + let count = fields.len().min(limit); + f.write_char(if !has_where_clause { ' ' } else { '\n' })?; + if count == 0 { + if fields.is_empty() { + f.write_str("{}")?; + } else { + f.write_str("{ /* … */ }")?; + } + } else { + f.write_str(" {\n")?; + for field in &fields[..count] { + f.write_str(" ")?; + field.hir_fmt(f)?; + f.write_str(",\n")?; + } + + if fields.len() > count { + f.write_str(" /* … */\n")?; + } + f.write_str("}")?; } - f.write_str("}")?; } } StructKind::Unit => _ = write_where_clause(def_id, f)?, diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs index 8f4c629b58..822751c0e4 100644 --- a/crates/ide/src/hover.rs +++ b/crates/ide/src/hover.rs @@ -33,6 +33,7 @@ pub struct HoverConfig { pub keywords: bool, pub format: HoverDocFormat, pub max_trait_assoc_items_count: Option, + pub max_struct_field_count: Option, } #[derive(Copy, Clone, Debug, PartialEq, Eq)] diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs index 63777d4910..abedbff831 100644 --- a/crates/ide/src/hover/render.rs +++ b/crates/ide/src/hover/render.rs @@ -410,6 +410,9 @@ pub(super) fn definition( Definition::Trait(trait_) => { trait_.display_limited(db, config.max_trait_assoc_items_count).to_string() } + Definition::Adt(Adt::Struct(struct_)) => { + struct_.display_limited(db, config.max_struct_field_count).to_string() + } _ => def.label(db), }; let docs = def.docs(db, famous_defs); diff --git a/crates/ide/src/static_index.rs b/crates/ide/src/static_index.rs index fe063081f7..3fef16df25 100644 --- a/crates/ide/src/static_index.rs +++ b/crates/ide/src/static_index.rs @@ -167,6 +167,7 @@ impl StaticIndex<'_> { keywords: true, format: crate::HoverDocFormat::Markdown, max_trait_assoc_items_count: None, + max_struct_field_count: None, }; let tokens = tokens.filter(|token| { matches!(