@@ -287,12 +287,18 @@ where
287287 ) -> ReachedFixedPoint {
288288 log:: debug!( "resolving import: {:?} ({:?})" , import, self . result. edition) ;
289289 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+ } ;
296302
297303 if reached_fixedpoint != ReachedFixedPoint :: Yes {
298304 return reached_fixedpoint;
@@ -502,6 +508,10 @@ impl ItemMap {
502508 from_scope. or ( from_extern_prelude) . or ( from_prelude)
503509 }
504510
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+
505515 fn resolve_name_in_crate_root_or_extern_prelude (
506516 & self ,
507517 db : & impl PersistentHirDatabase ,
@@ -511,8 +521,7 @@ impl ItemMap {
511521 let crate_root = module. crate_root ( db) ;
512522 let from_crate_root =
513523 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) ;
516525
517526 from_crate_root. or ( from_extern_prelude)
518527 }
0 commit comments