Refactor/simplify path resolution

This commit is contained in:
Florian Diebold 2019-01-13 20:26:14 +01:00
parent fa43ef30f4
commit 573f6f8656

View file

@ -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
// 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(); 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::Module(m) => {
let scope = m.scope(db);
match scope.get(&name) {
Some(r) => r.def_id,
None => PerNs::none(),
}
}
Def::Enum(e) => { Def::Enum(e) => {
if segments.len() == idx + 1 {
// enum variant // enum variant
let matching_variant = let matching_variant =
e.variants(db).into_iter().find(|(n, _variant)| n == name); e.variants(db).into_iter().find(|(n, _variant)| n == name);
if let Some((_n, variant)) = matching_variant { match matching_variant {
return PerNs::both(variant.def_id(), e.def_id()); Some((_n, variant)) => PerNs::both(variant.def_id(), e.def_id()),
} else { None => PerNs::none(),
return PerNs::none();
}
} else if segments.len() == idx {
// enum
return PerNs::types(e.def_id());
} else {
// malformed enum?
return PerNs::none();
} }
} }
_ => return PerNs::none(), _ => {
}; // could be an inherent method call in UFCS form
let scope = module.scope(db); // (`Struct::method`), or some other kind of associated
curr_per_ns = if let Some(r) = scope.get(&name) { // item... Which we currently don't handle (TODO)
r.def_id PerNs::none()
} else { }
return PerNs::none();
}; };
} }
curr_per_ns curr_per_ns