summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2016-11-21 10:16:47 +0100
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2016-11-21 19:18:28 +0100
commitd62af02361be371ded003cb4d293aea8d0762ae9 (patch)
tree0168be6c8e2a523b2ec28c981c4c1ead39587b5c
parentfc93c36139ae40242c782a153f6b2252317c72cd (diff)
ir: Properly recurse inside types.
-rw-r--r--libbindgen/src/ir/item.rs35
1 files changed, 26 insertions, 9 deletions
diff --git a/libbindgen/src/ir/item.rs b/libbindgen/src/ir/item.rs
index c370c8b0..4699af78 100644
--- a/libbindgen/src/ir/item.rs
+++ b/libbindgen/src/ir/item.rs
@@ -1,6 +1,7 @@
//! Bindgen's core intermediate representation type.
use clang;
+use clangll;
use parse::{ClangItemParser, ClangSubItemParser, ParseError, ParseResult};
use std::cell::{Cell, RefCell};
use std::fmt::Write;
@@ -1021,19 +1022,35 @@ impl ClangItemParser for Item {
assert_eq!(popped_decl, declaration_to_look_for);
}
- location.visit(|cur| {
+ fn visit_child(cur: clang::Cursor,
+ id: ItemId,
+ ty: &clang::Type,
+ parent_id: Option<ItemId>,
+ ctx: &mut BindgenContext,
+ result: &mut Result<ItemId, ParseError>)
+ -> clangll::Enum_CXChildVisitResult {
use clangll::*;
- result = Item::from_ty_with_id(id,
- ty,
- Some(cur),
- parent_id,
- ctx);
- match result {
+ if result.is_ok() {
+ return CXChildVisit_Break;
+ }
+
+ *result = Item::from_ty_with_id(id,
+ ty,
+ Some(cur),
+ parent_id,
+ ctx);
+
+ match *result {
Ok(..) => CXChildVisit_Break,
- Err(ParseError::Recurse) => CXChildVisit_Recurse,
+ Err(ParseError::Recurse) => {
+ cur.visit(|c| visit_child(c, id, ty, parent_id, ctx, result));
+ CXChildVisit_Continue
+ }
Err(ParseError::Continue) => CXChildVisit_Continue,
}
- });
+ }
+
+ location.visit(|cur| visit_child(cur, id, ty, parent_id, ctx, &mut result));
if valid_decl {
ctx.currently_parsed_types