7133: Proper handling $crate and local_inner_macros r=jonas-schievink a=edwin0cheng

This PR introduces `HygineFrames` to store the macro definition/call site hierarchy in hyginee and when resolving `local_inner_macros` and `$crate`, we use the token to look up the corresponding frame and return the correct value.

See also: https://rustc-dev-guide.rust-lang.org/macro-expansion.html#hygiene-and-hierarchies

fixe #6890 and  #6788

r? @jonas-schievink 

Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
This commit is contained in:
bors[bot] 2021-01-02 17:42:45 +00:00 committed by GitHub
commit a88d4f8c72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 178 additions and 54 deletions

View file

@ -370,6 +370,37 @@ expand!();
);
}
#[test]
fn infer_macro_with_dollar_crate_in_def_site() {
check_types(
r#"
//- /main.rs crate:main deps:foo
use foo::expand;
macro_rules! list {
($($tt:tt)*) => { $($tt)* }
}
fn test() {
let r = expand!();
r;
//^ u128
}
//- /lib.rs crate:foo
#[macro_export]
macro_rules! expand {
() => { list!($crate::m!()) };
}
#[macro_export]
macro_rules! m {
() => { 0u128 };
}
"#,
);
}
#[test]
fn infer_type_value_non_legacy_macro_use_as() {
check_infer(