use std::collections::{HashMap, HashSet};
use quote::ToTokens;
use syn::{DeriveInput, Meta};
use crate::{Trait, 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 {
final_predicates: HashMap<Trait, WherePredicates>,
}
impl TraitHandlerContext {
#[allow(dead_code)]
pub(crate) fn record(&mut self, t: Trait, predicates: &WherePredicates) {
self.final_predicates.insert(t, predicates.clone());
}
#[allow(dead_code)]
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());
}
}
}
}
}
}
#[allow(dead_code)]
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<()>;
}