true
}
+pub fn string_path_to_syn_path(path: &str) -> syn::Path {
+ let mut segments = syn::punctuated::Punctuated::new();
+ for seg in path.split("::") {
+ segments.push(syn::PathSegment {
+ ident: syn::Ident::new(seg, Span::call_site()),
+ arguments: syn::PathArguments::None,
+ });
+ }
+ syn::Path { leading_colon: Some(syn::Token![::](Span::call_site())), segments }
+}
+
#[derive(Debug, PartialEq)]
pub enum ExportStatus {
Export,
}
pub struct ImportResolver<'mod_lifetime, 'crate_lft: 'mod_lifetime> {
- crate_name: &'mod_lifetime str,
+ pub crate_name: &'mod_lifetime str,
dependencies: &'mod_lifetime HashSet<syn::Ident>,
module_path: &'mod_lifetime str,
imports: HashMap<syn::Ident, (String, syn::Path)>,
Self { crate_name, dependencies, module_path, imports, declared, priv_modules }
}
- pub fn get_declared_type(&self, ident: &syn::Ident) -> Option<&DeclType<'crate_lft>> {
- self.declared.get(ident)
- }
-
pub fn maybe_resolve_declared(&self, id: &syn::Ident) -> Option<&DeclType<'crate_lft>> {
self.declared.get(id)
}
} else { None }
}
- pub fn maybe_resolve_non_ignored_ident(&self, id: &syn::Ident) -> Option<String> {
- if let Some((imp, _)) = self.imports.get(id) {
- Some(imp.clone())
- } else if let Some(decl_type) = self.declared.get(id) {
- match decl_type {
- DeclType::StructIgnored => None,
- _ => Some(self.module_path.to_string() + "::" + &format!("{}", id)),
- }
- } else { None }
- }
-
pub fn maybe_resolve_path(&self, p: &syn::Path, generics: Option<&GenericTypes>) -> Option<String> {
if let Some(gen_types) = generics {
if let Some(resp) = gen_types.maybe_resolve_path(p) {
/// Aliases from paths to some other Type
pub type_aliases: HashMap<String, syn::Type>,
/// Value is an alias to Key (maybe with some generics)
- pub reverse_alias_map: HashMap<String, Vec<(syn::Path, syn::PathArguments)>>,
+ pub reverse_alias_map: HashMap<String, Vec<(String, syn::PathArguments)>>,
/// Template continer types defined, map from mangled type name -> whether a destructor fn
/// exists.
///
pub struct TypeResolver<'mod_lifetime, 'crate_lft: 'mod_lifetime> {
pub module_path: &'mod_lifetime str,
pub crate_types: &'mod_lifetime CrateTypes<'crate_lft>,
- types: ImportResolver<'mod_lifetime, 'crate_lft>,
+ pub types: ImportResolver<'mod_lifetime, 'crate_lft>,
}
/// Returned by write_empty_rust_val_check_suffix to indicate what type of dereferencing needs to
/// Returns true we if can just skip passing this to C entirely
fn no_arg_path_to_rust(&self, full_path: &str) -> &str {
if full_path == "bitcoin::secp256k1::Secp256k1" {
- "secp256k1::SECP256K1"
+ "secp256k1::global::SECP256K1"
} else { unimplemented!(); }
}
"std::time::Duration"|"core::time::Duration" => Some("u64"),
"std::time::SystemTime" => Some("u64"),
- "std::io::Error" => Some("crate::c_types::IOError"),
+ "std::io::Error"|"lightning::io::Error" => Some("crate::c_types::IOError"),
"core::fmt::Arguments" if is_ref => Some("crate::c_types::Str"),
"core::convert::Infallible" => Some("crate::c_types::NotConstructable"),
+ "bitcoin::bech32::Error"|"bech32::Error"
+ if !is_ref => Some("crate::c_types::Bech32Error"),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error"
+ if !is_ref => Some("crate::c_types::Secp256k1Error"),
+
+ "core::num::ParseIntError" => Some("crate::c_types::Error"),
+ "core::str::Utf8Error" => Some("crate::c_types::Error"),
+
"bitcoin::bech32::u5"|"bech32::u5" => Some("crate::c_types::u5"),
"core::num::NonZeroU8" => Some("u8"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- => Some("crate::c_types::PublicKey"),
- "bitcoin::secp256k1::Signature" => Some("crate::c_types::Signature"),
- "bitcoin::secp256k1::recovery::RecoverableSignature" => Some("crate::c_types::RecoverableSignature"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if is_ref => Some("*const [u8; 32]"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if !is_ref => Some("crate::c_types::SecretKey"),
- "bitcoin::secp256k1::Error"|"secp256k1::Error"
- if !is_ref => Some("crate::c_types::Secp256k1Error"),
+ "secp256k1::PublicKey"|"bitcoin::secp256k1::PublicKey" => Some("crate::c_types::PublicKey"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some("crate::c_types::Signature"),
+ "bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some("crate::c_types::RecoverableSignature"),
+ "bitcoin::secp256k1::SecretKey" if is_ref => Some("*const [u8; 32]"),
+ "bitcoin::secp256k1::SecretKey" if !is_ref => Some("crate::c_types::SecretKey"),
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice"),
"bitcoin::blockdata::script::Script" if !is_ref => Some("crate::c_types::derived::CVec_u8Z"),
"bitcoin::blockdata::transaction::OutPoint" => Some("crate::lightning::chain::transaction::OutPoint"),
"str" if is_ref => Some(""),
"alloc::string::String"|"String" => Some(""),
- "std::io::Error" if !is_ref => Some(""),
+ "std::io::Error"|"lightning::io::Error" => Some(""),
// Note that we'll panic for String if is_ref, as we only have non-owned memory, we
// cannot create a &String.
"core::convert::Infallible" => Some("panic!(\"You must never construct a NotConstructable! : "),
+ "bitcoin::bech32::Error"|"bech32::Error" if !is_ref => Some(""),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error" if !is_ref => Some(""),
+
+ "core::num::ParseIntError" => Some("u8::from_str_radix(\" a\", 10).unwrap_err() /*"),
+ "core::str::Utf8Error" => Some("core::str::from_utf8(&[0xff]).unwrap_err() /*"),
+
"std::time::Duration"|"core::time::Duration" => Some("core::time::Duration::from_secs("),
"std::time::SystemTime" => Some("(::std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs("),
"bitcoin::bech32::u5"|"bech32::u5" => Some(""),
"core::num::NonZeroU8" => Some("core::num::NonZeroU8::new("),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- if is_ref => Some("&"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- => Some(""),
- "bitcoin::secp256k1::Signature" if is_ref => Some("&"),
- "bitcoin::secp256k1::Signature" => Some(""),
- "bitcoin::secp256k1::recovery::RecoverableSignature" => Some(""),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if is_ref => Some("&::bitcoin::secp256k1::key::SecretKey::from_slice(&unsafe { *"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if !is_ref => Some(""),
+ "bitcoin::secp256k1::PublicKey"|"secp256k1::PublicKey" if is_ref => Some("&"),
+ "bitcoin::secp256k1::PublicKey"|"secp256k1::PublicKey" => Some(""),
+ "bitcoin::secp256k1::ecdsa::Signature" if is_ref => Some("&"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some(""),
+ "bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(""),
+ "bitcoin::secp256k1::SecretKey" if is_ref => Some("&::bitcoin::secp256k1::SecretKey::from_slice(&unsafe { *"),
+ "bitcoin::secp256k1::SecretKey" if !is_ref => Some(""),
"bitcoin::blockdata::script::Script" if is_ref => Some("&::bitcoin::blockdata::script::Script::from(Vec::from("),
"bitcoin::blockdata::script::Script" if !is_ref => Some("::bitcoin::blockdata::script::Script::from("),
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" if is_ref => Some("&"),
"str" if is_ref => Some(".into_str()"),
"alloc::string::String"|"String" => Some(".into_string()"),
- "std::io::Error" if !is_ref => Some(".to_rust()"),
+ "std::io::Error"|"lightning::io::Error" => Some(".to_rust()"),
"core::convert::Infallible" => Some("\")"),
+ "bitcoin::bech32::Error"|"bech32::Error" if !is_ref => Some(".into_rust()"),
+ "bitcoin::secp256k1::Error"|"secp256k1::Error" if !is_ref => Some(".into_rust()"),
+
+ "core::num::ParseIntError" => Some("*/"),
+ "core::str::Utf8Error" => Some("*/"),
+
"std::time::Duration"|"core::time::Duration" => Some(")"),
"std::time::SystemTime" => Some("))"),
"bitcoin::bech32::u5"|"bech32::u5" => Some(".into()"),
"core::num::NonZeroU8" => Some(").expect(\"Value must be non-zero\")"),
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- => Some(".into_rust()"),
- "bitcoin::secp256k1::Signature" => Some(".into_rust()"),
- "bitcoin::secp256k1::recovery::RecoverableSignature" => Some(".into_rust()"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if !is_ref => Some(".into_rust()"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if is_ref => Some("}[..]).unwrap()"),
+ "bitcoin::secp256k1::PublicKey"|"secp256k1::PublicKey" => Some(".into_rust()"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some(".into_rust()"),
+ "bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(".into_rust()"),
+ "bitcoin::secp256k1::SecretKey" if !is_ref => Some(".into_rust()"),
+ "bitcoin::secp256k1::SecretKey" if is_ref => Some("}[..]).unwrap()"),
"bitcoin::blockdata::script::Script" if is_ref => Some(".to_slice()))"),
"bitcoin::blockdata::script::Script" if !is_ref => Some(".into_rust())"),
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some(".into_bitcoin()"),
"std::time::Duration"|"core::time::Duration" => Some(""),
"std::time::SystemTime" => Some(""),
- "std::io::Error" if !is_ref => Some("crate::c_types::IOError::from_rust("),
+ "std::io::Error"|"lightning::io::Error" => Some("crate::c_types::IOError::from_rust("),
"core::fmt::Arguments" => Some("alloc::format!(\"{}\", "),
"core::convert::Infallible" => Some("panic!(\"Cannot construct an Infallible: "),
- "bitcoin::bech32::u5"|"bech32::u5" => Some(""),
-
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- => Some("crate::c_types::PublicKey::from_rust(&"),
- "bitcoin::secp256k1::Signature" => Some("crate::c_types::Signature::from_rust(&"),
- "bitcoin::secp256k1::recovery::RecoverableSignature" => Some("crate::c_types::RecoverableSignature::from_rust(&"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if is_ref => Some(""),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if !is_ref => Some("crate::c_types::SecretKey::from_rust("),
+ "bitcoin::bech32::Error"|"bech32::Error"
+ if !is_ref => Some("crate::c_types::Bech32Error::from_rust("),
"bitcoin::secp256k1::Error"|"secp256k1::Error"
if !is_ref => Some("crate::c_types::Secp256k1Error::from_rust("),
+
+ "core::num::ParseIntError" => Some("crate::c_types::Error { _dummy: 0 } /*"),
+ "core::str::Utf8Error" => Some("crate::c_types::Error { _dummy: 0 } /*"),
+
+ "bitcoin::bech32::u5"|"bech32::u5" => Some(""),
+
+ "bitcoin::secp256k1::PublicKey"|"secp256k1::PublicKey" => Some("crate::c_types::PublicKey::from_rust(&"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some("crate::c_types::Signature::from_rust(&"),
+ "bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some("crate::c_types::RecoverableSignature::from_rust(&"),
+ "bitcoin::secp256k1::SecretKey" if is_ref => Some(""),
+ "bitcoin::secp256k1::SecretKey" if !is_ref => Some("crate::c_types::SecretKey::from_rust("),
"bitcoin::blockdata::script::Script" if is_ref => Some("crate::c_types::u8slice::from_slice(&"),
"bitcoin::blockdata::script::Script" if !is_ref => Some(""),
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" if is_ref => Some("crate::c_types::Transaction::from_bitcoin("),
"std::time::Duration"|"core::time::Duration" => Some(".as_secs()"),
"std::time::SystemTime" => Some(".duration_since(::std::time::SystemTime::UNIX_EPOCH).expect(\"Times must be post-1970\").as_secs()"),
- "std::io::Error" if !is_ref => Some(")"),
+ "std::io::Error"|"lightning::io::Error" => Some(")"),
"core::fmt::Arguments" => Some(").into()"),
"core::convert::Infallible" => Some("\")"),
- "bitcoin::bech32::u5"|"bech32::u5" => Some(".into()"),
-
- "bitcoin::secp256k1::key::PublicKey"|"bitcoin::secp256k1::PublicKey"|"secp256k1::key::PublicKey"
- => Some(")"),
- "bitcoin::secp256k1::Signature" => Some(")"),
- "bitcoin::secp256k1::recovery::RecoverableSignature" => Some(")"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
+ "bitcoin::secp256k1::Error"|"bech32::Error"
if !is_ref => Some(")"),
- "bitcoin::secp256k1::key::SecretKey"|"bitcoin::secp256k1::SecretKey"
- if is_ref => Some(".as_ref()"),
"bitcoin::secp256k1::Error"|"secp256k1::Error"
if !is_ref => Some(")"),
+
+ "core::num::ParseIntError" => Some("*/"),
+ "core::str::Utf8Error" => Some("*/"),
+
+ "bitcoin::bech32::u5"|"bech32::u5" => Some(".into()"),
+
+ "bitcoin::secp256k1::PublicKey"|"secp256k1::PublicKey" => Some(")"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some(")"),
+ "bitcoin::secp256k1::ecdsa::RecoverableSignature" => Some(")"),
+ "bitcoin::secp256k1::SecretKey" if !is_ref => Some(")"),
+ "bitcoin::secp256k1::SecretKey" if is_ref => Some(".as_ref()"),
"bitcoin::blockdata::script::Script" if is_ref => Some("[..])"),
"bitcoin::blockdata::script::Script" if !is_ref => Some(".into_bytes().into()"),
"bitcoin::blockdata::transaction::Transaction"|"bitcoin::Transaction" => Some(")"),
fn empty_val_check_suffix_from_path(&self, full_path: &str) -> Option<&str> {
match full_path {
"lightning::ln::PaymentSecret" => Some(".data == [0; 32]"),
- "secp256k1::key::PublicKey"|"bitcoin::secp256k1::key::PublicKey" => Some(".is_null()"),
- "bitcoin::secp256k1::Signature" => Some(".is_null()"),
+ "secp256k1::PublicKey"|"bitcoin::secp256k1::PublicKey" => Some(".is_null()"),
+ "bitcoin::secp256k1::ecdsa::Signature" => Some(".is_null()"),
_ => None
}
}
}
},
"Option" => {
+ let mut is_contained_ref = false;
let contained_struct = if let Some(syn::Type::Path(p)) = single_contained {
Some(self.resolve_path(&p.path, generics))
} else if let Some(syn::Type::Reference(r)) = single_contained {
+ is_contained_ref = true;
if let syn::Type::Path(p) = &*r.elem {
Some(self.resolve_path(&p.path, generics))
} else { None }
} else { None };
if let Some(inner_path) = contained_struct {
+ let only_contained_has_inner = self.c_type_has_inner_from_path(&inner_path);
if self.c_type_has_inner_from_path(&inner_path) {
let is_inner_ref = if let Some(syn::Type::Reference(_)) = single_contained { true } else { false };
if is_ref {
], " }", ContainerPrefixLocation::OutsideConv));
}
} else if self.is_primitive(&inner_path) || self.c_type_from_path(&inner_path, false, false).is_none() {
- let inner_name = self.get_c_mangled_container_type(vec![single_contained.unwrap()], generics, "Option").unwrap();
- return Some(("if ", vec![
- (format!(".is_none() {{ {}::None }} else {{ {}::Some(",
- inner_name, inner_name),
- format!("{}.unwrap()", var_access))
- ], ") }", ContainerPrefixLocation::PerConv));
+ if self.is_primitive(&inner_path) || (!is_contained_ref && !is_ref) || only_contained_has_inner {
+ let inner_name = self.get_c_mangled_container_type(vec![single_contained.unwrap()], generics, "Option").unwrap();
+ return Some(("if ", vec![
+ (format!(".is_none() {{ {}::None }} else {{ {}::Some(", inner_name, inner_name),
+ format!("{}.unwrap()", var_access))
+ ], ") }", ContainerPrefixLocation::PerConv));
+ } else {
+ let inner_name = self.get_c_mangled_container_type(vec![single_contained.unwrap()], generics, "Option").unwrap();
+ return Some(("if ", vec![
+ (format!(".is_none() {{ {}::None }} else {{ {}::Some(/* WARNING: CLONING CONVERSION HERE! &Option<Enum> is otherwise un-expressable. */", inner_name, inner_name),
+ format!("{}.clone().unwrap()", var_access))
+ ], ") }", ContainerPrefixLocation::PerConv));
+ }
} else {
// If c_type_from_path is some (ie there's a manual mapping for the inner
// type), lean on write_empty_rust_val, below.
// Returns prefix + Vec<(prefix, var-name-to-inline-convert)> + suffix
// expecting one element in the vec per generic type, each of which is inline-converted
-> Option<(&'b str, Vec<(String, String)>, &'b str, ContainerPrefixLocation)> {
+ let mut only_contained_has_inner = false;
+ let only_contained_resolved = if let Some(syn::Type::Path(p)) = single_contained {
+ let res = self.resolve_path(&p.path, generics);
+ only_contained_has_inner = self.c_type_has_inner_from_path(&res);
+ Some(res)
+ } else { None };
match full_path {
"Result" if !is_ref => {
Some(("match ",
("), false => Err(".to_string(), format!("(*unsafe {{ Box::from_raw(<*mut _>::take_ptr(&mut {}.contents.err)) }})", var_access))],
")}", ContainerPrefixLocation::PerConv))
},
- "Slice" if is_ref => {
+ "Slice" if is_ref && only_contained_has_inner => {
Some(("Vec::new(); for mut item in ", vec![(format!(".as_slice().iter() {{ local_{}.push(", var_name), "item".to_string())], "); }", ContainerPrefixLocation::PerConv))
},
"Vec"|"Slice" => {
Some(("Vec::new(); for mut item in ", vec![(format!(".into_rust().drain(..) {{ local_{}.push(", var_name), "item".to_string())], "); }", ContainerPrefixLocation::PerConv))
},
"Option" => {
- if let Some(syn::Type::Path(p)) = single_contained {
- let inner_path = self.resolve_path(&p.path, generics);
- if self.is_primitive(&inner_path) {
+ if let Some(resolved) = only_contained_resolved {
+ if self.is_primitive(&resolved) {
return Some(("if ", vec![(".is_some() { Some(".to_string(), format!("{}.take()", var_access))], ") } else { None }", ContainerPrefixLocation::NoPrefix))
- } else if self.c_type_has_inner_from_path(&inner_path) {
+ } else if only_contained_has_inner {
if is_ref {
return Some(("if ", vec![(".inner.is_null() { None } else { Some((*".to_string(), format!("{}", var_access))], ").clone()) }", ContainerPrefixLocation::PerConv))
} else {
// *** Type definition during main.rs processing ***
// *************************************************
- pub fn get_declared_type(&'a self, ident: &syn::Ident) -> Option<&'a DeclType<'c>> {
- self.types.get_declared_type(ident)
- }
/// Returns true if the object at the given path is mapped as X { inner: *mut origX, .. }.
pub fn c_type_has_inner_from_path(&self, full_path: &str) -> bool {
self.crate_types.opaques.get(full_path).is_some()
self.types.maybe_resolve_ident(id)
}
- pub fn maybe_resolve_non_ignored_ident(&self, id: &syn::Ident) -> Option<String> {
- self.types.maybe_resolve_non_ignored_ident(id)
- }
-
pub fn maybe_resolve_path(&self, p_arg: &syn::Path, generics: Option<&GenericTypes>) -> Option<String> {
self.types.maybe_resolve_path(p_arg, generics)
}
write!(w, ">").unwrap();
}
pub fn write_rust_type<W: std::io::Write>(&self, w: &mut W, generics: Option<&GenericTypes>, t: &syn::Type) {
- match t {
+ match generics.resolve_type(t) {
syn::Type::Path(p) => {
if p.qself.is_some() {
unimplemented!();
}
}
- if let Some((prefix, conversions, suffix, prefix_location)) = container_lookup(&$container_type, is_ref && ty_has_inner, only_contained_type, ident, var) {
+ if let Some((prefix, conversions, suffix, prefix_location)) = container_lookup(&$container_type, is_ref, only_contained_type, ident, var) {
assert_eq!(conversions.len(), $args_len);
write!(w, "let mut local_{}{} = ", ident,
if (!to_c && needs_ref_map) || (to_c && $container_type == "Option" && contains_slice) {"_base"} else { "" }).unwrap();
}
write!(w, "let mut local_{} = (", ident).unwrap();
for (idx, elem) in t.elems.iter().enumerate() {
+ let real_elem = generics.resolve_type(&elem);
let ty_has_inner = {
if to_c {
// "To C ptr_for_ref" means "return the regular object with
// if we're about to set ty_has_inner.
ptr_for_ref = true;
}
- if let syn::Type::Reference(t) = elem {
+ if let syn::Type::Reference(t) = real_elem {
if let syn::Type::Path(p) = &*t.elem {
self.c_type_has_inner_from_path(&self.resolve_path(&p.path, generics))
} else { false }
- } else if let syn::Type::Path(p) = elem {
+ } else if let syn::Type::Path(p) = real_elem {
self.c_type_has_inner_from_path(&self.resolve_path(&p.path, generics))
} else { false }
};
if idx != 0 { write!(w, ", ").unwrap(); }
- var_prefix(w, elem, generics, is_ref && ty_has_inner, ptr_for_ref, false);
+ var_prefix(w, real_elem, generics, is_ref && ty_has_inner, ptr_for_ref, false);
if is_ref && ty_has_inner {
// For ty_has_inner, the regular var_prefix mapping will take a
// reference, so deref once here to make sure we keep the original ref.
// hope the type is Clonable and use that.
write!(w, ".clone()").unwrap();
}
- var_suffix(w, elem, generics, is_ref && ty_has_inner, ptr_for_ref, false);
+ var_suffix(w, real_elem, generics, is_ref && ty_has_inner, ptr_for_ref, false);
}
write!(w, "){};", if to_c { ".into()" } else { "" }).unwrap();
true
}
pub fn write_to_c_conversion_new_var_inner<W: std::io::Write>(&self, w: &mut W, ident: &syn::Ident, var_access: &str, t: &syn::Type, generics: Option<&GenericTypes>, ptr_for_ref: bool, from_ownable_ref: bool) -> bool {
- self.write_conversion_new_var_intern(w, ident, var_access, t, generics, false, ptr_for_ref, true, from_ownable_ref,
+ self.write_conversion_new_var_intern(w, ident, var_access, t, generics, from_ownable_ref, ptr_for_ref, true, from_ownable_ref,
&|a, b| self.to_c_conversion_new_var_from_path(a, b),
&|a, b, c, d, e| self.to_c_conversion_container_new_var(generics, a, b, c, d, e),
// We force ptr_for_ref here since we can't generate a ref on one line and use it later
if !c_ty {
self.write_rust_path(w, generics, path);
} else {
- write!(w, "{}", full_path).unwrap();
+ // We shouldn't be mapping references in types, so panic here
+ unimplemented!();
}
} else if is_ref {
write!(w, "&{}{}{}", if is_mut { "mut " } else { "" }, crate_pfx, full_path).unwrap();
assert!(self.write_c_type_intern(w, t, generics, false, false, ptr_for_ref, true, false));
}
pub fn understood_c_path(&self, p: &syn::Path) -> bool {
- if p.leading_colon.is_some() { return false; }
self.write_c_path_intern(&mut std::io::sink(), p, None, false, false, false, false, true)
}
pub fn understood_c_type(&self, t: &syn::Type, generics: Option<&GenericTypes>) -> bool {