在 Python 中通过 libclang 解析 C++ 源文件时,我试图查找(行和列位置)特定函数声明的所有引用。
例如:
#include <iostream>
using namespace std;
int addition (int a, int b)
{
int r;
r=a+b;
return r;
}
int main ()
{
int z, q;
z = addition (5,3);
q = addition (5,5);
cout << "The first result is " << z;
cout << "The second result is " << q;
}
所以,对于上面的源文件,我想要addition
第 5 行的函数声明,我想要find_all_function_decl_references
(见下文)返回第addition
15 行和第 16 行的引用。
我试过这个(改编自这里)
import clang.cindex
import ccsyspath
index = clang.cindex.Index.create()
translation_unit = index.parse(filename, args=args)
for node in translation_unit.cursor.walk_preorder():
node_definition = node.get_definition()
if node.location.file is None:
continue
if node.location.file.name != sourcefile:
continue
if node_def is None:
pass
if node.kind.name == 'FUNCTION_DECL':
if node.kind.is_reference():
find_all_function_decl_references(node_definition.displayname) # TODO
另一种方法是存储在列表中找到的所有函数声明并find_all_function_decl_references
在每个函数声明上运行该方法。
有谁知道如何解决这个问题?这种find_all_function_decl_references
方法会如何?(我对libclang
Python 很陌生。)
我已经看到它正在查找对某种类型的def find_typerefs
所有引用,但我不确定如何根据我的需要实现它。
理想情况下,我希望能够获取任何声明的所有引用;不仅是函数,还有变量声明、参数声明(例如上面第 7 行示例中的a
和b
)、类声明等。
编辑 根据Andrew 的评论,以下是有关我的设置规范的一些详细信息:
- LLVM 3.8.0-win64
- libclang-py3 3.8.1
- Python3.5.1(在 Windows 中,我假设为 CPython)
- 对于
args
,我尝试了此处答案中建议的方法和另一个答案中建议的方法。
*请注意,鉴于我的小型编程经验,我可以通过简要说明它的工作原理来感谢答案。