我正在使用LibTooling:我想要做的是输出源文件中所有变量的所有位置。
为了找到所有变量的出现,我重载了RecursiveASTVisitor和方法“bool VisitStmt(Stmt)”(见下文),但现在我不知道如何输出变量的名称。目前,我的代码只输出“DeclRefExpr”,但我想要“myNewVariable”或我输入文件中定义的任何内容。
class MyASTVisitor : public RecursiveASTVisitor<MyASTVisitor>
{
public:
explicit MyASTVisitor(ASTContext *Context_passed) : Context(Context_passed) {}
bool VisitStmt(Stmt *sta)
{
FullSourceLoc FullLocation = Context->getFullLoc(sta->getLocStart());
SourceManager &srcMgr = Context->getSourceManager();
if
(
FullLocation.isValid() &&
strcmp(sta->getStmtClassName(), "DeclRefExpr") == 0
)
{
// Print function name
printf("stm: %-23s at %3u:%-3u in %-15s\n",
sta->getStmtClassName(),
FullLocation.getSpellingLineNumber(),
FullLocation.getSpellingColumnNumber(),
srcMgr.getFilename(FullLocation).data());
}
return true;
}
private:
ASTContext *Context;
};
我如何获得名称,即声明本身?通过使用源管理器并从原始源代码中提取它?
答案 0 :(得分:0)
使用方法getFoundDecl(),可以获取类“NamedDecl”的实例,然后使用方法getNameAsString(),可以获取名称作为字符串,因此代码现在看起来像这样:
class MyASTVisitor : public RecursiveASTVisitor<MyASTVisitor>
{
public:
explicit MyASTVisitor(ASTContext *Context_passed) : Context(Context_passed) {}
bool VisitDeclRefExpr(DeclRefExpr *sta)
{
FullSourceLoc FullLocation = Context->getFullLoc(sta->getLocStart());
SourceManager &srcMgr = Context->getSourceManager();
if ( FullLocation.isValid() )
{
// Print function or variable name
printf("stm: %-23s at %3u:%-3u in %-15s\n",
(sta->getFoundDecl())->getNameAsString().c_str(),
FullLocation.getSpellingLineNumber(),
FullLocation.getSpellingColumnNumber(),
srcMgr.getFilename(FullLocation).data());
}
return true;
}
private:
ASTContext *Context;
};