- if let syn::Type::Tuple(tup) = t {
- if tup.elems.is_empty() {
- write!(w, "u8").unwrap();
- } else {
- write!(w, "{}::C{}TupleTempl<", Self::container_templ_path(), tup.elems.len()).unwrap();
- self.write_template_generics(w, &mut tup.elems.iter(), generics, is_ref, in_crate);
- write!(w, ">").unwrap();
- }
- } else if let syn::Type::Path(p_arg) = t {
- let resolved_generic = self.resolve_path(&p_arg.path, generics);
- if self.is_primitive(&resolved_generic) {
- write!(w, "{}", resolved_generic).unwrap();
- } else if let Some(c_type) = self.c_type_from_path(&resolved_generic, is_ref, false) {
- if self.is_known_container(&resolved_generic, is_ref) {
- if resolved_generic == "Result" {
- let mut inner_args = Vec::new();
- if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments {
- for arg in args.args.iter() {
- if let syn::GenericArgument::Type(t) = arg { inner_args.push(t) } else { unimplemented!() };
- }
- } else { unimplemented!(); }
- self.write_c_mangled_container_path(w, inner_args, generics, &resolved_generic, is_ref, false, false);
- } else {
- write!(w, "{}::C{}Templ<", Self::container_templ_path(), single_ident_generic_path_to_ident(&p_arg.path).unwrap()).unwrap();
- assert_eq!(p_arg.path.segments.len(), 1);
- if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments {
- self.write_template_generics(w, &mut args.args.iter().map(|gen|
- if let syn::GenericArgument::Type(t) = gen { t } else { unimplemented!() }),
- generics, is_ref, in_crate);
- } else { unimplemented!(); }
- write!(w, ">").unwrap();
- }
- } else if resolved_generic == "Option" {
- if let syn::PathArguments::AngleBracketed(args) = &p_arg.path.segments.iter().next().unwrap().arguments {
- self.write_template_generics(w, &mut args.args.iter().map(|gen|
- if let syn::GenericArgument::Type(t) = gen { t } else { unimplemented!() }),
- generics, is_ref, in_crate);
- } else { unimplemented!(); }
- } else if in_crate {
- write!(w, "{}", c_type).unwrap();
- } else {
- self.write_rust_type(w, generics, &t);
- }
- } else {
- // If we just write out resolved_generic, it may mostly work, however for
- // original types which are generic, we need the template args. We could
- // figure them out and write them out, too, but its much easier to just
- // reference the native{} type alias which exists at least for opaque types.
- if in_crate {
- write!(w, "crate::{}", resolved_generic).unwrap();
- } else {
- let path_name: Vec<&str> = resolved_generic.rsplitn(2, "::").collect();
- if path_name.len() > 1 {
- write!(w, "crate::{}::native{}", path_name[1], path_name[0]).unwrap();
- } else {
- write!(w, "crate::native{}", path_name[0]).unwrap();
- }
- }
- }
- } else if let syn::Type::Reference(r_arg) = t {