Skip to content

Commit baaae01

Browse files
committed
Make resolve_path a bit nicer
1 parent 699ce06 commit baaae01

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

crates/ra_hir/src/nameres.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -390,13 +390,14 @@ impl ItemMap {
390390
original_module: Module,
391391
path: &Path,
392392
) -> (PerNs<ModuleDef>, ReachedFixedPoint) {
393-
let mut segments = path.segments.iter().enumerate();
393+
let mut segments = path.segments.iter();
394+
// Handle crate/self/super, or the first segment
394395
let mut curr_per_ns: PerNs<ModuleDef> = match path.kind {
395396
PathKind::Crate => PerNs::types(original_module.crate_root(db).into()),
396397
PathKind::Self_ => PerNs::types(original_module.into()),
397398
PathKind::Plain => {
398399
let segment = match segments.next() {
399-
Some((_, segment)) => segment,
400+
Some(segment) => segment,
400401
None => return (PerNs::none(), ReachedFixedPoint::Yes),
401402
};
402403
// Resolve in:
@@ -424,19 +425,20 @@ impl ItemMap {
424425
PathKind::Abs => {
425426
// 2018-style absolute path -- only extern prelude
426427
let segment = match segments.next() {
427-
Some((_, segment)) => segment,
428+
Some(segment) => segment,
428429
None => return (PerNs::none(), ReachedFixedPoint::Yes),
429430
};
430431
if let Some(def) = self.extern_prelude.get(&segment.name) {
431432
log::debug!("absolute path {:?} resolved to crate {:?}", path, def);
432433
PerNs::types(*def)
433434
} else {
434-
return (PerNs::none(), ReachedFixedPoint::Yes);
435+
return (PerNs::none(), ReachedFixedPoint::No); // extern crate declarations can add to the extern prelude
435436
}
436437
}
437438
};
438439

439-
for (i, segment) in segments {
440+
// Go through the rest of the segments
441+
while let Some(segment) = segments.next() {
440442
let curr = match curr_per_ns.as_ref().take_types() {
441443
Some(r) => r,
442444
None => {
@@ -454,7 +456,7 @@ impl ItemMap {
454456
ModuleDef::Module(module) => {
455457
if module.krate != original_module.krate {
456458
let path = Path {
457-
segments: path.segments[i..].iter().cloned().collect(),
459+
segments: segments.cloned().collect(),
458460
kind: PathKind::Self_,
459461
};
460462
log::debug!("resolving {:?} in other crate", path);

0 commit comments

Comments
 (0)