diff options
Diffstat (limited to 'crates/ra_hir_def/src/resolver.rs')
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 103 |
1 files changed, 72 insertions, 31 deletions
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index e70049617..cf3c33d78 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -10,6 +10,7 @@ use rustc_hash::FxHashSet; | |||
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | body::scope::{ExprScopes, ScopeId}, | 12 | body::scope::{ExprScopes, ScopeId}, |
13 | body::Body, | ||
13 | builtin_type::BuiltinType, | 14 | builtin_type::BuiltinType, |
14 | db::DefDatabase, | 15 | db::DefDatabase, |
15 | expr::{ExprId, PatId}, | 16 | expr::{ExprId, PatId}, |
@@ -55,6 +56,8 @@ enum Scope { | |||
55 | AdtScope(AdtId), | 56 | AdtScope(AdtId), |
56 | /// Local bindings | 57 | /// Local bindings |
57 | ExprScope(ExprScope), | 58 | ExprScope(ExprScope), |
59 | /// Temporary hack to support local items. | ||
60 | LocalItemsScope(Arc<Body>), | ||
58 | } | 61 | } |
59 | 62 | ||
60 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 63 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
@@ -149,7 +152,13 @@ impl Resolver { | |||
149 | for scope in self.scopes.iter().rev() { | 152 | for scope in self.scopes.iter().rev() { |
150 | match scope { | 153 | match scope { |
151 | Scope::ExprScope(_) => continue, | 154 | Scope::ExprScope(_) => continue, |
152 | Scope::GenericParams { .. } | Scope::ImplBlockScope(_) if skip_to_mod => continue, | 155 | Scope::GenericParams { .. } |
156 | | Scope::ImplBlockScope(_) | ||
157 | | Scope::LocalItemsScope(_) | ||
158 | if skip_to_mod => | ||
159 | { | ||
160 | continue | ||
161 | } | ||
153 | 162 | ||
154 | Scope::GenericParams { params, def } => { | 163 | Scope::GenericParams { params, def } => { |
155 | if let Some(local_id) = params.find_by_name(first_name) { | 164 | if let Some(local_id) = params.find_by_name(first_name) { |
@@ -179,25 +188,35 @@ impl Resolver { | |||
179 | &path, | 188 | &path, |
180 | BuiltinShadowMode::Other, | 189 | BuiltinShadowMode::Other, |
181 | ); | 190 | ); |
182 | let res = match module_def.take_types()? { | 191 | let res = to_type_ns(module_def)?; |
183 | ModuleDefId::AdtId(it) => TypeNs::AdtId(it), | ||
184 | ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it), | ||
185 | |||
186 | ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it), | ||
187 | ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it), | ||
188 | |||
189 | ModuleDefId::TraitId(it) => TypeNs::TraitId(it), | ||
190 | |||
191 | ModuleDefId::FunctionId(_) | ||
192 | | ModuleDefId::ConstId(_) | ||
193 | | ModuleDefId::StaticId(_) | ||
194 | | ModuleDefId::ModuleId(_) => return None, | ||
195 | }; | ||
196 | return Some((res, idx)); | 192 | return Some((res, idx)); |
197 | } | 193 | } |
194 | Scope::LocalItemsScope(body) => { | ||
195 | let def = body.item_scope.get(first_name, BuiltinShadowMode::Other); | ||
196 | if let Some(res) = to_type_ns(def) { | ||
197 | return Some((res, None)); | ||
198 | } | ||
199 | } | ||
198 | } | 200 | } |
199 | } | 201 | } |
200 | None | 202 | return None; |
203 | fn to_type_ns(per_ns: PerNs) -> Option<TypeNs> { | ||
204 | let res = match per_ns.take_types()? { | ||
205 | ModuleDefId::AdtId(it) => TypeNs::AdtId(it), | ||
206 | ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it), | ||
207 | |||
208 | ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it), | ||
209 | ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it), | ||
210 | |||
211 | ModuleDefId::TraitId(it) => TypeNs::TraitId(it), | ||
212 | |||
213 | ModuleDefId::FunctionId(_) | ||
214 | | ModuleDefId::ConstId(_) | ||
215 | | ModuleDefId::StaticId(_) | ||
216 | | ModuleDefId::ModuleId(_) => return None, | ||
217 | }; | ||
218 | Some(res) | ||
219 | } | ||
201 | } | 220 | } |
202 | 221 | ||
203 | pub fn resolve_path_in_type_ns_fully( | 222 | pub fn resolve_path_in_type_ns_fully( |
@@ -227,6 +246,7 @@ impl Resolver { | |||
227 | | Scope::ExprScope(_) | 246 | | Scope::ExprScope(_) |
228 | | Scope::GenericParams { .. } | 247 | | Scope::GenericParams { .. } |
229 | | Scope::ImplBlockScope(_) | 248 | | Scope::ImplBlockScope(_) |
249 | | Scope::LocalItemsScope(_) | ||
230 | if skip_to_mod => | 250 | if skip_to_mod => |
231 | { | 251 | { |
232 | continue | 252 | continue |
@@ -276,20 +296,7 @@ impl Resolver { | |||
276 | ); | 296 | ); |
277 | return match idx { | 297 | return match idx { |
278 | None => { | 298 | None => { |
279 | let value = match module_def.take_values()? { | 299 | let value = to_value_ns(module_def)?; |
280 | ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it), | ||
281 | ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it), | ||
282 | ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it), | ||
283 | ModuleDefId::ConstId(it) => ValueNs::ConstId(it), | ||
284 | ModuleDefId::StaticId(it) => ValueNs::StaticId(it), | ||
285 | |||
286 | ModuleDefId::AdtId(AdtId::EnumId(_)) | ||
287 | | ModuleDefId::AdtId(AdtId::UnionId(_)) | ||
288 | | ModuleDefId::TraitId(_) | ||
289 | | ModuleDefId::TypeAliasId(_) | ||
290 | | ModuleDefId::BuiltinType(_) | ||
291 | | ModuleDefId::ModuleId(_) => return None, | ||
292 | }; | ||
293 | Some(ResolveValueResult::ValueNs(value)) | 300 | Some(ResolveValueResult::ValueNs(value)) |
294 | } | 301 | } |
295 | Some(idx) => { | 302 | Some(idx) => { |
@@ -309,9 +316,33 @@ impl Resolver { | |||
309 | } | 316 | } |
310 | }; | 317 | }; |
311 | } | 318 | } |
319 | Scope::LocalItemsScope(body) => { | ||
320 | let def = body.item_scope.get(first_name, BuiltinShadowMode::Other); | ||
321 | if let Some(res) = to_value_ns(def) { | ||
322 | return Some(ResolveValueResult::ValueNs(res)); | ||
323 | } | ||
324 | } | ||
312 | } | 325 | } |
313 | } | 326 | } |
314 | None | 327 | return None; |
328 | |||
329 | fn to_value_ns(per_ns: PerNs) -> Option<ValueNs> { | ||
330 | let res = match per_ns.take_values()? { | ||
331 | ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it), | ||
332 | ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it), | ||
333 | ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it), | ||
334 | ModuleDefId::ConstId(it) => ValueNs::ConstId(it), | ||
335 | ModuleDefId::StaticId(it) => ValueNs::StaticId(it), | ||
336 | |||
337 | ModuleDefId::AdtId(AdtId::EnumId(_)) | ||
338 | | ModuleDefId::AdtId(AdtId::UnionId(_)) | ||
339 | | ModuleDefId::TraitId(_) | ||
340 | | ModuleDefId::TypeAliasId(_) | ||
341 | | ModuleDefId::BuiltinType(_) | ||
342 | | ModuleDefId::ModuleId(_) => return None, | ||
343 | }; | ||
344 | Some(res) | ||
345 | } | ||
315 | } | 346 | } |
316 | 347 | ||
317 | pub fn resolve_path_in_value_ns_fully( | 348 | pub fn resolve_path_in_value_ns_fully( |
@@ -429,6 +460,11 @@ impl Scope { | |||
429 | }); | 460 | }); |
430 | } | 461 | } |
431 | } | 462 | } |
463 | Scope::LocalItemsScope(body) => { | ||
464 | body.item_scope.entries_without_primitives().for_each(|(name, def)| { | ||
465 | f(name.clone(), ScopeDef::PerNs(def)); | ||
466 | }) | ||
467 | } | ||
432 | Scope::GenericParams { params, def } => { | 468 | Scope::GenericParams { params, def } => { |
433 | for (local_id, param) in params.types.iter() { | 469 | for (local_id, param) in params.types.iter() { |
434 | f( | 470 | f( |
@@ -464,6 +500,7 @@ pub fn resolver_for_scope( | |||
464 | scope_id: Option<ScopeId>, | 500 | scope_id: Option<ScopeId>, |
465 | ) -> Resolver { | 501 | ) -> Resolver { |
466 | let mut r = owner.resolver(db); | 502 | let mut r = owner.resolver(db); |
503 | r = r.push_local_items_scope(db.body(owner)); | ||
467 | let scopes = db.expr_scopes(owner); | 504 | let scopes = db.expr_scopes(owner); |
468 | let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); | 505 | let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); |
469 | for scope in scope_chain.into_iter().rev() { | 506 | for scope in scope_chain.into_iter().rev() { |
@@ -499,6 +536,10 @@ impl Resolver { | |||
499 | self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) | 536 | self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) |
500 | } | 537 | } |
501 | 538 | ||
539 | fn push_local_items_scope(self, body: Arc<Body>) -> Resolver { | ||
540 | self.push_scope(Scope::LocalItemsScope(body)) | ||
541 | } | ||
542 | |||
502 | fn push_expr_scope( | 543 | fn push_expr_scope( |
503 | self, | 544 | self, |
504 | owner: DefWithBodyId, | 545 | owner: DefWithBodyId, |