Skip to content

Commit

Permalink
Merge pull request #1 from 2lambda123/hoist-method-cfg
Browse files Browse the repository at this point in the history
hoist
  • Loading branch information
2lambda123 committed Mar 18, 2024
2 parents 50ef983 + 8c702c0 commit 136389d
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 50 deletions.
2 changes: 1 addition & 1 deletion crates/libs/bindgen/src/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -741,7 +741,7 @@ pub fn type_def_bases(mut row: TypeDef) -> Vec<TypeDef> {
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,
Expand Down
26 changes: 14 additions & 12 deletions crates/libs/bindgen/src/rust/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,7 @@ fn field_cfg_combine(writer: &Writer, row: metadata::Field, enclosing: Option<me
type_cfg_combine(writer, &row.ty(enclosing), cfg)
}

pub fn type_def_cfg(writer: &Writer, row: metadata::TypeDef, generics: &[metadata::Type]) -> 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) {
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))]
impl From<IDispatch> for windows_core::VARIANT {
fn from(value: IDispatch) -> Self {
unsafe {
Expand All @@ -10,6 +11,7 @@ impl From<IDispatch> for windows_core::VARIANT {
}
}

#[cfg(all(feature = "Win32_System_Ole", feature = "Win32_System_Variant"))]
impl From<IDispatch> for windows_core::PROPVARIANT {
fn from(value: IDispatch) -> Self {
unsafe {
Expand All @@ -22,6 +24,7 @@ impl From<IDispatch> 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<Self> {
Expand All @@ -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<Self> {
Expand Down
2 changes: 1 addition & 1 deletion crates/libs/bindgen/src/rust/implements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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> };
Expand Down
8 changes: 6 additions & 2 deletions crates/libs/bindgen/src/rust/index.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
35 changes: 1 addition & 34 deletions crates/libs/bindgen/src/rust/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
//
Expand Down Expand Up @@ -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(&quote! {
#cfg_all
#signature
#cfg_not
#name: usize,
});
}
methods.combine(&signature);
}

quote! {
Expand Down

0 comments on commit 136389d

Please sign in to comment.