@@ -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
13371323fn 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
16891668impl HirDisplay for TraitRef {
0 commit comments