summaryrefslogtreecommitdiff
path: root/src/parse.rs
blob: 39d2644a858e1f47faa71af483dd00f79f31103f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use clang;
use ir::ty::TypeKind;
use ir::item::ItemId;
use ir::context::BindgenContext;

#[derive(Debug)]
pub enum ParseError {
    Recurse,
    Continue,
}

#[derive(Debug)]
pub enum ParseResult<T> {
    AlreadyResolved(ItemId),
    New(T, Option<clang::Cursor>),
}

pub trait ClangSubItemParser : Sized {
    /// The fact that is a reference guarantees it's holded by the context, and
    /// allow returning already existing types.
    fn parse(cursor: clang::Cursor, context: &mut BindgenContext) -> Result<ParseResult<Self>, ParseError>;
}

pub trait ClangItemParser: Sized {
    fn parse(cursor: clang::Cursor,
             parent: Option<ItemId>,
             context: &mut BindgenContext) -> Result<ItemId, ParseError>;
    fn from_ty_or_ref(ty: clang::Type,
                      location: Option<clang::Cursor>,
                      parent_id: Option<ItemId>,
                      context: &mut BindgenContext) -> ItemId;
    fn from_ty_with_id(id: ItemId,
                       ty: &clang::Type,
                       location: Option<clang::Cursor>,
                       parent: Option<ItemId>,
                       ctx: &mut BindgenContext) -> Result<ItemId, ParseError>;
    fn from_ty(ty: &clang::Type,
               location: Option<clang::Cursor>,
               parent: Option<ItemId>,
               ctx: &mut BindgenContext) -> Result<ItemId, ParseError>;
    fn named_type<S>(name: S, default: Option<ItemId>, parent: ItemId,
                     context: &mut BindgenContext) -> ItemId
        where S: Into<String>;
    fn named_type_with_id<S>(id: ItemId, name: S, default: Option<ItemId>,
                             parent: ItemId, context: &mut BindgenContext) -> ItemId
        where S: Into<String>;
    fn builtin_type(kind: TypeKind, is_const: bool, context: &mut BindgenContext) -> ItemId;
}