Skip to content

Commit 13c5468

Browse files
committed
Use index instead of peekable
1 parent 5f11117 commit 13c5468

File tree

1 file changed

+19
-35
lines changed

1 file changed

+19
-35
lines changed

crates/ra_hir_def/src/nameres/path_resolution.rs

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,16 @@ impl CrateDefMap {
7070
path: &Path,
7171
shadow: BuiltinShadowMode,
7272
) -> ResolvePathResult {
73-
let mut segments = path.segments.iter().enumerate().peekable();
73+
// if it is not the last segment, we prefer the module to the builtin
74+
let prefer_module = |index| {
75+
if index == path.segments.len() - 1 {
76+
shadow
77+
} else {
78+
BuiltinShadowMode::Module
79+
}
80+
};
81+
82+
let mut segments = path.segments.iter().enumerate();
7483

7584
let mut curr_per_ns: PerNs = match path.kind {
7685
PathKind::DollarCrate(krate) => {
@@ -98,29 +107,21 @@ impl CrateDefMap {
98107
if self.edition == Edition::Edition2015
99108
&& (path.kind == PathKind::Abs || mode == ResolveMode::Import) =>
100109
{
101-
let segment = match segments.next() {
102-
Some((_, segment)) => segment,
110+
let (idx, segment) = match segments.next() {
111+
Some((idx, segment)) => (idx, segment),
103112
None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
104113
};
105114
log::debug!("resolving {:?} in crate root (+ extern prelude)", segment);
106115

107-
self.resolve_name_in_crate_root_or_extern_prelude(
108-
&segment.name,
109-
prefer_module(&mut segments, shadow),
110-
)
116+
self.resolve_name_in_crate_root_or_extern_prelude(&segment.name, prefer_module(idx))
111117
}
112118
PathKind::Plain => {
113-
let segment = match segments.next() {
114-
Some((_, segment)) => segment,
119+
let (idx, segment) = match segments.next() {
120+
Some((idx, segment)) => (idx, segment),
115121
None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
116122
};
117123
log::debug!("resolving {:?} in module", segment);
118-
self.resolve_name_in_module(
119-
db,
120-
original_module,
121-
&segment.name,
122-
prefer_module(&mut segments, shadow),
123-
)
124+
self.resolve_name_in_module(db, original_module, &segment.name, prefer_module(idx))
124125
}
125126
PathKind::Super => {
126127
if let Some(p) = self.modules[original_module].parent {
@@ -150,7 +151,7 @@ impl CrateDefMap {
150151
}
151152
};
152153

153-
while let Some((i, segment)) = segments.next() {
154+
for (i, segment) in segments {
154155
let curr = match curr_per_ns.take_types() {
155156
Some(r) => r,
156157
None => {
@@ -180,10 +181,7 @@ impl CrateDefMap {
180181
}
181182

182183
// Since it is a qualified path here, it should not contains legacy macros
183-
match self[module.local_id]
184-
.scope
185-
.get(&segment.name, prefer_module(&mut segments, shadow))
186-
{
184+
match self[module.local_id].scope.get(&segment.name, prefer_module(i)) {
187185
Some(res) => res.def,
188186
_ => {
189187
log::debug!("path segment {:?} not found", segment.name);
@@ -226,22 +224,8 @@ impl CrateDefMap {
226224
}
227225
};
228226
}
229-
return ResolvePathResult::with(curr_per_ns, ReachedFixedPoint::Yes, None);
230227

231-
// if it is not the last segment, we prefer builtin as module
232-
fn prefer_module<I>(
233-
segments: &mut std::iter::Peekable<I>,
234-
shadow: BuiltinShadowMode,
235-
) -> BuiltinShadowMode
236-
where
237-
I: Iterator,
238-
{
239-
if segments.peek().is_some() {
240-
BuiltinShadowMode::Module
241-
} else {
242-
shadow
243-
}
244-
}
228+
ResolvePathResult::with(curr_per_ns, ReachedFixedPoint::Yes, None)
245229
}
246230

247231
fn resolve_name_in_module(

0 commit comments

Comments
 (0)