mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Merge #9700
9700: fix: Remove the legacy macro scoping hack r=matklad a=jonas-schievink This stops prepending `self::` to single-ident macro paths, resolving even legacy-scoped macros using the fixed-point algorithm. This is not correct, but a lot easier than fixing this properly (which involves pushing a new scope for every macro definition and invocation). This allows resolution of macros from the prelude, fixing https://github.com/rust-analyzer/rust-analyzer/issues/9687. Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
commit
33dcc895c1
3 changed files with 29 additions and 7 deletions
|
@ -1890,7 +1890,7 @@ impl ModCollector<'_, '_> {
|
|||
}
|
||||
|
||||
fn collect_macro_call(&mut self, mac: &MacroCall) {
|
||||
let mut ast_id = AstIdWithPath::new(self.file_id(), mac.ast_id, (*mac.path).clone());
|
||||
let ast_id = AstIdWithPath::new(self.file_id(), mac.ast_id, (*mac.path).clone());
|
||||
|
||||
// Case 1: try to resolve in legacy scope and expand macro_rules
|
||||
let mut error = None;
|
||||
|
@ -1941,11 +1941,6 @@ impl ModCollector<'_, '_> {
|
|||
}
|
||||
|
||||
// Case 2: resolve in module scope, expand during name resolution.
|
||||
// We rewrite simple path `macro_name` to `self::macro_name` to force resolve in module scope only.
|
||||
if ast_id.path.is_ident() {
|
||||
ast_id.path.kind = PathKind::Super(0);
|
||||
}
|
||||
|
||||
self.def_collector.unresolved_macros.push(MacroDirective {
|
||||
module_id: self.module_id,
|
||||
depth: self.macro_depth + 1,
|
||||
|
|
|
@ -349,8 +349,10 @@ macro_rules! m {
|
|||
"#,
|
||||
expect![[r#"
|
||||
crate
|
||||
S: t v
|
||||
"#]],
|
||||
);
|
||||
// FIXME: should not expand. legacy macro scoping is not implemented.
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -427,6 +429,7 @@ macro_rules! baz {
|
|||
"#,
|
||||
expect![[r#"
|
||||
crate
|
||||
NotFoundBefore: t v
|
||||
Ok: t v
|
||||
OkAfter: t v
|
||||
OkShadowStop: t v
|
||||
|
@ -462,6 +465,7 @@ macro_rules! baz {
|
|||
crate::m3::m5
|
||||
"#]],
|
||||
);
|
||||
// FIXME: should not see `NotFoundBefore`
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -994,3 +998,26 @@ structs!(Foo);
|
|||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn macro_in_prelude() {
|
||||
check(
|
||||
r#"
|
||||
//- /lib.rs crate:lib deps:std
|
||||
global_asm!();
|
||||
|
||||
//- /std.rs crate:std
|
||||
pub mod prelude {
|
||||
pub mod rust_2018 {
|
||||
pub macro global_asm() {
|
||||
pub struct S;
|
||||
}
|
||||
}
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
crate
|
||||
S: t v
|
||||
"#]],
|
||||
)
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@ foo::bar!(92);
|
|||
macro_rules! m { () => {} }
|
||||
|
||||
m!(); m2!();
|
||||
//^^ error: unresolved macro `self::m2!`
|
||||
//^^ error: unresolved macro `m2!`
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue