File tree Expand file tree Collapse file tree 7 files changed +13
-13
lines changed Expand file tree Collapse file tree 7 files changed +13
-13
lines changed Original file line number Diff line number Diff line change @@ -468,7 +468,7 @@ pub struct ExternCrateDeclData {
468468 pub name : Name ,
469469 pub alias : Option < ImportAlias > ,
470470 pub visibility : RawVisibility ,
471- pub crate_id : CrateId ,
471+ pub crate_id : Option < CrateId > ,
472472}
473473
474474impl ExternCrateDeclData {
@@ -482,15 +482,12 @@ impl ExternCrateDeclData {
482482
483483 let name = extern_crate. name . clone ( ) ;
484484 let crate_id = if name == hir_expand:: name![ self ] {
485- loc. container . krate ( )
485+ Some ( loc. container . krate ( ) )
486486 } else {
487487 db. crate_def_map ( loc. container . krate ( ) )
488488 . extern_prelude ( )
489489 . find ( |& ( prelude_name, ..) | * prelude_name == name)
490- // FIXME: Suspicious unwrap
491- . unwrap ( )
492- . 1
493- . krate ( )
490+ . map ( |( _, root) | root. krate ( ) )
494491 } ;
495492
496493 Arc :: new ( Self {
Original file line number Diff line number Diff line change @@ -126,7 +126,7 @@ impl HasAttrs for ExternCrateDecl {
126126 db. attrs_with_owner ( def)
127127 }
128128 fn docs ( self , db : & dyn HirDatabase ) -> Option < Documentation > {
129- let crate_docs = self . resolved_crate ( db) . root_module ( ) . attrs ( db) . docs ( ) . map ( String :: from) ;
129+ let crate_docs = self . resolved_crate ( db) ? . root_module ( ) . attrs ( db) . docs ( ) . map ( String :: from) ;
130130 let def = AttrDefId :: ExternCrateId ( self . into ( ) ) ;
131131 let decl_docs = db. attrs ( def) . docs ( ) . map ( String :: from) ;
132132 match ( decl_docs, crate_docs) {
Original file line number Diff line number Diff line change @@ -2138,8 +2138,8 @@ impl ExternCrateDecl {
21382138 self . id . module ( db. upcast ( ) ) . into ( )
21392139 }
21402140
2141- pub fn resolved_crate ( self , db : & dyn HirDatabase ) -> Crate {
2142- db. extern_crate_decl_data ( self . id ) . crate_id . into ( )
2141+ pub fn resolved_crate ( self , db : & dyn HirDatabase ) -> Option < Crate > {
2142+ db. extern_crate_decl_data ( self . id ) . crate_id . map ( Into :: into )
21432143 }
21442144
21452145 pub fn name ( self , db : & dyn HirDatabase ) -> Name {
Original file line number Diff line number Diff line change @@ -538,7 +538,7 @@ impl NameRefClass {
538538 } ,
539539 ast:: ExternCrate ( extern_crate_ast) => {
540540 let extern_crate = sema. to_def( & extern_crate_ast) ?;
541- let krate = extern_crate. resolved_crate( sema. db) ;
541+ let krate = extern_crate. resolved_crate( sema. db) ? ;
542542 Some ( if extern_crate_ast. rename( ) . is_some( ) {
543543 NameRefClass :: Definition ( Definition :: Module ( krate. root_module( ) ) )
544544 } else {
Original file line number Diff line number Diff line change @@ -77,10 +77,11 @@ pub(crate) fn goto_definition(
7777 . into_iter ( )
7878 . flat_map ( |def| {
7979 if let Definition :: ExternCrateDecl ( crate_def) = def {
80- return vec ! [ crate_def
80+ return crate_def
8181 . resolved_crate ( db)
82- . root_module( )
83- . to_nav( sema. db) ] ;
82+ . map ( |it| it. root_module ( ) . to_nav ( sema. db ) )
83+ . into_iter ( )
84+ . collect ( ) ;
8485 }
8586 try_filter_trait_item_definition ( sema, & def)
8687 . unwrap_or_else ( || def_to_nav ( sema. db , def) )
Original file line number Diff line number Diff line change 4545</ style >
4646< pre > < code > < span class ="keyword "> extern</ span > < span class ="keyword "> crate</ span > < span class ="module crate_root default_library library "> std</ span > < span class ="semicolon "> ;</ span >
4747< span class ="keyword "> extern</ span > < span class ="keyword "> crate</ span > < span class ="module crate_root default_library library "> alloc</ span > < span class ="keyword "> as</ span > < span class ="module crate_root declaration "> abc</ span > < span class ="semicolon "> ;</ span >
48+ < span class ="keyword "> extern</ span > < span class ="keyword "> crate</ span > < span class ="unresolved_reference "> unresolved</ span > < span class ="keyword "> as</ span > < span class ="module crate_root declaration "> definitely_unresolved</ span > < span class ="semicolon "> ;</ span >
4849</ code > </ pre >
Original file line number Diff line number Diff line change @@ -804,6 +804,7 @@ fn test_extern_crate() {
804804//- /main.rs crate:main deps:std,alloc
805805extern crate std;
806806extern crate alloc as abc;
807+ extern crate unresolved as definitely_unresolved;
807808//- /std/lib.rs crate:std
808809pub struct S;
809810//- /alloc/lib.rs crate:alloc
You can’t perform that action at this time.
0 commit comments