1//! [`Eq`](trait@std::cmp::Eq) implementation.
2
3use proc_macro2::TokenStream;
4use quote::quote;
5
6use crate::{Data, DeriveTrait, Item, SplitGenerics, TraitImpl};
7
8/// Dummy-struct implement [`Trait`](crate::Trait) for
9/// [`Eq`](trait@std::cmp::Eq).
10pub struct Eq;
11
12impl 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