2014-06-07 151 views
3

我有一個AST消費者得到所有的TagDecl它們的結構與如何從TagDecl獲得結構成員鏗鏘

clang::TagDecl::isStruct() 

如何在數組中獲得結構的成員(聲明,類型)像FunctionDecl類:

clang::FunctionDecl::getParamDecl(unsigned i) 

還是以其他方式?

回答

3

必須將TagDecl轉換爲RecordDecl,這些方法具有獲取成員/字段信息的方法。

clang::TagDecl*t; 
clang::RecordDecl*r; 
clang::RecordDecl::field_iterator jt; 

for(jt = r->field_begin(); jt != r->field_end();++jt) 
{ 
    std::cout << jt->getType().getAsString() << " " << jt->getNameAsString() << std::endl; 
} 
-1
void HandleTagDeclDefinition(TagDecl *D) override 
{  
    if(D->isStruct()) 
    {  
     DeclContext *DC = static_cast<DeclContext *>(D); 
     for (DeclContext::decl_iterator DI = DC->decls_begin(), DEnd = DC->decls_end(); 
      DI != DEnd; ++DI) 
     { 
      DI->dump(); 
     } 
    } 
} 

你應該這個功能添加到您擴展到ASTConsumer類。這方面

每聲明範圍內聲明的

存儲可以包含聲明的一些數字。例如,對於 示例,C++類(由RecordDecl表示)包含各種成員函數,字段,嵌套類型等等。所有這些 聲明都將存儲在DeclContext中,並且可以通過[DeclContext :: decls_begin(), DeclContext :: decls_end())迭代遍歷聲明。該機制提供了上下文中以聲明爲中心的聲明視圖。

http://clang.llvm.org/docs/InternalsManual.html

+1

請儘量避免只是傾銷碼作爲回答,並試圖解釋它做什麼,以及爲什麼。對於那些沒有相關編碼經驗的人來說,你的代碼可能並不明顯。 – Frits