@@ -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 ;
@@ -371,12 +371,19 @@ impl<'a> CrateLoader<'a> {
371
371
// - something over nothing (tuple.0);
372
372
// - direct extern crate to indirect (tuple.1);
373
373
// - shorter paths to longer (tuple.2).
374
- let new_rank = ( true , extern_crate. direct , !extern_crate. path_len ) ;
374
+ let new_rank = (
375
+ true ,
376
+ extern_crate. direct ,
377
+ cmp:: Reverse ( extern_crate. path_len ) ,
378
+ ) ;
375
379
let old_rank = match * old_extern_crate {
376
- None => ( false , false , !0 ) ,
377
- Some ( ref c) => ( true , c. direct , !c. path_len ) ,
380
+ None => ( false , false , cmp:: Reverse ( usize:: max_value ( ) ) ) ,
381
+ Some ( ref c) => (
382
+ true ,
383
+ c. direct ,
384
+ cmp:: Reverse ( c. path_len ) ,
385
+ ) ,
378
386
} ;
379
-
380
387
if old_rank >= new_rank {
381
388
return ; // no change needed
382
389
}
@@ -1053,7 +1060,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
1053
1060
}
1054
1061
}
1055
1062
1056
- fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
1063
+ fn process_extern_crate ( & mut self , item : & ast:: Item , definitions : & Definitions ) -> CrateNum {
1057
1064
match item. node {
1058
1065
ast:: ItemKind :: ExternCrate ( orig_name) => {
1059
1066
debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
@@ -1079,17 +1086,72 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
1079
1086
1080
1087
let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1081
1088
let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1082
-
1083
- let extern_crate = ExternCrate { def_id, span : item. span , direct : true , path_len } ;
1084
- self . update_extern_crate ( cnum, extern_crate, & mut FxHashSet ( ) ) ;
1089
+ self . update_extern_crate (
1090
+ cnum,
1091
+ ExternCrate {
1092
+ src : ExternCrateSource :: Extern ( def_id) ,
1093
+ span : item. span ,
1094
+ path_len,
1095
+ direct : true ,
1096
+ } ,
1097
+ & mut FxHashSet ( ) ,
1098
+ ) ;
1085
1099
self . cstore . add_extern_mod_stmt_cnum ( item. id , cnum) ;
1100
+ cnum
1086
1101
}
1087
- _ => { }
1102
+ _ => bug ! ( ) ,
1088
1103
}
1089
1104
}
1090
1105
1091
- fn resolve_crate_from_path ( & mut self , name : Symbol , span : Span ) -> CrateNum {
1092
- self . resolve_crate ( & None , name, name, None , None , span, PathKind :: Crate ,
1093
- DepKind :: Explicit ) . 0
1106
+ fn process_path_extern (
1107
+ & mut self ,
1108
+ name : Symbol ,
1109
+ span : Span ,
1110
+ ) -> CrateNum {
1111
+ let cnum = self . resolve_crate (
1112
+ & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1113
+ ) . 0 ;
1114
+
1115
+ self . update_extern_crate (
1116
+ cnum,
1117
+ ExternCrate {
1118
+ src : ExternCrateSource :: Path ,
1119
+ span,
1120
+ // to have the least priority in `update_extern_crate`
1121
+ path_len : usize:: max_value ( ) ,
1122
+ direct : true ,
1123
+ } ,
1124
+ & mut FxHashSet ( ) ,
1125
+ ) ;
1126
+
1127
+ cnum
1128
+ }
1129
+
1130
+ fn process_use_extern (
1131
+ & mut self ,
1132
+ name : Symbol ,
1133
+ span : Span ,
1134
+ id : ast:: NodeId ,
1135
+ definitions : & Definitions ,
1136
+ ) -> CrateNum {
1137
+ let cnum = self . resolve_crate (
1138
+ & None , name, name, None , None , span, PathKind :: Crate , DepKind :: Explicit
1139
+ ) . 0 ;
1140
+
1141
+ let def_id = definitions. opt_local_def_id ( id) . unwrap ( ) ;
1142
+ let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1143
+
1144
+ self . update_extern_crate (
1145
+ cnum,
1146
+ ExternCrate {
1147
+ src : ExternCrateSource :: Use ,
1148
+ span,
1149
+ path_len,
1150
+ direct : true ,
1151
+ } ,
1152
+ & mut FxHashSet ( ) ,
1153
+ ) ;
1154
+
1155
+ cnum
1094
1156
}
1095
1157
}
0 commit comments