1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
use crate::syntax::{NamedType, Ty1, Type}; use proc_macro2::{Ident, Span}; use std::hash::{Hash, Hasher}; use syn::Token; #[derive(Copy, Clone, PartialEq, Eq, Hash)] pub enum ImplKey<'a> { RustBox(NamedImplKey<'a>), RustVec(NamedImplKey<'a>), UniquePtr(NamedImplKey<'a>), SharedPtr(NamedImplKey<'a>), WeakPtr(NamedImplKey<'a>), CxxVector(NamedImplKey<'a>), } #[derive(Copy, Clone)] pub struct NamedImplKey<'a> { pub begin_span: Span, pub rust: &'a Ident, pub lt_token: Option<Token![<]>, pub gt_token: Option<Token![>]>, pub end_span: Span, } impl Type { pub(crate) fn impl_key(&self) -> Option<ImplKey> { if let Type::RustBox(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::RustBox(NamedImplKey::new(ty, ident))); } } else if let Type::RustVec(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::RustVec(NamedImplKey::new(ty, ident))); } } else if let Type::UniquePtr(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::UniquePtr(NamedImplKey::new(ty, ident))); } } else if let Type::SharedPtr(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::SharedPtr(NamedImplKey::new(ty, ident))); } } else if let Type::WeakPtr(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::WeakPtr(NamedImplKey::new(ty, ident))); } } else if let Type::CxxVector(ty) = self { if let Type::Ident(ident) = &ty.inner { return Some(ImplKey::CxxVector(NamedImplKey::new(ty, ident))); } } None } } impl<'a> PartialEq for NamedImplKey<'a> { fn eq(&self, other: &Self) -> bool { PartialEq::eq(self.rust, other.rust) } } impl<'a> Eq for NamedImplKey<'a> {} impl<'a> Hash for NamedImplKey<'a> { fn hash<H: Hasher>(&self, hasher: &mut H) { self.rust.hash(hasher); } } impl<'a> NamedImplKey<'a> { fn new(outer: &Ty1, inner: &'a NamedType) -> Self { NamedImplKey { begin_span: outer.name.span(), rust: &inner.rust, lt_token: inner.generics.lt_token, gt_token: inner.generics.gt_token, end_span: outer.rangle.span, } } }