首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLang 3.5 LibTooling:获取clang::LibTooling中变量的文件名

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

Stack Overflow用户
提问于 2013-12-18 13:03:14
回答 2查看 3K关注 0票数 2

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

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

但是,我想声明变量的并不是文件名。我还提到

1SourceLocation.html

没有任何函数可以返回文件名。有人能告诉我怎么弄吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-18 13:20:26

您应该使用SourceManagerSourceLocation中获取具体数据。特别是,请看一下 method

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

票数 4
EN

Stack Overflow用户

发布于 2013-12-20 11:35:37

不需要创建SourceManager对象。MatchFinder::MatchResult::Context为我提供了ASTContext*,我可以在该ASTContext*上调用getSourceManager来获取SourceManager对象。剩下的和我们以前做的一样。

代码语言:javascript
复制
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";
      }
    }
  }
};

“谢谢你的帮助,”奥克。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20658987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档