我正在http://clang.llvm.org/docs/LibASTMatchersTutorial.html上随意学习本教程。我设法创建了一个与类定义匹配的AST Matcher,我的MatchFinder看起来像这样

class ClassDeclPrinter : public MatchFinder::MatchCallback
{
public:
  virtual void run(const MatchFinder::MatchResult &result) override
  {
    if (clang::NamedDecl const* nd = result.Nodes.getNodeAs<clang::NamedDecl>("id"))
    {
      nd->dump();
    }
  }
};

如果我在匹配的节点上调用dump(),则输出已包含其文件和源位置:
CXXRecordDecl 0x10dd250 </home/name/llvm-dev/build/../../cpp/classes.cpp:4:1, line:6:1> class B definition

但是,当我调用getLocation()时,只得到一个SourceLocation对象,该对象的print()和dump()函数需要SourceManager实例才能工作。我不知道如何获取此SourceManager,或者是否还有另一种获取可打印源位置的方法。

最佳答案

正确的SourceManager可通过以下途径获得

result.Context->getSourceManager();

10-08 11:16