c++ - 在 clang RefactoringTool 中替换返回空 map

标签 c++ clang llvm libtooling

我有一个 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();

虽然我可以观察到 FuncPrinter 中的 Replace 变量在执行 FrontendAction 时被填充,Tool.getReplacements()返回一个空的 std::map<std::string, Replacements> .如果有人能指出我哪里出错了,我将不胜感激。

最佳答案

设法解决了它,所以发布了我自己的解决方案。问题在于使用默认构造函数,而使用 FuncPrinter(reps_t *reps) 的构造函数可以解决问题。

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

关于c++ - 在 clang RefactoringTool 中替换返回空 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42485217/

相关文章:

c++ try and catch 时的返回值

c++ - 如何 "Clear"一个WinAPI透明窗口

c++ - 为什么 clang 让我在 C++03 模式下通过非常量引用获取临时值?

clang-format 对已格式化的文件进行更改

c++ - 如何使用 llvm 和 g++ 进行编译?

c++ - C++ 的拆分函数

c++ - 找不到 timeBeginPeriod 标识符错误

xcode - OS X 上等效的图像文件执行选项

c++ - 如何在 Linux 上的 clang 中获取模板实例化统计信息?

build - 我可以在没有 Python 解释器的情况下构建 LLVM 吗?