我需要预处理一些C++文件以自动插入用于测试和分析的代码,我需要使用clang API来完成.
现在,我希望能够执行以下操作:如果有功能:
int SomeFn(int a, int b, int c) {
doStuff();
}
Run Code Online (Sandbox Code Playgroud)
我想预处理它,它看起来像这样:
int SomeFn(int a, int b, int c) {
cout << "SomeFn is invoked with the following arguments: a=" << a << ", b=" << b << ", c=" << c << endl;
doStuff();
}
Run Code Online (Sandbox Code Playgroud)
我试图扩展ASTConsumer和使用这些方法HandleTopLevelDecl,HandleTopLevelSingleDecl并检查传递的Decls是否是FunctionDecls向下传播它们,所以我可以得到它们的名字和身体位置.但是我不能这样处理类方法,只能处理全局函数.
我在ASTConsumer课堂上找到了一个功能HandleTagDeclDefinition(TagDecl* D).文件说:
每次完成TagDecl(例如struct,union,enum,class)时,都会调用此回调.
但是当我测试它时,看起来甚至没有调用这个方法.
所以我的问题是,做这项任务的正确方法是什么?如何在clang API中表示C++类?也许有人知道,我可以在哪里找到例子,因为clang API记录很差.
更新:
我知道还有一个概念,Visitors并且有一种方法VisitRecordDecl(RecordDecl *D) …
我正在使用clang 3.0库来分析C/C++代码,我需要获取变量声明的位置,我试过这段代码:
clang::VarDecl * vd = ...;
clang::SourceManager & srcMgr = ...;
clang::SourceRange loc = vd->getSourceRange();
clang::PresumedLoc locStart = srcMgr.getPresumedLoc(loc.getBegin());
clang::PresumedLoc locEnd = srcMgr.getPresumedLoc(loc.getEnd());
Run Code Online (Sandbox Code Playgroud)
但是locStart和locEnd指向声明变量的开头(和结尾)(带有类型,可能是初始化器).例如:
const char * ptr = 0;
^ ^ ^ ^
Run Code Online (Sandbox Code Playgroud)
locStart将指向第一个指针(^),而locEnd将指向最后一个指针.如何获取第二个和第三个指针的位置(仅限名称,没有类型和初始化)?