我有clang::VarDecl
个对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还浏览了一个问题: -
How to get location of variable name in clang::VarDecl
但我想这不是关于声明变量的文件名。 我也提到了
http://clang.llvm.org/doxygen/classclang_1_1SourceLocation.html
没有任何可能返回文件名的功能。任何人都可以告诉我如何获得它吗?
答案 0 :(得分:4)
您应该使用SourceManager
从SourceLocation
中获取具体数据。请特别注意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。