diff --git a/crates/hir_def/src/nameres/path_resolution.rs b/crates/hir_def/src/nameres/path_resolution.rs index 82528b79206..7b5fe24a7c5 100644 --- a/crates/hir_def/src/nameres/path_resolution.rs +++ b/crates/hir_def/src/nameres/path_resolution.rs @@ -13,6 +13,7 @@ use std::iter::successors; use base_db::Edition; +use hir_expand::name; use hir_expand::name::Name; use test_utils::mark; @@ -63,6 +64,13 @@ impl ResolvePathResult { impl DefMap { pub(super) fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs { + if name == &name!(self) { + mark::hit!(extern_crate_self_as); + return PerNs::types( + ModuleId { krate: self.krate, local_id: self.root }.into(), + Visibility::Public, + ); + } self.extern_prelude .get(name) .map_or(PerNs::none(), |&it| PerNs::types(it, Visibility::Public)) diff --git a/crates/hir_def/src/nameres/tests/diagnostics.rs b/crates/hir_def/src/nameres/tests/diagnostics.rs index 58d69d3c6b2..e8e72e5efbe 100644 --- a/crates/hir_def/src/nameres/tests/diagnostics.rs +++ b/crates/hir_def/src/nameres/tests/diagnostics.rs @@ -61,6 +61,22 @@ fn unresolved_extern_crate() { ); } +#[test] +fn extern_crate_self_as() { + mark::check!(extern_crate_self_as); + check_diagnostics( + r" + //- /lib.rs + extern crate doesnotexist; + //^^^^^^^^^^^^^^^^^^^^^^^^^^ unresolved extern crate + // Should not error. + extern crate self as foo; + struct Foo; + use foo::Foo as Bar; + ", + ); +} + #[test] fn dedup_unresolved_import_from_unresolved_crate() { check_diagnostics(