in src/bindgen/parser.rs [149:194]
fn parse_crate(&mut self, pkg: &PackageRef) -> Result<(), Error> {
assert!(self.lib.is_some());
debug!("Parsing crate {}", pkg.name);
self.parsed_crates.insert(pkg.name.clone());
// Check if we should use cargo expand for this crate
if self.config.parse.expand.crates.contains(&pkg.name) {
self.parse_expand_crate(pkg)?;
} else {
// Parse the crate before the dependencies otherwise the same-named idents we
// want to generate bindings for would be replaced by the ones provided
// by the first dependency containing it.
let crate_src = self.lib.as_ref().unwrap().find_crate_src(pkg);
match crate_src {
Some(crate_src) => self.parse_mod(pkg, crate_src.as_path(), 0)?,
None => {
// This should be an error, but is common enough to just elicit a warning
warn!(
"Parsing crate `{}`: can't find lib.rs with `cargo metadata`. \
The crate may be available only on a particular platform, \
so consider setting `fetch_all_dependencies` in your cbindgen configuration.",
pkg.name
);
}
}
}
for (dep_pkg, cfg) in self.lib.as_ref().unwrap().dependencies(pkg) {
if !self.should_parse_dependency(&dep_pkg.name) {
continue;
}
if let Some(ref cfg) = cfg {
self.cfg_stack.push(cfg.clone());
}
self.parse_crate(&dep_pkg)?;
if cfg.is_some() {
self.cfg_stack.pop();
}
}
Ok(())
}