11use { AmbiguityError , AmbiguityKind , AmbiguityErrorMisc } ;
22use { CrateLint , Resolver , ResolutionError , ScopeSet , Weak } ;
3- use { Module , NameBinding , NameBindingKind , PathResult , Segment , ToNameBinding } ;
3+ use { Module , ModuleKind , NameBinding , NameBindingKind , PathResult , Segment , ToNameBinding } ;
44use { is_known_tool, resolve_error} ;
55use ModuleOrUniformRoot ;
66use Namespace :: * ;
@@ -15,12 +15,13 @@ use syntax::ast::{self, Ident};
1515use syntax:: attr;
1616use syntax:: errors:: DiagnosticBuilder ;
1717use syntax:: ext:: base:: { self , Determinacy } ;
18- use syntax:: ext:: base:: { MacroKind , SyntaxExtension } ;
18+ use syntax:: ext:: base:: { Annotatable , MacroKind , SyntaxExtension } ;
1919use syntax:: ext:: expand:: { AstFragment , Invocation , InvocationKind } ;
2020use syntax:: ext:: hygiene:: { self , Mark } ;
2121use syntax:: ext:: tt:: macro_rules;
2222use syntax:: feature_gate:: { feature_err, is_builtin_attr_name, GateIssue } ;
2323use syntax:: symbol:: { Symbol , keywords} ;
24+ use syntax:: visit:: Visitor ;
2425use syntax:: util:: lev_distance:: find_best_match_for_name;
2526use syntax_pos:: { Span , DUMMY_SP } ;
2627use errors:: Applicability ;
@@ -126,6 +127,26 @@ impl<'a> base::Resolver for Resolver<'a> {
126127 mark
127128 }
128129
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+
129150 fn visit_ast_fragment_with_placeholders ( & mut self , mark : Mark , fragment : & AstFragment ,
130151 derives : & [ Mark ] ) {
131152 let invocation = self . invocations [ & mark] ;
0 commit comments