如果我在某些C++代码中具有以下宏:

_Foo(arg1, arg2)

我想使用Python使用Clang和cindex.py提供的Python绑定(bind)找到该宏的所有实例和范围。我不想直接在代码上使用来自Python的正则表达式,因为这样可以使我获得99%的结果,而不是100%的结果。在我看来,要达到100%,您需要使用像Clang这样的真实C++解析器来处理所有人们在语法上正确且可编译但对正则表达式没有意义的愚蠢事情。我需要处理100%的情况,并且由于我们将Clang用作我们的编译器之一,因此也可以将Clang用作此任务的解析器。

给定以下Python代码,我能够找到Clang python绑定(bind)知道的似乎是预定义类型的东西,而不是宏:
def find_typerefs(node):
    ref_node = clang.cindex.Cursor_ref(node)
    if ref_node:
        print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (
            ref_node.spelling, ref_node.kind, node.data, node.extent, node.location.line, node.location.column)

# Recurse for children of this node
for c in node.get_children():
    find_typerefs(c)

index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
find_typerefs(tu.cursor)

我想寻找的是一种解析原始AST的宏_FOO()的名称的方法,但是我不确定。有人可以提供一些代码,让我传递宏的名称,并从Clang取回范围或数据吗?

最佳答案

您需要将适当的options标志传递给Index.parse:

tu = index.parse(sys.argv[1], options=clang.cindex.TranslationUnit.PARSE_DETAILED_PROCESSING_RECORD)

其余的游标访问者可能看起来像这样:
def visit(node):
    if node.kind in (clang.cindex.CursorKind.MACRO_INSTANTIATION, clang.cindex.CursorKind.MACRO_DEFINITION):
        print 'Found %s Type %s DATA %s Extent %s [line=%s, col=%s]' % (node.displayname, node.kind, node.data, node.extent, node.location.line, node.location.column)
    for c in node.get_children():
        visit(c)

10-05 22:58
查看更多