in src/bindgen/parser.rs [761:831]
fn load_syn_assoc_consts<'a, I>(
&mut self,
crate_name: &str,
mod_cfg: Option<&Cfg>,
impl_ty: &syn::Type,
items: I,
) where
I: IntoIterator<Item = &'a syn::ImplItemConst>,
{
let ty = match Type::load(impl_ty) {
Ok(ty) => ty,
Err(e) => {
warn!("Skipping associated constants for {:?}: {:?}", impl_ty, e);
return;
}
};
let ty = match ty {
Some(ty) => ty,
None => return,
};
let impl_path = match ty.get_root_path() {
Some(p) => p,
None => {
warn!(
"Couldn't find path for {:?}, skipping associated constants",
ty
);
return;
}
};
for item in items.into_iter() {
if let syn::Visibility::Public(_) = item.vis {
} else {
warn!("Skip {}::{} - (not `pub`).", crate_name, &item.ident);
return;
}
let path = Path::new(item.ident.unraw().to_string());
match Constant::load(
path,
mod_cfg,
&item.ty,
&item.expr,
&item.attrs,
Some(impl_path.clone()),
) {
Ok(constant) => {
info!("Take {}::{}::{}.", crate_name, impl_path, &item.ident);
let mut any = false;
self.structs.for_items_mut(&impl_path, |item| {
any = true;
item.add_associated_constant(constant.clone());
});
// Handle associated constants to other item types that are
// not structs like enums or such as regular constants.
if !any && !self.constants.try_insert(constant) {
error!(
"Conflicting name for constant {}::{}::{}.",
crate_name, impl_path, &item.ident,
);
}
}
Err(msg) => {
warn!("Skip {}::{} - ({})", crate_name, &item.ident, msg);
}
}
}
}