Libclang Python如何获得具有默认值的函数参数数量
libclang python how to get number of arguments for function with default values
我正在使用libclang的python绑定,并且我正在尝试获得callexpr的参数数量,我发现,如果成员函数具有默认值并通过此参数调用缺失,libclang返回函数声明中的参数数量,而不是呼叫表达式中的参数。
例如:
class SomeClass
{
public:
int sum(int x, int y)
{
return x + y;
}
int sum_def(int x, int y = 0)
{
return x + y;
}
};
int main()
{
SomeClass x;
x.sum(10, 100);
x.sum_def(20);
return 0;
}
使用liblcang traverse ast:
def traverse(node):
if node.kind == clang.cindex.CursorKind.CALL_EXPR:
print('%-35s %-20s %-10s [%-6s:%s - %-6s:%s] %s %s ' % (
node.kind, node.spelling, node.type.spelling, node.extent.start.line, node.extent.start.column,
node.extent.end.line, node.extent.end.column, node.location.file, node.mangled_name))
print("%d " % node.get_num_arguments())
for arg in node.get_arguments():
print("ARG=%s %s" % (arg.kind, arg.spelling))
for child in node.get_children():
traverse(child)
输出:
CursorKind.CALL_EXPR sum int [20 :5 - 20 :19] main.cpp
2
ARG=CursorKind.INTEGER_LITERAL
ARG=CursorKind.INTEGER_LITERAL
CursorKind.CALL_EXPR sum_def int [21 :5 - 21 :18] main.cpp
2
ARG=CursorKind.INTEGER_LITERAL
ARG=CursorKind.UNEXPOSED_EXPR
我希望在sum_def的call_expr中获得1个参数,可以得到它,或者我应该自己解析代码,这是我真正不想做的。谢谢。
我更改了遍历功能以打印更多详细信息
def traverse(node, level):
print('%s %-35s %-20s %-10s [%-6s:%s - %-6s:%s] %s %s ' % (' ' * level,
node.kind, node.spelling, node.type.spelling, node.extent.start.line, node.extent.start.column,
node.extent.end.line, node.extent.end.column, node.location.file, node.mangled_name))
if node.kind == clang.cindex.CursorKind.CALL_EXPR:
for arg in node.get_arguments():
print("ARG=%s %s" % (arg.kind, arg.spelling))
for child in node.get_children():
traverse(child, level+1)
输出:
CursorKind.CLASS_DECL SomeClass SomeClass [2 :1 - 14 :2] main.cpp
CursorKind.CXX_ACCESS_SPEC_DECL [4 :1 - 4 :8] main.cpp
CursorKind.CXX_METHOD sum int (int, int) [5 :5 - 8 :6] main.cpp _ZN9SomeClass3sumEii
CursorKind.PARM_DECL x int [5 :13 - 5 :18] main.cpp _ZZN9SomeClass3sumEiiE1x
CursorKind.PARM_DECL y int [5 :20 - 5 :25] main.cpp _ZZN9SomeClass3sumEiiE1y
CursorKind.COMPOUND_STMT [6 :5 - 8 :6] main.cpp
CursorKind.RETURN_STMT [7 :9 - 7 :21] main.cpp
CursorKind.BINARY_OPERATOR int [7 :16 - 7 :21] main.cpp
CursorKind.UNEXPOSED_EXPR x int [7 :16 - 7 :17] main.cpp
CursorKind.DECL_REF_EXPR x int [7 :16 - 7 :17] main.cpp
CursorKind.UNEXPOSED_EXPR y int [7 :20 - 7 :21] main.cpp
CursorKind.DECL_REF_EXPR y int [7 :20 - 7 :21] main.cpp
CursorKind.CXX_METHOD sum_def int (int, int) [10 :5 - 13 :6] main.cpp _ZN9SomeClass7sum_defEii
CursorKind.PARM_DECL x int [10 :17 - 10 :22] main.cpp _ZZN9SomeClass7sum_defEiiE1x
CursorKind.PARM_DECL y int [10 :24 - 10 :33] main.cpp _ZZN9SomeClass7sum_defEiiE1y
CursorKind.INTEGER_LITERAL int [10 :32 - 10 :33] main.cpp
CursorKind.COMPOUND_STMT [11 :5 - 13 :6] main.cpp
CursorKind.RETURN_STMT [12 :9 - 12 :21] main.cpp
CursorKind.BINARY_OPERATOR int [12 :16 - 12 :21] main.cpp
CursorKind.UNEXPOSED_EXPR x int [12 :16 - 12 :17] main.cpp
CursorKind.DECL_REF_EXPR x int [12 :16 - 12 :17] main.cpp
CursorKind.UNEXPOSED_EXPR y int [12 :20 - 12 :21] main.cpp
CursorKind.DECL_REF_EXPR y int [12 :20 - 12 :21] main.cpp
CursorKind.FUNCTION_DECL main int () [17 :1 - 26 :2] main.cpp main
CursorKind.COMPOUND_STMT [18 :1 - 26 :2] main.cpp
CursorKind.DECL_STMT [19 :5 - 19 :22] main.cpp
CursorKind.VAR_DECL i int [19 :5 - 19 :14] main.cpp _ZZ4mainE1i
CursorKind.INTEGER_LITERAL int [19 :13 - 19 :14] main.cpp
CursorKind.VAR_DECL j int [19 :16 - 19 :21] main.cpp _ZZ4mainE1j
CursorKind.INTEGER_LITERAL int [19 :20 - 19 :21] main.cpp
CursorKind.DECL_STMT [20 :5 - 20 :17] main.cpp
CursorKind.VAR_DECL x SomeClass [20 :5 - 20 :16] main.cpp _ZZ4mainE1x
CursorKind.TYPE_REF class SomeClass SomeClass [20 :5 - 20 :14] main.cpp
CursorKind.CALL_EXPR SomeClass SomeClass [20 :15 - 20 :16] main.cpp
CursorKind.CALL_EXPR sum int [21 :5 - 21 :19] main.cpp
ARG=CursorKind.INTEGER_LITERAL
ARG=CursorKind.INTEGER_LITERAL
CursorKind.MEMBER_REF_EXPR sum <bound member function type> [21 :5 - 21 :10] main.cpp
CursorKind.DECL_REF_EXPR x SomeClass [21 :5 - 21 :6] main.cpp
CursorKind.INTEGER_LITERAL int [21 :11 - 21 :13] main.cpp
CursorKind.INTEGER_LITERAL int [21 :15 - 21 :18] main.cpp
CursorKind.CALL_EXPR sum_def int [22 :5 - 22 :18] main.cpp
ARG=CursorKind.INTEGER_LITERAL
ARG=CursorKind.UNEXPOSED_EXPR
CursorKind.MEMBER_REF_EXPR sum_def <bound member function type> [22 :5 - 22 :14] main.cpp
CursorKind.DECL_REF_EXPR x SomeClass [22 :5 - 22 :6] main.cpp
CursorKind.INTEGER_LITERAL int [22 :15 - 22 :17] main.cpp
CursorKind.UNEXPOSED_EXPR int [0 :0 - 0 :0] None
CursorKind.CALL_EXPR sum_def int [23 :5 - 23 :23] main.cpp
ARG=CursorKind.INTEGER_LITERAL
ARG=CursorKind.INTEGER_LITERAL
CursorKind.MEMBER_REF_EXPR sum_def <bound member function type> [23 :5 - 23 :14] main.cpp
CursorKind.DECL_REF_EXPR x SomeClass [23 :5 - 23 :6] main.cpp
CursorKind.INTEGER_LITERAL int [23 :15 - 23 :17] main.cpp
CursorKind.INTEGER_LITERAL int [23 :19 - 23 :22] main.cpp
CursorKind.CALL_EXPR sum int [24 :5 - 24 :16] main.cpp
ARG=CursorKind.UNEXPOSED_EXPR i
ARG=CursorKind.UNEXPOSED_EXPR j
CursorKind.MEMBER_REF_EXPR sum <bound member function type> [24 :5 - 24 :10] main.cpp
CursorKind.DECL_REF_EXPR x SomeClass [24 :5 - 24 :6] main.cpp
CursorKind.UNEXPOSED_EXPR i int [24 :11 - 24 :12] main.cpp
CursorKind.DECL_REF_EXPR i int [24 :11 - 24 :12] main.cpp
CursorKind.UNEXPOSED_EXPR j int [24 :14 - 24 :15] main.cpp
CursorKind.DECL_REF_EXPR j int [24 :14 - 24 :15] main.cpp
CursorKind.RETURN_STMT [25 :5 - 25 :13] main.cpp
CursorKind.INTEGER_LITERAL int [25 :12 - 25 :13] main.cpp
使用此输出以及我添加到源代码中的更多测试柜,我知道我应该将每个不是未表达的参数算作参数,如果它是未表达的,如果它是未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未未传出。则应该检查它是否有孩子。如果这样做意味着我需要计算它。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数