使用 Clang 查找特定函数调用的函数定义
Find a function definition for a specific function call with Clang
我正在尝试使用libclang构建一个小程序,该程序检索特定函数调用的函数/方法的定义。
例如,我有以下main.cpp
:
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1;
int b = 1;
int c = add(a, b);
return 0;
}
我想以这样的方式调用我的程序:
./find_definition main.cpp add
我希望它返回:
Definition of add in main.cpp:1 - int add(int x, int y)
我已经在这个SO问题中读到clang_getCursorUSR()
可能会对我有所帮助,到目前为止,我已经有了该代码:
#include <clang-c/Index.h>
#include <iostream>
#include <string>
CXChildVisitResult visitor(CXCursor cursor, CXCursor /* parent */, CXClientData clientData)
{
CXSourceLocation location = clang_getCursorLocation(cursor);
if(clang_Location_isFromMainFile(location) == 0)
{
// Continue the cursor traversal with the next sibling of the cursor just visited, without visiting its children.
return CXChildVisit_Continue;
}
CXCursorKind cursorKind = clang_getCursorKind(cursor);
CXString cursorSpelling = clang_getCursorSpelling(cursor);
if (cursorKind == CXCursor_CallExpr && clang_getCString(cursorSpelling) == "add") {
CXString cursorUsr = clang_getCursorUSR(cursor);
std::cout << "Cursor USR is " << clang_getCString(cursorUsr) << std::endl;
clang_disposeString(cursorUsr);
}
clang_disposeString(cursorSpelling);
// Visit children nodes
unsigned int curLevel = *(reinterpret_cast<unsigned int*>(clientData));
unsigned int nextLevel = curLevel + 1;
clang_visitChildren(cursor, visitor, &nextLevel);
return CXChildVisit_Continue;
}
int main(int argc, char** argv)
{
if(argc < 2)
return -1;
CXIndex index = clang_createIndex(0, 1);
CXTranslationUnit tu = clang_createTranslationUnitFromSourceFile(index, argv[1], 0, 0, 0, 0);
if(!tu)
{
std::cout << "TU not found! Aborting...";
return -1;
}
CXCursor rootCursor = clang_getTranslationUnitCursor(tu);
unsigned int treeLevel = 0;
clang_visitChildren(rootCursor, visitor, &treeLevel);
clang_disposeTranslationUnit(tu);
clang_disposeIndex(index);
return 0;
}
当我在我的main.cpp
上运行它时,它只打印:
Cursor USR is
但我没有得到任何其他信息。
我认为如果您的函数定义位于同一文件中,您可以使用 callexpr 匹配器来获取调用站点。 然后使用 getDirectCallee 获取 FunctionDecl。在 FunctionDecl 上,您可以调用 getBody
相关文章:
- 不同翻译单元中不可重载的非内联函数定义
- Visual Studio中的函数声明和函数定义问题
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 具有enable_if外部类原型的模板类构造函数定义
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为函数定义符号不明确的指针参数
- C++模板专用化 - 无法匹配函数定义
- 错误:在第 6 行'{'标记之前,此处不允许使用函数定义
- 找不到 #define 的函数定义
- 根据类型特征更改函数定义?
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 命名空间更改函数定义
- "Type&"与C++函数定义中的"Type*"
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 如何从 C++ 中的现有模板函数定义新函数
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 为什么c++允许成员函数定义中实例的私有成员访问
- Qt基类函数定义
- C++函数定义中参数列表后面额外一对括号的含义