88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- use { Module , Resolver } ;
11+ use { Module , ModuleKind , Resolver } ;
1212use build_reduced_graph:: BuildReducedGraphVisitor ;
1313use rustc:: hir:: def_id:: { CRATE_DEF_INDEX , DefIndex } ;
1414use rustc:: hir:: map:: { self , DefCollector } ;
@@ -21,7 +21,9 @@ use syntax::ext::base::{NormalTT, SyntaxExtension};
2121use syntax:: ext:: expand:: Expansion ;
2222use syntax:: ext:: hygiene:: Mark ;
2323use syntax:: ext:: tt:: macro_rules;
24+ use syntax:: fold:: Folder ;
2425use syntax:: parse:: token:: intern;
26+ use syntax:: ptr:: P ;
2527use syntax:: util:: lev_distance:: find_best_match_for_name;
2628use syntax_pos:: Span ;
2729
@@ -97,6 +99,31 @@ impl<'a> base::Resolver for Resolver<'a> {
9799 mark
98100 }
99101
102+ fn eliminate_crate_var ( & mut self , item : P < ast:: Item > ) -> P < ast:: Item > {
103+ struct EliminateCrateVar < ' b , ' a : ' b > ( & ' b mut Resolver < ' a > ) ;
104+
105+ impl < ' a , ' b > Folder for EliminateCrateVar < ' a , ' b > {
106+ fn fold_path ( & mut self , mut path : ast:: Path ) -> ast:: Path {
107+ let ident = path. segments [ 0 ] . identifier ;
108+ if & ident. name . as_str ( ) == "$crate" {
109+ path. global = true ;
110+ let module = self . 0 . resolve_crate_var ( ident. ctxt ) ;
111+ if module. is_local ( ) {
112+ path. segments . remove ( 0 ) ;
113+ } else {
114+ path. segments [ 0 ] . identifier = match module. kind {
115+ ModuleKind :: Def ( _, name) => ast:: Ident :: with_empty_ctxt ( name) ,
116+ _ => unreachable ! ( ) ,
117+ } ;
118+ }
119+ }
120+ path
121+ }
122+ }
123+
124+ EliminateCrateVar ( self ) . fold_item ( item) . expect_one ( "" )
125+ }
126+
100127 fn visit_expansion ( & mut self , mark : Mark , expansion : & Expansion ) {
101128 let invocation = self . invocations [ & mark] ;
102129 self . collect_def_ids ( invocation, expansion) ;
0 commit comments