How to traverse all children FieldDecl from parent CXXRecordDecl

Hi,

I am new to clang AST and try to parse a struct like below:

struct Foo {
int a;
double b;
};

the ast-dump result is like:

CXXRecordDecl 0x202c768 </home/lniu/ClangCheck/main.cpp:5:1, line:8:1> line:5:8 struct Foo definition

-CXXRecordDecl 0x202c880 <col:1, col:8> col:8 implicit struct Foo
-FieldDecl 0x202c920 <line:6:5, col:9> col:9 a ‘int’
`-FieldDecl 0x202c978 <line:7:5, col:12> col:12 b ‘double’

My question is How to traverse all children FieldDecl from parent CXXRecordDecl?

I follow the tutorial here http://clang.llvm.org/docs/RAVFrontendAction.html and try to solve this inside bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) from a RecursiveASTVisitor. I am expecting pseudo code like below but couldn’t find the api.

bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) {

for(ChildrenDecl decl : Declaration.getChildren()) {
// do sth here
}

}

I don’t know whether I am on the right path. Any idea is welcome. Thank you!

Best,
Lu

Hi,

As a CXXRecordDecl is a DeclContext, you could simply use the iterators you get by calling
decls_begin and decls_end.
For more sophisticated way, you could implement some visitor and VisitDeclContext from there.

Manasij Mukherjee

Hi,

I am new to clang AST and try to parse a struct like below:

struct Foo {
int a;
double b;
};

the ast-dump result is like:

CXXRecordDecl 0x202c768 </home/lniu/ClangCheck/main.cpp:5:1, line:8:1> line:5:8 struct Foo definition

-CXXRecordDecl 0x202c880 <col:1, col:8> col:8 implicit struct Foo
-FieldDecl 0x202c920 <line:6:5, col:9> col:9 a ‘int’
`-FieldDecl 0x202c978 <line:7:5, col:12> col:12 b ‘double’

My question is How to traverse all children FieldDecl from parent CXXRecordDecl?

I follow the tutorial here http://clang.llvm.org/docs/RAVFrontendAction.html and try to solve this inside bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) from a RecursiveASTVisitor. I am expecting pseudo code like below but couldn’t find the api.

bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) {

for(ChildrenDecl decl : Declaration.getChildren()) {
// do sth here
}

}

I don’t know whether I am on the right path. Any idea is welcome. Thank you!

Use RecordDecl::fields.

Hi,

Thank u for your answers! I have a new question here. Suppose I have a struct dump like below:

typedef struct {
int a;
double b;
} Foo;

-CXXRecordDecl 0x285db60 </home/qqibrow/test/main.cpp:5:9, line:8:1> struct definition

-FieldDecl 0x285dc80 <line:6:5, col:9> a ‘int’
`-FieldDecl 0x285dce0 <line:7:5, col:12> b ‘double’
-TypedefDecl 0x285dd80 <line:5:1, line:8:3> Foo ‘struct Foo’:‘Foo’

Is there a way to get access to that TypedefDecl of the struct from the VisitCXXRecordDecl method? For example:

bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) {

// 1. get name of the struct if possible from its TypedefDecl
// 2. get all fields of the struct. Thanks to your previous answers, I know how to do it now.

}

Best,
Lu