1
1
use { AmbiguityError , AmbiguityKind , AmbiguityErrorMisc } ;
2
2
use { CrateLint , Resolver , ResolutionError , ScopeSet , Weak } ;
3
- use { Module , NameBinding , NameBindingKind , PathResult , Segment , ToNameBinding } ;
3
+ use { Module , ModuleKind , NameBinding , NameBindingKind , PathResult , Segment , ToNameBinding } ;
4
4
use { is_known_tool, resolve_error} ;
5
5
use ModuleOrUniformRoot ;
6
6
use Namespace :: * ;
@@ -15,12 +15,13 @@ use syntax::ast::{self, Ident};
15
15
use syntax:: attr;
16
16
use syntax:: errors:: DiagnosticBuilder ;
17
17
use syntax:: ext:: base:: { self , Determinacy } ;
18
- use syntax:: ext:: base:: { MacroKind , SyntaxExtension } ;
18
+ use syntax:: ext:: base:: { Annotatable , MacroKind , SyntaxExtension } ;
19
19
use syntax:: ext:: expand:: { AstFragment , Invocation , InvocationKind } ;
20
20
use syntax:: ext:: hygiene:: { self , Mark } ;
21
21
use syntax:: ext:: tt:: macro_rules;
22
22
use syntax:: feature_gate:: { feature_err, is_builtin_attr_name, GateIssue } ;
23
23
use syntax:: symbol:: { Symbol , keywords} ;
24
+ use syntax:: visit:: Visitor ;
24
25
use syntax:: util:: lev_distance:: find_best_match_for_name;
25
26
use syntax_pos:: { Span , DUMMY_SP } ;
26
27
use errors:: Applicability ;
@@ -126,6 +127,26 @@ impl<'a> base::Resolver for Resolver<'a> {
126
127
mark
127
128
}
128
129
130
+ fn resolve_dollar_crates ( & mut self , annotatable : & Annotatable ) {
131
+ pub struct ResolveDollarCrates < ' a , ' b : ' a > {
132
+ pub resolver : & ' a mut Resolver < ' b > ,
133
+ }
134
+ impl < ' a > Visitor < ' a > for ResolveDollarCrates < ' a , ' _ > {
135
+ fn visit_ident ( & mut self , ident : Ident ) {
136
+ if ident. name == keywords:: DollarCrate . name ( ) {
137
+ let name = match self . resolver . resolve_crate_root ( ident) . kind {
138
+ ModuleKind :: Def ( _, name) if name != keywords:: Invalid . name ( ) => name,
139
+ _ => keywords:: Crate . name ( ) ,
140
+ } ;
141
+ ident. span . ctxt ( ) . set_dollar_crate_name ( name) ;
142
+ }
143
+ }
144
+ fn visit_mac ( & mut self , _: & ast:: Mac ) { }
145
+ }
146
+
147
+ annotatable. visit_with ( & mut ResolveDollarCrates { resolver : self } ) ;
148
+ }
149
+
129
150
fn visit_ast_fragment_with_placeholders ( & mut self , mark : Mark , fragment : & AstFragment ,
130
151
derives : & [ Mark ] ) {
131
152
let invocation = self . invocations [ & mark] ;
0 commit comments