@@ -422,13 +422,7 @@ impl HirDisplay for ProjectionTy {
422422let proj_params_count =
423423self . substitution . len ( Interner ) - trait_ref. substitution . len ( Interner ) ;
424424let 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 {
469463ConstScalar :: Bytes ( b, m) => render_const_scalar ( f, b, m, & data. ty ) ,
470464ConstScalar :: UnevaluatedConst ( c, parameters) => {
471465write ! ( 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+ ) ?;
473471Ok ( ( ) )
474472}
475473ConstScalar :: Unknown => f. write_char ( '_' ) ,
@@ -945,37 +943,31 @@ impl HirDisplay for Ty {
945943}
946944} ;
947945 f. end_location_link ( ) ;
946+
948947if parameters. len ( Interner ) > 0 {
949948let 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+
976965write ! ( 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) ?;
979971write ! ( f, ">" ) ?;
980972}
981973}
@@ -1019,7 +1011,7 @@ impl HirDisplay for Ty {
10191011
10201012let 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}
10241016TyKind :: AssociatedType ( assoc_type_id, parameters) => {
10251017let 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 {
10531039let projection_ty = ProjectionTy {
10541040associated_ty_id : to_assoc_type_id ( type_alias) ,
10551041substitution : parameters. clone ( ) ,
10561042} ;
10571043
1058- projection_ty. hir_fmt ( f) ? ;
1059- }
1044+ projection_ty. hir_fmt ( f)
1045+ } ? ;
10601046}
10611047TyKind :: Foreign ( type_alias) => {
10621048let alias = from_foreign_def_id ( * type_alias) ;
@@ -1150,7 +1136,7 @@ impl HirDisplay for Ty {
11501136}
11511137ClosureStyle :: ClosureWithSubst => {
11521138write ! ( 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 (
13381324f : & mut HirFormatter < ' _ > ,
1339- parameters : & Substitution ,
1325+ parameters : & [ GenericArg ] ,
13401326generic_def : Option < hir_def:: GenericDefId > ,
13411327) -> Result < ( ) , HirDisplayError > {
1342- if parameters. is_empty ( Interner ) {
1328+ if parameters. is_empty ( ) {
13431329return 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) ;
13481333if !parameters_to_write. is_empty ( ) {
13491334write ! ( f, "<" ) ?;
13501335hir_fmt_generic_arguments ( f, parameters_to_write) ?;
@@ -1677,13 +1662,7 @@ fn fmt_trait_ref(
16771662 f. start_location_link ( trait_. into ( ) ) ;
16781663write ! ( 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