2013-12-21 2 views
2

저는 Clang 3.5에서 작업 중입니다. C++ 프로젝트에서 선언 된 변수에 대한 정보를 가져 오려고합니다.CLang Libtooling : clang :: VarDecl, clang :: FieldDecl 또는 clang :: ParmVarDecl 내부의 변수 데이터 유형 가져 오기

clang::VarDecl, clang::FieldDecl 또는 clang::ParmVarDecl 개체에서 변수의 데이터 유형이나 정규화 된 클래스 이름을 가져올 수 있습니까? 여기에 제공된 clang::VarDecl에 대한 doc에서 변수의 데이터 유형 또는 클래스 이름을 반환 할 수있는 함수를 찾으려고했습니다.

http://clang.llvm.org/doxygen/classclang_1_1VarDecl.html

는 또한 때문에 통과 cmd를에 $LLVM/tools/clang/tools/clang-check/ClangCheck.cpp의 코드로 보는 시도가 선언 된 모든 변수를 포함하여 모든 AST 노드에 대한 모든 정보를 보여줍니다 --ast-dump을 arg를. 나는 그 모든 정보에 어떻게 접근해야하는지 궁금합니다. 내 변수 선언을 찾을 수 ASTMatchers을 사용하고

, 사람들은 다음과 같습니다

fieldDecl().bind("field") 
parmVarDecl().bind("param") 
varDecl().bind("var") 

는 사람이 어떻게 delcared 모든 변수의 데이터 유형을 얻을 수 말해 주시겠습니까?

+0

내가 그것을 더 많은 세부 사항을 추가해야 (ex04.cc 참조) github.com 에서 사용할 수 있습니까? 아주 명확한 것을 묻는다면 관련 튜토리얼에 대한 링크를 제공해주십시오. 또는 적어도 Clang 소스 코드에서 구문 분석 및 AST에 액세스하려는 경우 시작할 클래스를 알려주십시오. –

+0

llvm/tools/clang/unittests/AST를 살펴보고 AST를 통과하는 코드를 살펴보십시오. 나는 개인적으로이 링크가 매우 유용하다는 것을 알았다 : http://clang.llvm.org/docs/LibASTMatchersTutorial.html –

답변

1

최근에 나는 Clang을 배우고 있으며이 질문을 읽고 몇 가지 코드를 작성했습니다. 도움이 될지도 모릅니다.

전체 소스 코드

DeclarationMatcher FieldDeclMatcher = 
    clang::ast_matchers::fieldDecl().bind("field_decl"); 

class LoopPrinter : public MatchFinder::MatchCallback 
{ 
public : 
    virtual void run(const MatchFinder::MatchResult& result) 
    { 
     if (const clang::FieldDecl* fd 
      = result.Nodes.getNodeAs<clang::FieldDecl>("field_decl")) 
     { 
      std::cout << "======== FieldDecl found ======" << std::endl; 

      const clang::RecordDecl* rd = fd->getParent(); 
      const clang::QualType qt = fd->getType(); 
      const clang::Type* t = qt.getTypePtr(); 

      std::cout << "FieldDecl found '" 
         << fd->getQualifiedNameAsString() << " " 
         << fd->getName().str() << "' in '" 
         << rd->getName().str() << "'. " 
         << "is Builtintype = " << t->isBuiltinType() << " " 
         << std::endl << std::endl; 
     } 

    } // end of run() 
};