[cfe-dev] how to get AST content from CXCursor?

Lou Wynn via cfe-dev cfe-dev at lists.llvm.org
Thu Oct 25 05:27:30 PDT 2018

I've found some functions in the tools/libclang/CXCursor.h file, and 
they are:

std::pair<OverloadedDeclRefStorage, SourceLocation>
   getCursorOverloadedDeclRef(CXCursor C);

const Decl *getCursorDecl(CXCursor Cursor);
const Expr *getCursorExpr(CXCursor Cursor);
const Stmt *getCursorStmt(CXCursor Cursor);
const Attr *getCursorAttr(CXCursor Cursor);
const Decl *getCursorParentDecl(CXCursor Cursor);

ASTContext &getCursorContext(CXCursor Cursor);
ASTUnit *getCursorASTUnit(CXCursor Cursor);
CXTranslationUnit getCursorTU(CXCursor Cursor);

void getOverriddenCursors(CXCursor cursor,
                           SmallVectorImpl<CXCursor> &overridden);

Some of them are implemented as follows:

const Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
   return static_cast<const Decl *>(Cursor.data[0]);

const Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
   if (Cursor.kind == CXCursor_ObjCSuperClassRef ||
       Cursor.kind == CXCursor_ObjCProtocolRef ||
       Cursor.kind == CXCursor_ObjCClassRef)
     return nullptr;

   return static_cast<const Stmt *>(Cursor.data[1]);

const Attr *cxcursor::getCursorAttr(CXCursor Cursor) {
   return static_cast<const Attr *>(Cursor.data[1]);

const Decl *cxcursor::getCursorParentDecl(CXCursor Cursor) {
   return static_cast<const Decl *>(Cursor.data[0]);

But they are not exported in the libClang. I'm wondering if I can use 
them in my code, and how? Can anyone give me any hints on when to use 
data[i], where i = 0, 1, 2? This would be the best way for me to get the 
contents of a node and do source-to-source translation, if it works.


On 10/25/18 5:31 PM, Jacob Carlborg via cfe-dev wrote:
> On 2018-10-25 10:02, Lou Wynn via cfe-dev wrote:
>> Hi,
>> I'm traversing an AST by using the CXCursorVisitor. How can I get the 
>> node content from the cursor? For example, for a 
>> CXCursor_BinaryOperator cursor, I'd like to get the binary operator 
>> itself. I guess that the information is included in the CXCursor 
>> struct, but I haven't found examples of how to use it? Any help is 
>> appreciated.
> I'm not sure if there's a better way but you can get the tokens of the 
> expression. Example, assuming the current cursor is the binary operator:
> 1. Get the translation unit using clang_Cursor_getTranslationUnit
> 2. Get the source extent of the cursor using clang_getCursorExtent
> 3. Tokenize the source extent using clang_tokenize, this will give you 
> an array of tokens
> 4. For each token:
>   1. Get the token kind using clang_getTokenKind
>   2. Get the token spelling using clang_getTokenSpelling
> 5. Find the token with the kind CXToken_Punctuation
> 6. The spelling for this token will contain the binary operator as a 
> string
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20181025/d9d7abfc/attachment.html>

More information about the cfe-dev mailing list