Skip to content

Commit 0799288

Browse files
committed
Don't write trailing whitespace when formatting empty GenericPredicates
1 parent 9e5192d commit 0799288

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

crates/hir/src/code_model.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use hir_expand::{
2828
};
2929
use hir_ty::{
3030
autoderef,
31-
display::{write_bounds_like_dyn_trait, HirDisplayError, HirFormatter},
31+
display::{write_bounds_like_dyn_trait_with_prefix, HirDisplayError, HirFormatter},
3232
method_resolution,
3333
traits::{FnTrait, Solution, SolutionVariables},
3434
ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate,
@@ -1379,8 +1379,7 @@ impl HirDisplay for TypeParam {
13791379
let substs = Substs::type_params(f.db, self.id.parent);
13801380
let predicates = bounds.iter().cloned().map(|b| b.subst(&substs)).collect::<Vec<_>>();
13811381
if !(predicates.is_empty() || f.omit_verbose_types()) {
1382-
write!(f, ": ")?;
1383-
write_bounds_like_dyn_trait(&predicates, f)?;
1382+
write_bounds_like_dyn_trait_with_prefix(":", &predicates, f)?;
13841383
}
13851384
Ok(())
13861385
}

crates/hir_ty/src/display.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -467,8 +467,7 @@ impl HirDisplay for ApplicationTy {
467467
.as_ref()
468468
.map(|rpit| rpit.impl_traits[idx as usize].bounds.clone());
469469
let bounds = data.subst(&self.parameters);
470-
write!(f, "impl ")?;
471-
write_bounds_like_dyn_trait(&bounds.value, f)?;
470+
write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?;
472471
// FIXME: it would maybe be good to distinguish this from the alias type (when debug printing), and to show the substitution
473472
}
474473
OpaqueTyId::AsyncBlockTypeImplTrait(..) => {
@@ -548,10 +547,10 @@ impl HirDisplay for Ty {
548547
write!(f, "{}", param_data.name.clone().unwrap_or_else(Name::missing))?
549548
}
550549
TypeParamProvenance::ArgumentImplTrait => {
551-
write!(f, "impl ")?;
552550
let bounds = f.db.generic_predicates_for_param(*id);
553551
let substs = Substs::type_params_for_generics(&generics);
554-
write_bounds_like_dyn_trait(
552+
write_bounds_like_dyn_trait_with_prefix(
553+
"impl",
555554
&bounds.iter().map(|b| b.clone().subst(&substs)).collect::<Vec<_>>(),
556555
f,
557556
)?;
@@ -560,8 +559,7 @@ impl HirDisplay for Ty {
560559
}
561560
Ty::Bound(idx) => write!(f, "?{}.{}", idx.debruijn.depth(), idx.index)?,
562561
Ty::Dyn(predicates) => {
563-
write!(f, "dyn ")?;
564-
write_bounds_like_dyn_trait(predicates, f)?;
562+
write_bounds_like_dyn_trait_with_prefix("dyn", predicates, f)?;
565563
}
566564
Ty::Opaque(opaque_ty) => {
567565
match opaque_ty.opaque_ty_id {
@@ -572,8 +570,7 @@ impl HirDisplay for Ty {
572570
.as_ref()
573571
.map(|rpit| rpit.impl_traits[idx as usize].bounds.clone());
574572
let bounds = data.subst(&opaque_ty.parameters);
575-
write!(f, "impl ")?;
576-
write_bounds_like_dyn_trait(&bounds.value, f)?;
573+
write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?;
577574
}
578575
OpaqueTyId::AsyncBlockTypeImplTrait(..) => {
579576
write!(f, "{{async block}}")?;
@@ -627,7 +624,21 @@ fn fn_traits(db: &dyn DefDatabase, trait_: TraitId) -> impl Iterator<Item = Trai
627624
ArrayVec::from(fn_traits).into_iter().flatten().flat_map(|it| it.as_trait())
628625
}
629626

630-
pub fn write_bounds_like_dyn_trait(
627+
pub fn write_bounds_like_dyn_trait_with_prefix(
628+
prefix: &str,
629+
predicates: &[GenericPredicate],
630+
f: &mut HirFormatter,
631+
) -> Result<(), HirDisplayError> {
632+
write!(f, "{}", prefix)?;
633+
if !predicates.is_empty() {
634+
write!(f, " ")?;
635+
write_bounds_like_dyn_trait(predicates, f)
636+
} else {
637+
Ok(())
638+
}
639+
}
640+
641+
fn write_bounds_like_dyn_trait(
631642
predicates: &[GenericPredicate],
632643
f: &mut HirFormatter,
633644
) -> Result<(), HirDisplayError> {

crates/hir_ty/src/tests/traits.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,9 +1410,9 @@ fn weird_bounds() {
14101410
"#,
14111411
expect![[r#"
14121412
23..24 'a': impl Trait
1413-
50..51 'b': impl
1413+
50..51 'b': impl
14141414
69..70 'c': impl Trait
1415-
86..87 'd': impl
1415+
86..87 'd': impl
14161416
107..108 'e': impl {error}
14171417
123..124 'f': impl Trait + {error}
14181418
147..149 '{}': ()

0 commit comments

Comments
 (0)