如何在Clang LibTooling中获取语句的名称?

时间:2015-11-02 14:09:27

标签: clang libtooling

我正在使用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;
};

我如何获得名称,即声明本身?通过使用源管理器并从原始源代码中提取它?

1 个答案:

答案 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;
};