我是clang
的新用户,我想使用ASTMatcher
重命名成员变量名称。例如:
class Person
{
public:
....
private:
char m_genger;
^^^^^^^^ => rename to gender_
int m_age;
^^^^^^ => rename to age_
};
现在阅读了一些教程后,我找到了如何使用ASTMatcher
,以便我可以访问要修改的位置。
但我有一个Seg。在致电clang::Rewriter::ReplaceText
或InsertText
之后立即出现故障。
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());
}
#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
感谢。
答案 0 :(得分:2)
阅读Eli Bendersky's post后,我找到了答案。
似乎我无法仅使用ASTMatcher
重写代码,要修改代码,我们不仅需要ASTFrontendAction
和ASTConsumer
,还需要ASTMatcher
。
(如果我正在吵架,请纠正我)
你可以获得Eli的代码his github repository。