@@ -867,7 +867,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
867
867
/// Compares two given types, eliding parts that are the same between them and highlighting
868
868
/// relevant differences, and return two representation of those types for highlighted printing.
869
869
fn cmp ( & self , t1 : Ty < ' tcx > , t2 : Ty < ' tcx > ) -> ( DiagnosticStyledString , DiagnosticStyledString ) {
870
- debug ! ( "cmp(t1={}, t2={})" , t1, t2 ) ;
870
+ debug ! ( "cmp(t1={}, t1.kind={:?}, t2={}, t2.kind={:?} )" , t1, t1 . kind , t2 , t2 . kind ) ;
871
871
872
872
// helper functions
873
873
fn equals < ' tcx > ( a : Ty < ' tcx > , b : Ty < ' tcx > ) -> bool {
@@ -1056,12 +1056,47 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
1056
1056
return values;
1057
1057
}
1058
1058
1059
- // We couldn't find anything in common, highlight everything.
1060
- // let x: Bar<Qux> = y::<Foo<Zar>>();
1061
- (
1062
- DiagnosticStyledString :: highlighted ( t1. to_string ( ) ) ,
1063
- DiagnosticStyledString :: highlighted ( t2. to_string ( ) ) ,
1064
- )
1059
+ // We can't find anything in common, highlight relevant part of type path.
1060
+ // let x: foo::bar::Baz<Qux> = y:<foo::bar::Bar<Zar>>();
1061
+ // foo::bar::Baz<Qux>
1062
+ // foo::bar::Bar<Zar>
1063
+ // -------- this part of the path is different
1064
+
1065
+ let t1_str = t1. to_string ( ) ;
1066
+ let t2_str = t2. to_string ( ) ;
1067
+ let min_len = t1_str. len ( ) . min ( t2_str. len ( ) ) ;
1068
+
1069
+ const SEPARATOR : & str = "::" ;
1070
+ let separator_len = SEPARATOR . len ( ) ;
1071
+ let split_idx: usize =
1072
+ t1_str. split ( SEPARATOR )
1073
+ . zip ( t2_str. split ( SEPARATOR ) )
1074
+ . take_while ( |( mod1_str, mod2_str) | mod1_str == mod2_str)
1075
+ . map ( |( mod_str, _) | mod_str. len ( ) + separator_len)
1076
+ . sum ( ) ;
1077
+
1078
+ debug ! ( "cmp: separator_len={}, split_idx={}, min_len={}" ,
1079
+ separator_len, split_idx, min_len
1080
+ ) ;
1081
+
1082
+ if split_idx >= min_len {
1083
+ // paths are identical, highlight everything
1084
+ (
1085
+ DiagnosticStyledString :: highlighted ( t1_str) ,
1086
+ DiagnosticStyledString :: highlighted ( t2_str)
1087
+ )
1088
+ } else {
1089
+ let ( common, uniq1) = t1_str. split_at ( split_idx) ;
1090
+ let ( _, uniq2) = t2_str. split_at ( split_idx) ;
1091
+ debug ! ( "cmp: common={}, uniq1={}, uniq2={}" , common, uniq1, uniq2) ;
1092
+
1093
+ values. 0 . push_normal ( common) ;
1094
+ values. 0 . push_highlighted ( uniq1) ;
1095
+ values. 1 . push_normal ( common) ;
1096
+ values. 1 . push_highlighted ( uniq2) ;
1097
+
1098
+ values
1099
+ }
1065
1100
}
1066
1101
}
1067
1102
0 commit comments