Skip to content

Commit c037130

Browse files
committed
Auto merge of #17072 - Veykril:hir-ty-display, r=Veykril
internal: Use `hir_fmt_args` everywhere in `hir_ty::display`
2 parents 2e7059c + 91659da commit c037130

File tree

1 file changed

+34
-55
lines changed

1 file changed

+34
-55
lines changed

crates/hir-ty/src/display.rs

+34-55
Original file line numberDiff line numberDiff line change
@@ -422,13 +422,7 @@ impl HirDisplay for ProjectionTy {
422422
let proj_params_count =
423423
self.substitution.len(Interner) - trait_ref.substitution.len(Interner);
424424
let proj_params = &self.substitution.as_slice(Interner)[..proj_params_count];
425-
if !proj_params.is_empty() {
426-
write!(f, "<")?;
427-
// FIXME use `hir_fmt_generics` here
428-
f.write_joined(proj_params, ", ")?;
429-
write!(f, ">")?;
430-
}
431-
Ok(())
425+
hir_fmt_generics(f, proj_params, None)
432426
}
433427
}
434428

@@ -469,7 +463,11 @@ impl HirDisplay for Const {
469463
ConstScalar::Bytes(b, m) => render_const_scalar(f, b, m, &data.ty),
470464
ConstScalar::UnevaluatedConst(c, parameters) => {
471465
write!(f, "{}", c.name(f.db.upcast()))?;
472-
hir_fmt_generics(f, parameters, c.generic_def(f.db.upcast()))?;
466+
hir_fmt_generics(
467+
f,
468+
parameters.as_slice(Interner),
469+
c.generic_def(f.db.upcast()),
470+
)?;
473471
Ok(())
474472
}
475473
ConstScalar::Unknown => f.write_char('_'),
@@ -945,37 +943,31 @@ impl HirDisplay for Ty {
945943
}
946944
};
947945
f.end_location_link();
946+
948947
if parameters.len(Interner) > 0 {
949948
let generics = generics(db.upcast(), def.into());
950-
let (
951-
parent_params,
952-
self_param,
953-
type_params,
954-
const_params,
955-
_impl_trait_params,
956-
lifetime_params,
957-
) = generics.provenance_split();
958-
let total_len =
959-
parent_params + self_param + type_params + const_params + lifetime_params;
949+
let (parent_len, self_, type_, const_, impl_, lifetime) =
950+
generics.provenance_split();
951+
let parameters = parameters.as_slice(Interner);
960952
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
961-
if total_len > 0 {
953+
if parameters.len() - impl_ > 0 {
962954
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
963955
// parent's params (those from enclosing impl or trait, if any).
964-
let parameters = parameters.as_slice(Interner);
965-
let fn_params_len = self_param + type_params + const_params;
966-
// This will give slice till last type or const
967-
let fn_params = parameters.get(..fn_params_len);
968-
let fn_lt_params =
969-
parameters.get(fn_params_len..(fn_params_len + lifetime_params));
970-
let parent_params = parameters.get(parameters.len() - parent_params..);
971-
let params = parent_params
972-
.into_iter()
973-
.chain(fn_lt_params)
974-
.chain(fn_params)
975-
.flatten();
956+
let (fn_params, other) =
957+
parameters.split_at(self_ + type_ + const_ + lifetime);
958+
let (_impl, parent_params) = other.split_at(impl_);
959+
debug_assert_eq!(parent_params.len(), parent_len);
960+
961+
let parent_params =
962+
generic_args_sans_defaults(f, Some(def.into()), parent_params);
963+
let fn_params = generic_args_sans_defaults(f, Some(def.into()), fn_params);
964+
976965
write!(f, "<")?;
977-
// FIXME use `hir_fmt_generics` here
978-
f.write_joined(params, ", ")?;
966+
hir_fmt_generic_arguments(f, parent_params)?;
967+
if !parent_params.is_empty() && !fn_params.is_empty() {
968+
write!(f, ", ")?;
969+
}
970+
hir_fmt_generic_arguments(f, fn_params)?;
979971
write!(f, ">")?;
980972
}
981973
}
@@ -1019,7 +1011,7 @@ impl HirDisplay for Ty {
10191011

10201012
let generic_def = self.as_generic_def(db);
10211013

1022-
hir_fmt_generics(f, parameters, generic_def)?;
1014+
hir_fmt_generics(f, parameters.as_slice(Interner), generic_def)?;
10231015
}
10241016
TyKind::AssociatedType(assoc_type_id, parameters) => {
10251017
let type_alias = from_assoc_type_id(*assoc_type_id);
@@ -1042,21 +1034,15 @@ impl HirDisplay for Ty {
10421034
f.end_location_link();
10431035
// Note that the generic args for the associated type come before those for the
10441036
// trait (including the self type).
1045-
// FIXME: reconsider the generic args order upon formatting?
1046-
if parameters.len(Interner) > 0 {
1047-
write!(f, "<")?;
1048-
// FIXME use `hir_fmt_generics` here
1049-
f.write_joined(parameters.as_slice(Interner), ", ")?;
1050-
write!(f, ">")?;
1051-
}
1037+
hir_fmt_generics(f, parameters.as_slice(Interner), None)
10521038
} else {
10531039
let projection_ty = ProjectionTy {
10541040
associated_ty_id: to_assoc_type_id(type_alias),
10551041
substitution: parameters.clone(),
10561042
};
10571043

1058-
projection_ty.hir_fmt(f)?;
1059-
}
1044+
projection_ty.hir_fmt(f)
1045+
}?;
10601046
}
10611047
TyKind::Foreign(type_alias) => {
10621048
let alias = from_foreign_def_id(*type_alias);
@@ -1150,7 +1136,7 @@ impl HirDisplay for Ty {
11501136
}
11511137
ClosureStyle::ClosureWithSubst => {
11521138
write!(f, "{{closure#{:?}}}", id.0.as_u32())?;
1153-
return hir_fmt_generics(f, substs, None);
1139+
return hir_fmt_generics(f, substs.as_slice(Interner), None);
11541140
}
11551141
_ => (),
11561142
}
@@ -1336,15 +1322,14 @@ impl HirDisplay for Ty {
13361322

13371323
fn hir_fmt_generics(
13381324
f: &mut HirFormatter<'_>,
1339-
parameters: &Substitution,
1325+
parameters: &[GenericArg],
13401326
generic_def: Option<hir_def::GenericDefId>,
13411327
) -> Result<(), HirDisplayError> {
1342-
if parameters.is_empty(Interner) {
1328+
if parameters.is_empty() {
13431329
return Ok(());
13441330
}
13451331

1346-
let parameters_to_write =
1347-
generic_args_sans_defaults(f, generic_def, parameters.as_slice(Interner));
1332+
let parameters_to_write = generic_args_sans_defaults(f, generic_def, parameters);
13481333
if !parameters_to_write.is_empty() {
13491334
write!(f, "<")?;
13501335
hir_fmt_generic_arguments(f, parameters_to_write)?;
@@ -1677,13 +1662,7 @@ fn fmt_trait_ref(
16771662
f.start_location_link(trait_.into());
16781663
write!(f, "{}", f.db.trait_data(trait_).name.display(f.db.upcast()))?;
16791664
f.end_location_link();
1680-
if tr.substitution.len(Interner) > 1 {
1681-
write!(f, "<")?;
1682-
// FIXME use `hir_fmt_generics` here
1683-
f.write_joined(&tr.substitution.as_slice(Interner)[1..], ", ")?;
1684-
write!(f, ">")?;
1685-
}
1686-
Ok(())
1665+
hir_fmt_generics(f, &tr.substitution.as_slice(Interner)[1..], None)
16871666
}
16881667

16891668
impl HirDisplay for TraitRef {

0 commit comments

Comments
 (0)