use crate :: *;
#[ allow( clippy ::struct_excessive_bools ) ]
#[ derive( Debug, Clone ) ]
pub struct GenericsClassification< 'a >
{
pub lifetimes: Vec< &'a syn ::LifetimeParam >,
pub types: Vec< &'a syn ::TypeParam >,
pub consts: Vec< &'a syn ::ConstParam >,
pub has_only_lifetimes: bool,
pub has_only_types: bool,
pub has_only_consts: bool,
pub has_mixed: bool,
pub is_empty: bool,
}
#[ must_use ]
pub fn classify_generics(generics: &syn ::Generics) -> GenericsClassification< '_ >
{
let mut lifetimes = Vec ::new();
let mut types = Vec ::new();
let mut consts = Vec ::new();
for param in &generics.params
{
match param
{
syn ::GenericParam ::Lifetime(lt) => lifetimes.push(lt),
syn ::GenericParam ::Type(ty) => types.push(ty),
syn ::GenericParam ::Const(ct) => consts.push(ct),
}
}
let total = lifetimes.len() + types.len() + consts.len();
let is_empty = total == 0;
let has_only_lifetimes = !is_empty && lifetimes.len() == total;
let has_only_types = !is_empty && types.len() == total;
let has_only_consts = !is_empty && consts.len() == total;
let has_mixed = !is_empty && !has_only_lifetimes && !has_only_types && !has_only_consts;
GenericsClassification {
lifetimes,
types,
consts,
has_only_lifetimes,
has_only_types,
has_only_consts,
has_mixed,
is_empty,
}
}
#[ derive( Debug, Clone ) ]
pub struct DecomposedClassified
{
pub generics_with_defaults: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_impl: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_ty: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_where: syn ::punctuated ::Punctuated< syn ::WherePredicate, syn ::token ::Comma >,
pub classification: GenericsClassification< 'static >,
pub generics_impl_only_types: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_impl_no_lifetimes: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_ty_only_types: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
pub generics_ty_no_lifetimes: syn ::punctuated ::Punctuated< syn ::GenericParam, syn ::token ::Comma >,
}
#[ must_use ]
pub fn decompose_classified(generics: &syn ::Generics) -> DecomposedClassified
{
use super ::filter;
let (with_defaults, impl_params, ty_params, where_clause) = crate::generic_params::decompose(generics);
let generics_leaked = Box ::leak(Box ::new(generics.clone()));
let classification = classify_generics(generics_leaked);
let generics_impl_only_types = filter ::filter_params(&impl_params, filter ::filter_types);
let generics_impl_no_lifetimes = filter ::filter_params(&impl_params, filter ::filter_non_lifetimes);
let generics_ty_only_types = filter ::filter_params(&ty_params, filter ::filter_types);
let generics_ty_no_lifetimes = filter ::filter_params(&ty_params, filter ::filter_non_lifetimes);
DecomposedClassified {
generics_with_defaults: with_defaults,
generics_impl: impl_params,
generics_ty: ty_params,
generics_where: where_clause,
classification,
generics_impl_only_types,
generics_impl_no_lifetimes,
generics_ty_only_types,
generics_ty_no_lifetimes,
}
}