From 76b06025c1cfbbc6344854f27fb1143c1ca724e0 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Wed, 15 Jan 2025 11:00:11 -0600 Subject: [PATCH] bindgen --- crates/libs/bindgen/src/types/cpp_delegate.rs | 34 +++++++++++++++---- .../libs/bindgen/src/types/cpp_interface.rs | 6 +--- crates/libs/bindgen/src/types/interface.rs | 6 +--- crates/libs/bindgen/src/types/mod.rs | 28 +++++++-------- 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/crates/libs/bindgen/src/types/cpp_delegate.rs b/crates/libs/bindgen/src/types/cpp_delegate.rs index dbb471b280..83e5c84fc5 100644 --- a/crates/libs/bindgen/src/types/cpp_delegate.rs +++ b/crates/libs/bindgen/src/types/cpp_delegate.rs @@ -49,11 +49,11 @@ impl CppDelegate { let method = self.method(); let signature = method.signature(type_name.namespace(), &[]); - let params = signature.params.iter().map(|(ty, param)| { - let name = to_ident(¶m.name().to_lowercase()); - let ty = ty.write_default(writer); - quote! { #name: #ty } - }); + let mut params = quote! {}; + + for (ty, param) in &signature.params { + params.combine(write_param(writer, ty, *param)); + } let return_sig = writer.write_return_sig(method, &signature, false); let arches = write_arches(self.def); @@ -62,7 +62,7 @@ impl CppDelegate { quote! { #arches #cfg - pub type #name = Option; + pub type #name = Option; } } @@ -72,3 +72,25 @@ impl CppDelegate { .dependencies(dependencies); } } + +fn write_param(writer: &Writer, ty: &Type, param: Param) -> TokenStream { + let name = to_ident(¶m.name().to_lowercase()); + let type_name = ty.write_name(writer); + + if writer.config.sys { + return quote! { #name: #type_name, }; + } + + if param.flags().contains(ParamAttributes::Out) { + if ty.deref().is_interface() { + let type_name = ty.deref().write_name(writer); + quote! { #name: windows_core::OutRef<'_, #type_name>, } + } else { + quote! { #name: #type_name, } + } + } else if ty.is_copyable() { + quote! { #name: #type_name, } + } else { + quote! { #name: windows_core::Ref<#type_name>, } + } +} diff --git a/crates/libs/bindgen/src/types/cpp_interface.rs b/crates/libs/bindgen/src/types/cpp_interface.rs index f1a95bd09a..8c74bd4c7b 100644 --- a/crates/libs/bindgen/src/types/cpp_interface.rs +++ b/crates/libs/bindgen/src/types/cpp_interface.rs @@ -402,11 +402,7 @@ impl CppInterface { } pub fn write_name(&self, writer: &Writer) -> TokenStream { - if writer.config.sys { - quote! { *mut core::ffi::c_void } - } else { - self.type_name().write(writer, &[]) - } + self.type_name().write(writer, &[]) } fn write_vtbl_name(&self, writer: &Writer) -> TokenStream { diff --git a/crates/libs/bindgen/src/types/interface.rs b/crates/libs/bindgen/src/types/interface.rs index 71bd0e9e8f..938191a20a 100644 --- a/crates/libs/bindgen/src/types/interface.rs +++ b/crates/libs/bindgen/src/types/interface.rs @@ -500,11 +500,7 @@ impl Interface { } pub fn write_name(&self, writer: &Writer) -> TokenStream { - if writer.config.sys { - quote! { *mut core::ffi::c_void } - } else { - self.type_name().write(writer, &self.generics) - } + self.type_name().write(writer, &self.generics) } fn write_vtbl_name(&self, writer: &Writer) -> TokenStream { diff --git a/crates/libs/bindgen/src/types/mod.rs b/crates/libs/bindgen/src/types/mod.rs index e56750d828..6ac390c679 100644 --- a/crates/libs/bindgen/src/types/mod.rs +++ b/crates/libs/bindgen/src/types/mod.rs @@ -364,6 +364,10 @@ impl Type { } pub fn write_name(&self, writer: &Writer) -> TokenStream { + if writer.config.sys && self.is_interface() { + return quote! { *mut core::ffi::c_void }; + } + match self { Self::Void => quote! { core::ffi::c_void }, Self::Bool => quote! { bool }, @@ -385,12 +389,8 @@ impl Type { quote! { #name BSTR } } Self::IUnknown => { - if writer.config.sys { - quote! { *mut core::ffi::c_void } - } else { - let name = writer.write_core(); - quote! { #name IUnknown } - } + let name = writer.write_core(); + quote! { #name IUnknown } } Self::GUID => { let name = writer.write_core(); @@ -409,12 +409,8 @@ impl Type { quote! { #name HSTRING } } Self::Object => { - if writer.config.sys { - quote! { *mut core::ffi::c_void } - } else { - let name = writer.write_core(); - quote! { #name IInspectable } - } + let name = writer.write_core(); + quote! { #name IInspectable } } Self::PSTR => { let name = writer.write_core(); @@ -474,6 +470,10 @@ impl Type { } pub fn write_default(&self, writer: &Writer) -> TokenStream { + if writer.config.sys { + return self.write_name(writer); + } + if let Self::Array(ty) = self { ty.write_default(writer) } else { @@ -481,7 +481,7 @@ impl Type { if matches!(self, Self::Param(_)) { quote! { <#tokens as windows_core::Type<#tokens>>::Default } - } else if self.is_interface() && !writer.config.sys { + } else if self.is_interface() { quote! { Option<#tokens> } } else { tokens @@ -503,7 +503,7 @@ impl Type { pub fn write_abi(&self, writer: &Writer) -> TokenStream { if writer.config.sys { - return self.write_default(writer); + return self.write_name(writer); } match self {