Skip to content

Commit 53eed86

Browse files
authored
Metadata parsing improvements (#2592)
1 parent a20dbba commit 53eed86

36 files changed

+819
-717
lines changed

crates/libs/metadata/src/codes.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,52 @@ impl HasAttribute {
4646
}
4747
}
4848

49+
impl From<MethodDef> for HasAttribute {
50+
fn from(from: MethodDef) -> Self {
51+
Self::MethodDef(from)
52+
}
53+
}
54+
impl From<Field> for HasAttribute {
55+
fn from(from: Field) -> Self {
56+
Self::Field(from)
57+
}
58+
}
59+
impl From<TypeRef> for HasAttribute {
60+
fn from(from: TypeRef) -> Self {
61+
Self::TypeRef(from)
62+
}
63+
}
64+
impl From<TypeDef> for HasAttribute {
65+
fn from(from: TypeDef) -> Self {
66+
Self::TypeDef(from)
67+
}
68+
}
69+
impl From<Param> for HasAttribute {
70+
fn from(from: Param) -> Self {
71+
Self::Param(from)
72+
}
73+
}
74+
impl From<InterfaceImpl> for HasAttribute {
75+
fn from(from: InterfaceImpl) -> Self {
76+
Self::InterfaceImpl(from)
77+
}
78+
}
79+
impl From<MemberRef> for HasAttribute {
80+
fn from(from: MemberRef) -> Self {
81+
Self::MemberRef(from)
82+
}
83+
}
84+
impl From<TypeSpec> for HasAttribute {
85+
fn from(from: TypeSpec) -> Self {
86+
Self::TypeSpec(from)
87+
}
88+
}
89+
impl From<GenericParam> for HasAttribute {
90+
fn from(from: GenericParam) -> Self {
91+
Self::GenericParam(from)
92+
}
93+
}
94+
4995
#[derive(Clone)]
5096
pub enum HasConstant {
5197
Field(Field),

crates/libs/metadata/src/file/reader.rs

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@ pub trait RowReader<'a> {
9696
self.type_ref_name(row)
9797
}
9898

99+
fn attributes<R: AsRow + Into<HasAttribute>>(&self, row: R) -> RowIterator<Attribute> {
100+
self.row_equal_range(row, 0, row.into().encode())
101+
}
102+
103+
fn find_attribute<R: AsRow + Into<HasAttribute>>(&self, row: R, name: &str) -> Option<Attribute> {
104+
self.attributes(row).find(|attribute| self.attribute_name(*attribute) == name)
105+
}
106+
107+
fn has_attribute<R: AsRow + Into<HasAttribute>>(&self, row: R, name: &str) -> bool {
108+
self.find_attribute(row, name).is_some()
109+
}
110+
99111
//
100112
// Other
101113
//
@@ -159,10 +171,6 @@ pub trait RowReader<'a> {
159171
self.row_equal_range(row, 1, HasConstant::Field(row).encode()).next()
160172
}
161173

162-
fn field_attributes(&self, row: Field) -> RowIterator<Attribute> {
163-
self.row_equal_range(row, 0, HasAttribute::Field(row).encode())
164-
}
165-
166174
//
167175
// GenericParam
168176
//
@@ -187,14 +195,6 @@ pub trait RowReader<'a> {
187195
self.row_str(row, 2)
188196
}
189197

190-
//
191-
// InterfaceImpl
192-
//
193-
194-
fn interface_impl_attributes(&self, row: InterfaceImpl) -> RowIterator<Attribute> {
195-
self.row_equal_range(row, 0, HasAttribute::InterfaceImpl(row).encode())
196-
}
197-
198198
//
199199
// MemberRef
200200
//
@@ -227,10 +227,6 @@ pub trait RowReader<'a> {
227227
self.row_list(row, 5)
228228
}
229229

230-
fn method_def_attributes(&self, row: MethodDef) -> RowIterator<Attribute> {
231-
self.row_equal_range(row, 0, HasAttribute::MethodDef(row).encode())
232-
}
233-
234230
fn method_def_impl_map(&self, row: MethodDef) -> Option<ImplMap> {
235231
self.row_equal_range(row, 1, MemberForwarded::MethodDef(row).encode()).next()
236232
}
@@ -280,10 +276,6 @@ pub trait RowReader<'a> {
280276
self.row_str(row, 2)
281277
}
282278

283-
fn param_attributes(&self, row: Param) -> RowIterator<Attribute> {
284-
self.row_equal_range(row, 0, HasAttribute::Param(row).encode())
285-
}
286-
287279
//
288280
// TypeDef
289281
//
@@ -315,10 +307,6 @@ pub trait RowReader<'a> {
315307
self.row_list(row, 4)
316308
}
317309

318-
fn type_def_attributes(&self, row: TypeDef) -> RowIterator<Attribute> {
319-
self.row_equal_range(row, 0, HasAttribute::TypeDef(row).encode())
320-
}
321-
322310
fn type_def_generics(&self, row: TypeDef) -> Vec<Type> {
323311
self.row_equal_range(row, 2, TypeOrMethodDef::TypeDef(row).encode()).map(Type::GenericParam).collect()
324312
}
@@ -335,10 +323,6 @@ pub trait RowReader<'a> {
335323
self.row_equal_range(row, 2, row.0.row + 1).next()
336324
}
337325

338-
fn type_def_is_scoped(&self, row: TypeDef) -> bool {
339-
self.type_def_flags(row).contains(TypeAttributes::WindowsRuntime) || self.type_def_attributes(row).any(|attribute| self.attribute_name(attribute) == "ScopedEnumAttribute")
340-
}
341-
342326
//
343327
// TypeRef
344328
//

0 commit comments

Comments
 (0)