#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
use std::collections::HashMap;
#[cfg(any(feature = "Copy", feature = "Eq", feature = "Ord", feature = "PartialOrd"))]
use std::collections::HashSet;
#[cfg(any(feature = "Copy", feature = "Eq", feature = "Ord", feature = "PartialOrd"))]
use quote::ToTokens;
use syn::{DeriveInput, Meta};
use crate::Trait;
#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
use crate::common::where_predicates_bool::WherePredicates;
#[cfg(feature = "Clone")]
pub(crate) mod clone;
#[cfg(feature = "Copy")]
pub(crate) mod copy;
#[cfg(feature = "Debug")]
pub(crate) mod debug;
#[cfg(feature = "Default")]
pub(crate) mod default;
#[cfg(feature = "Deref")]
pub(crate) mod deref;
#[cfg(feature = "DerefMut")]
pub(crate) mod deref_mut;
#[cfg(feature = "Eq")]
pub(crate) mod eq;
#[cfg(feature = "Hash")]
pub(crate) mod hash;
#[cfg(feature = "Into")]
pub(crate) mod into;
#[cfg(feature = "Ord")]
pub(crate) mod ord;
#[cfg(feature = "PartialEq")]
pub(crate) mod partial_eq;
#[cfg(feature = "PartialOrd")]
pub(crate) mod partial_ord;
#[derive(Default)]
pub(crate) struct TraitHandlerContext {
#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
final_predicates: HashMap<Trait, WherePredicates>,
}
impl TraitHandlerContext {
#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
pub(crate) fn record(&mut self, t: Trait, predicates: &WherePredicates) {
self.final_predicates.insert(t, predicates.clone());
}
#[cfg(any(feature = "Copy", feature = "Eq", feature = "Ord", feature = "PartialOrd"))]
pub(crate) fn inherit_from(&self, prerequisites: &[Trait], own: &mut WherePredicates) {
let mut seen: HashSet<String> =
own.iter().map(|predicate| predicate.to_token_stream().to_string()).collect();
for prerequisite in prerequisites {
if let Some(predicates) = self.final_predicates.get(prerequisite) {
for predicate in predicates {
if seen.insert(predicate.to_token_stream().to_string()) {
own.push(predicate.clone());
}
}
}
}
}
}
#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Debug",
feature = "Default",
feature = "Deref",
feature = "DerefMut",
feature = "Eq",
feature = "Hash",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
pub(crate) trait TraitHandler {
fn trait_meta_handler(
ast: &DeriveInput,
ctx: &mut TraitHandlerContext,
token_stream: &mut proc_macro2::TokenStream,
traits: &[Trait],
meta: &Meta,
) -> syn::Result<()>;
}
#[cfg(feature = "Into")]
pub(crate) trait TraitHandlerMultiple {
fn trait_meta_handler(
ast: &DeriveInput,
ctx: &mut TraitHandlerContext,
token_stream: &mut proc_macro2::TokenStream,
traits: &[Trait],
meta: &[Meta],
) -> syn::Result<()>;
}