Make Types available in expand_extern_type

This commit is contained in:
David Tolnay 2020-11-02 12:33:13 -08:00
parent babf65ca00
commit 5e88a0d840
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -208,7 +208,7 @@ fn expand_cxx_function_decl(efn: &ExternFn, types: &Types) -> TokenStream {
}); });
let args = efn.args.iter().map(|arg| { let args = efn.args.iter().map(|arg| {
let ident = &arg.ident; let ident = &arg.ident;
let ty = expand_extern_type(&arg.ty); let ty = expand_extern_type(&arg.ty, types);
if arg.ty == RustString { if arg.ty == RustString {
quote!(#ident: *const #ty) quote!(#ident: *const #ty)
} else if let Type::RustVec(_) = arg.ty { } else if let Type::RustVec(_) = arg.ty {
@ -229,7 +229,7 @@ fn expand_cxx_function_decl(efn: &ExternFn, types: &Types) -> TokenStream {
}; };
let mut outparam = None; let mut outparam = None;
if indirect_return(efn, types) { if indirect_return(efn, types) {
let ret = expand_extern_type(efn.ret.as_ref().unwrap()); let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types);
outparam = Some(quote!(__return: *mut #ret)); outparam = Some(quote!(__return: *mut #ret));
} }
let link_name = mangle::extern_fn(efn, types); let link_name = mangle::extern_fn(efn, types);
@ -323,7 +323,7 @@ fn expand_cxx_function_shim(efn: &ExternFn, types: &Types) -> TokenStream {
.collect::<TokenStream>(); .collect::<TokenStream>();
let local_name = format_ident!("__{}", efn.name.rust); let local_name = format_ident!("__{}", efn.name.rust);
let call = if indirect_return { let call = if indirect_return {
let ret = expand_extern_type(efn.ret.as_ref().unwrap()); let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types);
setup.extend(quote! { setup.extend(quote! {
let mut __return = ::std::mem::MaybeUninit::<#ret>::uninit(); let mut __return = ::std::mem::MaybeUninit::<#ret>::uninit();
}); });
@ -508,7 +508,7 @@ fn expand_rust_function_shim_impl(
}); });
let args = sig.args.iter().map(|arg| { let args = sig.args.iter().map(|arg| {
let ident = &arg.ident; let ident = &arg.ident;
let ty = expand_extern_type(&arg.ty); let ty = expand_extern_type(&arg.ty, types);
if types.needs_indirect_abi(&arg.ty) { if types.needs_indirect_abi(&arg.ty) {
quote!(#ident: *mut #ty) quote!(#ident: *mut #ty)
} else { } else {
@ -609,7 +609,7 @@ fn expand_rust_function_shim_impl(
let mut outparam = None; let mut outparam = None;
let indirect_return = indirect_return(sig, types); let indirect_return = indirect_return(sig, types);
if indirect_return { if indirect_return {
let ret = expand_extern_type(sig.ret.as_ref().unwrap()); let ret = expand_extern_type(sig.ret.as_ref().unwrap(), types);
outparam = Some(quote!(__return: *mut #ret,)); outparam = Some(quote!(__return: *mut #ret,));
} }
if sig.throws { if sig.throws {
@ -939,15 +939,15 @@ fn indirect_return(sig: &Signature, types: &Types) -> bool {
.map_or(false, |ret| sig.throws || types.needs_indirect_abi(ret)) .map_or(false, |ret| sig.throws || types.needs_indirect_abi(ret))
} }
fn expand_extern_type(ty: &Type) -> TokenStream { fn expand_extern_type(ty: &Type, types: &Types) -> TokenStream {
match ty { match ty {
Type::Ident(ident) if ident.rust == RustString => quote!(::cxx::private::RustString), Type::Ident(ident) if ident.rust == RustString => quote!(::cxx::private::RustString),
Type::RustBox(ty) | Type::UniquePtr(ty) => { Type::RustBox(ty) | Type::UniquePtr(ty) => {
let inner = expand_extern_type(&ty.inner); let inner = expand_extern_type(&ty.inner, types);
quote!(*mut #inner) quote!(*mut #inner)
} }
Type::RustVec(ty) => { Type::RustVec(ty) => {
let elem = expand_extern_type(&ty.inner); let elem = expand_extern_type(&ty.inner, types);
quote!(::cxx::private::RustVec<#elem>) quote!(::cxx::private::RustVec<#elem>)
} }
Type::Ref(ty) => { Type::Ref(ty) => {
@ -957,7 +957,7 @@ fn expand_extern_type(ty: &Type) -> TokenStream {
quote!(&#mutability ::cxx::private::RustString) quote!(&#mutability ::cxx::private::RustString)
} }
Type::RustVec(ty) => { Type::RustVec(ty) => {
let inner = expand_extern_type(&ty.inner); let inner = expand_extern_type(&ty.inner, types);
quote!(&#mutability ::cxx::private::RustVec<#inner>) quote!(&#mutability ::cxx::private::RustVec<#inner>)
} }
_ => quote!(#ty), _ => quote!(#ty),
@ -974,6 +974,6 @@ fn expand_extern_return_type(ret: &Option<Type>, types: &Types) -> TokenStream {
Some(ret) if !types.needs_indirect_abi(ret) => ret, Some(ret) if !types.needs_indirect_abi(ret) => ret,
_ => return TokenStream::new(), _ => return TokenStream::new(),
}; };
let ty = expand_extern_type(ret); let ty = expand_extern_type(ret, types);
quote!(-> #ty) quote!(-> #ty)
} }