| 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"), |
| } |
| } |