1+ use std:: fmt:: Write ;
2+
13use rustc_hir:: def:: DefKind ;
2- use rustc_hir:: def_id:: CRATE_DEF_ID ;
3- use rustc_middle:: ty:: TyCtxt ;
4+ use rustc_hir:: def_id:: { LocalDefId , CRATE_DEF_ID } ;
5+ use rustc_middle:: ty:: { GenericArgs , TyCtxt } ;
46use rustc_span:: symbol:: sym;
57
8+ fn format_variances ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) -> String {
9+ let variances = tcx. variances_of ( def_id) ;
10+ let generics = GenericArgs :: identity_for_item ( tcx, def_id) ;
11+ // 7 = 2-letter parameter + ": " + 1-letter variance + ", "
12+ let mut ret = String :: with_capacity ( 2 + 7 * variances. len ( ) ) ;
13+ ret. push ( '[' ) ;
14+ for ( arg, variance) in generics. iter ( ) . zip ( variances. iter ( ) ) {
15+ write ! ( ret, "{arg}: {variance:?}, " ) . unwrap ( ) ;
16+ }
17+ // Remove trailing `, `.
18+ if !variances. is_empty ( ) {
19+ ret. pop ( ) ;
20+ ret. pop ( ) ;
21+ }
22+ ret. push ( ']' ) ;
23+ ret
24+ }
25+
626pub ( crate ) fn variances ( tcx : TyCtxt < ' _ > ) {
727 if tcx. has_attr ( CRATE_DEF_ID , sym:: rustc_variance_of_opaques) {
828 for id in tcx. hir ( ) . items ( ) {
929 let DefKind :: OpaqueTy = tcx. def_kind ( id. owner_id ) else { continue } ;
1030
11- let variances = tcx. variances_of ( id. owner_id ) ;
12-
1331 tcx. dcx ( ) . emit_err ( crate :: errors:: VariancesOf {
1432 span : tcx. def_span ( id. owner_id ) ,
15- variances : format ! ( "{variances:?}" ) ,
33+ variances : format_variances ( tcx , id . owner_id . def_id ) ,
1634 } ) ;
1735 }
1836 }
@@ -22,11 +40,9 @@ pub(crate) fn variances(tcx: TyCtxt<'_>) {
2240 continue ;
2341 }
2442
25- let variances = tcx. variances_of ( id. owner_id ) ;
26-
2743 tcx. dcx ( ) . emit_err ( crate :: errors:: VariancesOf {
2844 span : tcx. def_span ( id. owner_id ) ,
29- variances : format ! ( "{variances:?}" ) ,
45+ variances : format_variances ( tcx , id . owner_id . def_id ) ,
3046 } ) ;
3147 }
3248}
0 commit comments