Skip to content

Commit

Permalink
bindgen
Browse files Browse the repository at this point in the history
  • Loading branch information
kennykerr committed Feb 29, 2024
1 parent f3aa338 commit 5f4268f
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 70 deletions.
4 changes: 4 additions & 0 deletions crates/libs/bindgen/src/rust/classes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ use super::*;
use metadata::HasAttributes;

pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream {
if !def.flags().contains(metadata::TypeAttributes::WindowsRuntime) {
return quote! {};
}

if writer.sys {
if def.interface_impls().next().is_some() {
let name = to_ident(def.name());
Expand Down
38 changes: 1 addition & 37 deletions crates/libs/bindgen/src/rust/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,36 +177,7 @@ fn namespace(writer: &Writer, tree: &Tree) -> String {
if writer.reader.core_types().any(|(x, _)| x == &type_name) {
continue;
}
let name = type_name.name;
let mut kind = def.kind();

let tokens = match kind {
metadata::TypeKind::Class => {
if def.flags().contains(metadata::TypeAttributes::WindowsRuntime) {
classes::writer(writer, def)
} else {
quote! {}
}
}
metadata::TypeKind::Interface => interfaces::writer(writer, def),
metadata::TypeKind::Enum => enums::writer(writer, def),
metadata::TypeKind::Struct => {
if let Some(guid) = clsid(def) {
kind = metadata::TypeKind::Class;
let ident = to_ident(name);
let value = writer.guid(&guid);
let guid = writer.type_name(&metadata::Type::GUID);
quote! {
pub const #ident: #guid = #value;
}
} else {
structs::writer(writer, def)
}
}
metadata::TypeKind::Delegate => delegates::writer(writer, def),
};

types.entry(kind).or_default().entry(name).or_default().combine(&tokens);
types.entry(def.kind()).or_default().entry(type_name.name).or_default().combine(&writer.type_def(def));
}
metadata::Item::Fn(def, namespace) => {
let name = def.name();
Expand Down Expand Up @@ -236,13 +207,6 @@ fn namespace(writer: &Writer, tree: &Tree) -> String {
tokens.into_string()
}

fn clsid(def: metadata::TypeDef) -> Option<metadata::Guid> {
if def.fields().next().is_none() {
return metadata::type_def_guid(def);
}
None
}

fn namespace_impl(writer: &Writer, tree: &Tree) -> String {
let writer = &mut writer.clone();
writer.namespace = tree.namespace;
Expand Down
34 changes: 1 addition & 33 deletions crates/libs/bindgen/src/rust/standalone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,39 +85,7 @@ pub fn standalone_imp(writer: &Writer) -> String {
);
}
metadata::Type::TypeDef(def, _) => {
let kind = def.kind();
match kind {
metadata::TypeKind::Class => {
sorted.insert(def.name(), classes::writer(writer, def));
}
metadata::TypeKind::Interface => {
sorted.insert(def.name(), interfaces::writer(writer, def));
}
metadata::TypeKind::Enum => {
sorted.insert(def.name(), enums::writer(writer, def));
}
metadata::TypeKind::Struct => {
let name = def.name();
if def.fields().next().is_none() {
if let Some(guid) = metadata::type_def_guid(def) {
let ident = to_ident(name);
let value = writer.guid(&guid);
let guid = writer.type_name(&metadata::Type::GUID);
sorted.insert(
name,
quote! {
pub const #ident: #guid = #value;
},
);
continue;
}
}
sorted.insert(name, structs::writer(writer, def));
}
metadata::TypeKind::Delegate => {
sorted.insert(def.name(), delegates::writer(writer, def));
}
}
sorted.insert(def.name(), writer.type_def(def));
}
_ => {}
}
Expand Down
16 changes: 16 additions & 0 deletions crates/libs/bindgen/src/rust/structs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ pub fn writer(writer: &Writer, def: metadata::TypeDef) -> TokenStream {
return handles::writer(writer, def);
}

if let Some(guid) = clsid(def) {
let ident = to_ident(def.name());
let value = writer.guid(&guid);
let guid = writer.type_name(&metadata::Type::GUID);
return quote! {
pub const #ident: #guid = #value;
};
}

gen_struct_with_name(writer, def, def.name(), &cfg::Cfg::default())
}

Expand Down Expand Up @@ -285,3 +294,10 @@ fn gen_struct_constants(writer: &Writer, def: metadata::TypeDef, struct_name: &T

tokens
}

fn clsid(def: metadata::TypeDef) -> Option<metadata::Guid> {
if def.fields().next().is_none() {
return metadata::type_def_guid(def);
}
None
}
9 changes: 9 additions & 0 deletions crates/libs/bindgen/src/rust/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ impl Writer {
}
}
}
pub fn type_def(&self, def: metadata::TypeDef) -> TokenStream {
match def.kind() {
metadata::TypeKind::Class => classes::writer(self, def),
metadata::TypeKind::Interface => interfaces::writer(self, def),
metadata::TypeKind::Enum => enums::writer(self, def),
metadata::TypeKind::Struct => structs::writer(self, def),
metadata::TypeKind::Delegate => delegates::writer(self, def),
}
}

//
// Type
Expand Down

0 comments on commit 5f4268f

Please sign in to comment.