Don't write trailing whitespace when formatting empty GenericPredicates

This commit is contained in:
Lukas Wirth 2021-02-20 20:43:04 +01:00
parent 9e5192d917
commit 0799288f01
3 changed files with 24 additions and 14 deletions

View file

@ -28,7 +28,7 @@ use hir_expand::{
}; };
use hir_ty::{ use hir_ty::{
autoderef, autoderef,
display::{write_bounds_like_dyn_trait, HirDisplayError, HirFormatter}, display::{write_bounds_like_dyn_trait_with_prefix, HirDisplayError, HirFormatter},
method_resolution, method_resolution,
traits::{FnTrait, Solution, SolutionVariables}, traits::{FnTrait, Solution, SolutionVariables},
ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate, ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate,
@ -1379,8 +1379,7 @@ impl HirDisplay for TypeParam {
let substs = Substs::type_params(f.db, self.id.parent); let substs = Substs::type_params(f.db, self.id.parent);
let predicates = bounds.iter().cloned().map(|b| b.subst(&substs)).collect::<Vec<_>>(); let predicates = bounds.iter().cloned().map(|b| b.subst(&substs)).collect::<Vec<_>>();
if !(predicates.is_empty() || f.omit_verbose_types()) { if !(predicates.is_empty() || f.omit_verbose_types()) {
write!(f, ": ")?; write_bounds_like_dyn_trait_with_prefix(":", &predicates, f)?;
write_bounds_like_dyn_trait(&predicates, f)?;
} }
Ok(()) Ok(())
} }

View file

@ -467,8 +467,7 @@ impl HirDisplay for ApplicationTy {
.as_ref() .as_ref()
.map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone());
let bounds = data.subst(&self.parameters); let bounds = data.subst(&self.parameters);
write!(f, "impl ")?; write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?;
write_bounds_like_dyn_trait(&bounds.value, f)?;
// FIXME: it would maybe be good to distinguish this from the alias type (when debug printing), and to show the substitution // FIXME: it would maybe be good to distinguish this from the alias type (when debug printing), and to show the substitution
} }
OpaqueTyId::AsyncBlockTypeImplTrait(..) => { OpaqueTyId::AsyncBlockTypeImplTrait(..) => {
@ -548,10 +547,10 @@ impl HirDisplay for Ty {
write!(f, "{}", param_data.name.clone().unwrap_or_else(Name::missing))? write!(f, "{}", param_data.name.clone().unwrap_or_else(Name::missing))?
} }
TypeParamProvenance::ArgumentImplTrait => { TypeParamProvenance::ArgumentImplTrait => {
write!(f, "impl ")?;
let bounds = f.db.generic_predicates_for_param(*id); let bounds = f.db.generic_predicates_for_param(*id);
let substs = Substs::type_params_for_generics(&generics); let substs = Substs::type_params_for_generics(&generics);
write_bounds_like_dyn_trait( write_bounds_like_dyn_trait_with_prefix(
"impl",
&bounds.iter().map(|b| b.clone().subst(&substs)).collect::<Vec<_>>(), &bounds.iter().map(|b| b.clone().subst(&substs)).collect::<Vec<_>>(),
f, f,
)?; )?;
@ -560,8 +559,7 @@ impl HirDisplay for Ty {
} }
Ty::Bound(idx) => write!(f, "?{}.{}", idx.debruijn.depth(), idx.index)?, Ty::Bound(idx) => write!(f, "?{}.{}", idx.debruijn.depth(), idx.index)?,
Ty::Dyn(predicates) => { Ty::Dyn(predicates) => {
write!(f, "dyn ")?; write_bounds_like_dyn_trait_with_prefix("dyn", predicates, f)?;
write_bounds_like_dyn_trait(predicates, f)?;
} }
Ty::Opaque(opaque_ty) => { Ty::Opaque(opaque_ty) => {
match opaque_ty.opaque_ty_id { match opaque_ty.opaque_ty_id {
@ -572,8 +570,7 @@ impl HirDisplay for Ty {
.as_ref() .as_ref()
.map(|rpit| rpit.impl_traits[idx as usize].bounds.clone()); .map(|rpit| rpit.impl_traits[idx as usize].bounds.clone());
let bounds = data.subst(&opaque_ty.parameters); let bounds = data.subst(&opaque_ty.parameters);
write!(f, "impl ")?; write_bounds_like_dyn_trait_with_prefix("impl", &bounds.value, f)?;
write_bounds_like_dyn_trait(&bounds.value, f)?;
} }
OpaqueTyId::AsyncBlockTypeImplTrait(..) => { OpaqueTyId::AsyncBlockTypeImplTrait(..) => {
write!(f, "{{async block}}")?; write!(f, "{{async block}}")?;
@ -627,7 +624,21 @@ fn fn_traits(db: &dyn DefDatabase, trait_: TraitId) -> impl Iterator<Item = Trai
ArrayVec::from(fn_traits).into_iter().flatten().flat_map(|it| it.as_trait()) ArrayVec::from(fn_traits).into_iter().flatten().flat_map(|it| it.as_trait())
} }
pub fn write_bounds_like_dyn_trait( pub fn write_bounds_like_dyn_trait_with_prefix(
prefix: &str,
predicates: &[GenericPredicate],
f: &mut HirFormatter,
) -> Result<(), HirDisplayError> {
write!(f, "{}", prefix)?;
if !predicates.is_empty() {
write!(f, " ")?;
write_bounds_like_dyn_trait(predicates, f)
} else {
Ok(())
}
}
fn write_bounds_like_dyn_trait(
predicates: &[GenericPredicate], predicates: &[GenericPredicate],
f: &mut HirFormatter, f: &mut HirFormatter,
) -> Result<(), HirDisplayError> { ) -> Result<(), HirDisplayError> {

View file

@ -1410,9 +1410,9 @@ fn weird_bounds() {
"#, "#,
expect![[r#" expect![[r#"
23..24 'a': impl Trait 23..24 'a': impl Trait
50..51 'b': impl 50..51 'b': impl
69..70 'c': impl Trait 69..70 'c': impl Trait
86..87 'd': impl 86..87 'd': impl
107..108 'e': impl {error} 107..108 'e': impl {error}
123..124 'f': impl Trait + {error} 123..124 'f': impl Trait + {error}
147..149 '{}': () 147..149 '{}': ()