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

How can I get the name of a statement in 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;
};

如何获取名称,即语句本身?通过使用 Source Manager 并从原始源代码中提取它?

使用 getFoundDecl() 方法,可以获取 class "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;
};