Clang 重写与某个ASTMatcher匹配的代码

Clang 重写与某个ASTMatcher匹配的代码,clang,Clang,我是clang新手,我想使用astmacher重命名成员变量名。例如: class Person { public: .... private: char m_genger; ^^^^^^^^ => rename to gender_ int m_age; ^^^^^^ => rename to age_ }; 在阅读了一些教程之后,我发现了如何使用ASTMatcher,以便访问要修改的位置 但我有一个赛格。调用cla

我是
clang
新手,我想使用
astmacher
重命名成员变量名。例如:

class Person
{

public:
    ....

private:
    char m_genger;
         ^^^^^^^^ => rename to gender_

    int m_age;
        ^^^^^^ => rename to age_
};
在阅读了一些教程之后,我发现了如何使用
ASTMatcher
,以便访问要修改的位置

但我有一个赛格。调用
clang::Rewriter::ReplaceText
InsertText
后立即出现错误

我的
astmacher
程序 谢谢。

读完后,我找到了答案

似乎我不能只用
ASTMatcher
重写代码,要修改代码,我们不仅需要
ASTFrontendAction
astcummer
,还需要
ASTMatcher
。 (如果我不明白,请纠正我)


您可以获取Eli的代码。

在使用重写器之前,必须使用setSourceMgr设置源代码管理器,无需ASTFrontendAction等。
DeclarationMatcher FieldDeclMatcher =
    clang::ast_matchers::fieldDecl().bind("field_decl");

clang::Rewriter rewriter;

class MyMatcher : public MatchFinder::MatchCallback
{
public :
    MyMatcher(clang::Rewriter& rewrite) : m_rewriter(rewrite) {}

    virtual void run(const MatchFinder::MatchResult& result)
    {
        if (const clang::FieldDecl* fs
            = result.Nodes.getNodeAs<clang::FieldDecl>("field_decl"))
        {
            std::cout << "===== found: FieldDecl =====" << std::endl;
            fs->dump();
            std::cout << std::endl;

            // seg. fault occurs here.
            m_rewriter.InsertText(fs->getLocStart(), "/* comment */", true, true);
        }
    }
private:
    clang::Rewriter& m_rewriter;
};

int main(int argc, const char **argv)
{
    CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
    ClangTool Tool(OptionsParser.getCompilations(),
                   OptionsParser.getSourcePathList());

    MyMatcher matcher(rewriter);

    clang::ast_matchers::MatchFinder finder;
    finder.addMatcher(FieldDeclMatcher, &matcher);

    return Tool.run(newFrontendActionFactory(&finder).get());
}
#0  0x0000000000a52153 in clang::Rewriter::getLocationOffsetAndFileID(clang::SourceLocation, clang::FileID&) const ()
#1  0x0000000000a5516a in clang::Rewriter::InsertText(clang::SourceLocation, llvm::StringRef, bool, bool) ()
#2  0x0000000000422f0d in MyMatcher::run(clang::ast_matchers::MatchFinder::MatchResult const&) () at ex03.cc:68