Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/path_resolution.rs')
-rw-r--r--crates/hir-def/src/nameres/path_resolution.rs43
1 files changed, 27 insertions, 16 deletions
diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs
index 1e13f7f8fd..9e53b03728 100644
--- a/crates/hir-def/src/nameres/path_resolution.rs
+++ b/crates/hir-def/src/nameres/path_resolution.rs
@@ -22,7 +22,7 @@ use crate::{
path::{ModPath, PathKind},
per_ns::PerNs,
visibility::{RawVisibility, Visibility},
- AdtId, CrateId, LocalModuleId, ModuleDefId,
+ AdtId, LocalModuleId, ModuleDefId,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -42,21 +42,21 @@ pub(super) struct ResolvePathResult {
pub(super) resolved_def: PerNs,
pub(super) segment_index: Option<usize>,
pub(super) reached_fixedpoint: ReachedFixedPoint,
- pub(super) krate: Option<CrateId>,
+ pub(super) from_differing_crate: bool,
}
impl ResolvePathResult {
fn empty(reached_fixedpoint: ReachedFixedPoint) -> ResolvePathResult {
- ResolvePathResult::with(PerNs::none(), reached_fixedpoint, None, None)
+ ResolvePathResult::new(PerNs::none(), reached_fixedpoint, None, false)
}
- fn with(
+ fn new(
resolved_def: PerNs,
reached_fixedpoint: ReachedFixedPoint,
segment_index: Option<usize>,
- krate: Option<CrateId>,
+ from_differing_crate: bool,
) -> ResolvePathResult {
- ResolvePathResult { resolved_def, segment_index, reached_fixedpoint, krate }
+ ResolvePathResult { resolved_def, segment_index, reached_fixedpoint, from_differing_crate }
}
}
@@ -134,7 +134,19 @@ impl DefMap {
// resolving them to. Pass `None` otherwise, e.g. when we're resolving import paths.
expected_macro_subns: Option<MacroSubNs>,
) -> ResolvePathResult {
- let mut result = ResolvePathResult::empty(ReachedFixedPoint::No);
+ let mut result = self.resolve_path_fp_with_macro_single(
+ db,
+ mode,
+ original_module,
+ path,
+ shadow,
+ expected_macro_subns,
+ );
+
+ if self.block.is_none() {
+ // If we're in the root `DefMap`, we can resolve the path directly.
+ return result;
+ }
let mut arc;
let mut current_map = self;
@@ -153,8 +165,7 @@ impl DefMap {
if result.reached_fixedpoint == ReachedFixedPoint::No {
result.reached_fixedpoint = new.reached_fixedpoint;
}
- // FIXME: this doesn't seem right; what if the different namespace resolutions come from different crates?
- result.krate = result.krate.or(new.krate);
+ result.from_differing_crate |= new.from_differing_crate;
result.segment_index = match (result.segment_index, new.segment_index) {
(Some(idx), None) => Some(idx),
(Some(old), Some(new)) => Some(old.max(new)),
@@ -333,11 +344,11 @@ impl DefMap {
// expectation is discarded.
let (def, s) =
defp_map.resolve_path(db, module.local_id, &path, shadow, None);
- return ResolvePathResult::with(
+ return ResolvePathResult::new(
def,
ReachedFixedPoint::Yes,
s.map(|s| s + i),
- Some(module.krate),
+ true,
);
}
@@ -385,11 +396,11 @@ impl DefMap {
match res {
Some(res) => res,
None => {
- return ResolvePathResult::with(
+ return ResolvePathResult::new(
PerNs::types(e.into(), vis, imp),
ReachedFixedPoint::Yes,
Some(i),
- Some(self.krate),
+ false,
)
}
}
@@ -403,11 +414,11 @@ impl DefMap {
curr,
);
- return ResolvePathResult::with(
+ return ResolvePathResult::new(
PerNs::types(s, vis, imp),
ReachedFixedPoint::Yes,
Some(i),
- Some(self.krate),
+ false,
);
}
};
@@ -416,7 +427,7 @@ impl DefMap {
.filter_visibility(|vis| vis.is_visible_from_def_map(db, self, original_module));
}
- ResolvePathResult::with(curr_per_ns, ReachedFixedPoint::Yes, None, Some(self.krate))
+ ResolvePathResult::new(curr_per_ns, ReachedFixedPoint::Yes, None, false)
}
fn resolve_name_in_module(