我有一个clang::VarDecl对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还略读了一个问题:-
How to get location of variable name in clang::VarDecl
但是,我想声明变量的并不是文件名。我还提到
1SourceLocation.html
没有任何函数可以返回文件名。有人能告诉我怎么弄吗?
发布于 2013-12-18 13:20:26
您应该使用SourceManager从SourceLocation中获取具体数据。特别是,请看一下 method。
可以通过使用SourceManager获取CompilerInstance::getSourceManager的实例。
发布于 2013-12-20 11:35:37
不需要创建SourceManager对象。MatchFinder::MatchResult::Context为我提供了ASTContext*,我可以在该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";
}
}
}
};“谢谢你的帮助,”奥克。
https://stackoverflow.com/questions/20658987
复制相似问题