Como posso analisar macros em código C ++, usando CLANG como analisador e Python como linguagem de script?

Se eu tiver a macro a seguir em algum código C ++:

<code>_Foo(arg1, arg2)
</code>

Gostaria de usar o Python para encontrar todas as instâncias e extensões dessa macro usando as ligações Clang e Python fornecidas com cindex.py. Eu não quero usar uma expressão regular do Python no código diretamente porque isso me deixa 99% do caminho, mas não 100%. Parece-me que para chegar a 100%, você precisa usar um analisador C ++ real como o Clang para lidar com todos os casos em que as pessoas fazem coisas tolas que são sintaticamente corretas e compilarem, mas não fazem sentido para uma expressão regular. Eu preciso lidar com 100% dos casos e como usamos o Clang como um de nossos compiladores, faz sentido usá-lo como o analisador para essa tarefa também.

Dado o seguinte código Python, eu posso encontrar o que parece ser tipos predefinidos que as ligações python do Clang conhecem, mas não as macros:

<code>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)
</code>

O que eu acho que estou procurando é uma maneira de analisar o AST bruto para o nome da minha macro_FOO(), mas eu não tenho certeza. Alguém pode fornecer algum código que me permita passar o nome de uma Macro e recuperar a extensão ou os dados do Clang?

questionAnswers(2)

yourAnswerToTheQuestion