mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 13:25:09 +00:00
Refactor/simplify path resolution
This commit is contained in:
parent
fa43ef30f4
commit
573f6f8656
1 changed files with 34 additions and 32 deletions
|
@ -147,41 +147,43 @@ impl Module {
|
||||||
.def_id,
|
.def_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
let segments = &path.segments;
|
for name in path.segments.iter() {
|
||||||
for (idx, name) in segments.iter().enumerate() {
|
let curr = match curr_per_ns.as_ref().take_types() {
|
||||||
let curr = if let Some(r) = curr_per_ns.as_ref().take_types() {
|
Some(r) => r,
|
||||||
r
|
None => {
|
||||||
} else {
|
// we still have path segments left, but the path so far
|
||||||
return PerNs::none();
|
// didn't resolve in the types namespace => no resolution
|
||||||
|
// (don't break here because curr_per_ns might contain
|
||||||
|
// something in the value namespace, and it would be wrong
|
||||||
|
// to return that)
|
||||||
|
return PerNs::none();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
let module = match curr.resolve(db) {
|
// resolve segment in curr
|
||||||
Def::Module(it) => it,
|
curr_per_ns = match curr.resolve(db) {
|
||||||
Def::Enum(e) => {
|
Def::Module(m) => {
|
||||||
if segments.len() == idx + 1 {
|
let scope = m.scope(db);
|
||||||
// enum variant
|
match scope.get(&name) {
|
||||||
let matching_variant =
|
Some(r) => r.def_id,
|
||||||
e.variants(db).into_iter().find(|(n, _variant)| n == name);
|
None => PerNs::none(),
|
||||||
|
|
||||||
if let Some((_n, variant)) = matching_variant {
|
|
||||||
return PerNs::both(variant.def_id(), e.def_id());
|
|
||||||
} else {
|
|
||||||
return PerNs::none();
|
|
||||||
}
|
|
||||||
} else if segments.len() == idx {
|
|
||||||
// enum
|
|
||||||
return PerNs::types(e.def_id());
|
|
||||||
} else {
|
|
||||||
// malformed enum?
|
|
||||||
return PerNs::none();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => return PerNs::none(),
|
Def::Enum(e) => {
|
||||||
};
|
// enum variant
|
||||||
let scope = module.scope(db);
|
let matching_variant =
|
||||||
curr_per_ns = if let Some(r) = scope.get(&name) {
|
e.variants(db).into_iter().find(|(n, _variant)| n == name);
|
||||||
r.def_id
|
|
||||||
} else {
|
match matching_variant {
|
||||||
return PerNs::none();
|
Some((_n, variant)) => PerNs::both(variant.def_id(), e.def_id()),
|
||||||
|
None => PerNs::none(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
// could be an inherent method call in UFCS form
|
||||||
|
// (`Struct::method`), or some other kind of associated
|
||||||
|
// item... Which we currently don't handle (TODO)
|
||||||
|
PerNs::none()
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
curr_per_ns
|
curr_per_ns
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue