Skip to content

Commit 1685363

Browse files
authored
Metadata writer refactoring (#2309)
1 parent 15cefaf commit 1685363

53 files changed

Lines changed: 1227 additions & 1118 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/clippy.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ jobs:
113113
cargo clippy -p test_window_long &&
114114
cargo clippy -p test_winrt &&
115115
cargo clippy -p tool_gnu &&
116-
cargo clippy -p tool_ilrs &&
117116
cargo clippy -p tool_lib &&
118117
cargo clippy -p tool_license &&
119118
cargo clippy -p tool_msvc &&

.github/workflows/test.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ jobs:
132132
cargo test --target ${{ matrix.target }} -p test_enums &&
133133
cargo test --target ${{ matrix.target }} -p test_error &&
134134
cargo test --target ${{ matrix.target }} -p test_event &&
135-
cargo test --target ${{ matrix.target }} -p test_extensions &&
136135
cargo clean &&
136+
cargo test --target ${{ matrix.target }} -p test_extensions &&
137137
cargo test --target ${{ matrix.target }} -p test_handles &&
138138
cargo test --target ${{ matrix.target }} -p test_helpers &&
139139
cargo test --target ${{ matrix.target }} -p test_implement &&
@@ -163,7 +163,6 @@ jobs:
163163
cargo test --target ${{ matrix.target }} -p test_window_long &&
164164
cargo test --target ${{ matrix.target }} -p test_winrt &&
165165
cargo test --target ${{ matrix.target }} -p tool_gnu &&
166-
cargo test --target ${{ matrix.target }} -p tool_ilrs &&
167166
cargo test --target ${{ matrix.target }} -p tool_lib &&
168167
cargo test --target ${{ matrix.target }} -p tool_license &&
169168
cargo test --target ${{ matrix.target }} -p tool_msvc &&

crates/libs/bindgen/src/com_methods.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,9 @@ pub fn gen_upcall(gen: &Gen, sig: &Signature, inner: TokenStream) -> TokenStream
196196
fn gen_win32_invoke_arg(gen: &Gen, param: &SignatureParam) -> TokenStream {
197197
let name = gen.param_name(param.def);
198198

199-
if gen.reader.param_flags(param.def).input() && gen.reader.type_is_nullable(&param.ty) {
199+
if gen.reader.param_flags(param.def).contains(ParamAttributes::INPUT) && gen.reader.type_is_nullable(&param.ty) {
200200
quote! { ::windows::core::from_raw_borrowed(&#name) }
201-
} else if (!param.ty.is_pointer() && gen.reader.type_is_nullable(&param.ty)) || (gen.reader.param_flags(param.def).input() && !gen.reader.type_is_primitive(&param.ty)) {
201+
} else if (!param.ty.is_pointer() && gen.reader.type_is_nullable(&param.ty)) || (gen.reader.param_flags(param.def).contains(ParamAttributes::INPUT) && !gen.reader.type_is_primitive(&param.ty)) {
202202
quote! { ::core::mem::transmute(&#name) }
203203
} else {
204204
quote! { ::core::mem::transmute_copy(&#name) }

crates/libs/bindgen/src/delegates.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::*;
22

33
pub fn gen(gen: &Gen, def: TypeDef) -> TokenStream {
4-
if gen.reader.type_def_flags(def).winrt() {
4+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
55
gen_delegate(gen, def)
66
} else {
77
gen_callback(gen, def)

crates/libs/bindgen/src/enums.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub fn gen(gen: &Gen, def: TypeDef) -> TokenStream {
1414
.reader
1515
.type_def_fields(def)
1616
.filter_map(|field| {
17-
if gen.reader.field_flags(field).literal() {
17+
if gen.reader.field_flags(field).contains(FieldAttributes::LITERAL) {
1818
let field_name = to_ident(gen.reader.field_name(field));
1919
let constant = gen.reader.field_constant(field).unwrap();
2020
let value = gen.value(&gen.reader.constant_value(constant));
@@ -170,7 +170,7 @@ pub fn gen(gen: &Gen, def: TypeDef) -> TokenStream {
170170
});
171171
}
172172

173-
if gen.reader.type_def_flags(def).winrt() {
173+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
174174
let signature = Literal::byte_string(gen.reader.type_def_signature(def, &[]).as_bytes());
175175

176176
tokens.combine(&quote! {

crates/libs/bindgen/src/functions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ fn does_not_return(gen: &Gen, def: MethodDef) -> TokenStream {
244244

245245
fn handle_last_error(gen: &Gen, def: MethodDef, signature: &Signature) -> bool {
246246
if let Some(map) = gen.reader.method_def_impl_map(def) {
247-
if gen.reader.impl_map_flags(map).last_error() {
247+
if gen.reader.impl_map_flags(map).contains(PInvokeAttributes::LAST_ERROR) {
248248
if let Some(Type::TypeDef((return_type, _))) = &signature.return_type {
249249
if gen.reader.type_def_is_handle(*return_type) {
250250
if gen.reader.type_def_underlying_type(*return_type).is_pointer() {

crates/libs/bindgen/src/gen.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl<'a> Gen<'a> {
181181
}
182182
}
183183
TypeKind::Delegate => {
184-
if self.reader.type_def_flags(*def).winrt() {
184+
if self.reader.type_def_flags(*def).contains(TypeAttributes::WINRT) {
185185
quote! { *mut ::core::ffi::c_void }
186186
} else {
187187
self.type_def_name(*def, &[])
@@ -619,7 +619,7 @@ impl<'a> Gen<'a> {
619619
}
620620
}
621621
pub fn interface_winrt_trait(&self, def: TypeDef, generics: &[Type], ident: &TokenStream, constraints: &TokenStream, _phantoms: &TokenStream, features: &TokenStream) -> TokenStream {
622-
if self.reader.type_def_flags(def).winrt() {
622+
if self.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
623623
let type_signature = if self.reader.type_def_kind(def) == TypeKind::Class {
624624
let type_signature = Literal::byte_string(self.reader.type_def_signature(def, generics).as_bytes());
625625
quote! { ::windows::core::ConstBuffer::from_slice(#type_signature) }
@@ -673,7 +673,7 @@ impl<'a> Gen<'a> {
673673
}
674674
}
675675
pub fn runtime_name_trait(&self, def: TypeDef, _generics: &[Type], name: &TokenStream, constraints: &TokenStream, features: &TokenStream) -> TokenStream {
676-
if self.reader.type_def_flags(def).winrt() {
676+
if self.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
677677
// TODO: this needs to use a ConstBuffer-like facility to accomodate generics
678678
let runtime_name = format!("{}", self.reader.type_def_type_name(def));
679679

@@ -793,7 +793,7 @@ impl<'a> Gen<'a> {
793793
}
794794
}
795795
pub fn vtbl_signature(&self, def: TypeDef, _generics: &[Type], signature: &Signature) -> TokenStream {
796-
let is_winrt = self.reader.type_def_flags(def).winrt();
796+
let is_winrt = self.reader.type_def_flags(def).contains(TypeAttributes::WINRT);
797797
let hresult = self.type_name(&Type::HRESULT);
798798

799799
let (trailing_return_type, return_type, udt_return_type) = if is_winrt {
@@ -826,7 +826,7 @@ impl<'a> Gen<'a> {
826826
let abi = self.type_abi_name(&p.ty);
827827
let abi_size_name: TokenStream = format!("{}_array_size", self.reader.param_name(p.def)).into();
828828

829-
if self.reader.param_flags(p.def).input() {
829+
if self.reader.param_flags(p.def).contains(ParamAttributes::INPUT) {
830830
if p.ty.is_winrt_array() {
831831
quote! { #abi_size_name: u32, #name: *const #abi, }
832832
} else if p.ty.is_winrt_const_ref() {
@@ -894,7 +894,7 @@ impl<'a> Gen<'a> {
894894
let flags = self.reader.param_flags(param.def);
895895
match param.kind {
896896
SignatureParamKind::ArrayFixed(_) | SignatureParamKind::ArrayRelativeLen(_) | SignatureParamKind::ArrayRelativeByteLen(_) => {
897-
let map = if flags.optional() {
897+
let map = if flags.contains(ParamAttributes::OPTIONAL) {
898898
quote! { #name.as_deref().map_or(::core::ptr::null(), |slice|slice.as_ptr()) }
899899
} else {
900900
quote! { #name.as_ptr() }
@@ -904,7 +904,7 @@ impl<'a> Gen<'a> {
904904
SignatureParamKind::ArrayRelativePtr(relative) => {
905905
let name = self.param_name(params[relative].def);
906906
let flags = self.reader.param_flags(params[relative].def);
907-
if flags.optional() {
907+
if flags.contains(ParamAttributes::OPTIONAL) {
908908
quote! { #name.as_deref().map_or(0, |slice|slice.len() as _), }
909909
} else {
910910
quote! { #name.len() as _, }
@@ -920,7 +920,7 @@ impl<'a> Gen<'a> {
920920
quote! { #name.into(), }
921921
}
922922
SignatureParamKind::OptionalPointer => {
923-
if flags.output() {
923+
if flags.contains(ParamAttributes::OUTPUT) {
924924
quote! { ::core::mem::transmute(#name.unwrap_or(::std::ptr::null_mut())), }
925925
} else {
926926
quote! { ::core::mem::transmute(#name.unwrap_or(::std::ptr::null())), }
@@ -967,12 +967,12 @@ impl<'a> Gen<'a> {
967967
let ty = param.ty.deref();
968968
let ty = self.type_default_name(&ty);
969969
let len = Literal::u32_unsuffixed(fixed as _);
970-
let ty = if self.reader.param_flags(param.def).output() {
970+
let ty = if self.reader.param_flags(param.def).contains(ParamAttributes::OUTPUT) {
971971
quote! { &mut [#ty; #len] }
972972
} else {
973973
quote! { &[#ty; #len] }
974974
};
975-
if self.reader.param_flags(param.def).optional() {
975+
if self.reader.param_flags(param.def).contains(ParamAttributes::OPTIONAL) {
976976
tokens.combine(&quote! { #name: ::core::option::Option<#ty>, });
977977
} else {
978978
tokens.combine(&quote! { #name: #ty, });
@@ -981,24 +981,24 @@ impl<'a> Gen<'a> {
981981
SignatureParamKind::ArrayRelativeLen(_) => {
982982
let ty = param.ty.deref();
983983
let ty = self.type_default_name(&ty);
984-
let ty = if self.reader.param_flags(param.def).output() {
984+
let ty = if self.reader.param_flags(param.def).contains(ParamAttributes::OUTPUT) {
985985
quote! { &mut [#ty] }
986986
} else {
987987
quote! { &[#ty] }
988988
};
989-
if self.reader.param_flags(param.def).optional() {
989+
if self.reader.param_flags(param.def).contains(ParamAttributes::OPTIONAL) {
990990
tokens.combine(&quote! { #name: ::core::option::Option<#ty>, });
991991
} else {
992992
tokens.combine(&quote! { #name: #ty, });
993993
}
994994
}
995995
SignatureParamKind::ArrayRelativeByteLen(_) => {
996-
let ty = if self.reader.param_flags(param.def).output() {
996+
let ty = if self.reader.param_flags(param.def).contains(ParamAttributes::OUTPUT) {
997997
quote! { &mut [u8] }
998998
} else {
999999
quote! { &[u8] }
10001000
};
1001-
if self.reader.param_flags(param.def).optional() {
1001+
if self.reader.param_flags(param.def).contains(ParamAttributes::OPTIONAL) {
10021002
tokens.combine(&quote! { #name: ::core::option::Option<#ty>, });
10031003
} else {
10041004
tokens.combine(&quote! { #name: #ty, });
@@ -1029,7 +1029,7 @@ impl<'a> Gen<'a> {
10291029
}
10301030

10311031
pub fn impl_signature(&self, def: TypeDef, signature: &Signature) -> TokenStream {
1032-
if self.reader.type_def_flags(def).winrt() {
1032+
if self.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
10331033
let is_delegate = self.reader.type_def_kind(def) == TypeKind::Delegate;
10341034
let params = signature.params.iter().map(|p| self.winrt_produce_type(p, !is_delegate));
10351035

@@ -1084,7 +1084,7 @@ impl<'a> Gen<'a> {
10841084
fn winrt_produce_type(&self, param: &SignatureParam, include_param_names: bool) -> TokenStream {
10851085
let default_type = self.type_default_name(&param.ty);
10861086

1087-
let sig = if self.reader.param_flags(param.def).input() {
1087+
let sig = if self.reader.param_flags(param.def).contains(ParamAttributes::INPUT) {
10881088
if param.ty.is_winrt_array() {
10891089
quote! { &[#default_type] }
10901090
} else if self.reader.type_is_primitive(&param.ty) {
@@ -1115,7 +1115,7 @@ impl<'a> Gen<'a> {
11151115
let name = self.param_name(param.def);
11161116
let kind = self.type_default_name(&param.ty);
11171117

1118-
if self.reader.param_flags(param.def).input() {
1118+
if self.reader.param_flags(param.def).contains(ParamAttributes::INPUT) {
11191119
if self.reader.type_is_primitive(&param.ty) {
11201120
quote! { #name: #kind, }
11211121
} else if self.reader.type_is_nullable(&param.ty) {

crates/libs/bindgen/src/implements.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub fn gen(gen: &Gen, def: TypeDef) -> TokenStream {
4444
}
4545
}
4646

47-
if gen.reader.type_def_flags(def).winrt() {
47+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
4848
// TODO: this awkward wrapping of TypeDefs needs fixing
4949
for interface in gen.reader.type_interfaces(&Type::TypeDef((def, generics.to_vec()))) {
5050
if let Type::TypeDef((def, generics)) = interface.ty {
@@ -73,7 +73,7 @@ pub fn gen(gen: &Gen, def: TypeDef) -> TokenStream {
7373
let signature = gen.reader.method_def_signature(method, generics);
7474
let vtbl_signature = gen.vtbl_signature(def, generics, &signature);
7575

76-
let invoke_upcall = if gen.reader.type_def_flags(def).winrt() { winrt_methods::gen_upcall(gen, &signature, quote! { this.#name }) } else { com_methods::gen_upcall(gen, &signature, quote! { this.#name }) };
76+
let invoke_upcall = if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) { winrt_methods::gen_upcall(gen, &signature, quote! { this.#name }) } else { com_methods::gen_upcall(gen, &signature, quote! { this.#name }) };
7777

7878
if has_unknown_base {
7979
quote! {

crates/libs/bindgen/src/interfaces.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ fn gen_win_interface(gen: &Gen, def: TypeDef) -> TokenStream {
6161
let method_names = &mut MethodNames::new();
6262
let virtual_names = &mut MethodNames::new();
6363

64-
if gen.reader.type_def_flags(def).winrt() {
64+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
6565
for method in gen.reader.type_def_methods(def) {
6666
methods.combine(&winrt_methods::gen(gen, def, generics, InterfaceKind::Default, method, method_names, virtual_names));
6767
}
@@ -141,7 +141,7 @@ fn gen_win_interface(gen: &Gen, def: TypeDef) -> TokenStream {
141141
}
142142
}
143143

144-
if gen.reader.type_def_flags(def).winrt() {
144+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
145145
for interface in &interfaces {
146146
let into = gen.type_name(&interface.ty);
147147
let cfg = gen.cfg_features(&cfg.union(&gen.reader.type_cfg(&interface.ty)));

crates/libs/bindgen/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub fn namespace(gen: &Gen, tree: &Tree) -> String {
5353
let kind = gen.reader.type_def_kind(def);
5454
match kind {
5555
TypeKind::Class => {
56-
if gen.reader.type_def_flags(def).winrt() {
56+
if gen.reader.type_def_flags(def).contains(TypeAttributes::WINRT) {
5757
types.entry(kind).or_default().insert(name, classes::gen(gen, def));
5858
} else {
5959
for method in gen.reader.type_def_methods(def) {

0 commit comments

Comments
 (0)