@@ -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,13 @@ impl ItemMap {
502508 from_scope. or ( from_extern_prelude) . or ( from_prelude)
503509 }
504510
511+ fn resolve_name_in_extern_prelude (
512+ & self ,
513+ name : & Name ,
514+ ) -> PerNs < ModuleDef > {
515+ self . extern_prelude . get ( name) . map_or ( PerNs :: none ( ) , |& it| PerNs :: types ( it) )
516+ }
517+
505518 fn resolve_name_in_crate_root_or_extern_prelude (
506519 & self ,
507520 db : & impl PersistentHirDatabase ,
@@ -512,7 +525,7 @@ impl ItemMap {
512525 let from_crate_root =
513526 self [ crate_root. module_id ] . items . get ( name) . map_or ( PerNs :: none ( ) , |it| it. def ) ;
514527 let from_extern_prelude =
515- self . extern_prelude . get ( name) . map_or ( PerNs :: none ( ) , | & it| PerNs :: types ( it ) ) ;
528+ self . resolve_name_in_extern_prelude ( name) ;
516529
517530 from_crate_root. or ( from_extern_prelude)
518531 }
0 commit comments