@@ -287,12 +287,18 @@ where
287
287
) -> ReachedFixedPoint {
288
288
log:: debug!( "resolving import: {:?} ({:?})" , import, self . result. edition) ;
289
289
let original_module = Module { krate : self . krate , module_id } ;
290
- let ( def, reached_fixedpoint) = self . result . resolve_path_fp (
291
- self . db ,
292
- ResolveMode :: Import ,
293
- original_module,
294
- & import. path ,
295
- ) ;
290
+
291
+ let ( def, reached_fixedpoint) = if import. is_extern_crate {
292
+ let res = self . result . resolve_name_in_extern_prelude (
293
+ & import
294
+ . path
295
+ . as_ident ( )
296
+ . expect ( "extern crate should have been desugared to one-element path" ) ,
297
+ ) ;
298
+ ( res, if res. is_none ( ) { ReachedFixedPoint :: No } else { ReachedFixedPoint :: Yes } )
299
+ } else {
300
+ self . result . resolve_path_fp ( self . db , ResolveMode :: Import , original_module, & import. path )
301
+ } ;
296
302
297
303
if reached_fixedpoint != ReachedFixedPoint :: Yes {
298
304
return reached_fixedpoint;
@@ -502,6 +508,10 @@ impl ItemMap {
502
508
from_scope. or ( from_extern_prelude) . or ( from_prelude)
503
509
}
504
510
511
+ fn resolve_name_in_extern_prelude ( & self , name : & Name ) -> PerNs < ModuleDef > {
512
+ self . extern_prelude . get ( name) . map_or ( PerNs :: none ( ) , |& it| PerNs :: types ( it) )
513
+ }
514
+
505
515
fn resolve_name_in_crate_root_or_extern_prelude (
506
516
& self ,
507
517
db : & impl PersistentHirDatabase ,
@@ -511,8 +521,7 @@ impl ItemMap {
511
521
let crate_root = module. crate_root ( db) ;
512
522
let from_crate_root =
513
523
self [ crate_root. module_id ] . items . get ( name) . map_or ( PerNs :: none ( ) , |it| it. def ) ;
514
- let from_extern_prelude =
515
- self . extern_prelude . get ( name) . map_or ( PerNs :: none ( ) , |& it| PerNs :: types ( it) ) ;
524
+ let from_extern_prelude = self . resolve_name_in_extern_prelude ( name) ;
516
525
517
526
from_crate_root. or ( from_extern_prelude)
518
527
}
0 commit comments