equivalence_derive/
lib.rs1use fnv::FnvHashMap as HashMap;
2use std::borrow::Cow;
3
4use darling::{
5 ast::Data,
6 util::{Flag, Override, SpannedValue},
7 FromDeriveInput, FromField, FromMeta, FromVariant,
8};
9use proc_macro::{self, TokenStream};
10use proc_macro_error::*;
11use quote::quote;
12use syn::{
13 parse_macro_input, punctuated::Punctuated, spanned::Spanned, token::Where, Expr, Ident, Type,
14 WhereClause,
15};
16
17use proc_macro2::{Span, TokenStream as TokenStream2};
18
19mod derivation;
20mod parser;
21
22use derivation::*;
23use parser::*;
24
25pub(crate) type IdentMap = HashMap<Ident, Ident>;
26
27#[proc_macro_error]
28#[proc_macro_derive(Equivalence, attributes(equiv, fwd))]
29pub fn derive_equivalence(input: TokenStream) -> TokenStream {
30 let input = parse_macro_input!(input);
31
32 let mut derivation = match EquivalenceDerivation::from_derive_input(&input) {
34 Ok(opts) => opts,
35 Err(err) => abort! {
36 err.span(),
37 "failed to parse Equivalence derivation: {}",
38 err
39 },
40 };
41
42 let mut result = quote! {};
44 derivation.synthesize(&mut result);
45
46 result.into()
47}