diff --git a/src/bindgen/config.rs b/src/bindgen/config.rs index 004b9901e0f980472c961c49d3a1ef05e49480c3..e33af99fc2b1568810a400974ed1107e77d9e6fc 100644 --- a/src/bindgen/config.rs +++ b/src/bindgen/config.rs @@ -110,6 +110,8 @@ pub struct Config { pub tab_width: usize, /// The language to output bindings for pub language: Language, + /// The names of crates to parse with `rustc --pretty=expanded` + pub expand: Vec<String>, /// The configuration options for functions #[serde(rename = "fn")] pub function: FunctionConfig, @@ -133,6 +135,7 @@ impl Default for Config { line_length: 100, tab_width: 2, language: Language::Cxx, + expand: Vec::new(), function: FunctionConfig::default(), structure: StructConfig::default(), enumeration: EnumConfig::default(), diff --git a/src/bindgen/library.rs b/src/bindgen/library.rs index adb151304188e431f4e4d5e2f90401783a43e6d4..c92ce6d1c6847ac8e299ec9d60e00cf9795de2e0 100644 --- a/src/bindgen/library.rs +++ b/src/bindgen/library.rs @@ -305,7 +305,10 @@ impl<'a> Library<'a> { { let mut library = Library::blank(bindings_crate_name, config); - rust_lib::parse_lib(crate_dir, bindings_crate_name, &mut |crate_name, items| { + rust_lib::parse_lib(crate_dir, + bindings_crate_name, + &config.expand, + &mut |crate_name, items| { library.parse_crate_mod(&crate_name, items); }); diff --git a/src/bindgen/rust_lib.rs b/src/bindgen/rust_lib.rs index 6c873ff844c442674e5a626e80a82a0288cffdf8..b8a81f73bdde6768967b22f8385a2b232fb73d20 100644 --- a/src/bindgen/rust_lib.rs +++ b/src/bindgen/rust_lib.rs @@ -36,6 +36,7 @@ pub fn parse_src<F>(src_file: &Path, /// command to find the location of dependencies. pub fn parse_lib<F>(crate_path: &Path, binding_crate_name: &str, + expand: &[String], items_callback: &mut F) where F: FnMut(&str, &Vec<syn::Item>) { @@ -50,6 +51,7 @@ pub fn parse_lib<F>(crate_path: &Path, let mut context = ParseLibContext { manifest_path: manifest_path, metadata: metadata, + expand: expand.to_owned(), cache_src: HashMap::new(), cache_expanded_crate: HashMap::new(), items_callback: items_callback, @@ -63,6 +65,7 @@ struct ParseLibContext<F> { manifest_path: PathBuf, metadata: cargo_metadata::Metadata, + expand: Vec<String>, cache_src: HashMap<PathBuf, Vec<syn::Item>>, cache_expanded_crate: HashMap<String, Vec<syn::Item>>, @@ -95,6 +98,11 @@ fn parse_crate<F>(crate_name: &str, context: &mut ParseLibContext<F>) return; } + if context.expand.contains(&crate_name.to_owned()) { + parse_expand_crate(crate_name, context); + return; + } + let crate_src = context.find_crate_src(crate_name); match crate_src { @@ -155,8 +163,8 @@ fn process_expanded_mod<F>(crate_name: &str, warn!("external mod found in expanded source"); } syn::ItemKind::ExternCrate(_) => { - parse_expand_crate(&item.ident.to_string(), - context); + parse_crate(&item.ident.to_string(), + context); } _ => {} } @@ -227,8 +235,8 @@ fn process_mod<F>(crate_name: &str, } } syn::ItemKind::ExternCrate(_) => { - parse_expand_crate(&item.ident.to_string(), - context); + parse_crate(&item.ident.to_string(), + context); } _ => {} }