2
나는 MatchFinder과 같이 정의했다 :교체가
MatchFinder Finder;
Finder.addMatcher(FunctionCallMatcher, &printer);
그리고 DeclarationMatcher 및 MatchCallback은 다음과 같습니다 : 내 주요 코드에서
DeclarationMatcher FunctionCallMatcher = functionDecl(isDefinition()).bind("func");
class FuncPrinter : public MatchFinder::MatchCallback {
public :
FuncPrinter(){Replace = new Replacements;}
FuncPrinter(Replacements *Replace) : Replace(Replace) {}
virtual void run(const MatchFinder::MatchResult &Result) {
clang::ASTContext *Context = Result.Context;
if (const FunctionDecl *FS = Result.Nodes.getNodeAs<clang::FunctionDecl>("func")) {
FS->dump();
SourceRange sr = FS->getSourceRange();
std::string s = std::string("test");
Replacement Rep(*(Result.SourceManager), sr.getEnd(), s.length(), s);
if(llvm::Error err = Replace->add(Rep)) {
}
}
}
private:
Replacements *Replace;
};
를, 내가 실행 프론트 엔드 작업 찾기 및 교체 :
RefactoringTool Tool(OptionsParser.getCompilations(),
OptionsParser.getSourcePathList());
FuncPrinter printer;
MatchFinder Finder;
Finder.addMatcher(FunctionCallMatcher, &printer);
if (int Result = Tool.run(newFrontendActionFactory(&Finder).get())) {
return Result;
}
std::map<std::string, Replacements>& reps = Tool.getReplacements();
그래도 va 교체 FrontendAction이 실행될 때 FuncPrinter에서 값이 반입됩니다. Tool.getReplacements()
은 빈 을 반환합니다. 누구든지 내가 잘못 나온 곳을 생각해 낼 수 있다면 고맙겠습니다.