Skip to content

Commit e6a1c9c

Browse files
bors[bot]Veykril
andauthored
Merge #8371
8371: Don't use HirDisplayWrapper when displaying SourceCode r=matklad a=Veykril The issue was basically that when displaying for `DisplayTarget::SourceCode` some `hir_fmt` functions would create `HirDisplayWrapper`s which would then `fmt` these triggering the Display panic since `fmt::Display` can't fail the same way as `HirDisplay`. Simple fix is to just use `hir_fmt` directly. Should probably write that down somewhere in source, looking for a good spot to put that right now. Fixes #8077, Fixes #8370 Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
2 parents 7dd7017 + a43409f commit e6a1c9c

File tree

1 file changed

+17
-32
lines changed

1 file changed

+17
-32
lines changed

crates/hir_ty/src/display.rs

Lines changed: 17 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ pub trait HirDisplay {
5151
where
5252
Self: Sized,
5353
{
54+
assert!(
55+
!matches!(display_target, DisplayTarget::SourceCode { .. }),
56+
"HirDisplayWrapper cannot fail with DisplaySourceCodeError, use HirDisplay::hir_fmt directly instead"
57+
);
5458
HirDisplayWrapper { db, t: self, max_size, omit_verbose_types, display_target }
5559
}
5660

@@ -235,7 +239,7 @@ where
235239
Err(HirDisplayError::FmtError) => Err(fmt::Error),
236240
Err(HirDisplayError::DisplaySourceCodeError(_)) => {
237241
// This should never happen
238-
panic!("HirDisplay failed when calling Display::fmt!")
242+
panic!("HirDisplay::hir_fmt failed with DisplaySourceCodeError when calling Display::fmt!")
239243
}
240244
}
241245
}
@@ -256,13 +260,9 @@ impl HirDisplay for ProjectionTy {
256260
}
257261

258262
let trait_ = f.db.trait_data(self.trait_(f.db));
259-
let first_parameter = self.self_type_parameter(&Interner).into_displayable(
260-
f.db,
261-
f.max_size,
262-
f.omit_verbose_types,
263-
f.display_target,
264-
);
265-
write!(f, "<{} as {}", first_parameter, trait_.name)?;
263+
write!(f, "<")?;
264+
self.self_type_parameter(&Interner).hir_fmt(f)?;
265+
write!(f, " as {}", trait_.name)?;
266266
if self.substitution.len(&Interner) > 1 {
267267
write!(f, "<")?;
268268
f.write_joined(&self.substitution.interned()[1..], ", ")?;
@@ -341,9 +341,6 @@ impl HirDisplay for Ty {
341341
write!(f, "]")?;
342342
}
343343
TyKind::Raw(m, t) | TyKind::Ref(m, _, t) => {
344-
let ty_display =
345-
t.into_displayable(f.db, f.max_size, f.omit_verbose_types, f.display_target);
346-
347344
if matches!(self.kind(&Interner), TyKind::Raw(..)) {
348345
write!(
349346
f,
@@ -398,16 +395,16 @@ impl HirDisplay for Ty {
398395
if fn_traits(f.db.upcast(), trait_).any(|it| it == trait_)
399396
&& predicates.len() <= 2
400397
{
401-
return write!(f, "{}", ty_display);
398+
return t.hir_fmt(f);
402399
}
403400
}
404401

405402
if predicates.len() > 1 {
406403
write!(f, "(")?;
407-
write!(f, "{}", ty_display)?;
404+
t.hir_fmt(f)?;
408405
write!(f, ")")?;
409406
} else {
410-
write!(f, "{}", ty_display)?;
407+
t.hir_fmt(f)?;
411408
}
412409
}
413410
TyKind::Tuple(_, substs) => {
@@ -454,14 +451,8 @@ impl HirDisplay for Ty {
454451
write!(f, ")")?;
455452
let ret = sig.ret();
456453
if !ret.is_unit() {
457-
let ret_display = ret.into_displayable(
458-
f.db,
459-
f.max_size,
460-
f.omit_verbose_types,
461-
f.display_target,
462-
);
463-
464-
write!(f, " -> {}", ret_display)?;
454+
write!(f, " -> ")?;
455+
ret.hir_fmt(f)?;
465456
}
466457
}
467458
TyKind::Adt(AdtId(def_id), parameters) => {
@@ -603,13 +594,8 @@ impl HirDisplay for Ty {
603594
write!(f, "|")?;
604595
};
605596

606-
let ret_display = sig.ret().into_displayable(
607-
f.db,
608-
f.max_size,
609-
f.omit_verbose_types,
610-
f.display_target,
611-
);
612-
write!(f, " -> {}", ret_display)?;
597+
write!(f, " -> ")?;
598+
sig.ret().hir_fmt(f)?;
613599
} else {
614600
write!(f, "{{closure}}")?;
615601
}
@@ -697,9 +683,8 @@ impl HirDisplay for CallableSig {
697683
write!(f, ")")?;
698684
let ret = self.ret();
699685
if !ret.is_unit() {
700-
let ret_display =
701-
ret.into_displayable(f.db, f.max_size, f.omit_verbose_types, f.display_target);
702-
write!(f, " -> {}", ret_display)?;
686+
write!(f, " -> ")?;
687+
ret.hir_fmt(f)?;
703688
}
704689
Ok(())
705690
}

0 commit comments

Comments
 (0)