summaryrefslogtreecommitdiffstats
path: root/vendor/windows-bindgen/src/winmd/verify.rs
blob: f10bd65246fcc051507b9e760bd0365d31b4e841 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use super::*;
use metadata::RowReader;

pub fn verify(reader: &metadata::Reader, filter: &metadata::Filter) -> crate::Result<()> {
    for item in reader.items(filter) {
        // TODO: cover all variants
        let metadata::Item::Type(def) = item else {
            continue;
        };

        let generics = &metadata::type_def_generics(reader, def);

        reader.type_def_fields(def).try_for_each(|field| not_type_ref(reader, &reader.field_type(field, Some(def))))?;

        reader.type_def_methods(def).try_for_each(|method| {
            let sig = reader.method_def_signature(method, generics);
            not_type_ref(reader, &sig.return_type)?;

            sig.params.iter().try_for_each(|param| not_type_ref(reader, param))
        })?;
    }

    Ok(())
}

fn not_type_ref(reader: &metadata::Reader, ty: &metadata::Type) -> crate::Result<()> {
    if let metadata::Type::TypeRef(ty) = ty {
        return Err(crate::Error::new(&format!("missing type definition `{}`", reader.type_def_or_ref(*ty))));
    }
    Ok(())
}