Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/nameres/collector.rs8
-rw-r--r--crates/hir-def/src/nameres/tests/macros.rs64
2 files changed, 71 insertions, 1 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 4b35c1ae71..58aca96429 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -16,6 +16,7 @@ use hir_expand::{
name::{AsName, Name},
proc_macro::CustomProcMacroExpander,
ExpandTo, HirFileId, InFile, MacroCallId, MacroCallKind, MacroDefId, MacroDefKind,
+ MacroFileIdExt,
};
use intern::{sym, Interned};
use itertools::{izip, Itertools};
@@ -1397,7 +1398,12 @@ impl DefCollector<'_> {
// Then, fetch and process the item tree. This will reuse the expansion result from above.
let item_tree = self.db.file_item_tree(file_id);
- let mod_dir = self.mod_dirs[&module_id].clone();
+ let mod_dir = if macro_call_id.as_macro_file().is_include_macro(self.db.upcast()) {
+ ModDir::root()
+ } else {
+ self.mod_dirs[&module_id].clone()
+ };
+
ModCollector {
def_collector: &mut *self,
macro_depth: depth,
diff --git a/crates/hir-def/src/nameres/tests/macros.rs b/crates/hir-def/src/nameres/tests/macros.rs
index 9f67d6fa8b..390c934f6d 100644
--- a/crates/hir-def/src/nameres/tests/macros.rs
+++ b/crates/hir-def/src/nameres/tests/macros.rs
@@ -1356,6 +1356,70 @@ pub mod ip_address {
}
#[test]
+fn include_many_mods() {
+ check(
+ r#"
+//- /lib.rs
+#[rustc_builtin_macro]
+macro_rules! include { () => {} }
+
+mod nested {
+ include!("out_dir/includes.rs");
+
+ mod different_company {
+ include!("out_dir/different_company/mod.rs");
+ }
+
+ mod util;
+}
+
+//- /nested/util.rs
+pub struct Helper {}
+//- /out_dir/includes.rs
+pub mod company_name {
+ pub mod network {
+ pub mod v1;
+ }
+}
+//- /out_dir/company_name/network/v1.rs
+pub struct IpAddress {}
+//- /out_dir/different_company/mod.rs
+pub mod network;
+//- /out_dir/different_company/network.rs
+pub struct Url {}
+
+"#,
+ expect![[r#"
+ crate
+ nested: t
+
+ crate::nested
+ company_name: t
+ different_company: t
+ util: t
+
+ crate::nested::company_name
+ network: t
+
+ crate::nested::company_name::network
+ v1: t
+
+ crate::nested::company_name::network::v1
+ IpAddress: t
+
+ crate::nested::different_company
+ network: t
+
+ crate::nested::different_company::network
+ Url: t
+
+ crate::nested::util
+ Helper: t
+ "#]],
+ );
+}
+
+#[test]
fn macro_use_imports_all_macro_types() {
let db = TestDB::with_files(
r#"