about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2021-02-02 12:25:13 +0100
committerJonas Schievink <jonasschievink@gmail.com>2021-02-02 12:36:38 +0100
commitcd9659ffcee35ade2148162a9b77f8d74656d43e (patch)
treed5cbb565fbcdb5378ab4dbc4cf885933eb39eedd
parent157156276b32c4edca337e6389dc70a203c7c681 (diff)
downloadrust-cd9659ffcee35ade2148162a9b77f8d74656d43e.tar.gz
rust-cd9659ffcee35ade2148162a9b77f8d74656d43e.zip
Use the right `DefMap` when looking up modules
-rw-r--r--crates/hir_def/src/nameres.rs4
-rw-r--r--crates/hir_def/src/nameres/collector.rs8
-rw-r--r--crates/hir_def/src/nameres/path_resolution.rs10
3 files changed, 20 insertions, 2 deletions
diff --git a/crates/hir_def/src/nameres.rs b/crates/hir_def/src/nameres.rs
index 6169b3bbcbd..5efc2fe470a 100644
--- a/crates/hir_def/src/nameres.rs
+++ b/crates/hir_def/src/nameres.rs
@@ -258,6 +258,10 @@ impl DefMap {
         self.krate
     }
 
+    pub(crate) fn block_id(&self) -> Option<BlockId> {
+        self.block.as_ref().map(|block| block.block)
+    }
+
     pub(crate) fn prelude(&self) -> Option<ModuleId> {
         self.prelude
     }
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs
index fcc8e2607ea..6e86cc4a7ab 100644
--- a/crates/hir_def/src/nameres/collector.rs
+++ b/crates/hir_def/src/nameres/collector.rs
@@ -592,7 +592,13 @@ impl DefCollector<'_> {
                         // glob import from same crate => we do an initial
                         // import, and then need to propagate any further
                         // additions
-                        let scope = &self.def_map[m.local_id].scope;
+                        let def_map;
+                        let scope = if m.block == self.def_map.block_id() {
+                            &self.def_map[m.local_id].scope
+                        } else {
+                            def_map = m.def_map(self.db);
+                            &def_map[m.local_id].scope
+                        };
 
                         // Module scoped macros is included
                         let items = scope
diff --git a/crates/hir_def/src/nameres/path_resolution.rs b/crates/hir_def/src/nameres/path_resolution.rs
index 2a0f8ec2bc8..2d1477160e4 100644
--- a/crates/hir_def/src/nameres/path_resolution.rs
+++ b/crates/hir_def/src/nameres/path_resolution.rs
@@ -271,8 +271,16 @@ impl DefMap {
                         );
                     }
 
+                    let def_map;
+                    let module_data = if module.block == self.block_id() {
+                        &self[module.local_id]
+                    } else {
+                        def_map = module.def_map(db);
+                        &def_map[module.local_id]
+                    };
+
                     // Since it is a qualified path here, it should not contains legacy macros
-                    self[module.local_id].scope.get(&segment)
+                    module_data.scope.get(&segment)
                 }
                 ModuleDefId::AdtId(AdtId::EnumId(e)) => {
                     // enum variant