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

Lou Wynn via cfe-dev cfe-dev at lists.llvm.org
Mon Oct 29 21:15:28 PDT 2018


That's what I guessed. But my purpose is doing source-to-source 
translation. I'm not sure if I should use libclang and your previously 
suggested method to do it, or use libTooling to directly get AST nodes. 
To me, the second method seems easier to get the content of a node.

Any suggestions? Which way do you prefer if you were translating the 
source to another language?

Love,
Lou

On 10/27/18 8:45 PM, Jacob Carlborg via cfe-dev wrote:
> On 2018-10-25 14:27, Lou Wynn via cfe-dev wrote:
>> 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.
>
> You're looking at the implementation of libclang, which is in C++. 
> These functions will not be exposed. You should look at CXCursor 
> mostly as an opaque data structure. It's fine to read the "kind" field 
> but you should probably avoid the other two fields ("xdata" and "data").
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20181030/5b60361f/attachment-0001.html>


More information about the cfe-dev mailing list