重写代码与某个ASTMatcher匹配

时间:2014-08-05 01:17:00

标签: clang

我是clang的新用户,我想使用ASTMatcher重命名成员变量名称。例如:

class Person
{

public:
    ....

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

    int m_age;
        ^^^^^^ => rename to age_
};

现在阅读了一些教程后,我找到了如何使用ASTMatcher,以便我可以访问要修改的位置。

但我有一个Seg。在致电clang::Rewriter::ReplaceTextInsertText之后立即出现故障。

我的ASTMatcher计划

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());
}

gdb backtrace的输出

#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

感谢。

1 个答案:

答案 0 :(得分:2)

阅读Eli Bendersky's post后,我找到了答案。

似乎我无法仅使用ASTMatcher重写代码,要修改代码,我们不仅需要ASTFrontendActionASTConsumer,还需要ASTMatcher。 (如果我正在吵架,请纠正我)

你可以获得Eli的代码his github repository