diff --git a/crates/libs/bindgen/src/metadata.rs b/crates/libs/bindgen/src/metadata.rs index 0f34fea193..34e1ff6d3b 100644 --- a/crates/libs/bindgen/src/metadata.rs +++ b/crates/libs/bindgen/src/metadata.rs @@ -741,7 +741,7 @@ pub fn type_def_bases(mut row: TypeDef) -> Vec { loop { match row.extends() { Some(base) if base != TypeName::Object => { - row = row.reader().get_type_def(base.namespace, base.name).next().expect("Type not found"); + row = row.reader().get_type_def(base.namespace, base.name).next().unwrap_or_else(|| panic!("Type not found: {}", base)); bases.push(row); } _ => break, diff --git a/crates/libs/bindgen/src/rust/cfg.rs b/crates/libs/bindgen/src/rust/cfg.rs index 283953edd8..9d9f1aa146 100644 --- a/crates/libs/bindgen/src/rust/cfg.rs +++ b/crates/libs/bindgen/src/rust/cfg.rs @@ -40,13 +40,7 @@ fn field_cfg_combine(writer: &Writer, row: metadata::Field, enclosing: Option Cfg { - let mut cfg = Cfg::default(); - type_def_cfg_combine(writer, row, generics, &mut cfg); - cfg_add_attributes(&mut cfg, row); - cfg -} -pub fn type_def_cfg_impl(writer: &Writer, def: metadata::TypeDef, generics: &[metadata::Type]) -> Cfg { +pub fn type_def_cfg(writer: &Writer, def: metadata::TypeDef, generics: &[metadata::Type]) -> Cfg { let mut cfg = Cfg { implement: true, ..Default::default() }; fn combine(writer: &Writer, def: metadata::TypeDef, generics: &[metadata::Type], cfg: &mut Cfg) { @@ -89,11 +83,19 @@ pub fn type_def_cfg_combine(writer: &Writer, row: metadata::TypeDef, generics: & } } metadata::TypeKind::Interface => { - if !row.flags().contains(metadata::TypeAttributes::WindowsRuntime) { - for def in metadata::type_def_vtables(row) { - if let metadata::Type::TypeDef(def, _) = def { - cfg.add_feature(def.namespace()); - } + fn combine(writer: &Writer, def: metadata::TypeDef, generics: &[metadata::Type], cfg: &mut Cfg) { + type_def_cfg_combine(writer, def, generics, cfg); + + for method in def.methods() { + signature_cfg_combine(writer, &method.signature(generics), cfg); + } + } + + combine(writer, row, generics, cfg); + + for interface in metadata::type_interfaces(&metadata::Type::TypeDef(row, generics.to_vec())) { + if let metadata::Type::TypeDef(row, generics) = interface.ty { + combine(writer, row, &generics, cfg); } } } diff --git a/crates/libs/bindgen/src/rust/extensions/mod/Win32/System/Com/IDispatch.rs b/crates/libs/bindgen/src/rust/extensions/mod/Win32/System/Com/IDispatch.rs index 8ca7dff38d..897a7b8ba6 100644 --- a/crates/libs/bindgen/src/rust/extensions/mod/Win32/System/Com/IDispatch.rs +++ b/crates/libs/bindgen/src/rust/extensions/mod/Win32/System/Com/IDispatch.rs @@ -1,3 +1,4 @@ +#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))] impl From for windows_core::VARIANT { fn from(value: IDispatch) -> Self { unsafe { @@ -10,6 +11,7 @@ impl From for windows_core::VARIANT { } } +#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))] impl From for windows_core::PROPVARIANT { fn from(value: IDispatch) -> Self { unsafe { @@ -22,6 +24,7 @@ impl From for windows_core::PROPVARIANT { } } +#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))] impl TryFrom<&windows_core::VARIANT> for IDispatch { type Error = windows_core::Error; fn try_from(from: &windows_core::VARIANT) -> windows_core::Result { @@ -37,6 +40,7 @@ impl TryFrom<&windows_core::VARIANT> for IDispatch { } } +#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))] impl TryFrom<&windows_core::PROPVARIANT> for IDispatch { type Error = windows_core::Error; fn try_from(from: &windows_core::PROPVARIANT) -> windows_core::Result { diff --git a/crates/libs/bindgen/src/rust/implements.rs b/crates/libs/bindgen/src/rust/implements.rs index 8007578e0d..d4f4e95035 100644 --- a/crates/libs/bindgen/src/rust/implements.rs +++ b/crates/libs/bindgen/src/rust/implements.rs @@ -14,7 +14,7 @@ pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream { let constraints = writer.generic_constraints(generics); let generic_names = writer.generic_names(generics); let named_phantoms = writer.generic_named_phantoms(generics); - let cfg = cfg::type_def_cfg_impl(writer, def, generics); + let cfg = cfg::type_def_cfg(writer, def, generics); let features = writer.cfg_features(&cfg); let mut requires = quote! {}; let type_ident = quote! { #type_ident<#generic_names> }; diff --git a/crates/libs/bindgen/src/rust/index.rs b/crates/libs/bindgen/src/rust/index.rs index f7466de6a3..79310755de 100644 --- a/crates/libs/bindgen/src/rust/index.rs +++ b/crates/libs/bindgen/src/rust/index.rs @@ -36,8 +36,12 @@ pub fn gen_index(writer: &Writer) -> String { cfg = match item { Item::Type(def) => { - index_item.name = def.name().to_string(); - cfg.union(&type_def_cfg(writer, def, &[])) + if def.extends() == Some(metadata::TypeName::Attribute) { + cfg + } else { + index_item.name = def.name().to_string(); + cfg.union(&type_def_cfg(writer, def, &[])) + } } Item::Const(field) => { index_item.name = field.name().to_string(); diff --git a/crates/libs/bindgen/src/rust/writer.rs b/crates/libs/bindgen/src/rust/writer.rs index 6a01363d8f..06aca35400 100644 --- a/crates/libs/bindgen/src/rust/writer.rs +++ b/crates/libs/bindgen/src/rust/writer.rs @@ -430,25 +430,6 @@ impl Writer { compact } - fn cfg_not_features(&self, cfg: &cfg::Cfg) -> TokenStream { - let features = self.cfg_features_imp(cfg, self.namespace); - if features.is_empty() { - quote! {} - } else { - match features.len() { - 0 => quote! {}, - 1 => { - let features = features.iter().cloned().map(to_feature); - quote! { #[cfg(not(#(feature = #features)*))] } - } - _ => { - let features = features.iter().cloned().map(to_feature); - quote! { #[cfg(not(all( #(feature = #features),* )))] } - } - } - } - } - // // Other helpers // @@ -793,24 +774,10 @@ impl Writer { } let name = method_names.add(method); let signature = metadata::method_def_signature(def.namespace(), method, generics); - let mut cfg = cfg::signature_cfg(self, method); let signature = self.vtbl_signature(def, false, &signature); - cfg.add_feature(def.namespace()); - let cfg_all = self.cfg_features(&cfg); - let cfg_not = self.cfg_not_features(&cfg); let signature = quote! { pub #name: unsafe extern "system" fn #signature, }; - - if cfg_all.is_empty() { - methods.combine(&signature); - } else { - methods.combine("e! { - #cfg_all - #signature - #cfg_not - #name: usize, - }); - } + methods.combine(&signature); } quote! {