8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use { Module , Resolver } ;
11
+ use { Module , ModuleKind , Resolver } ;
12
12
use build_reduced_graph:: BuildReducedGraphVisitor ;
13
13
use rustc:: hir:: def_id:: { CRATE_DEF_INDEX , DefIndex } ;
14
14
use rustc:: hir:: map:: { self , DefCollector } ;
@@ -21,7 +21,9 @@ use syntax::ext::base::{NormalTT, SyntaxExtension};
21
21
use syntax:: ext:: expand:: Expansion ;
22
22
use syntax:: ext:: hygiene:: Mark ;
23
23
use syntax:: ext:: tt:: macro_rules;
24
+ use syntax:: fold:: Folder ;
24
25
use syntax:: parse:: token:: intern;
26
+ use syntax:: ptr:: P ;
25
27
use syntax:: util:: lev_distance:: find_best_match_for_name;
26
28
use syntax_pos:: Span ;
27
29
@@ -97,6 +99,31 @@ impl<'a> base::Resolver for Resolver<'a> {
97
99
mark
98
100
}
99
101
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
+
100
127
fn visit_expansion ( & mut self , mark : Mark , expansion : & Expansion ) {
101
128
let invocation = self . invocations [ & mark] ;
102
129
self . collect_def_ids ( invocation, expansion) ;
0 commit comments