Skip to content

Commit 22de1c9

Browse files
authored
Simplify metadata filtering (#2684)
1 parent 462f941 commit 22de1c9

32 files changed

+264
-280
lines changed

crates/libs/bindgen/src/lib.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,14 @@ where
104104
let output = canonicalize(output)?;
105105

106106
let input = read_input(&input)?;
107-
let reader = metadata::Reader::new(input);
108-
let filter = metadata::Filter::new(&include, &exclude);
107+
let reader = metadata::Reader::filter(input, &include, &exclude);
109108

110-
winmd::verify(reader, &filter)?;
109+
winmd::verify(reader)?;
111110

112111
match extension(&output) {
113-
"rdl" => rdl::from_reader(reader, &filter, config, &output)?,
114-
"winmd" => winmd::from_reader(reader, &filter, config, &output)?,
115-
"rs" => rust::from_reader(reader, &filter, config, &output)?,
112+
"rdl" => rdl::from_reader(reader, config, &output)?,
113+
"winmd" => winmd::from_reader(reader, config, &output)?,
114+
"rs" => rust::from_reader(reader, config, &output)?,
116115
_ => return Err(Error::new("output extension must be one of winmd/rdl/rs")),
117116
}
118117

crates/libs/bindgen/src/metadata.rs

Lines changed: 68 additions & 67 deletions
Large diffs are not rendered by default.

crates/libs/bindgen/src/rdl/from_reader.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ use crate::tokens::{quote, to_ident, TokenStream};
33
use crate::{rdl, Error, Result, Tree};
44
use metadata::*;
55

6-
pub fn from_reader(reader: &metadata::Reader, filter: &metadata::Filter, mut config: std::collections::BTreeMap<&str, &str>, output: &str) -> Result<()> {
6+
pub fn from_reader(reader: &metadata::Reader, mut config: std::collections::BTreeMap<&str, &str>, output: &str) -> Result<()> {
77
let dialect = match config.remove("type") {
88
Some("winrt") => Dialect::WinRT,
99
Some("win32") => Dialect::Win32,
1010
_ => return Err(Error::new("configuration value `type` must be `win32` or `winrt`")),
1111
};
1212

13-
let mut writer = Writer::new(reader, filter, output, dialect);
13+
let mut writer = Writer::new(reader, output, dialect);
1414

1515
// TODO: be sure to use the same "split" key for winmd splitting.
1616
// May also want to support split=N similar to the way MIDLRT supports winmd splitting
@@ -29,7 +29,7 @@ pub fn from_reader(reader: &metadata::Reader, filter: &metadata::Filter, mut con
2929
}
3030

3131
fn gen_split(writer: &Writer) -> Result<()> {
32-
let tree = Tree::new(writer.reader, writer.filter);
32+
let tree = Tree::new(writer.reader);
3333
let directory = crate::directory(writer.output);
3434

3535
// TODO: parallelize
@@ -46,7 +46,7 @@ fn gen_split(writer: &Writer) -> Result<()> {
4646
}
4747

4848
fn gen_file(writer: &Writer) -> Result<()> {
49-
let tree = Tree::new(writer.reader, writer.filter);
49+
let tree = Tree::new(writer.reader);
5050
let tokens = writer.tree(&tree);
5151
writer.write_to_file(writer.output, tokens)
5252
}
@@ -59,20 +59,19 @@ enum Dialect {
5959

6060
struct Writer<'a> {
6161
reader: &'a metadata::Reader,
62-
filter: &'a metadata::Filter<'a>,
6362
namespace: &'a str,
6463
dialect: Dialect,
6564
split: bool,
6665
output: &'a str,
6766
}
6867

6968
impl<'a> Writer<'a> {
70-
fn new(reader: &'a metadata::Reader, filter: &'a metadata::Filter, output: &'a str, dialect: Dialect) -> Self {
71-
Self { reader, filter, namespace: "", output, dialect, split: false }
69+
fn new(reader: &'a metadata::Reader, output: &'a str, dialect: Dialect) -> Self {
70+
Self { reader, namespace: "", output, dialect, split: false }
7271
}
7372

7473
fn with_namespace(&self, namespace: &'a str) -> Self {
75-
Self { reader: self.reader, filter: self.filter, namespace, dialect: self.dialect, output: self.output, split: self.split }
74+
Self { reader: self.reader, namespace, dialect: self.dialect, output: self.output, split: self.split }
7675
}
7776

7877
fn write_to_file(&self, output: &str, tokens: TokenStream) -> Result<()> {
@@ -135,7 +134,7 @@ impl<'a> Writer<'a> {
135134
let mut types = vec![];
136135

137136
if !tree.namespace.is_empty() {
138-
for item in self.reader.namespace_items(tree.namespace, self.filter).filter(|item| match item {
137+
for item in self.reader.namespace_items(tree.namespace).filter(|item| match item {
139138
metadata::Item::Type(def) => {
140139
let winrt = def.flags().contains(metadata::TypeAttributes::WindowsRuntime);
141140
match self.dialect {
@@ -246,7 +245,7 @@ impl<'a> Writer<'a> {
246245
let name = to_ident(method.name());
247246

248247
// TODO: use reader.method_def_signature instead
249-
let signature = metadata::method_def_signature(self.reader, def.namespace(), method, generics);
248+
let signature = metadata::method_def_signature(def.namespace(), method, generics);
250249

251250
let return_type = self.return_type(&signature.return_type);
252251

crates/libs/bindgen/src/rust/cfg.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use super::*;
22

33
#[derive(Default, Clone)]
4-
pub struct Cfg<'a> {
5-
pub types: BTreeMap<&'a str, BTreeSet<TypeDef>>,
4+
pub struct Cfg {
5+
pub types: BTreeMap<&'static str, BTreeSet<TypeDef>>,
66
pub core_types: BTreeSet<Type>,
77
pub arches: BTreeSet<&'static str>,
88
pub implement: bool,
99
}
1010

11-
impl<'a> Cfg<'a> {
12-
pub fn add_feature(&mut self, feature: &'a str) {
11+
impl Cfg {
12+
pub fn add_feature(&mut self, feature: &'static str) {
1313
self.types.entry(feature).or_default();
1414
}
1515
pub fn union(&self, other: &Self) -> Self {
@@ -30,63 +30,63 @@ impl<'a> Cfg<'a> {
3030
}
3131
}
3232

33-
pub fn field_cfg(reader: &Reader, row: Field) -> Cfg {
33+
pub fn field_cfg(row: Field) -> Cfg {
3434
let mut cfg = Cfg::default();
35-
field_cfg_combine(reader, row, None, &mut cfg);
35+
field_cfg_combine(row, None, &mut cfg);
3636
cfg
3737
}
38-
fn field_cfg_combine<'a>(reader: &'a Reader, row: Field, enclosing: Option<TypeDef>, cfg: &mut Cfg<'a>) {
39-
type_cfg_combine(reader, &row.ty(enclosing), cfg)
38+
fn field_cfg_combine(row: Field, enclosing: Option<TypeDef>, cfg: &mut Cfg) {
39+
type_cfg_combine(&row.ty(enclosing), cfg)
4040
}
4141

42-
pub fn type_def_cfg<'a>(reader: &'a Reader, row: TypeDef, generics: &[Type]) -> Cfg<'a> {
42+
pub fn type_def_cfg(row: TypeDef, generics: &[Type]) -> Cfg {
4343
let mut cfg = Cfg::default();
44-
type_def_cfg_combine(reader, row, generics, &mut cfg);
44+
type_def_cfg_combine(row, generics, &mut cfg);
4545
cfg_add_attributes(&mut cfg, row);
4646
cfg
4747
}
48-
pub fn type_def_cfg_impl<'a>(reader: &'a Reader, def: TypeDef, generics: &[Type]) -> Cfg<'a> {
48+
pub fn type_def_cfg_impl(def: TypeDef, generics: &[Type]) -> Cfg {
4949
let mut cfg = Cfg { implement: true, ..Default::default() };
5050

51-
fn combine<'a>(reader: &'a Reader, def: TypeDef, generics: &[Type], cfg: &mut Cfg<'a>) {
52-
type_def_cfg_combine(reader, def, generics, cfg);
51+
fn combine(def: TypeDef, generics: &[Type], cfg: &mut Cfg) {
52+
type_def_cfg_combine(def, generics, cfg);
5353

5454
for method in def.methods() {
55-
signature_cfg_combine(reader, &method.signature(generics), cfg);
55+
signature_cfg_combine(&method.signature(generics), cfg);
5656
}
5757
}
5858

59-
combine(reader, def, generics, &mut cfg);
59+
combine(def, generics, &mut cfg);
6060

6161
for def in type_def_vtables(def) {
6262
if let Type::TypeDef(def, generics) = def {
63-
combine(reader, def, &generics, &mut cfg);
63+
combine(def, &generics, &mut cfg);
6464
}
6565
}
6666

6767
if def.flags().contains(TypeAttributes::WindowsRuntime) {
6868
for interface in type_def_interfaces(def, generics) {
6969
if let Type::TypeDef(def, generics) = interface {
70-
combine(reader, def, &generics, &mut cfg);
70+
combine(def, &generics, &mut cfg);
7171
}
7272
}
7373
}
7474

7575
cfg_add_attributes(&mut cfg, def);
7676
cfg
7777
}
78-
pub fn type_def_cfg_combine<'a>(reader: &'a Reader, row: TypeDef, generics: &[Type], cfg: &mut Cfg<'a>) {
78+
pub fn type_def_cfg_combine(row: TypeDef, generics: &[Type], cfg: &mut Cfg) {
7979
let type_name = row.type_name();
8080

8181
for generic in generics {
82-
type_cfg_combine(reader, generic, cfg);
82+
type_cfg_combine(generic, cfg);
8383
}
8484

8585
if cfg.types.entry(type_name.namespace).or_default().insert(row) {
8686
match row.kind() {
8787
TypeKind::Class => {
8888
if let Some(default_interface) = type_def_default_interface(row) {
89-
type_cfg_combine(reader, &default_interface, cfg);
89+
type_cfg_combine(&default_interface, cfg);
9090
}
9191
}
9292
TypeKind::Interface => {
@@ -99,30 +99,30 @@ pub fn type_def_cfg_combine<'a>(reader: &'a Reader, row: TypeDef, generics: &[Ty
9999
}
100100
}
101101
TypeKind::Struct => {
102-
row.fields().for_each(|field| field_cfg_combine(reader, field, Some(row), cfg));
102+
row.fields().for_each(|field| field_cfg_combine(field, Some(row), cfg));
103103
if !type_name.namespace.is_empty() {
104-
for def in reader.get_type_def(type_name.namespace, type_name.name) {
104+
for def in row.reader().get_type_def(type_name.namespace, type_name.name) {
105105
if def != row {
106-
type_def_cfg_combine(reader, def, &[], cfg);
106+
type_def_cfg_combine(def, &[], cfg);
107107
}
108108
}
109109
}
110110
}
111-
TypeKind::Delegate => signature_cfg_combine(reader, &type_def_invoke_method(row).signature(generics), cfg),
111+
TypeKind::Delegate => signature_cfg_combine(&type_def_invoke_method(row).signature(generics), cfg),
112112
_ => {}
113113
}
114114
}
115115
}
116116

117-
pub fn signature_cfg(reader: &Reader, method: MethodDef) -> Cfg {
117+
pub fn signature_cfg(method: MethodDef) -> Cfg {
118118
let mut cfg = Cfg::default();
119-
signature_cfg_combine(reader, &method.signature(&[]), &mut cfg);
119+
signature_cfg_combine(&method.signature(&[]), &mut cfg);
120120
cfg_add_attributes(&mut cfg, method);
121121
cfg
122122
}
123-
fn signature_cfg_combine<'a>(reader: &'a Reader, signature: &MethodDefSig, cfg: &mut Cfg<'a>) {
124-
type_cfg_combine(reader, &signature.return_type, cfg);
125-
signature.params.iter().for_each(|param| type_cfg_combine(reader, param, cfg));
123+
fn signature_cfg_combine(signature: &MethodDefSig, cfg: &mut Cfg) {
124+
type_cfg_combine(&signature.return_type, cfg);
125+
signature.params.iter().for_each(|param| type_cfg_combine(param, cfg));
126126
}
127127

128128
fn cfg_add_attributes<R: AsRow + Into<HasAttribute>>(cfg: &mut Cfg, row: R) {
@@ -151,19 +151,19 @@ fn cfg_add_attributes<R: AsRow + Into<HasAttribute>>(cfg: &mut Cfg, row: R) {
151151
}
152152
}
153153

154-
pub fn type_cfg<'a>(reader: &'a Reader, ty: &Type) -> Cfg<'a> {
154+
pub fn type_cfg(ty: &Type) -> Cfg {
155155
let mut cfg = Cfg::default();
156-
type_cfg_combine(reader, ty, &mut cfg);
156+
type_cfg_combine(ty, &mut cfg);
157157
cfg
158158
}
159-
fn type_cfg_combine<'a>(reader: &'a Reader, ty: &Type, cfg: &mut Cfg<'a>) {
159+
fn type_cfg_combine(ty: &Type, cfg: &mut Cfg) {
160160
match ty {
161-
Type::TypeDef(row, generics) => type_def_cfg_combine(reader, *row, generics, cfg),
162-
Type::Win32Array(ty, _) => type_cfg_combine(reader, ty, cfg),
163-
Type::ConstPtr(ty, _) => type_cfg_combine(reader, ty, cfg),
164-
Type::MutPtr(ty, _) => type_cfg_combine(reader, ty, cfg),
165-
Type::WinrtArray(ty) => type_cfg_combine(reader, ty, cfg),
166-
Type::WinrtArrayRef(ty) => type_cfg_combine(reader, ty, cfg),
161+
Type::TypeDef(row, generics) => type_def_cfg_combine(*row, generics, cfg),
162+
Type::Win32Array(ty, _) => type_cfg_combine(ty, cfg),
163+
Type::ConstPtr(ty, _) => type_cfg_combine(ty, cfg),
164+
Type::MutPtr(ty, _) => type_cfg_combine(ty, cfg),
165+
Type::WinrtArray(ty) => type_cfg_combine(ty, cfg),
166+
Type::WinrtArrayRef(ty) => type_cfg_combine(ty, cfg),
167167
ty => _ = cfg.core_types.insert(ty.clone()),
168168
}
169169
}

crates/libs/bindgen/src/rust/classes.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ fn gen_class(writer: &Writer, def: TypeDef) -> TokenStream {
2121
}
2222

2323
let name = to_ident(def.name());
24-
let interfaces = type_interfaces(writer.reader, &Type::TypeDef(def, Vec::new()));
24+
let interfaces = type_interfaces(&Type::TypeDef(def, Vec::new()));
2525
let mut methods = quote! {};
2626
let mut method_names = MethodNames::new();
2727

28-
let cfg = type_def_cfg(writer.reader, def, &[]);
28+
let cfg = type_def_cfg(def, &[]);
2929
let doc = writer.cfg_doc(&cfg);
3030
let features = writer.cfg_features(&cfg);
3131

@@ -44,7 +44,7 @@ fn gen_class(writer: &Writer, def: TypeDef) -> TokenStream {
4444
if let Type::TypeDef(def, generics) = &interface.ty {
4545
if def.methods().next().is_some() {
4646
let interface_type = writer.type_name(&interface.ty);
47-
let features = writer.cfg_features(&type_def_cfg(writer.reader, *def, generics));
47+
let features = writer.cfg_features(&type_def_cfg(*def, generics));
4848

4949
return Some(quote! {
5050
#[doc(hidden)]
@@ -138,17 +138,17 @@ fn gen_conversions(writer: &Writer, def: TypeDef, name: &TokenStream, interfaces
138138
}
139139

140140
let into = writer.type_name(&interface.ty);
141-
let features = writer.cfg_features(&cfg.union(&type_cfg(writer.reader, &interface.ty)));
141+
let features = writer.cfg_features(&cfg.union(&type_cfg(&interface.ty)));
142142

143143
tokens.combine(&quote! {
144144
#features
145145
impl ::windows_core::CanTryInto<#into> for #name {}
146146
});
147147
}
148148

149-
for def in type_def_bases(writer.reader, def) {
149+
for def in type_def_bases(def) {
150150
let into = writer.type_def_name(def, &[]);
151-
let features = writer.cfg_features(&cfg.union(&type_def_cfg(writer.reader, def, &[])));
151+
let features = writer.cfg_features(&cfg.union(&type_def_cfg(def, &[])));
152152

153153
tokens.combine(&quote! {
154154
#features

crates/libs/bindgen/src/rust/com_methods.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::*;
22

33
pub fn writer(writer: &Writer, def: TypeDef, kind: InterfaceKind, method: MethodDef, method_names: &mut MethodNames, virtual_names: &mut MethodNames, base_count: usize) -> TokenStream {
4-
let signature = method_def_signature(writer.reader, def.namespace(), method, &[]);
4+
let signature = method_def_signature(def.namespace(), method, &[]);
55

66
let name = method_names.add(method);
77
let vname = virtual_names.add(method);
88
let generics = writer.constraint_generics(&signature.params);
99
let where_clause = writer.where_clause(&signature.params);
10-
let mut cfg = signature_cfg(writer.reader, method);
10+
let mut cfg = signature_cfg(method);
1111
cfg.add_feature(def.namespace());
1212
let doc = writer.cfg_method_doc(&cfg);
1313
let features = writer.cfg_features(&cfg);

crates/libs/bindgen/src/rust/constants.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::*;
33
pub fn writer(writer: &Writer, def: Field) -> TokenStream {
44
let name = to_ident(def.name());
55
let ty = def.ty(None).to_const_type();
6-
let cfg = field_cfg(writer.reader, def);
6+
let cfg = field_cfg(def);
77
let doc = writer.cfg_doc(&cfg);
88
let features = writer.cfg_features(&cfg);
99

crates/libs/bindgen/src/rust/delegates.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ fn gen_callback(writer: &Writer, def: TypeDef) -> TokenStream {
1212
let name = to_ident(def.name());
1313
let method = type_def_invoke_method(def);
1414

15-
let signature = method_def_signature(writer.reader, def.namespace(), method, &[]);
15+
let signature = method_def_signature(def.namespace(), method, &[]);
1616

1717
let return_type = writer.return_sig(&signature);
18-
let cfg = type_def_cfg(writer.reader, def, &[]);
18+
let cfg = type_def_cfg(def, &[]);
1919
let doc = writer.cfg_doc(&cfg);
2020
let features = writer.cfg_features(&cfg);
2121

@@ -57,10 +57,10 @@ fn gen_win_delegate(writer: &Writer, def: TypeDef) -> TokenStream {
5757
let ident = writer.type_def_name(def, generics);
5858
let method = type_def_invoke_method(def);
5959

60-
let signature = method_def_signature(writer.reader, def.namespace(), method, generics);
60+
let signature = method_def_signature(def.namespace(), method, generics);
6161

6262
let fn_constraint = gen_fn_constraint(writer, def, &signature);
63-
let cfg = type_def_cfg(writer.reader, def, generics);
63+
let cfg = type_def_cfg(def, generics);
6464
let doc = writer.cfg_doc(&cfg);
6565
let features = writer.cfg_features(&cfg);
6666

crates/libs/bindgen/src/rust/enums.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn writer(writer: &Writer, def: TypeDef) -> TokenStream {
99
// TODO: unscoped enums should be removed from metadata
1010
let is_scoped = def.flags().contains(TypeAttributes::WindowsRuntime) || def.has_attribute("ScopedEnumAttribute");
1111

12-
let cfg = type_def_cfg(writer.reader, def, &[]);
12+
let cfg = type_def_cfg(def, &[]);
1313
let doc = writer.cfg_doc(&cfg);
1414
let features = writer.cfg_features(&cfg);
1515

@@ -160,7 +160,7 @@ pub fn writer(writer: &Writer, def: TypeDef) -> TokenStream {
160160
}
161161

162162
if def.flags().contains(TypeAttributes::WindowsRuntime) {
163-
let signature = Literal::byte_string(type_def_signature(writer.reader, def, &[]).as_bytes());
163+
let signature = Literal::byte_string(type_def_signature(def, &[]).as_bytes());
164164

165165
tokens.combine(&quote! {
166166
#features

0 commit comments

Comments
 (0)