Pythonバインディングでlibclangを使用しており、CallExprの引数の数を取得しようとしています.メンバー関数にデフォルト値があり、この引数がない状態で呼び出された場合、libclangは関数内の引数の数を返すことがわかりましたcall 式とは異なります。
例えば :
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 を取得することを期待していますが、それを取得することは可能ですか、それとも自分でコードを解析する必要がありますか?これは本当にやりたくないことです。ありがとうございました。