aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model_impl
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-01-13 19:26:14 +0000
committerFlorian Diebold <[email protected]>2019-01-19 13:48:07 +0000
commit573f6f86561927c3694578dec6c643cc5612c148 (patch)
tree82ee83a50c4834419009e79a83a7187d7d7618a8 /crates/ra_hir/src/code_model_impl
parentfa43ef30f4f96fc8e4ea1f9c4492bcb07b3335ca (diff)
Refactor/simplify path resolution
Diffstat (limited to 'crates/ra_hir/src/code_model_impl')
-rw-r--r--crates/ra_hir/src/code_model_impl/module.rs64
1 files changed, 33 insertions, 31 deletions
diff --git a/crates/ra_hir/src/code_model_impl/module.rs b/crates/ra_hir/src/code_model_impl/module.rs
index e5394d440..7215236f9 100644
--- a/crates/ra_hir/src/code_model_impl/module.rs
+++ b/crates/ra_hir/src/code_model_impl/module.rs
@@ -147,41 +147,43 @@ impl Module {
147 .def_id, 147 .def_id,
148 ); 148 );
149 149
150 let segments = &path.segments; 150 for name in path.segments.iter() {
151 for (idx, name) in segments.iter().enumerate() { 151 let curr = match curr_per_ns.as_ref().take_types() {
152 let curr = if let Some(r) = curr_per_ns.as_ref().take_types() { 152 Some(r) => r,
153 r 153 None => {
154 } else { 154 // we still have path segments left, but the path so far
155 return PerNs::none(); 155 // didn't resolve in the types namespace => no resolution
156 // (don't break here because curr_per_ns might contain
157 // something in the value namespace, and it would be wrong
158 // to return that)
159 return PerNs::none();
160 }
156 }; 161 };
157 let module = match curr.resolve(db) { 162 // resolve segment in curr
158 Def::Module(it) => it, 163 curr_per_ns = match curr.resolve(db) {
164 Def::Module(m) => {
165 let scope = m.scope(db);
166 match scope.get(&name) {
167 Some(r) => r.def_id,
168 None => PerNs::none(),
169 }
170 }
159 Def::Enum(e) => { 171 Def::Enum(e) => {
160 if segments.len() == idx + 1 { 172 // enum variant
161 // enum variant 173 let matching_variant =
162 let matching_variant = 174 e.variants(db).into_iter().find(|(n, _variant)| n == name);
163 e.variants(db).into_iter().find(|(n, _variant)| n == name); 175
164 176 match matching_variant {
165 if let Some((_n, variant)) = matching_variant { 177 Some((_n, variant)) => PerNs::both(variant.def_id(), e.def_id()),
166 return PerNs::both(variant.def_id(), e.def_id()); 178 None => PerNs::none(),
167 } else {
168 return PerNs::none();
169 }
170 } else if segments.len() == idx {
171 // enum
172 return PerNs::types(e.def_id());
173 } else {
174 // malformed enum?
175 return PerNs::none();
176 } 179 }
177 } 180 }
178 _ => return PerNs::none(), 181 _ => {
179 }; 182 // could be an inherent method call in UFCS form
180 let scope = module.scope(db); 183 // (`Struct::method`), or some other kind of associated
181 curr_per_ns = if let Some(r) = scope.get(&name) { 184 // item... Which we currently don't handle (TODO)
182 r.def_id 185 PerNs::none()
183 } else { 186 }
184 return PerNs::none();
185 }; 187 };
186 } 188 }
187 curr_per_ns 189 curr_per_ns