@@ -25,7 +25,7 @@ use rustc_back::PanicStrategy;
25
25
use rustc_back:: target:: TargetTriple ;
26
26
use rustc:: session:: search_paths:: PathKind ;
27
27
use rustc:: middle;
28
- use rustc:: middle:: cstore:: { validate_crate_name, ExternCrate } ;
28
+ use rustc:: middle:: cstore:: { validate_crate_name, ExternCrate , ExternCrateSource } ;
29
29
use rustc:: util:: common:: record_time;
30
30
use rustc:: util:: nodemap:: FxHashSet ;
31
31
use rustc:: hir:: map:: Definitions ;
@@ -367,16 +367,31 @@ impl<'a> CrateLoader<'a> {
367
367
let cmeta = self . cstore . get_crate_data ( cnum) ;
368
368
let mut old_extern_crate = cmeta. extern_crate . borrow_mut ( ) ;
369
369
370
+ fn path_len_reverse ( src : ExternCrateSource ) -> cmp:: Reverse < usize > {
371
+ cmp:: Reverse ( match src {
372
+ ExternCrateSource :: Extern { path_len, .. } |
373
+ ExternCrateSource :: Use { path_len } => path_len,
374
+ _ => usize:: max_value ( ) ,
375
+ } )
376
+ }
377
+
370
378
// Prefer:
371
379
// - something over nothing (tuple.0);
372
380
// - direct extern crate to indirect (tuple.1);
373
381
// - shorter paths to longer (tuple.2).
374
- let new_rank = ( true , extern_crate. direct , !extern_crate. path_len ) ;
382
+ let new_rank = (
383
+ true ,
384
+ extern_crate. direct ,
385
+ path_len_reverse ( extern_crate. src ) ,
386
+ ) ;
375
387
let old_rank = match * old_extern_crate {
376
- None => ( false , false , !0 ) ,
377
- Some ( ref c) => ( true , c. direct , !c. path_len ) ,
388
+ None => ( false , false , cmp:: Reverse ( usize:: max_value ( ) ) ) ,
389
+ Some ( ref c) => (
390
+ true ,
391
+ c. direct ,
392
+ path_len_reverse ( c. src ) ,
393
+ ) ,
378
394
} ;
379
-
380
395
if old_rank >= new_rank {
381
396
return ; // no change needed
382
397
}
@@ -1045,7 +1060,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
1045
1060
}
1046
1061
}
1047
1062
1048
- fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
1063
+ fn process_extern_crate ( & mut self , item : & ast:: Item , definitions : & Definitions ) -> CrateNum {
1049
1064
match item. node {
1050
1065
ast:: ItemKind :: ExternCrate ( orig_name) => {
1051
1066
debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
@@ -1071,17 +1086,68 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
1071
1086
1072
1087
let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1073
1088
let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1074
-
1075
- let extern_crate = ExternCrate { def_id, span : item. span , direct : true , path_len } ;
1076
- self . update_extern_crate ( cnum, extern_crate, & mut FxHashSet ( ) ) ;
1089
+ self . update_extern_crate (
1090
+ cnum,
1091
+ ExternCrate {
1092
+ src : ExternCrateSource :: Extern { def_id, path_len } ,
1093
+ span : item. span ,
1094
+ direct : true ,
1095
+ } ,
1096
+ & mut FxHashSet ( ) ,
1097
+ ) ;
1077
1098
self . cstore . add_extern_mod_stmt_cnum ( item. id , cnum) ;
1099
+ cnum
1078
1100
}
1079
- _ => { }
1101
+ _ => bug ! ( ) ,
1080
1102
}
1081
1103
}
1082
1104
1083
- fn resolve_crate_from_path ( & mut self , name : Symbol , span : Span ) -> CrateNum {
1084
- self . resolve_crate ( & None , name, name, None , None , span, PathKind :: Crate ,
1085
- DepKind :: Explicit ) . 0
1105
+ fn process_path_extern (
1106
+ & mut self ,
1107
+ name : Symbol ,
1108
+ span : Span ,
1109
+ ) -> CrateNum {
1110
+ let cnum = self . resolve_crate (
1111
+ & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1112
+ ) . 0 ;
1113
+
1114
+ self . update_extern_crate (
1115
+ cnum,
1116
+ ExternCrate {
1117
+ src : ExternCrateSource :: Path ,
1118
+ span,
1119
+ direct : true ,
1120
+ } ,
1121
+ & mut FxHashSet ( ) ,
1122
+ ) ;
1123
+
1124
+ cnum
1125
+ }
1126
+
1127
+ fn process_use_extern (
1128
+ & mut self ,
1129
+ name : Symbol ,
1130
+ span : Span ,
1131
+ id : ast:: NodeId ,
1132
+ definitions : & Definitions ,
1133
+ ) -> CrateNum {
1134
+ let cnum = self . resolve_crate (
1135
+ & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1136
+ ) . 0 ;
1137
+
1138
+ let def_id = definitions. opt_local_def_id ( id) . unwrap ( ) ;
1139
+ let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1140
+
1141
+ self . update_extern_crate (
1142
+ cnum,
1143
+ ExternCrate {
1144
+ src : ExternCrateSource :: Use { path_len } ,
1145
+ span,
1146
+ direct : true ,
1147
+ } ,
1148
+ & mut FxHashSet ( ) ,
1149
+ ) ;
1150
+
1151
+ cnum
1086
1152
}
1087
1153
}
0 commit comments