+trait ResolveType<'a> { fn resolve_type(&'a self, ty: &'a syn::Type) -> &'a syn::Type; }
+impl<'a, 'b, 'c: 'a + 'b> ResolveType<'c> for Option<&GenericTypes<'a, 'b>> {
+ fn resolve_type(&'c self, ty: &'c syn::Type) -> &'c syn::Type {
+ if let Some(us) = self {
+ match ty {
+ syn::Type::Path(p) => {
+ if let Some(ident) = p.path.get_ident() {
+ if let Some((ty, _)) = us.default_generics.get(ident) {
+ return ty;
+ }
+ }
+ },
+ syn::Type::Reference(syn::TypeReference { elem, .. }) => {
+ if let syn::Type::Path(p) = &**elem {
+ if let Some(ident) = p.path.get_ident() {
+ if let Some((_, refty)) = us.default_generics.get(ident) {
+ return refty;
+ }
+ }
+ }
+ }
+ _ => {},
+ }
+ }
+ ty
+ }
+}
+