blob: c2a5af0c102d895ad4bdf133bfb6a26b62030355 [file] [log] [blame]
David Tolnaydde63022021-03-26 22:22:35 -04001use crate::syntax::{NamedType, Type};
David Tolnay4c6052d2020-12-31 15:01:04 -08002use proc_macro2::Ident;
David Tolnaydde63022021-03-26 22:22:35 -04003use std::hash::{Hash, Hasher};
4use syn::Token;
David Tolnay4c6052d2020-12-31 15:01:04 -08005
David Tolnaye352c1e2020-12-31 16:41:05 -08006#[derive(Copy, Clone, PartialEq, Eq, Hash)]
David Tolnay4c6052d2020-12-31 15:01:04 -08007pub enum ImplKey<'a> {
David Tolnaydde63022021-03-26 22:22:35 -04008 RustBox(NamedImplKey<'a>),
9 RustVec(NamedImplKey<'a>),
10 UniquePtr(NamedImplKey<'a>),
11 SharedPtr(NamedImplKey<'a>),
12 WeakPtr(NamedImplKey<'a>),
13 CxxVector(NamedImplKey<'a>),
14}
15
16#[derive(Copy, Clone)]
17pub struct NamedImplKey<'a> {
18 pub rust: &'a Ident,
19 pub lt_token: Option<Token![<]>,
20 pub gt_token: Option<Token![>]>,
David Tolnay4c6052d2020-12-31 15:01:04 -080021}
22
23impl Type {
24 pub(crate) fn impl_key(&self) -> Option<ImplKey> {
25 if let Type::RustBox(ty) = self {
26 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040027 return Some(ImplKey::RustBox(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080028 }
29 } else if let Type::RustVec(ty) = self {
30 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040031 return Some(ImplKey::RustVec(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080032 }
33 } else if let Type::UniquePtr(ty) = self {
34 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040035 return Some(ImplKey::UniquePtr(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080036 }
37 } else if let Type::SharedPtr(ty) = self {
38 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040039 return Some(ImplKey::SharedPtr(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080040 }
41 } else if let Type::WeakPtr(ty) = self {
42 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040043 return Some(ImplKey::WeakPtr(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080044 }
45 } else if let Type::CxxVector(ty) = self {
46 if let Type::Ident(ident) = &ty.inner {
David Tolnaydde63022021-03-26 22:22:35 -040047 return Some(ImplKey::CxxVector(NamedImplKey::from(ident)));
David Tolnay4c6052d2020-12-31 15:01:04 -080048 }
49 }
50 None
51 }
52}
David Tolnaydde63022021-03-26 22:22:35 -040053
54impl<'a> PartialEq for NamedImplKey<'a> {
55 fn eq(&self, other: &Self) -> bool {
56 PartialEq::eq(self.rust, other.rust)
57 }
58}
59
60impl<'a> Eq for NamedImplKey<'a> {}
61
62impl<'a> Hash for NamedImplKey<'a> {
63 fn hash<H: Hasher>(&self, hasher: &mut H) {
64 self.rust.hash(hasher);
65 }
66}
67
68impl<'a> From<&'a NamedType> for NamedImplKey<'a> {
69 fn from(ty: &'a NamedType) -> Self {
70 NamedImplKey {
71 rust: &ty.rust,
72 lt_token: ty.generics.lt_token,
73 gt_token: ty.generics.gt_token,
74 }
75 }
76}