Auto merge of #57155 - petrochenkov:dcrate3, r=dtolnay
Resolve `$crate`s for pretty-printing at more appropriate time Doing it in `BuildReducedGraphVisitor` wasn't a good idea, identifiers wasn't actually visited half of the time. As a result some `$crate`s weren't resolved and were therefore pretty-printed as `$crate` literally, which turns into two tokens during re-parsing of the pretty-printed text. Now we are visiting and resolving `$crate` identifiers in an item right before sending that item to a proc macro attribute or derive. Fixes https://github.com/rust-lang/rust/issues/57089
This commit is contained in:
commit
e8ca35e63d
7 changed files with 154 additions and 13 deletions
|
|
@ -6,6 +6,13 @@
|
|||
extern crate proc_macro;
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro]
|
||||
pub fn m_empty(input: TokenStream) -> TokenStream {
|
||||
println!("PROC MACRO INPUT (PRETTY-PRINTED): {}", input);
|
||||
println!("PROC MACRO INPUT: {:#?}", input);
|
||||
TokenStream::new()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
pub fn m(input: TokenStream) -> TokenStream {
|
||||
println!("PROC MACRO INPUT (PRETTY-PRINTED): {}", input);
|
||||
|
|
|
|||
26
src/test/ui/proc-macro/dollar-crate-issue-57089.rs
Normal file
26
src/test/ui/proc-macro/dollar-crate-issue-57089.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// compile-pass
|
||||
// edition:2018
|
||||
// aux-build:dollar-crate.rs
|
||||
|
||||
// Anonymize unstable non-dummy spans while still showing dummy spans `0..0`.
|
||||
// normalize-stdout-test "bytes\([^0]\w*\.\.(\w+)\)" -> "bytes(LO..$1)"
|
||||
// normalize-stdout-test "bytes\((\w+)\.\.[^0]\w*\)" -> "bytes($1..HI)"
|
||||
|
||||
extern crate dollar_crate;
|
||||
|
||||
type S = u8;
|
||||
|
||||
macro_rules! m {
|
||||
() => {
|
||||
dollar_crate::m_empty! {
|
||||
struct M($crate::S);
|
||||
}
|
||||
|
||||
#[dollar_crate::a]
|
||||
struct A($crate::S);
|
||||
};
|
||||
}
|
||||
|
||||
m!();
|
||||
|
||||
fn main() {}
|
||||
80
src/test/ui/proc-macro/dollar-crate-issue-57089.stdout
Normal file
80
src/test/ui/proc-macro/dollar-crate-issue-57089.stdout
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
PROC MACRO INPUT (PRETTY-PRINTED): struct M ( $crate :: S ) ;
|
||||
PROC MACRO INPUT: TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Ident {
|
||||
ident: "M",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Group {
|
||||
delimiter: Parenthesis,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "$crate",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Joint,
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Alone,
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Ident {
|
||||
ident: "S",
|
||||
span: #2 bytes(LO..HI)
|
||||
}
|
||||
],
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ';',
|
||||
spacing: Alone,
|
||||
span: #2 bytes(LO..HI)
|
||||
}
|
||||
]
|
||||
ATTRIBUTE INPUT (PRETTY-PRINTED): struct A(crate::S);
|
||||
ATTRIBUTE INPUT: TokenStream [
|
||||
Ident {
|
||||
ident: "struct",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Ident {
|
||||
ident: "A",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Group {
|
||||
delimiter: Parenthesis,
|
||||
stream: TokenStream [
|
||||
Ident {
|
||||
ident: "$crate",
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Joint,
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ':',
|
||||
spacing: Alone,
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Ident {
|
||||
ident: "S",
|
||||
span: #2 bytes(LO..HI)
|
||||
}
|
||||
],
|
||||
span: #2 bytes(LO..HI)
|
||||
},
|
||||
Punct {
|
||||
ch: ';',
|
||||
spacing: Alone,
|
||||
span: #2 bytes(LO..HI)
|
||||
}
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue