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
@ -1890,7 +1890,7 @@ fn collect_macro_def(&mut self, id: FileItemTreeId<MacroDef>) {
|
||||
}
|
||||
|
||||
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 @@ fn collect_macro_call(&mut self, mac: &MacroCall) {
|
||||
}
|
||||
|
||||
// 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 @@ fn resolve_macro_def() {
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[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 @@ fn unresolved_legacy_scope_macro() {
|
||||
macro_rules! m { () => {} }
|
||||
|
||||
m!(); m2!();
|
||||
//^^ error: unresolved macro `self::m2!`
|
||||
//^^ error: unresolved macro `m2!`
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user