【发布时间】:2017-12-04 21:10:35
【问题描述】:
我正在使用带有 python 绑定的 libclang,并且我正在尝试获取 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 遍历 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 作为参数的数量,有可能得到它,或者我应该自己解析代码,这是我真的不想做的事情。 谢谢。
【问题讨论】:
标签: python c++ abstract-syntax-tree clang++ libclang