linkme_impl/
ty.rs

1use syn::{GenericArgument, Lifetime, PathArguments, Type};
2
3pub(crate) fn populate_static_lifetimes(ty: &mut Type) {
4    match ty {
5        #![cfg_attr(all(test, exhaustive), deny(non_exhaustive_omitted_patterns))]
6        Type::Array(ty) => populate_static_lifetimes(&mut ty.elem),
7        Type::Group(ty) => populate_static_lifetimes(&mut ty.elem),
8        Type::Paren(ty) => populate_static_lifetimes(&mut ty.elem),
9        Type::Path(ty) => {
10            if let Some(qself) = &mut ty.qself {
11                populate_static_lifetimes(&mut qself.ty);
12            }
13            for segment in &mut ty.path.segments {
14                if let PathArguments::AngleBracketed(segment) = &mut segment.arguments {
15                    for arg in &mut segment.args {
16                        if let GenericArgument::Type(arg) = arg {
17                            populate_static_lifetimes(arg);
18                        }
19                    }
20                }
21            }
22        }
23        Type::Ptr(ty) => populate_static_lifetimes(&mut ty.elem),
24        Type::Reference(ty) => {
25            if ty.lifetime.is_none() {
26                ty.lifetime = Some(Lifetime::new("'static", ty.and_token.span));
27            }
28            populate_static_lifetimes(&mut ty.elem);
29        }
30        Type::Slice(ty) => populate_static_lifetimes(&mut ty.elem),
31        Type::Tuple(ty) => ty.elems.iter_mut().for_each(populate_static_lifetimes),
32        Type::ImplTrait(_)
33        | Type::Infer(_)
34        | Type::Macro(_)
35        | Type::Never(_)
36        | Type::TraitObject(_)
37        | Type::BareFn(_)
38        | Type::Verbatim(_) => {}
39
40        _ => unimplemented!("unknown Type"),
41    }
42}