@@ -71,14 +71,6 @@ fn dump_crates(cstore: &CStore) {
7171 } ) ;
7272}
7373
74- #[ derive( Debug ) ]
75- struct ExternCrateInfo {
76- ident : Symbol ,
77- name : Symbol ,
78- id : ast:: NodeId ,
79- dep_kind : DepKind ,
80- }
81-
8274// Extra info about a crate loaded for plugins or exported macros.
8375struct ExtensionCrate {
8476 metadata : PMDSource ,
@@ -117,34 +109,6 @@ impl<'a> CrateLoader<'a> {
117109 }
118110 }
119111
120- fn extract_crate_info ( & self , i : & ast:: Item ) -> Option < ExternCrateInfo > {
121- match i. node {
122- ast:: ItemKind :: ExternCrate ( ref path_opt) => {
123- debug ! ( "resolving extern crate stmt. ident: {} path_opt: {:?}" ,
124- i. ident, path_opt) ;
125- let name = match * path_opt {
126- Some ( name) => {
127- validate_crate_name ( Some ( self . sess ) , & name. as_str ( ) ,
128- Some ( i. span ) ) ;
129- name
130- }
131- None => i. ident . name ,
132- } ;
133- Some ( ExternCrateInfo {
134- ident : i. ident . name ,
135- name,
136- id : i. id ,
137- dep_kind : if attr:: contains_name ( & i. attrs , "no_link" ) {
138- DepKind :: UnexportedMacrosOnly
139- } else {
140- DepKind :: Explicit
141- } ,
142- } )
143- }
144- _ => None
145- }
146- }
147-
148112 fn existing_match ( & self , name : Symbol , hash : Option < & Svh > , kind : PathKind )
149113 -> Option < CrateNum > {
150114 let mut ret = None ;
@@ -478,17 +442,17 @@ impl<'a> CrateLoader<'a> {
478442 } ) ) . collect ( )
479443 }
480444
481- fn read_extension_crate ( & mut self , span : Span , info : & ExternCrateInfo ) -> ExtensionCrate {
482- info ! ( "read extension crate {} `extern crate {} as {}` dep_kind={:?}" ,
483- info . id , info . name , info . ident , info . dep_kind ) ;
445+ fn read_extension_crate ( & mut self , span : Span , orig_name : Symbol , rename : Symbol )
446+ -> ExtensionCrate {
447+ info ! ( "read extension crate `extern crate {} as {}`" , orig_name , rename ) ;
484448 let target_triple = & self . sess . opts . target_triple [ ..] ;
485449 let is_cross = target_triple != config:: host_triple ( ) ;
486450 let mut target_only = false ;
487451 let mut locate_ctxt = locator:: Context {
488452 sess : self . sess ,
489453 span,
490- ident : info . ident ,
491- crate_name : info . name ,
454+ ident : orig_name ,
455+ crate_name : rename ,
492456 hash : None ,
493457 filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
494458 target : & self . sess . host ,
@@ -625,12 +589,8 @@ impl<'a> CrateLoader<'a> {
625589 span : Span ,
626590 name : & str )
627591 -> Option < ( PathBuf , CrateDisambiguator , DefIndex ) > {
628- let ekrate = self . read_extension_crate ( span, & ExternCrateInfo {
629- name : Symbol :: intern ( name) ,
630- ident : Symbol :: intern ( name) ,
631- id : ast:: DUMMY_NODE_ID ,
632- dep_kind : DepKind :: UnexportedMacrosOnly ,
633- } ) ;
592+ let name = Symbol :: intern ( name) ;
593+ let ekrate = self . read_extension_crate ( span, name, name) ;
634594
635595 if ekrate. target_only {
636596 // Need to abort before syntax expansion.
@@ -1098,21 +1058,37 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10981058
10991059 fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
11001060 match item. node {
1101- ast:: ItemKind :: ExternCrate ( _) => {
1102- let info = self . extract_crate_info ( item) . unwrap ( ) ;
1061+ ast:: ItemKind :: ExternCrate ( rename) => {
1062+ debug ! ( "resolving extern crate stmt. ident: {} rename: {:?}" , item. ident, rename) ;
1063+ let rename = match rename {
1064+ Some ( rename) => {
1065+ validate_crate_name ( Some ( self . sess ) , & rename. as_str ( ) , Some ( item. span ) ) ;
1066+ rename
1067+ }
1068+ None => item. ident . name ,
1069+ } ;
1070+ let dep_kind = if attr:: contains_name ( & item. attrs , "no_link" ) {
1071+ DepKind :: UnexportedMacrosOnly
1072+ } else {
1073+ DepKind :: Explicit
1074+ } ;
1075+
11031076 let ( cnum, ..) = self . resolve_crate (
1104- & None , info . ident , info . name , None , item. span , PathKind :: Crate , info . dep_kind ,
1077+ & None , item . ident . name , rename , None , item. span , PathKind :: Crate , dep_kind,
11051078 ) ;
11061079
11071080 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1108- let len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1081+ let path_len = definitions. def_path ( def_id. index ) . data . len ( ) ;
11091082
1110- let extern_crate =
1111- ExternCrate { def_id : def_id, span : item. span , direct : true , path_len : len } ;
1083+ let extern_crate = ExternCrate { def_id, span : item. span , direct : true , path_len } ;
11121084 self . update_extern_crate ( cnum, extern_crate, & mut FxHashSet ( ) ) ;
1113- self . cstore . add_extern_mod_stmt_cnum ( info . id , cnum) ;
1085+ self . cstore . add_extern_mod_stmt_cnum ( item . id , cnum) ;
11141086 }
11151087 _ => { }
11161088 }
11171089 }
1090+
1091+ fn resolve_crate_from_path ( & mut self , name : Symbol , span : Span ) -> CrateNum {
1092+ self . resolve_crate ( & None , name, name, None , span, PathKind :: Crate , DepKind :: Explicit ) . 0
1093+ }
11181094}
0 commit comments