in src/bindgen/parser.rs [230:286]
fn parse_mod(
&mut self,
pkg: &PackageRef,
mod_path: &FilePath,
depth: usize,
) -> Result<(), Error> {
let mod_items = match self.cache_src.entry(mod_path.to_path_buf()) {
Entry::Vacant(vacant_entry) => {
let mut s = String::new();
let mut f = File::open(mod_path).map_err(|_| Error::ParseCannotOpenFile {
crate_name: pkg.name.clone(),
src_path: mod_path.to_str().unwrap().to_owned(),
})?;
f.read_to_string(&mut s)
.map_err(|_| Error::ParseCannotOpenFile {
crate_name: pkg.name.clone(),
src_path: mod_path.to_str().unwrap().to_owned(),
})?;
let i = syn::parse_file(&s).map_err(|x| Error::ParseSyntaxError {
crate_name: pkg.name.clone(),
src_path: mod_path.to_string_lossy().into(),
error: x,
})?;
vacant_entry.insert(i.items).clone()
}
Entry::Occupied(occupied_entry) => occupied_entry.get().clone(),
};
// Compute module directory according to Rust 2018 rules
let submod_dir_2018;
let mod_dir = mod_path.parent().unwrap();
let is_mod_rs = depth == 0 || mod_path.ends_with("mod.rs");
let submod_dir = if is_mod_rs {
mod_dir
} else {
submod_dir_2018 = mod_path
.parent()
.unwrap()
.join(mod_path.file_stem().unwrap());
&submod_dir_2018
};
self.process_mod(
pkg,
Some(mod_dir),
Some(submod_dir),
&mod_items,
depth,
/* is_inline = */ false,
is_mod_rs,
)
}