@@ -17,7 +17,7 @@ use macros::{InvocationData, LegacyScope};
17
17
use resolve_imports:: ImportDirective ;
18
18
use resolve_imports:: ImportDirectiveSubclass :: { self , GlobImport , SingleImport } ;
19
19
use { Module , ModuleData , ModuleKind , NameBinding , NameBindingKind , ToNameBinding } ;
20
- use { PerNS , Resolver , ResolverArenas } ;
20
+ use { ModuleOrUniformRoot , PerNS , Resolver , ResolverArenas } ;
21
21
use Namespace :: { self , TypeNS , ValueNS , MacroNS } ;
22
22
use { resolve_error, resolve_struct_error, ResolutionError } ;
23
23
@@ -175,7 +175,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
175
175
ModuleKind :: Def ( _, name) => name,
176
176
ModuleKind :: Block ( ..) => unreachable ! ( ) ,
177
177
} ;
178
- source. name = crate_name;
178
+ // HACK(eddyb) unclear how good this is, but keeping `$crate`
179
+ // in `source` breaks `src/test/compile-fail/import-crate-var.rs`,
180
+ // while the current crate doesn't have a valid `crate_name`.
181
+ if crate_name != keywords:: Invalid . name ( ) {
182
+ source. name = crate_name;
183
+ }
179
184
if rename. is_none ( ) {
180
185
ident. name = crate_name;
181
186
}
@@ -187,6 +192,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
187
192
}
188
193
}
189
194
195
+ if ident. name == keywords:: Crate . name ( ) {
196
+ self . session . span_err ( ident. span ,
197
+ "crate root imports need to be explicitly named: \
198
+ `use crate as name;`") ;
199
+ }
200
+
190
201
let subclass = SingleImport {
191
202
target : ident,
192
203
source,
@@ -299,7 +310,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
299
310
root_id : item. id ,
300
311
id : item. id ,
301
312
parent,
302
- imported_module : Cell :: new ( Some ( module) ) ,
313
+ imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
303
314
subclass : ImportDirectiveSubclass :: ExternCrate ( orig_name) ,
304
315
root_span : item. span ,
305
316
span : item. span ,
@@ -701,7 +712,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
701
712
root_id : item. id ,
702
713
id : item. id ,
703
714
parent : graph_root,
704
- imported_module : Cell :: new ( Some ( module) ) ,
715
+ imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
705
716
subclass : ImportDirectiveSubclass :: MacroUse ,
706
717
root_span : span,
707
718
span,
@@ -721,7 +732,13 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
721
732
} else {
722
733
for ( name, span) in legacy_imports. imports {
723
734
let ident = Ident :: with_empty_ctxt ( name) ;
724
- let result = self . resolve_ident_in_module ( module, ident, MacroNS , false , span) ;
735
+ let result = self . resolve_ident_in_module (
736
+ ModuleOrUniformRoot :: Module ( module) ,
737
+ ident,
738
+ MacroNS ,
739
+ false ,
740
+ span,
741
+ ) ;
725
742
if let Ok ( binding) = result {
726
743
let directive = macro_use_directive ( span) ;
727
744
self . potentially_unused_imports . push ( directive) ;
0 commit comments