diff --git a/crates/libs/bindgen/src/types/cpp_delegate.rs b/crates/libs/bindgen/src/types/cpp_delegate.rs index c2f4cd6a89..280df9e9ef 100644 --- a/crates/libs/bindgen/src/types/cpp_delegate.rs +++ b/crates/libs/bindgen/src/types/cpp_delegate.rs @@ -53,9 +53,11 @@ impl CppDelegate { self.dependencies(&mut dependencies); } + let arches = write_arches(self.def); let cfg = writer.write_cfg(self.def, type_name.namespace(), &dependencies, false); quote! { + #arches #cfg pub type #name = Option; } diff --git a/crates/libs/bindgen/src/types/cpp_fn.rs b/crates/libs/bindgen/src/types/cpp_fn.rs index 412b6423e2..6d5dbcc9bf 100644 --- a/crates/libs/bindgen/src/types/cpp_fn.rs +++ b/crates/libs/bindgen/src/types/cpp_fn.rs @@ -84,8 +84,11 @@ impl CppFn { } let link = self.write_link(writer, false); + let arches = write_arches(self.method); let cfg = writer.write_cfg(self.method, self.namespace, &dependencies, false); + let cfg = quote! { #arches #cfg }; let window_long = self.write_window_long(); + if writer.config.sys { return quote! { #cfg diff --git a/crates/libs/bindgen/src/types/cpp_struct.rs b/crates/libs/bindgen/src/types/cpp_struct.rs index 12bb5e1cf5..65d765bc8e 100644 --- a/crates/libs/bindgen/src/types/cpp_struct.rs +++ b/crates/libs/bindgen/src/types/cpp_struct.rs @@ -63,8 +63,9 @@ impl CppStruct { self.dependencies(&mut dependencies); } + let arches = write_arches(self.def); let cfg = writer.write_cfg(self.def, self.def.namespace(), &dependencies, false); - self.write_with_cfg(writer, &cfg) + self.write_with_cfg(writer, "e! { #arches #cfg }) } fn write_with_cfg(&self, writer: &Writer, cfg: &TokenStream) -> TokenStream { diff --git a/crates/libs/bindgen/src/writer/cfg.rs b/crates/libs/bindgen/src/writer/cfg.rs index 5b634f8442..588f42d16a 100644 --- a/crates/libs/bindgen/src/writer/cfg.rs +++ b/crates/libs/bindgen/src/writer/cfg.rs @@ -1,5 +1,36 @@ use super::*; +pub fn write_arches(row: R) -> TokenStream { + let mut tokens = quote! {}; + + if let Some(attribute) = row.find_attribute("SupportedArchitectureAttribute") { + if let Some((_, Value::I32(value))) = attribute.args().first() { + let mut arches = BTreeSet::new(); + + if value & 1 == 1 { + arches.insert("x86"); + } + + if value & 2 == 2 { + arches.insert("x86_64"); + arches.insert("arm64ec"); + } + + if value & 4 == 4 { + arches.insert("aarch64"); + } + + match arches.len() { + 0 => {} + 1 => tokens.combine(quote! { #[cfg(#(target_arch = #arches),*)] }), + _ => tokens.combine(quote! { #[cfg(any(#(target_arch = #arches),*))] }), + } + } + } + + tokens +} + impl Writer { pub fn write_cfg( &self, @@ -9,37 +40,9 @@ impl Writer { not: bool, ) -> TokenStream { let mut features = BTreeSet::new(); - let mut arches = BTreeSet::new(); - - for attribute in row.attributes() { - match attribute.name() { - "SupportedArchitectureAttribute" => { - if let Some((_, Value::I32(value))) = attribute.args().first() { - if value & 1 == 1 { - arches.insert("x86"); - } - if value & 2 == 2 { - arches.insert("x86_64"); - arches.insert("arm64ec"); - } - if value & 4 == 4 { - arches.insert("aarch64"); - } - } - } - "DeprecatedAttribute" => { - features.insert("deprecated".to_string()); - } - _ => {} - } - } - let mut tokens = quote! {}; - - match arches.len() { - 0 => {} - 1 => tokens.combine(quote! { #[cfg(#(target_arch = #arches),*)] }), - _ => tokens.combine(quote! { #[cfg(any(#(target_arch = #arches),*))] }), + if row.has_attribute("DeprecatedAttribute") { + features.insert("deprecated".to_string()); } let mut compact: Vec<&'static str> = dependencies.keys().map(|tn| tn.namespace()).collect(); @@ -76,6 +79,8 @@ impl Writer { features.insert(feature); } + let mut tokens = quote! {}; + match features.len() { 0 => {} 1 => { diff --git a/crates/libs/bindgen/src/writer/mod.rs b/crates/libs/bindgen/src/writer/mod.rs index cb0de64b03..75b353e8ff 100644 --- a/crates/libs/bindgen/src/writer/mod.rs +++ b/crates/libs/bindgen/src/writer/mod.rs @@ -5,6 +5,7 @@ mod names; mod value; use super::*; +pub use cfg::*; use rayon::prelude::*; #[derive(Clone)]