37 lines
1007 B
Rust
37 lines
1007 B
Rust
extern crate proc_macro;
|
|
|
|
#[proc_macro]
|
|
pub fn unelide_lifetimes(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
use quote::ToTokens;
|
|
use syn::parse::{Parse, ParseStream};
|
|
use syn::visit_mut::VisitMut;
|
|
|
|
struct Input {
|
|
lt: syn::Lifetime,
|
|
ty: syn::Type,
|
|
}
|
|
|
|
impl Parse for Input {
|
|
fn parse(input: ParseStream) -> syn::Result<Self> {
|
|
let lt: syn::Lifetime = input.parse()?;
|
|
let _: syn::Token!(;) = input.parse()?;
|
|
let ty: syn::Type = input.parse()?;
|
|
Ok(Self { lt, ty })
|
|
}
|
|
}
|
|
|
|
struct UnelideLifetimes(syn::Lifetime);
|
|
|
|
impl VisitMut for UnelideLifetimes {
|
|
fn visit_lifetime_mut(&mut self, i: &mut syn::Lifetime) {
|
|
if i.ident == "_" {
|
|
*i = self.0.clone();
|
|
}
|
|
}
|
|
}
|
|
|
|
let mut input = syn::parse_macro_input!(input as Input);
|
|
UnelideLifetimes(input.lt).visit_type_mut(&mut input.ty);
|
|
input.ty.to_token_stream().into()
|
|
}
|