diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-11-22 13:15:56 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-11-22 13:36:41 +0100 |
commit | 26d4c73dd364fb52ac459ff642fade6c6a3895a3 (patch) | |
tree | b9b89771b401914f437d43bdf01b796a9bd5d856 /libbindgen/src/codegen/mod.rs | |
parent | f6b2c6c25c8407f7ae331ebd3d408432a676d6a4 (diff) |
A more coherent story for whitelisting.
Diffstat (limited to 'libbindgen/src/codegen/mod.rs')
-rw-r--r-- | libbindgen/src/codegen/mod.rs | 77 |
1 files changed, 23 insertions, 54 deletions
diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index a3fefcc7..0469a5be 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -242,11 +242,6 @@ impl CodeGenerator for Item { match *self.kind() { ItemKind::Module(ref module) => { - if !ctx.options().enable_cxx_namespaces && - self.id() == ctx.root_module() { - return; - } - module.codegen(ctx, result, whitelisted_items, self); } ItemKind::Function(ref fun) => { @@ -274,22 +269,28 @@ impl CodeGenerator for Module { item: &Item) { debug!("<Module as CodeGenerator>::codegen: item = {:?}", item); - if !ctx.options().enable_cxx_namespaces { - for child in self.children() { - ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); + let codegen_self = |result: &mut CodegenResult| { + // FIXME: This could be less expensive, I guess. + for &whitelisted_item in whitelisted_items { + if whitelisted_item == item.id() { + continue; + } + + let child = ctx.resolve_item(whitelisted_item); + if child.parent_id() == item.id() { + child.codegen(ctx, result, whitelisted_items, &()); + } } + }; + + if !ctx.options().enable_cxx_namespaces { + codegen_self(result); return; } let inner_items = result.inner(|result| { result.push(root_import(ctx)); - for child in self.children() { - if whitelisted_items.contains(child) { - ctx.resolve_item(*child) - .codegen(ctx, result, whitelisted_items, &()); - } - } + codegen_self(result); }); let module = ast::ItemKind::Mod(ast::Mod { @@ -428,13 +429,12 @@ impl CodeGenerator for Type { TypeKind::Comp(ref ci) => { ci.codegen(ctx, result, whitelisted_items, item) } + // NB: The inner Alias will be generated and pick the correct + // applicable_template_args. TypeKind::TemplateAlias(inner, _) => { - // NB: The inner Alias will pick the correct - // applicable_template_args. - let inner_item = ctx.resolve_item(inner); - inner_item.expect_type() - .codegen(ctx, result, whitelisted_items, inner_item); - } + ctx.resolve_item(inner) + .codegen(ctx, result, whitelisted_items, &()) + }, TypeKind::Alias(ref spelling, inner) => { let inner_item = ctx.resolve_item(inner); let name = item.canonical_name(ctx); @@ -1964,27 +1964,6 @@ impl CodeGenerator for Function { } } -// Return true if any of the ancestors of `id` are in the whitelisted items set, -// false otherwise. -fn ancestor_is_whitelisted(ctx: &BindgenContext, - whitelisted_items: &ItemSet, - id: ItemId) - -> bool { - let item = ctx.resolve_item(id); - let mut last = id; - let mut current = item.parent_id(); - - while last != current { - if whitelisted_items.contains(¤t) { - return true; - } - last = current; - current = ctx.resolve_item(current).parent_id(); - } - - false -} - pub fn codegen(context: &mut BindgenContext) -> Vec<P<ast::Item>> { context.gen(|context| { let mut result = CodegenResult::new(); @@ -2000,18 +1979,8 @@ pub fn codegen(context: &mut BindgenContext) -> Vec<P<ast::Item>> { } } - for &id in whitelisted_items.iter() { - let item = context.resolve_item(id); - - // Non-toplevel items' parents are responsible one for generating - // their children. However, if we find an orphaned reference to a - // non-toplevel item whose parent is not in our whitelisted set, we - // need to take responsibility for generating it. - if item.is_toplevel(context) || - !ancestor_is_whitelisted(context, &whitelisted_items, id) { - item.codegen(context, &mut result, &whitelisted_items, &()); - } - } + context.resolve_item(context.root_module()) + .codegen(context, &mut result, &whitelisted_items, &()); let saw_union = result.saw_union; let mut result = result.items; |