|  | 
|  | 1 | +// force-host | 
|  | 2 | +// no-prefer-dynamic | 
|  | 3 | + | 
|  | 4 | +#![crate_type = "proc-macro"] | 
|  | 5 | + | 
|  | 6 | +//#![feature(proc_macro_diagnostic, proc_macro_span, proc_macro_def_site)] | 
|  | 7 | + | 
|  | 8 | +extern crate proc_macro; | 
|  | 9 | + | 
|  | 10 | +use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree}; | 
|  | 11 | +use std::iter::FromIterator; | 
|  | 12 | + | 
|  | 13 | +#[proc_macro_attribute] | 
|  | 14 | +pub fn repro(_args: TokenStream, input: TokenStream) -> TokenStream { | 
|  | 15 | +    let call_site = Span::call_site(); | 
|  | 16 | +    let span = input.into_iter().nth(8).unwrap().span(); | 
|  | 17 | + | 
|  | 18 | +    //fn f(_: &::std::fmt::Formatter) {} | 
|  | 19 | +    TokenStream::from_iter([ | 
|  | 20 | +        TokenTree::Ident(Ident::new("fn", call_site)), | 
|  | 21 | +        TokenTree::Ident(Ident::new("f", call_site)), | 
|  | 22 | +        TokenTree::Group(Group::new( | 
|  | 23 | +            Delimiter::Parenthesis, | 
|  | 24 | +            TokenStream::from_iter([ | 
|  | 25 | +                TokenTree::Ident(Ident::new("_", call_site)), | 
|  | 26 | +                TokenTree::Punct(punct(':', Spacing::Alone, call_site)), | 
|  | 27 | +                TokenTree::Punct(punct('&', Spacing::Alone, call_site)), | 
|  | 28 | +                TokenTree::Punct(punct(':', Spacing::Joint, span)), | 
|  | 29 | +                TokenTree::Punct(punct(':', Spacing::Alone, span)), | 
|  | 30 | +                TokenTree::Ident(Ident::new("std", span)), | 
|  | 31 | +                TokenTree::Punct(punct(':', Spacing::Joint, span)), | 
|  | 32 | +                TokenTree::Punct(punct(':', Spacing::Alone, span)), | 
|  | 33 | +                TokenTree::Ident(Ident::new("fmt", span)), | 
|  | 34 | +                TokenTree::Punct(punct(':', Spacing::Joint, span)), | 
|  | 35 | +                TokenTree::Punct(punct(':', Spacing::Alone, span)), | 
|  | 36 | +                TokenTree::Ident(Ident::new("Formatter", span)), | 
|  | 37 | +            ]), | 
|  | 38 | +        )), | 
|  | 39 | +        TokenTree::Group(Group::new(Delimiter::Brace, TokenStream::new())), | 
|  | 40 | +    ]) | 
|  | 41 | +} | 
|  | 42 | + | 
|  | 43 | +fn punct(ch: char, spacing: Spacing, span: Span) -> Punct { | 
|  | 44 | +    let mut punct = Punct::new(ch, spacing); | 
|  | 45 | +    punct.set_span(span); | 
|  | 46 | +    punct | 
|  | 47 | +} | 
0 commit comments