@@ -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 ;
@@ -367,16 +367,31 @@ impl<'a> CrateLoader<'a> {
367367 let cmeta = self . cstore . get_crate_data ( cnum) ;
368368 let mut old_extern_crate = cmeta. extern_crate . borrow_mut ( ) ;
369369
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+
370378 // Prefer:
371379 // - something over nothing (tuple.0);
372380 // - direct extern crate to indirect (tuple.1);
373381 // - 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+ ) ;
375387 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+ ) ,
378394 } ;
379-
380395 if old_rank >= new_rank {
381396 return ; // no change needed
382397 }
@@ -1045,7 +1060,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10451060 }
10461061 }
10471062
1048- fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
1063+ fn process_extern_crate ( & mut self , item : & ast:: Item , definitions : & Definitions ) -> CrateNum {
10491064 match item. node {
10501065 ast:: ItemKind :: ExternCrate ( orig_name) => {
10511066 debug ! ( "resolving extern crate stmt. ident: {} orig_name: {:?}" ,
@@ -1071,17 +1086,68 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10711086
10721087 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
10731088 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+ ) ;
10771098 self . cstore . add_extern_mod_stmt_cnum ( item. id , cnum) ;
1099+ cnum
10781100 }
1079- _ => { }
1101+ _ => bug ! ( ) ,
10801102 }
10811103 }
10821104
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
10861152 }
10871153}
0 commit comments