typhoon-context-macro 0.1.0-alpha.12

TODO
Documentation
use syn::{parse_quote, visit_mut::VisitMut, PathArguments};

pub struct LifetimeInjector;

impl VisitMut for LifetimeInjector {
    fn visit_generics_mut(&mut self, i: &mut syn::Generics) {
        i.params.push(parse_quote!('info));
    }

    fn visit_type_path_mut(&mut self, i: &mut syn::TypePath) {
        if let Some(seg) = i.path.segments.last_mut() {
            if seg.ident == "Mut" || seg.ident == "Option" {
                self.visit_path_segment_mut(seg);

                return;
            }

            match seg.arguments {
                PathArguments::AngleBracketed(ref mut gen_args) => {
                    gen_args.args.insert(0, parse_quote!('info));
                }
                PathArguments::None => {
                    seg.arguments = PathArguments::AngleBracketed(parse_quote!(<'info>));
                }
                PathArguments::Parenthesized(_) => {}
            }
        }
    }
}