@@ -25,7 +25,7 @@ use rustc_back::PanicStrategy;
2525use rustc_back:: target:: TargetTriple ;
2626use rustc:: session:: search_paths:: PathKind ;
2727use rustc:: middle;
28- use rustc:: middle:: cstore:: { validate_crate_name, ExternCrate } ;
28+ use rustc:: middle:: cstore:: { validate_crate_name, ExternCrate , ExternCrateSource } ;
2929use rustc:: util:: common:: record_time;
3030use rustc:: util:: nodemap:: FxHashSet ;
3131use rustc:: hir:: map:: Definitions ;
@@ -371,12 +371,19 @@ impl<'a> CrateLoader<'a> {
371371 // - something over nothing (tuple.0);
372372 // - direct extern crate to indirect (tuple.1);
373373 // - 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+ ) ;
375379 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+ ) ,
378386 } ;
379-
380387 if old_rank >= new_rank {
381388 return ; // no change needed
382389 }
@@ -1053,7 +1060,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10531060 }
10541061 }
10551062
1056- fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
1063+ fn process_extern_crate ( & mut self , item : & ast:: Item , definitions : & Definitions ) -> CrateNum {
10571064 match item. node {
10581065 ast:: ItemKind :: ExternCrate ( orig_name) => {
10591066 debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
@@ -1079,17 +1086,72 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10791086
10801087 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
10811088 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+ ) ;
10851099 self . cstore . add_extern_mod_stmt_cnum ( item. id , cnum) ;
1100+ cnum
10861101 }
1087- _ => { }
1102+ _ => bug ! ( ) ,
10881103 }
10891104 }
10901105
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
10941156 }
10951157}
0 commit comments