mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 06:03:58 +00:00
Auto merge of #17660 - ObsidianMinor:fix/17645, r=Veykril
Fix more path resolution for included submodules Now with more comprehensive testing! This adds tests for includes within modules. Previous testing was not comprehensive enough since submodules that use `include!` didn't actually work either! The `ModDir` used for resolving mods relative to included files has to be `ModDir::root()`. The original test just so happened to put the submodules in the root which made this work, but if you put the `include!` inside a `mod` block it didn't work. With this change, when collecting a macro expansion, if the macro call is an `include!`, we use the `ModDir::root()` instead of the current module we're in.
This commit is contained in:
commit
232e55515f
2 changed files with 71 additions and 1 deletions
|
@ -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,
|
||||
|
|
|
@ -1355,6 +1355,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(
|
||||
|
|
Loading…
Reference in a new issue