Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/data.rs9
-rw-r--r--crates/hir/src/attrs.rs2
-rw-r--r--crates/hir/src/lib.rs4
-rw-r--r--crates/ide-db/src/defs.rs2
-rw-r--r--crates/ide/src/goto_definition.rs7
-rw-r--r--crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html1
-rw-r--r--crates/ide/src/syntax_highlighting/tests.rs1
7 files changed, 13 insertions, 13 deletions
diff --git a/crates/hir-def/src/data.rs b/crates/hir-def/src/data.rs
index 4fb4794d4a..91db68058b 100644
--- a/crates/hir-def/src/data.rs
+++ b/crates/hir-def/src/data.rs
@@ -468,7 +468,7 @@ pub struct ExternCrateDeclData {
pub name: Name,
pub alias: Option<ImportAlias>,
pub visibility: RawVisibility,
- pub crate_id: CrateId,
+ pub crate_id: Option<CrateId>,
}
impl ExternCrateDeclData {
@@ -482,15 +482,12 @@ impl ExternCrateDeclData {
let name = extern_crate.name.clone();
let crate_id = if name == hir_expand::name![self] {
- loc.container.krate()
+ Some(loc.container.krate())
} else {
db.crate_def_map(loc.container.krate())
.extern_prelude()
.find(|&(prelude_name, ..)| *prelude_name == name)
- // FIXME: Suspicious unwrap
- .unwrap()
- .1
- .krate()
+ .map(|(_, root)| root.krate())
};
Arc::new(Self {
diff --git a/crates/hir/src/attrs.rs b/crates/hir/src/attrs.rs
index b4944379dc..3ed03fe7c0 100644
--- a/crates/hir/src/attrs.rs
+++ b/crates/hir/src/attrs.rs
@@ -126,7 +126,7 @@ impl HasAttrs for ExternCrateDecl {
db.attrs_with_owner(def)
}
fn docs(self, db: &dyn HirDatabase) -> Option<Documentation> {
- let crate_docs = self.resolved_crate(db).root_module().attrs(db).docs().map(String::from);
+ let crate_docs = self.resolved_crate(db)?.root_module().attrs(db).docs().map(String::from);
let def = AttrDefId::ExternCrateId(self.into());
let decl_docs = db.attrs(def).docs().map(String::from);
match (decl_docs, crate_docs) {
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 1a9d3ac448..bf041b61f2 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -2138,8 +2138,8 @@ impl ExternCrateDecl {
self.id.module(db.upcast()).into()
}
- pub fn resolved_crate(self, db: &dyn HirDatabase) -> Crate {
- db.extern_crate_decl_data(self.id).crate_id.into()
+ pub fn resolved_crate(self, db: &dyn HirDatabase) -> Option<Crate> {
+ db.extern_crate_decl_data(self.id).crate_id.map(Into::into)
}
pub fn name(self, db: &dyn HirDatabase) -> Name {
diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs
index 4417a61b86..5e4562d9c5 100644
--- a/crates/ide-db/src/defs.rs
+++ b/crates/ide-db/src/defs.rs
@@ -538,7 +538,7 @@ impl NameRefClass {
},
ast::ExternCrate(extern_crate_ast) => {
let extern_crate = sema.to_def(&extern_crate_ast)?;
- let krate = extern_crate.resolved_crate(sema.db);
+ let krate = extern_crate.resolved_crate(sema.db)?;
Some(if extern_crate_ast.rename().is_some() {
NameRefClass::Definition(Definition::Module(krate.root_module()))
} else {
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs
index 10a26befa4..21471ab2a0 100644
--- a/crates/ide/src/goto_definition.rs
+++ b/crates/ide/src/goto_definition.rs
@@ -77,10 +77,11 @@ pub(crate) fn goto_definition(
.into_iter()
.flat_map(|def| {
if let Definition::ExternCrateDecl(crate_def) = def {
- return vec![crate_def
+ return crate_def
.resolved_crate(db)
- .root_module()
- .to_nav(sema.db)];
+ .map(|it| it.root_module().to_nav(sema.db))
+ .into_iter()
+ .collect();
}
try_filter_trait_item_definition(sema, &def)
.unwrap_or_else(|| def_to_nav(sema.db, def))
diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
index cc9640b0b5..88a008796b 100644
--- a/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
+++ b/crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html
@@ -45,4 +45,5 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
</style>
<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>
<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>
+<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>
</code></pre> \ No newline at end of file
diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs
index 8747071807..8749d355c8 100644
--- a/crates/ide/src/syntax_highlighting/tests.rs
+++ b/crates/ide/src/syntax_highlighting/tests.rs
@@ -804,6 +804,7 @@ fn test_extern_crate() {
//- /main.rs crate:main deps:std,alloc
extern crate std;
extern crate alloc as abc;
+extern crate unresolved as definitely_unresolved;
//- /std/lib.rs crate:std
pub struct S;
//- /alloc/lib.rs crate:alloc