| 1 | //! [`Eq`](trait@std::cmp::Eq) implementation. |
| 2 | |
| 3 | use proc_macro2::TokenStream; |
| 4 | use quote::quote; |
| 5 | |
| 6 | use crate::{Data, DeriveTrait, Item, SplitGenerics, TraitImpl}; |
| 7 | |
| 8 | /// Dummy-struct implement [`Trait`](crate::Trait) for |
| 9 | /// [`Eq`](trait@std::cmp::Eq). |
| 10 | pub struct Eq; |
| 11 | |
| 12 | impl TraitImpl for Eq { |
| 13 | fn as_str(&self) -> &'static str { |
| 14 | "Eq" |
| 15 | } |
| 16 | |
| 17 | fn default_derive_trait(&self) -> DeriveTrait { |
| 18 | DeriveTrait::Eq |
| 19 | } |
| 20 | |
| 21 | fn build_signature( |
| 22 | &self, |
| 23 | _any_bound: bool, |
| 24 | _item: &Item, |
| 25 | _generics: &SplitGenerics<'_>, |
| 26 | _traits: &[DeriveTrait], |
| 27 | _trait_: &DeriveTrait, |
| 28 | body: &TokenStream, |
| 29 | ) -> TokenStream { |
| 30 | quote! { |
| 31 | #[inline] |
| 32 | fn assert_receiver_is_total_eq(&self) { |
| 33 | struct __AssertEq<__T: ::core::cmp::Eq + ?::core::marker::Sized>(::core::marker::PhantomData<__T>); |
| 34 | |
| 35 | #body |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | fn build_body( |
| 41 | &self, |
| 42 | _any_bound: bool, |
| 43 | _traits: &[DeriveTrait], |
| 44 | trait_: &DeriveTrait, |
| 45 | data: &Data, |
| 46 | ) -> TokenStream { |
| 47 | let types = data.iter_fields(**trait_).map(|field| field.type_); |
| 48 | |
| 49 | quote! { |
| 50 | #(let _: __AssertEq<#types>;)* |
| 51 | } |
| 52 | } |
| 53 | } |
| 54 | |