CLang 3.5 LibTooling: получение имени файла переменной в clang::VarDecl

У меня есть clang::VarDecl объект. Я хочу получить имя файла / местоположение переменной (по крайней мере, если они глобальные). Я также пролистал вопрос:

Как узнать местонахождение имени переменной в clang::VarDecl

Но я предполагаю, что дело не в имени файла, в котором объявлены переменные. Я также упоминал

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

Нет функции, которая может вернуть имя файла. Кто-нибудь может сказать мне, как получить это?

2 ответа

Решение

Вы должны использовать SourceManager чтобы получить конкретные данные из SourceLocation, В частности, взгляните на SourceManager::getFilename(SourceLocation) метод.

Вы можете получить экземпляр SourceManager используя CompilerInstance::getSourceManager,

Там не было необходимости создавать 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.

Другие вопросы по тегам