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.