2017-02-27 6 views
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()은 빈 을 반환합니다. 누구든지 내가 잘못 나온 곳을 생각해 낼 수 있다면 고맙겠습니다.

답변

0

해결 방법을 관리하므로 내 솔루션을 게시 할 수 있습니다. 문제는 기본 생성자를 사용하는 반면, 생성자는 FuncPrinter(reps_t *reps) does the trick.

class FuncPrinter : public MatchFinder::MatchCallback { 
    using reps_t = std::map<std::string, Replacements>;  
public : 
    FuncPrinter(reps_t *reps) : Replace(reps) {} 
    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); 
     Replace->insert(std::pair<std::string,Replacements>(path, Replacements(Rep))); 
    } 
    } 
private: 
    reps_t *Replace; 
};