Track the angle brackets attached to generic implicit impls
diff --git a/syntax/instantiate.rs b/syntax/instantiate.rs
index e9c6f29..c2a5af0 100644
--- a/syntax/instantiate.rs
+++ b/syntax/instantiate.rs
@@ -1,43 +1,76 @@
-use crate::syntax::Type;
+use crate::syntax::{NamedType, Type};
use proc_macro2::Ident;
+use std::hash::{Hash, Hasher};
+use syn::Token;
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub enum ImplKey<'a> {
- RustBox(&'a Ident),
- RustVec(&'a Ident),
- UniquePtr(&'a Ident),
- SharedPtr(&'a Ident),
- WeakPtr(&'a Ident),
- CxxVector(&'a Ident),
+ 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 rust: &'a Ident,
+ pub lt_token: Option<Token![<]>,
+ pub gt_token: Option<Token![>]>,
}
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(&ident.rust));
+ return Some(ImplKey::RustBox(NamedImplKey::from(ident)));
}
} else if let Type::RustVec(ty) = self {
if let Type::Ident(ident) = &ty.inner {
- return Some(ImplKey::RustVec(&ident.rust));
+ return Some(ImplKey::RustVec(NamedImplKey::from(ident)));
}
} else if let Type::UniquePtr(ty) = self {
if let Type::Ident(ident) = &ty.inner {
- return Some(ImplKey::UniquePtr(&ident.rust));
+ return Some(ImplKey::UniquePtr(NamedImplKey::from(ident)));
}
} else if let Type::SharedPtr(ty) = self {
if let Type::Ident(ident) = &ty.inner {
- return Some(ImplKey::SharedPtr(&ident.rust));
+ return Some(ImplKey::SharedPtr(NamedImplKey::from(ident)));
}
} else if let Type::WeakPtr(ty) = self {
if let Type::Ident(ident) = &ty.inner {
- return Some(ImplKey::WeakPtr(&ident.rust));
+ return Some(ImplKey::WeakPtr(NamedImplKey::from(ident)));
}
} else if let Type::CxxVector(ty) = self {
if let Type::Ident(ident) = &ty.inner {
- return Some(ImplKey::CxxVector(&ident.rust));
+ return Some(ImplKey::CxxVector(NamedImplKey::from(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> From<&'a NamedType> for NamedImplKey<'a> {
+ fn from(ty: &'a NamedType) -> Self {
+ NamedImplKey {
+ rust: &ty.rust,
+ lt_token: ty.generics.lt_token,
+ gt_token: ty.generics.gt_token,
+ }
+ }
+}