#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
use std::collections::HashMap;
use syn::{DeriveInput, Meta, Type};
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(any(feature = "Copy", feature = "Eq", feature = "Ord", feature = "PartialOrd"))]
use crate::common::where_predicates_bool::extend_where_predicates;
#[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<'a> {
#[cfg(any(
feature = "Clone",
feature = "Copy",
feature = "Eq",
feature = "Ord",
feature = "PartialEq",
feature = "PartialOrd"
))]
final_predicates: HashMap<Trait, WherePredicates>,
#[cfg(all(feature = "Clone", feature = "Copy"))]
copy_meta: Option<Meta>,
#[allow(dead_code)]
partial_eq_types: Option<Vec<&'a Type>>,
}
impl<'a> TraitHandlerContext<'a> {
#[cfg(all(feature = "Clone", feature = "Copy"))]
pub(crate) fn set_copy_meta(&mut self, meta: Option<&Meta>) {
self.copy_meta = meta.cloned();
}
#[cfg(all(feature = "Clone", feature = "Copy"))]
pub(crate) fn copy_meta(&self) -> Option<&Meta> {
self.copy_meta.as_ref()
}
#[cfg(all(feature = "Eq", feature = "PartialEq"))]
pub(crate) fn record_partial_eq_types(&mut self, types: &[&'a Type]) {
self.partial_eq_types = Some(types.to_vec());
}
#[cfg(all(feature = "Eq", feature = "PartialEq"))]
pub(crate) fn partial_eq_types(&self) -> Option<&[&'a Type]> {
self.partial_eq_types.as_deref()
}
#[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) {
for prerequisite in prerequisites {
if let Some(predicates) = self.final_predicates.get(prerequisite) {
extend_where_predicates(own, predicates.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<'a>(
ast: &'a DeriveInput,
ctx: &mut TraitHandlerContext<'a>,
token_stream: &mut proc_macro2::TokenStream,
traits: &[Trait],
meta: &Meta,
) -> syn::Result<()>;
}
#[cfg(feature = "Into")]
pub(crate) trait TraitHandlerMultiple {
fn trait_meta_handler<'a>(
ast: &'a DeriveInput,
ctx: &mut TraitHandlerContext<'a>,
token_stream: &mut proc_macro2::TokenStream,
traits: &[Trait],
meta: &[Meta],
) -> syn::Result<()>;
}