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