use syn::{GenericArgument, Lifetime, PathArguments, Type};
pub(crate) fn populate_static_lifetimes(ty: &mut Type) {
match ty {
#![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
Type::Array(ty) => populate_static_lifetimes(&mut ty.elem),
Type::Group(ty) => populate_static_lifetimes(&mut ty.elem),
Type::Paren(ty) => populate_static_lifetimes(&mut ty.elem),
Type::Path(ty) => {
if let Some(qself) = &mut ty.qself {
populate_static_lifetimes(&mut qself.ty);
}
for segment in &mut ty.path.segments {
if let PathArguments::AngleBracketed(segment) = &mut segment.arguments {
for arg in &mut segment.args {
if let GenericArgument::Type(arg) = arg {
populate_static_lifetimes(arg);
}
}
}
}
}
Type::Ptr(ty) => populate_static_lifetimes(&mut ty.elem),
Type::Reference(ty) => {
if ty.lifetime.is_none() {
ty.lifetime = Some(Lifetime::new("'static", ty.and_token.span));
}
populate_static_lifetimes(&mut ty.elem);
}
Type::Slice(ty) => populate_static_lifetimes(&mut ty.elem),
Type::Tuple(ty) => ty.elems.iter_mut().for_each(populate_static_lifetimes),
Type::ImplTrait(_)
| Type::Infer(_)
| Type::Macro(_)
| Type::Never(_)
| Type::TraitObject(_)
| Type::BareFn(_)
| Type::Verbatim(_) => {}
_ => unimplemented!("unknown Type"),
}
}