C++ CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名
我有一个C++ CLang 3.5 LibTooling:获取CLang::VarDecl中变量的文件名,c++,clang,C++,Clang,我有一个clang::VarDecl对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还略读了一个问题:- 但我想这与声明变量的文件名无关。 我还提到 没有任何函数可以返回文件名。有谁能告诉我如何获取它吗?您应该使用SourceManager从SourceLocation获取具体数据。特别是,请看一下 您可以通过使用获取SourceManager的实例。无需创建SourceManager对象MatchFinder::MatchResult::Context为我提供了ASTConte
clang::VarDecl
对象。我想获取变量的文件名/位置(至少如果它们是全局的)。我还略读了一个问题:-
但我想这与声明变量的文件名无关。
我还提到
没有任何函数可以返回文件名。有谁能告诉我如何获取它吗?您应该使用
SourceManager
从SourceLocation
获取具体数据。特别是,请看一下
您可以通过使用获取
SourceManager
的实例。无需创建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";
}
}
}
};
class VarDeclPrinter:public MatchFinder::MatchCallback{
公众:
虚拟无效运行(常量MatchFinder::MatchResult和Result){
SourceManager&srcMgr=Result.Context->getSourceManager();
if(const VarDecl*var=Result.Nodes.getNodeAs(“var”)){
如果(var->isFunctionOrMethodVarDecl()){
但是CompilerInstance::createSourceManager
的返回类型为void。我如何获取它的实例?与CompilerInstance::createFileManager
相同。我不熟悉CLang libtooling,您能进一步解释一下吗?谢谢您的帮助。但是当我尝试使用ci.getSourceManager().getFilename()时(var->getLocation()).str()
,其中ci
是CompilerInstance
的对象,var
是VarDecl
的对象,那么我得到了分段错误。这是gdb所说的:-程序收到信号SIGSEGV,分段错误。clang::SourceManager::getFileID中的0x08060d52(此=0x0,拼写LOC=…)在/home/prakar/Source/CLang/llvm/tools/CLang/include/CLang/Basic/SourceManager.h:974中。您知道此错误的原因吗?我发现&ci.getSourceManager()
每次都为空。至少告诉我是否缺少什么?我是否必须在CompilerInstance中初始化SourceManager?如果是,那么如何构造SourceManager?@Prakhamishra您是否先创建了源代码管理器(使用createSourceManager
方法)?由于CompilerInstance.cpp
中的compileModule
fn,我了解了如何创建SourceManager
。即使在调用createSourceManager
之前,也需要调用CompilerInstance
对象上的createDiagnostics
,否则会出现segmentation fault
。谢谢谢谢你的帮助,奥克。