2013-12-21 3 views
2

Я работаю над CLang 3.5. Я пытаюсь получить информацию о переменных, объявленных в проекте C++.CLang Libtooling: выборка типа переменной внутри clang :: VarDecl, clang :: FieldDecl или clang :: ParmVarDecl

Как получить тип данных или квалифицированное имя класса переменной в объектах clang::VarDecl, clang::FieldDecl или clang::ParmVarDecl? Я попытался найти функцию, которая может возвращать тип данных или имя класса переменной в документе для clang::VarDecl, приведенной здесь.

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

Я также попытался посмотреть в код $LLVM/tools/clang/tools/clang-check/ClangCheck.cpp, потому что при переходе ЦМД ARG --ast-dump он показывает всю информацию о каждом узле AST включая все переменные, объявленные. Интересно, как получить доступ ко всей этой информации.

Я использую ASTMatchers найти мои объявления переменных, те:

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

Может кто-нибудь пожалуйста, скажите мне, как я могу получить тип данных всех переменных delcared?

+0

Должен ли я добавить больше деталей к нему? Если я прошу что-то очень очевидное, предоставьте мне некоторые ссылки на соответствующие учебники. Или, по крайней мере, скажите мне, с какого класса начать, если я хочу понять разбор и доступ к AST в исходном коде CLang. –

+0

Попробуйте посмотреть llvm/tools/clang/unittests/AST и взгляните на код, касающийся прохождения AST. Я лично нашел эту ссылку очень полезной: http://clang.llvm.org/docs/LibASTMatchersTutorial.html –

ответ

1

В последнее время я изучаю Clang, и после написания этого вопроса я написал несколько кодов. Это может помочь вам.

Полный исходный код доступен в github.com (см ex04.cc)

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() 
};