Skip to content

Commit d69a81f

Browse files
committed
fix: Fix wrong where clause rendering on hover
1 parent 0dd89d7 commit d69a81f

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)