David Tolnay | b247df1 | 2020-11-27 12:06:12 -0800 | [diff] [blame] | 1 | use proc_macro2::{Ident, Span}; |
David Tolnay | 16e2620 | 2020-11-27 19:28:37 -0800 | [diff] [blame] | 2 | use std::fmt::{self, Display}; |
David Tolnay | b247df1 | 2020-11-27 12:06:12 -0800 | [diff] [blame] | 3 | |
| 4 | #[derive(Copy, Clone)] |
David Tolnay | 886fff8 | 2023-09-03 12:48:23 -0700 | [diff] [blame] | 5 | pub(crate) struct Derive { |
David Tolnay | b247df1 | 2020-11-27 12:06:12 -0800 | [diff] [blame] | 6 | pub what: Trait, |
| 7 | pub span: Span, |
| 8 | } |
David Tolnay | 64703b4 | 2020-05-10 22:12:33 -0700 | [diff] [blame] | 9 | |
| 10 | #[derive(Copy, Clone, PartialEq)] |
David Tolnay | 886fff8 | 2023-09-03 12:48:23 -0700 | [diff] [blame] | 11 | pub(crate) enum Trait { |
David Tolnay | 64703b4 | 2020-05-10 22:12:33 -0700 | [diff] [blame] | 12 | Clone, |
| 13 | Copy, |
David Tolnay | f84c98b | 2020-11-27 12:59:42 -0800 | [diff] [blame] | 14 | Debug, |
David Tolnay | a6a9e94 | 2020-11-27 17:22:35 -0800 | [diff] [blame] | 15 | Default, |
David Tolnay | 21466df | 2020-11-27 14:04:42 -0800 | [diff] [blame] | 16 | Eq, |
David Tolnay | 16e2620 | 2020-11-27 19:28:37 -0800 | [diff] [blame] | 17 | ExternType, |
David Tolnay | 7da3820 | 2020-11-27 17:36:16 -0800 | [diff] [blame] | 18 | Hash, |
David Tolnay | 577135e | 2020-11-27 16:23:53 -0800 | [diff] [blame] | 19 | Ord, |
David Tolnay | 21466df | 2020-11-27 14:04:42 -0800 | [diff] [blame] | 20 | PartialEq, |
David Tolnay | 577135e | 2020-11-27 16:23:53 -0800 | [diff] [blame] | 21 | PartialOrd, |
Johan Verwey | b3ac95e | 2021-09-25 07:54:24 -0700 | [diff] [blame] | 22 | Serialize, |
| 23 | Deserialize, |
David Tolnay | 64703b4 | 2020-05-10 22:12:33 -0700 | [diff] [blame] | 24 | } |
| 25 | |
| 26 | impl Derive { |
David Tolnay | 886fff8 | 2023-09-03 12:48:23 -0700 | [diff] [blame] | 27 | pub(crate) fn from(ident: &Ident) -> Option<Self> { |
David Tolnay | b247df1 | 2020-11-27 12:06:12 -0800 | [diff] [blame] | 28 | let what = match ident.to_string().as_str() { |
| 29 | "Clone" => Trait::Clone, |
| 30 | "Copy" => Trait::Copy, |
David Tolnay | f84c98b | 2020-11-27 12:59:42 -0800 | [diff] [blame] | 31 | "Debug" => Trait::Debug, |
David Tolnay | a6a9e94 | 2020-11-27 17:22:35 -0800 | [diff] [blame] | 32 | "Default" => Trait::Default, |
David Tolnay | 21466df | 2020-11-27 14:04:42 -0800 | [diff] [blame] | 33 | "Eq" => Trait::Eq, |
David Tolnay | 16e2620 | 2020-11-27 19:28:37 -0800 | [diff] [blame] | 34 | "ExternType" => Trait::ExternType, |
David Tolnay | 7da3820 | 2020-11-27 17:36:16 -0800 | [diff] [blame] | 35 | "Hash" => Trait::Hash, |
David Tolnay | 577135e | 2020-11-27 16:23:53 -0800 | [diff] [blame] | 36 | "Ord" => Trait::Ord, |
David Tolnay | 21466df | 2020-11-27 14:04:42 -0800 | [diff] [blame] | 37 | "PartialEq" => Trait::PartialEq, |
David Tolnay | 577135e | 2020-11-27 16:23:53 -0800 | [diff] [blame] | 38 | "PartialOrd" => Trait::PartialOrd, |
Johan Verwey | b3ac95e | 2021-09-25 07:54:24 -0700 | [diff] [blame] | 39 | "Serialize" => Trait::Serialize, |
| 40 | "Deserialize" => Trait::Deserialize, |
David Tolnay | b247df1 | 2020-11-27 12:06:12 -0800 | [diff] [blame] | 41 | _ => return None, |
| 42 | }; |
| 43 | let span = ident.span(); |
| 44 | Some(Derive { what, span }) |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | impl PartialEq<Trait> for Derive { |
| 49 | fn eq(&self, other: &Trait) -> bool { |
| 50 | self.what == *other |
David Tolnay | 64703b4 | 2020-05-10 22:12:33 -0700 | [diff] [blame] | 51 | } |
| 52 | } |
David Tolnay | bc047bb | 2020-11-27 14:30:12 -0800 | [diff] [blame] | 53 | |
David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 54 | impl AsRef<str> for Trait { |
| 55 | fn as_ref(&self) -> &str { |
| 56 | match self { |
| 57 | Trait::Clone => "Clone", |
| 58 | Trait::Copy => "Copy", |
| 59 | Trait::Debug => "Debug", |
David Tolnay | a6a9e94 | 2020-11-27 17:22:35 -0800 | [diff] [blame] | 60 | Trait::Default => "Default", |
David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 61 | Trait::Eq => "Eq", |
David Tolnay | 16e2620 | 2020-11-27 19:28:37 -0800 | [diff] [blame] | 62 | Trait::ExternType => "ExternType", |
David Tolnay | 7da3820 | 2020-11-27 17:36:16 -0800 | [diff] [blame] | 63 | Trait::Hash => "Hash", |
David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 64 | Trait::Ord => "Ord", |
| 65 | Trait::PartialEq => "PartialEq", |
| 66 | Trait::PartialOrd => "PartialOrd", |
Johan Verwey | b3ac95e | 2021-09-25 07:54:24 -0700 | [diff] [blame] | 67 | Trait::Serialize => "Serialize", |
| 68 | Trait::Deserialize => "Deserialize", |
David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 69 | } |
| 70 | } |
| 71 | } |
| 72 | |
David Tolnay | 16e2620 | 2020-11-27 19:28:37 -0800 | [diff] [blame] | 73 | impl Display for Derive { |
| 74 | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| 75 | formatter.write_str(self.what.as_ref()) |
| 76 | } |
| 77 | } |
| 78 | |
David Tolnay | 927d8ea | 2023-09-03 12:14:45 -0700 | [diff] [blame] | 79 | pub(crate) fn contains(derives: &[Derive], query: Trait) -> bool { |
David Tolnay | bc047bb | 2020-11-27 14:30:12 -0800 | [diff] [blame] | 80 | derives.iter().any(|derive| derive.what == query) |
| 81 | } |