Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/hir-def/src/data.rs | 9 | ||||
| -rw-r--r-- | crates/hir/src/attrs.rs | 2 | ||||
| -rw-r--r-- | crates/hir/src/lib.rs | 4 | ||||
| -rw-r--r-- | crates/ide-db/src/defs.rs | 2 | ||||
| -rw-r--r-- | crates/ide/src/goto_definition.rs | 7 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html | 1 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/tests.rs | 1 |
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 |