File tree 7 files changed +13
-13
lines changed
7 files changed +13
-13
lines changed Original file line number Diff line number Diff line change @@ -468,7 +468,7 @@ pub struct ExternCrateDeclData {
468
468
pub name : Name ,
469
469
pub alias : Option < ImportAlias > ,
470
470
pub visibility : RawVisibility ,
471
- pub crate_id : CrateId ,
471
+ pub crate_id : Option < CrateId > ,
472
472
}
473
473
474
474
impl ExternCrateDeclData {
@@ -482,15 +482,12 @@ impl ExternCrateDeclData {
482
482
483
483
let name = extern_crate. name . clone ( ) ;
484
484
let crate_id = if name == hir_expand:: name![ self ] {
485
- loc. container . krate ( )
485
+ Some ( loc. container . krate ( ) )
486
486
} else {
487
487
db. crate_def_map ( loc. container . krate ( ) )
488
488
. extern_prelude ( )
489
489
. find ( |& ( prelude_name, ..) | * prelude_name == name)
490
- // FIXME: Suspicious unwrap
491
- . unwrap ( )
492
- . 1
493
- . krate ( )
490
+ . map ( |( _, root) | root. krate ( ) )
494
491
} ;
495
492
496
493
Arc :: new ( Self {
Original file line number Diff line number Diff line change @@ -126,7 +126,7 @@ impl HasAttrs for ExternCrateDecl {
126
126
db. attrs_with_owner ( def)
127
127
}
128
128
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) ;
130
130
let def = AttrDefId :: ExternCrateId ( self . into ( ) ) ;
131
131
let decl_docs = db. attrs ( def) . docs ( ) . map ( String :: from) ;
132
132
match ( decl_docs, crate_docs) {
Original file line number Diff line number Diff line change @@ -2138,8 +2138,8 @@ impl ExternCrateDecl {
2138
2138
self . id . module ( db. upcast ( ) ) . into ( )
2139
2139
}
2140
2140
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 )
2143
2143
}
2144
2144
2145
2145
pub fn name ( self , db : & dyn HirDatabase ) -> Name {
Original file line number Diff line number Diff line change @@ -538,7 +538,7 @@ impl NameRefClass {
538
538
} ,
539
539
ast:: ExternCrate ( extern_crate_ast) => {
540
540
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) ? ;
542
542
Some ( if extern_crate_ast. rename( ) . is_some( ) {
543
543
NameRefClass :: Definition ( Definition :: Module ( krate. root_module( ) ) )
544
544
} else {
Original file line number Diff line number Diff line change @@ -77,10 +77,11 @@ pub(crate) fn goto_definition(
77
77
. into_iter ( )
78
78
. flat_map ( |def| {
79
79
if let Definition :: ExternCrateDecl ( crate_def) = def {
80
- return vec ! [ crate_def
80
+ return crate_def
81
81
. 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 ( ) ;
84
85
}
85
86
try_filter_trait_item_definition ( sema, & def)
86
87
. unwrap_or_else ( || def_to_nav ( sema. db , def) )
Original file line number Diff line number Diff line change 45
45
</ style >
46
46
< 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 >
47
47
< 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 >
48
49
</ code > </ pre >
Original file line number Diff line number Diff line change @@ -804,6 +804,7 @@ fn test_extern_crate() {
804
804
//- /main.rs crate:main deps:std,alloc
805
805
extern crate std;
806
806
extern crate alloc as abc;
807
+ extern crate unresolved as definitely_unresolved;
807
808
//- /std/lib.rs crate:std
808
809
pub struct S;
809
810
//- /alloc/lib.rs crate:alloc
You can’t perform that action at this time.
0 commit comments