@@ -71,14 +71,6 @@ fn dump_crates(cstore: &CStore) {
71
71
} ) ;
72
72
}
73
73
74
- #[ derive( Debug ) ]
75
- struct ExternCrateInfo {
76
- ident : Symbol ,
77
- name : Symbol ,
78
- id : ast:: NodeId ,
79
- dep_kind : DepKind ,
80
- }
81
-
82
74
// Extra info about a crate loaded for plugins or exported macros.
83
75
struct ExtensionCrate {
84
76
metadata : PMDSource ,
@@ -117,34 +109,6 @@ impl<'a> CrateLoader<'a> {
117
109
}
118
110
}
119
111
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
-
148
112
fn existing_match ( & self , name : Symbol , hash : Option < & Svh > , kind : PathKind )
149
113
-> Option < CrateNum > {
150
114
let mut ret = None ;
@@ -478,17 +442,17 @@ impl<'a> CrateLoader<'a> {
478
442
} ) ) . collect ( )
479
443
}
480
444
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 ) ;
484
448
let target_triple = & self . sess . opts . target_triple [ ..] ;
485
449
let is_cross = target_triple != config:: host_triple ( ) ;
486
450
let mut target_only = false ;
487
451
let mut locate_ctxt = locator:: Context {
488
452
sess : self . sess ,
489
453
span,
490
- ident : info . ident ,
491
- crate_name : info . name ,
454
+ ident : orig_name ,
455
+ crate_name : rename ,
492
456
hash : None ,
493
457
filesearch : self . sess . host_filesearch ( PathKind :: Crate ) ,
494
458
target : & self . sess . host ,
@@ -625,12 +589,8 @@ impl<'a> CrateLoader<'a> {
625
589
span : Span ,
626
590
name : & str )
627
591
-> 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) ;
634
594
635
595
if ekrate. target_only {
636
596
// Need to abort before syntax expansion.
@@ -1098,21 +1058,37 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
1098
1058
1099
1059
fn process_item ( & mut self , item : & ast:: Item , definitions : & Definitions ) {
1100
1060
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
+
1103
1076
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,
1105
1078
) ;
1106
1079
1107
1080
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 ( ) ;
1109
1082
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 } ;
1112
1084
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) ;
1114
1086
}
1115
1087
_ => { }
1116
1088
}
1117
1089
}
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
+ }
1118
1094
}
0 commit comments