Skip to content

Commit c08e690

Browse files
Merge #8447
8447: Resolve prelude and crate root names in the root DefMap r=jonas-schievink a=jonas-schievink Should fix #8418 bors r+ Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
2 parents 3b1692c + 75614b1 commit c08e690

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

crates/hir_def/src/nameres/collector.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ impl DefCollector<'_> {
478478
self.def_map.edition,
479479
);
480480

481-
let res = self.def_map.resolve_name_in_extern_prelude(&extern_crate.name);
481+
let res = self.def_map.resolve_name_in_extern_prelude(self.db, &extern_crate.name);
482482

483483
if let Some(ModuleDefId::ModuleId(m)) = res.take_types() {
484484
cov_mark::hit!(macro_rules_from_other_crates_are_visible_with_macro_use);
@@ -534,6 +534,7 @@ impl DefCollector<'_> {
534534
log::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition);
535535
if import.is_extern_crate {
536536
let res = self.def_map.resolve_name_in_extern_prelude(
537+
self.db,
537538
&import
538539
.path
539540
.as_ident()

crates/hir_def/src/nameres/path_resolution.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,26 @@ impl ResolvePathResult {
6060
}
6161

6262
impl DefMap {
63-
pub(super) fn resolve_name_in_extern_prelude(&self, name: &Name) -> PerNs {
63+
pub(super) fn resolve_name_in_extern_prelude(
64+
&self,
65+
db: &dyn DefDatabase,
66+
name: &Name,
67+
) -> PerNs {
6468
if name == &name!(self) {
6569
cov_mark::hit!(extern_crate_self_as);
6670
return PerNs::types(self.module_id(self.root).into(), Visibility::Public);
6771
}
68-
self.extern_prelude
72+
73+
let arc;
74+
let root = match self.block {
75+
Some(_) => {
76+
arc = self.crate_root(db).def_map(db);
77+
&*arc
78+
}
79+
None => self,
80+
};
81+
82+
root.extern_prelude
6983
.get(name)
7084
.map_or(PerNs::none(), |&it| PerNs::types(it, Visibility::Public))
7185
}
@@ -191,7 +205,7 @@ impl DefMap {
191205
None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
192206
};
193207
log::debug!("resolving {:?} in crate root (+ extern prelude)", segment);
194-
self.resolve_name_in_crate_root_or_extern_prelude(&segment)
208+
self.resolve_name_in_crate_root_or_extern_prelude(db, &segment)
195209
}
196210
PathKind::Plain => {
197211
let (_, segment) = match segments.next() {
@@ -394,9 +408,21 @@ impl DefMap {
394408
from_legacy_macro.or(from_scope_or_builtin).or(from_extern_prelude).or(from_prelude)
395409
}
396410

397-
fn resolve_name_in_crate_root_or_extern_prelude(&self, name: &Name) -> PerNs {
398-
let from_crate_root = self[self.root].scope.get(name);
399-
let from_extern_prelude = self.resolve_name_in_extern_prelude(name);
411+
fn resolve_name_in_crate_root_or_extern_prelude(
412+
&self,
413+
db: &dyn DefDatabase,
414+
name: &Name,
415+
) -> PerNs {
416+
let arc;
417+
let crate_def_map = match self.block {
418+
Some(_) => {
419+
arc = self.crate_root(db).def_map(db);
420+
&arc
421+
}
422+
None => self,
423+
};
424+
let from_crate_root = crate_def_map[crate_def_map.root].scope.get(name);
425+
let from_extern_prelude = self.resolve_name_in_extern_prelude(db, name);
400426

401427
from_crate_root.or(from_extern_prelude)
402428
}

crates/hir_ty/src/tests/traits.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3413,3 +3413,33 @@ fn foo() {
34133413
"#]],
34143414
);
34153415
}
3416+
3417+
#[test]
3418+
fn renamed_extern_crate_in_block() {
3419+
check_types(
3420+
r#"
3421+
//- /lib.rs crate:lib deps:serde
3422+
use serde::Deserialize;
3423+
3424+
struct Foo {}
3425+
3426+
const _ : () = {
3427+
extern crate serde as _serde;
3428+
impl _serde::Deserialize for Foo {
3429+
fn deserialize() -> u8 { 0 }
3430+
}
3431+
};
3432+
3433+
fn foo() {
3434+
Foo::deserialize();
3435+
//^^^^^^^^^^^^^^^^^^ u8
3436+
}
3437+
3438+
//- /serde.rs crate:serde
3439+
3440+
pub trait Deserialize {
3441+
fn deserialize() -> u8;
3442+
}
3443+
"#,
3444+
);
3445+
}

0 commit comments

Comments
 (0)