//@ force-host
//@ no-prefer-dynamic
// ignore-tidy-linelength

#![feature(proc_macro_quote)]
#![crate_type = "proc-macro"]

extern crate proc_macro;
use std::iter::FromIterator;
use std::str::FromStr;
use proc_macro::*;

#[proc_macro]
pub fn custom_quote(input: TokenStream) -> TokenStream {
    let mut tokens: Vec<_> = input.into_iter().collect();
    assert_eq!(tokens.len(), 1, "Unexpected input: {:?}", tokens);
    match tokens.pop() {
        Some(TokenTree::Ident(ident)) => {
            assert_eq!(ident.to_string(), "my_ident");

            let proc_macro_crate = TokenStream::from_str("::proc_macro").unwrap();
            let quoted_span = proc_macro::quote_span(proc_macro_crate, ident.span());
            let prefix = TokenStream::from_str(r#"let mut ident = proc_macro::Ident::new("my_ident", proc_macro::Span::call_site());"#).unwrap();
            let set_span_method = TokenStream::from_str("ident.set_span").unwrap();
            let set_span_arg = TokenStream::from(TokenTree::Group(Group::new(Delimiter::Parenthesis, quoted_span)));
            let suffix = TokenStream::from_str(";proc_macro::TokenStream::from(proc_macro::TokenTree::Ident(ident))").unwrap();
            let full_stream = TokenStream::from_iter([prefix, set_span_method, set_span_arg, suffix]);
            full_stream
        }
        _ => unreachable!()
    }
}
