Skip to content

Commit b94c285

Browse files
committed
Auto merge of #16856 - Veykril:macarons, r=Veykril
fix: Fix wrong where clause rendering on hover We were not accounting for proper newline indentation in some places making the hover look weird (or just straight up wrong for type aliases)
2 parents c8badeb + d69a81f commit b94c285

File tree

2 files changed

+210
-108
lines changed

2 files changed

+210
-108
lines changed

crates/hir/src/display.rs

+49-39
Original file line numberDiff line numberDiff line change
@@ -159,44 +159,48 @@ impl HirDisplay for Adt {
159159
impl HirDisplay for Struct {
160160
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
161161
let module_id = self.module(f.db).id;
162+
// FIXME: Render repr if its set explicitly?
162163
write_visibility(module_id, self.visibility(f.db), f)?;
163164
f.write_str("struct ")?;
164165
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
165166
let def_id = GenericDefId::AdtId(AdtId::StructId(self.id));
166167
write_generic_params(def_id, f)?;
167168

168169
let variant_data = self.variant_data(f.db);
169-
if let StructKind::Tuple = variant_data.kind() {
170-
f.write_char('(')?;
171-
let mut it = variant_data.fields().iter().peekable();
172-
173-
while let Some((id, _)) = it.next() {
174-
let field = Field { parent: (*self).into(), id };
175-
write_visibility(module_id, field.visibility(f.db), f)?;
176-
field.ty(f.db).hir_fmt(f)?;
177-
if it.peek().is_some() {
178-
f.write_str(", ")?;
179-
}
180-
}
181-
182-
f.write_str(");")?;
183-
}
170+
match variant_data.kind() {
171+
StructKind::Tuple => {
172+
f.write_char('(')?;
173+
let mut it = variant_data.fields().iter().peekable();
184174

185-
write_where_clause(def_id, f)?;
175+
while let Some((id, _)) = it.next() {
176+
let field = Field { parent: (*self).into(), id };
177+
write_visibility(module_id, field.visibility(f.db), f)?;
178+
field.ty(f.db).hir_fmt(f)?;
179+
if it.peek().is_some() {
180+
f.write_str(", ")?;
181+
}
182+
}
186183

187-
if let StructKind::Record = variant_data.kind() {
188-
let fields = self.fields(f.db);
189-
if fields.is_empty() {
190-
f.write_str(" {}")?;
191-
} else {
192-
f.write_str(" {\n")?;
193-
for field in self.fields(f.db) {
194-
f.write_str(" ")?;
195-
field.hir_fmt(f)?;
196-
f.write_str(",\n")?;
184+
f.write_char(')')?;
185+
write_where_clause(def_id, f)?;
186+
}
187+
StructKind::Record => {
188+
let has_where_clause = write_where_clause(def_id, f)?;
189+
let fields = self.fields(f.db);
190+
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
191+
if fields.is_empty() {
192+
f.write_str("{}")?;
193+
} else {
194+
f.write_str("{\n")?;
195+
for field in self.fields(f.db) {
196+
f.write_str(" ")?;
197+
field.hir_fmt(f)?;
198+
f.write_str(",\n")?;
199+
}
200+
f.write_str("}")?;
197201
}
198-
f.write_str("}")?;
199202
}
203+
StructKind::Unit => _ = write_where_clause(def_id, f)?,
200204
}
201205

202206
Ok(())
@@ -210,11 +214,12 @@ impl HirDisplay for Enum {
210214
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
211215
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
212216
write_generic_params(def_id, f)?;
213-
write_where_clause(def_id, f)?;
217+
let has_where_clause = write_where_clause(def_id, f)?;
214218

215219
let variants = self.variants(f.db);
216220
if !variants.is_empty() {
217-
f.write_str(" {\n")?;
221+
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
222+
f.write_str("{\n")?;
218223
for variant in variants {
219224
f.write_str(" ")?;
220225
variant.hir_fmt(f)?;
@@ -234,11 +239,12 @@ impl HirDisplay for Union {
234239
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
235240
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
236241
write_generic_params(def_id, f)?;
237-
write_where_clause(def_id, f)?;
242+
let has_where_clause = write_where_clause(def_id, f)?;
238243

239244
let fields = self.fields(f.db);
240245
if !fields.is_empty() {
241-
f.write_str(" {\n")?;
246+
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
247+
f.write_str("{\n")?;
242248
for field in self.fields(f.db) {
243249
f.write_str(" ")?;
244250
field.hir_fmt(f)?;
@@ -446,7 +452,10 @@ fn write_generic_params(
446452
Ok(())
447453
}
448454

449-
fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
455+
fn write_where_clause(
456+
def: GenericDefId,
457+
f: &mut HirFormatter<'_>,
458+
) -> Result<bool, HirDisplayError> {
450459
let params = f.db.generic_params(def);
451460

452461
// unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
@@ -465,7 +474,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
465474
});
466475

467476
if !has_displayable_predicate {
468-
return Ok(());
477+
return Ok(false);
469478
}
470479

471480
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter<'_>| match target {
@@ -543,7 +552,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
543552
// End of final predicate. There must be at least one predicate here.
544553
f.write_char(',')?;
545554

546-
Ok(())
555+
Ok(true)
547556
}
548557

549558
impl HirDisplay for Const {
@@ -594,19 +603,20 @@ impl HirDisplay for Trait {
594603
write!(f, "trait {}", data.name.display(f.db.upcast()))?;
595604
let def_id = GenericDefId::TraitId(self.id);
596605
write_generic_params(def_id, f)?;
597-
write_where_clause(def_id, f)?;
606+
let has_where_clause = write_where_clause(def_id, f)?;
598607

599608
if let Some(limit) = f.entity_limit {
600609
let assoc_items = self.items(f.db);
601610
let count = assoc_items.len().min(limit);
611+
f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
602612
if count == 0 {
603613
if assoc_items.is_empty() {
604-
f.write_str(" {}")?;
614+
f.write_str("{}")?;
605615
} else {
606-
f.write_str(" { /* … */ }")?;
616+
f.write_str("{ /* … */ }")?;
607617
}
608618
} else {
609-
f.write_str(" {\n")?;
619+
f.write_str("{\n")?;
610620
for item in &assoc_items[..count] {
611621
f.write_str(" ")?;
612622
match item {
@@ -651,7 +661,6 @@ impl HirDisplay for TypeAlias {
651661
write!(f, "type {}", data.name.display(f.db.upcast()))?;
652662
let def_id = GenericDefId::TypeAliasId(self.id);
653663
write_generic_params(def_id, f)?;
654-
write_where_clause(def_id, f)?;
655664
if !data.bounds.is_empty() {
656665
f.write_str(": ")?;
657666
f.write_joined(data.bounds.iter(), " + ")?;
@@ -660,6 +669,7 @@ impl HirDisplay for TypeAlias {
660669
f.write_str(" = ")?;
661670
ty.hir_fmt(f)?;
662671
}
672+
write_where_clause(def_id, f)?;
663673
Ok(())
664674
}
665675
}

0 commit comments

Comments
 (0)