CLang Libtooling: выборка типа данных переменной внутри clang :: VarDecl, clang :: FieldDecl или clang :: ParmVarDecl

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

Как я могу получить тип данных или квалифицированное имя класса переменной в 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 потому что при прохождении cmd arg --ast-dump он показывает всю информацию о каждом узле AST, включая все объявленные переменные. Интересно, как получить доступ ко всей этой информации.

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

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

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

2

Решение

Недавно я учусь 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()
};
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]