Process macro_use
prelude in semantic scope resolver
This commit is contained in:
parent
2f8cd66fb4
commit
68a74decb6
@ -183,7 +183,7 @@ fn find_path_for_module(
|
|||||||
|
|
||||||
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
|
// - if the item is the crate root of a dependency crate, return the name from the extern prelude
|
||||||
let root_def_map = crate_root.def_map(db);
|
let root_def_map = crate_root.def_map(db);
|
||||||
for (name, &def_id) in root_def_map.extern_prelude() {
|
for (name, def_id) in root_def_map.extern_prelude() {
|
||||||
if module_id == def_id {
|
if module_id == def_id {
|
||||||
let name = scope_name.unwrap_or_else(|| name.clone());
|
let name = scope_name.unwrap_or_else(|| name.clone());
|
||||||
|
|
||||||
|
@ -355,8 +355,12 @@ pub(crate) fn prelude(&self) -> Option<ModuleId> {
|
|||||||
self.prelude
|
self.prelude
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn extern_prelude(&self) -> impl Iterator<Item = (&Name, &ModuleId)> + '_ {
|
pub(crate) fn extern_prelude(&self) -> impl Iterator<Item = (&Name, ModuleId)> + '_ {
|
||||||
self.extern_prelude.iter()
|
self.extern_prelude.iter().map(|(name, def)| (name, *def))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn macro_use_prelude(&self) -> impl Iterator<Item = (&Name, MacroId)> + '_ {
|
||||||
|
self.macro_use_prelude.iter().map(|(name, def)| (name, *def))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn module_id(&self, local_id: LocalModuleId) -> ModuleId {
|
pub fn module_id(&self, local_id: LocalModuleId) -> ModuleId {
|
||||||
|
@ -461,7 +461,10 @@ pub fn names_in_scope(
|
|||||||
res.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)));
|
res.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)));
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
def_map.extern_prelude().for_each(|(name, &def)| {
|
def_map.macro_use_prelude().for_each(|(name, def)| {
|
||||||
|
res.add(name, ScopeDef::ModuleDef(def.into()));
|
||||||
|
});
|
||||||
|
def_map.extern_prelude().for_each(|(name, def)| {
|
||||||
res.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
|
res.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
|
||||||
});
|
});
|
||||||
BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
|
BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
|
||||||
|
@ -1265,3 +1265,24 @@ macro_rules! define_struct {
|
|||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn macro_use_prelude_is_in_scope() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
//- /main.rs crate:main deps:dep
|
||||||
|
#[macro_use]
|
||||||
|
extern crate dep;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
print$0
|
||||||
|
}
|
||||||
|
//- /lib.rs crate:dep
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! println {
|
||||||
|
() => {}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![""],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user