diff options
author | Jonas Schievink <[email protected]> | 2021-03-22 17:47:19 +0000 |
---|---|---|
committer | Jonas Schievink <[email protected]> | 2021-03-22 17:55:51 +0000 |
commit | 2633e23f2bf0649031b887309cda1fecae063084 (patch) | |
tree | 5c00f2d3ece6379df2e155e17864d8151c50c55a | |
parent | 94aa3a7b1af7b756139e6c2d8384beb57daa6190 (diff) |
resolver: manually traverse nested block scopes
-rw-r--r-- | crates/hir_def/src/nameres.rs | 17 | ||||
-rw-r--r-- | crates/hir_def/src/nameres/path_resolution.rs | 2 | ||||
-rw-r--r-- | crates/hir_def/src/resolver.rs | 18 | ||||
-rw-r--r-- | crates/hir_ty/src/tests/regression.rs | 13 |
4 files changed, 45 insertions, 5 deletions
diff --git a/crates/hir_def/src/nameres.rs b/crates/hir_def/src/nameres.rs index 0d3a0b54f..9e8e4e9ec 100644 --- a/crates/hir_def/src/nameres.rs +++ b/crates/hir_def/src/nameres.rs | |||
@@ -322,6 +322,23 @@ impl DefMap { | |||
322 | (res.resolved_def, res.segment_index) | 322 | (res.resolved_def, res.segment_index) |
323 | } | 323 | } |
324 | 324 | ||
325 | pub(crate) fn resolve_path_locally( | ||
326 | &self, | ||
327 | db: &dyn DefDatabase, | ||
328 | original_module: LocalModuleId, | ||
329 | path: &ModPath, | ||
330 | shadow: BuiltinShadowMode, | ||
331 | ) -> (PerNs, Option<usize>) { | ||
332 | let res = self.resolve_path_fp_with_macro_single( | ||
333 | db, | ||
334 | ResolveMode::Other, | ||
335 | original_module, | ||
336 | path, | ||
337 | shadow, | ||
338 | ); | ||
339 | (res.resolved_def, res.segment_index) | ||
340 | } | ||
341 | |||
325 | /// Ascends the `DefMap` hierarchy and calls `f` with every `DefMap` and containing module. | 342 | /// Ascends the `DefMap` hierarchy and calls `f` with every `DefMap` and containing module. |
326 | /// | 343 | /// |
327 | /// If `f` returns `Some(val)`, iteration is stopped and `Some(val)` is returned. If `f` returns | 344 | /// If `f` returns `Some(val)`, iteration is stopped and `Some(val)` is returned. If `f` returns |
diff --git a/crates/hir_def/src/nameres/path_resolution.rs b/crates/hir_def/src/nameres/path_resolution.rs index db459b1ed..60471937c 100644 --- a/crates/hir_def/src/nameres/path_resolution.rs +++ b/crates/hir_def/src/nameres/path_resolution.rs | |||
@@ -156,7 +156,7 @@ impl DefMap { | |||
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
159 | fn resolve_path_fp_with_macro_single( | 159 | pub(super) fn resolve_path_fp_with_macro_single( |
160 | &self, | 160 | &self, |
161 | db: &dyn DefDatabase, | 161 | db: &dyn DefDatabase, |
162 | mode: ResolveMode, | 162 | mode: ResolveMode, |
diff --git a/crates/hir_def/src/resolver.rs b/crates/hir_def/src/resolver.rs index 04ea9c5d7..a73585ee7 100644 --- a/crates/hir_def/src/resolver.rs +++ b/crates/hir_def/src/resolver.rs | |||
@@ -548,7 +548,7 @@ impl ModuleItemMap { | |||
548 | path: &ModPath, | 548 | path: &ModPath, |
549 | ) -> Option<ResolveValueResult> { | 549 | ) -> Option<ResolveValueResult> { |
550 | let (module_def, idx) = | 550 | let (module_def, idx) = |
551 | self.def_map.resolve_path(db, self.module_id, &path, BuiltinShadowMode::Other); | 551 | self.def_map.resolve_path_locally(db, self.module_id, &path, BuiltinShadowMode::Other); |
552 | match idx { | 552 | match idx { |
553 | None => { | 553 | None => { |
554 | let value = to_value_ns(module_def)?; | 554 | let value = to_value_ns(module_def)?; |
@@ -578,7 +578,7 @@ impl ModuleItemMap { | |||
578 | path: &ModPath, | 578 | path: &ModPath, |
579 | ) -> Option<(TypeNs, Option<usize>)> { | 579 | ) -> Option<(TypeNs, Option<usize>)> { |
580 | let (module_def, idx) = | 580 | let (module_def, idx) = |
581 | self.def_map.resolve_path(db, self.module_id, &path, BuiltinShadowMode::Other); | 581 | self.def_map.resolve_path_locally(db, self.module_id, &path, BuiltinShadowMode::Other); |
582 | let res = to_type_ns(module_def)?; | 582 | let res = to_type_ns(module_def)?; |
583 | Some((res, idx)) | 583 | Some((res, idx)) |
584 | } | 584 | } |
@@ -627,8 +627,18 @@ pub trait HasResolver: Copy { | |||
627 | 627 | ||
628 | impl HasResolver for ModuleId { | 628 | impl HasResolver for ModuleId { |
629 | fn resolver(self, db: &dyn DefDatabase) -> Resolver { | 629 | fn resolver(self, db: &dyn DefDatabase) -> Resolver { |
630 | let def_map = self.def_map(db); | 630 | let mut def_map = self.def_map(db); |
631 | Resolver::default().push_module_scope(def_map, self.local_id) | 631 | let mut modules = Vec::new(); |
632 | modules.push((def_map.clone(), self.local_id)); | ||
633 | while let Some(parent) = def_map.parent() { | ||
634 | def_map = parent.def_map(db); | ||
635 | modules.push((def_map.clone(), parent.local_id)); | ||
636 | } | ||
637 | let mut resolver = Resolver::default(); | ||
638 | for (def_map, module) in modules.into_iter().rev() { | ||
639 | resolver = resolver.push_module_scope(def_map, module); | ||
640 | } | ||
641 | resolver | ||
632 | } | 642 | } |
633 | } | 643 | } |
634 | 644 | ||
diff --git a/crates/hir_ty/src/tests/regression.rs b/crates/hir_ty/src/tests/regression.rs index 69314e245..b69f86050 100644 --- a/crates/hir_ty/src/tests/regression.rs +++ b/crates/hir_ty/src/tests/regression.rs | |||
@@ -961,3 +961,16 @@ fn issue_6852() { | |||
961 | "#]], | 961 | "#]], |
962 | ); | 962 | ); |
963 | } | 963 | } |
964 | |||
965 | #[test] | ||
966 | fn param_overrides_fn() { | ||
967 | check_types( | ||
968 | r#" | ||
969 | fn example(example: i32) { | ||
970 | fn f() {} | ||
971 | example; | ||
972 | //^^^^^^^ i32 | ||
973 | } | ||
974 | "#, | ||
975 | ) | ||
976 | } | ||