Skip to content

Commit

Permalink
bindgen
Browse files Browse the repository at this point in the history
  • Loading branch information
kennykerr committed Jan 15, 2025
1 parent 33bb2f2 commit 76b0602
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 30 deletions.
34 changes: 28 additions & 6 deletions crates/libs/bindgen/src/types/cpp_delegate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(&param.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);
Expand All @@ -62,7 +62,7 @@ impl CppDelegate {
quote! {
#arches
#cfg
pub type #name = Option<unsafe extern "system" fn(#(#params),*) #return_sig>;
pub type #name = Option<unsafe extern "system" fn(#params) #return_sig>;
}
}

Expand All @@ -72,3 +72,25 @@ impl CppDelegate {
.dependencies(dependencies);
}
}

fn write_param(writer: &Writer, ty: &Type, param: Param) -> TokenStream {
let name = to_ident(&param.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>, }
}
}
6 changes: 1 addition & 5 deletions crates/libs/bindgen/src/types/cpp_interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
6 changes: 1 addition & 5 deletions crates/libs/bindgen/src/types/interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
28 changes: 14 additions & 14 deletions crates/libs/bindgen/src/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Expand All @@ -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();
Expand All @@ -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();
Expand Down Expand Up @@ -474,14 +470,18 @@ 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 {
let tokens = self.write_name(writer);

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
Expand All @@ -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 {
Expand Down

0 comments on commit 76b0602

Please sign in to comment.