2014-10-02 79 views
8

我一直在使用卓越的C接口libclang(http://clang.llvm.org/doxygen/group__CINDEX.html)編寫C++ AST分析器。不幸的是,在C++ 11範圍的枚舉和老式的枚舉之間似乎沒有消歧義:它們都有一個遊標類型CXCursor_EnumDecl和一個類型CXType_Enum I.e.相同。如何檢測使用libclang的枚舉和範圍枚舉之間的區別?

我曾試着去看孩子,看他們的父母是不同的 - 可悲的是。我試過要求基礎類型,我得到了一個整數。我已經檢查了Enum之後聲明的所有項目,以查看是否可能會出現舊式的枚舉bind或typedef,再次沒有區別。

我開始認爲我必須缺少一些東西。我是否必須使用代碼完成API來確定它是哪種類型的Enum或什麼?

回答

3

所以這裏有一個解決方案,雖然它不是很棒,但它可以幫助其他人。甲CXCursor是尋找這樣一個結構:

typedef struct { 
    enum CXCursorKind kind; 
    int xdata; 
    const void *data[3]; 
} CXCursor; 

目前,void *的數據[3]映射到{常量鐺:: *申報父,常量鐺::語句* S,CXTranslationUnit TU}。知道了這些,我們就可以編寫代碼提取內部鐺C從當前libclangÇ狀態++對象:

#include "clang/AST/Decl.h" 
bool isScoped=false; 
{ 
    using namespace clang; 
    const Decl *D = static_cast<const Decl *>(cursor.data[0]); 
    if(const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D)) 
    { 
    isScoped=TD->isScoped(); 
    } 
} 

很多壞事可以用此溶液發生,如果您鐺頭從libclang偏離。我不太在意這個解決方案,但它確實有效。