in src/bindgen/parser.rs [489:579]
fn load_syn_crate_mod<'a>(
&mut self,
config: &Config,
binding_crate_name: &str,
crate_name: &str,
mod_cfg: Option<&Cfg>,
items: &'a [syn::Item],
) -> Vec<&'a syn::ItemMod> {
let mut impls_with_assoc_consts = Vec::new();
let mut nested_modules = Vec::new();
for item in items {
if item.should_skip_parsing() {
continue;
}
match item {
syn::Item::ForeignMod(ref item) => {
self.load_syn_foreign_mod(
config,
binding_crate_name,
crate_name,
mod_cfg,
item,
);
}
syn::Item::Fn(ref item) => {
self.load_syn_fn(config, binding_crate_name, crate_name, mod_cfg, item);
}
syn::Item::Const(ref item) => {
self.load_syn_const(config, binding_crate_name, crate_name, mod_cfg, item);
}
syn::Item::Static(ref item) => {
self.load_syn_static(config, binding_crate_name, crate_name, mod_cfg, item);
}
syn::Item::Struct(ref item) => {
self.load_syn_struct(config, crate_name, mod_cfg, item);
}
syn::Item::Union(ref item) => {
self.load_syn_union(config, crate_name, mod_cfg, item);
}
syn::Item::Enum(ref item) => {
self.load_syn_enum(config, crate_name, mod_cfg, item);
}
syn::Item::Type(ref item) => {
self.load_syn_ty(crate_name, mod_cfg, item);
}
syn::Item::Impl(ref item_impl) => {
let has_assoc_const = item_impl
.items
.iter()
.any(|item| matches!(item, syn::ImplItem::Const(_)));
if has_assoc_const {
impls_with_assoc_consts.push(item_impl);
}
if let syn::Type::Path(ref path) = *item_impl.self_ty {
if let Some(type_name) = path.path.get_ident() {
for method in item_impl.items.iter().filter_map(|item| match item {
syn::ImplItem::Fn(method) if !method.should_skip_parsing() => {
Some(method)
}
_ => None,
}) {
self.load_syn_method(
config,
binding_crate_name,
crate_name,
mod_cfg,
&Path::new(type_name.unraw().to_string()),
method,
)
}
}
}
}
syn::Item::Macro(ref item) => {
self.load_builtin_macro(config, crate_name, mod_cfg, item);
}
syn::Item::Mod(ref item) => {
nested_modules.push(item);
}
_ => {}
}
}
for item_impl in impls_with_assoc_consts {
self.load_syn_assoc_consts_from_impl(crate_name, mod_cfg, item_impl)
}
nested_modules
}