CLang 3.5 LibTooling:获取clang :: VarDecl中变量的文件名

时间:2013-12-18 13:03:15

标签: c++ clang

我有clang::VarDecl个对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还浏览了一个问题: -

How to get location of variable name in clang::VarDecl

但我想这不是关于声明变量的文件名。 我也提到了

http://clang.llvm.org/doxygen/classclang_1_1SourceLocation.html

没有任何可能返回文件名的功能。任何人都可以告诉我如何获得它吗?

2 个答案:

答案 0 :(得分:4)

您应该使用SourceManagerSourceLocation中获取具体数据。请特别注意SourceManager::getFilename(SourceLocation) method

您可以使用CompilerInstance::getSourceManager获取SourceManager的实例。

答案 1 :(得分:4)

无需创建SourceManager对象。 MatchFinder::MatchResult::Context为我提供了ASTContext*,我可以致电getSourceManager获取SourceManager对象。其余的就像我们以前一样。

class VarDeclPrinter : public MatchFinder::MatchCallback {
  public:

  virtual void run(const MatchFinder::MatchResult &Result) {

    SourceManager &srcMgr = Result.Context->getSourceManager();

    if(const VarDecl* var = Result.Nodes.getNodeAs<VarDecl>("var")) {
      if(var->isFunctionOrMethodVarDecl()) {
        cout << setw(20) << left << "Local Variable: " << var->getName().str() << "\t\t";
        cout << ((CXXMethodDecl*)(var->getParentFunctionOrMethod()))->getQualifiedNameAsString() << "\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
      if(var->hasExternalStorage()) {
        cout << setw(20) << left << "External Variable: " << var->getName().str() << "\t\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
      else if(var->hasGlobalStorage()) {
        cout << setw(20) << left << "Global Variable: " << var->getName().str() << "\t\t";
        cout << "--" << srcMgr.getFilename(var->getLocation()).str();
        cout << "\n";
      }
    }
  }
};

感谢您的帮助,@ Oak。