diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-11-21 10:16:47 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2016-11-21 19:18:28 +0100 |
commit | d62af02361be371ded003cb4d293aea8d0762ae9 (patch) | |
tree | 0168be6c8e2a523b2ec28c981c4c1ead39587b5c | |
parent | fc93c36139ae40242c782a153f6b2252317c72cd (diff) |
ir: Properly recurse inside types.
-rw-r--r-- | libbindgen/src/ir/item.rs | 35 |
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 |