Как разобрать один файл, используя привязки Python к Clang?

Я пишу простой инструмент, который поможет с рефакторингом исходного кода нашего приложения. Я хотел бы проанализировать код C++ на основе библиотеки wxWidgets, которая определяет графический интерфейс и создает файл XML .ui для использования с Qt. Мне нужно получить все вызовы функций и значения аргументов.

В настоящее время я играю с привязками Python к Clang, используя приведенный ниже пример кода, я получаю токены, их тип и местоположение, но тип курсора всегда CursorKind.INVALID_FILE.

import sys
import clang.cindex

def find_typerefs(node):
    """ Find all references to the type named 'typename'
    """

    for t in node.get_tokens():
        if not node.location.file != sys.argv[1]:
            continue
        if t.kind.value != 0 and t.kind.value != 1 and t.kind.value != 4:
            print t.spelling
            print t.location
            print t.cursor.kind
            print t.kind
            print "\n"

index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
print 'Translation unit:', tu.spelling
find_typerefs(tu.cursor)

Как правильно определить тип курсора?

Я не смог найти никакой документации, кроме нескольких сообщений в блогах, но они были устаревшими или не освещали эту тему. Я также не смог понять это из примеров, которые поставлялись с Clang.


person user1791083    schedule 05.11.2012    source источник
comment
Не могли бы вы дать вывод list(f.source.name for f in tu.get_includes())? (просто напечатайте его в конце вашего скрипта)   -  person forivall    schedule 12.01.2013
comment
как и другие компиляторы c, папка включения должна быть установлена ​​правильно, index.parse(sys.argv[1],args=['I./path/to/include', 'I./another/include'] )   -  person Shao-Chuan Wang    schedule 04.04.2013
comment
Переложить чужую работу не стыдно, только не забудьте упомянуть об этом: ваш код чем-то очень похож на первый пример на странице Илая: eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang   -  person Bak Itzik    schedule 24.08.2016


Ответы (1)


Для объектов курсора можно просто использовать cursor.kind. Возможно, проблема в том, что вы используете ходовые токены вместо дочерних объектов курсора (не уверен в этом). Вместо get_tokens вы можете использовать get_children для прохождения AST.

Чтобы увидеть, как выглядит AST, когда я хочу написать функцию обхода AST, я использую этот скрипт: https://gist.github.com/2503232. Это просто показывает cursor.kind и дает разумные результаты в моей системе. Нет CursorKind.INVALID_FILE.

person Sebastian    schedule 22.10.2013