@@ -422,13 +422,7 @@ impl HirDisplay for ProjectionTy {
422
422
let proj_params_count =
423
423
self . substitution . len ( Interner ) - trait_ref. substitution . len ( Interner ) ;
424
424
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 )
432
426
}
433
427
}
434
428
@@ -469,7 +463,11 @@ impl HirDisplay for Const {
469
463
ConstScalar :: Bytes ( b, m) => render_const_scalar ( f, b, m, & data. ty ) ,
470
464
ConstScalar :: UnevaluatedConst ( c, parameters) => {
471
465
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
+ ) ?;
473
471
Ok ( ( ) )
474
472
}
475
473
ConstScalar :: Unknown => f. write_char ( '_' ) ,
@@ -945,37 +943,31 @@ impl HirDisplay for Ty {
945
943
}
946
944
} ;
947
945
f. end_location_link ( ) ;
946
+
948
947
if parameters. len ( Interner ) > 0 {
949
948
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 ) ;
960
952
// 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 {
962
954
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
963
955
// 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
+
976
965
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) ?;
979
971
write ! ( f, ">" ) ?;
980
972
}
981
973
}
@@ -1019,7 +1011,7 @@ impl HirDisplay for Ty {
1019
1011
1020
1012
let generic_def = self . as_generic_def ( db) ;
1021
1013
1022
- hir_fmt_generics ( f, parameters, generic_def) ?;
1014
+ hir_fmt_generics ( f, parameters. as_slice ( Interner ) , generic_def) ?;
1023
1015
}
1024
1016
TyKind :: AssociatedType ( assoc_type_id, parameters) => {
1025
1017
let type_alias = from_assoc_type_id ( * assoc_type_id) ;
@@ -1042,21 +1034,15 @@ impl HirDisplay for Ty {
1042
1034
f. end_location_link ( ) ;
1043
1035
// Note that the generic args for the associated type come before those for the
1044
1036
// 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 )
1052
1038
} else {
1053
1039
let projection_ty = ProjectionTy {
1054
1040
associated_ty_id : to_assoc_type_id ( type_alias) ,
1055
1041
substitution : parameters. clone ( ) ,
1056
1042
} ;
1057
1043
1058
- projection_ty. hir_fmt ( f) ? ;
1059
- }
1044
+ projection_ty. hir_fmt ( f)
1045
+ } ? ;
1060
1046
}
1061
1047
TyKind :: Foreign ( type_alias) => {
1062
1048
let alias = from_foreign_def_id ( * type_alias) ;
@@ -1150,7 +1136,7 @@ impl HirDisplay for Ty {
1150
1136
}
1151
1137
ClosureStyle :: ClosureWithSubst => {
1152
1138
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 ) ;
1154
1140
}
1155
1141
_ => ( ) ,
1156
1142
}
@@ -1336,15 +1322,14 @@ impl HirDisplay for Ty {
1336
1322
1337
1323
fn hir_fmt_generics (
1338
1324
f : & mut HirFormatter < ' _ > ,
1339
- parameters : & Substitution ,
1325
+ parameters : & [ GenericArg ] ,
1340
1326
generic_def : Option < hir_def:: GenericDefId > ,
1341
1327
) -> Result < ( ) , HirDisplayError > {
1342
- if parameters. is_empty ( Interner ) {
1328
+ if parameters. is_empty ( ) {
1343
1329
return Ok ( ( ) ) ;
1344
1330
}
1345
1331
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) ;
1348
1333
if !parameters_to_write. is_empty ( ) {
1349
1334
write ! ( f, "<" ) ?;
1350
1335
hir_fmt_generic_arguments ( f, parameters_to_write) ?;
@@ -1677,13 +1662,7 @@ fn fmt_trait_ref(
1677
1662
f. start_location_link ( trait_. into ( ) ) ;
1678
1663
write ! ( f, "{}" , f. db. trait_data( trait_) . name. display( f. db. upcast( ) ) ) ?;
1679
1664
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 )
1687
1666
}
1688
1667
1689
1668
impl HirDisplay for TraitRef {
0 commit comments