Как разобрать отдельный файл, используя привязки Python к Clang?
Я пишу простой инструмент, который поможет с рефакторингом исходного кода нашего приложения. Я хотел бы проанализировать код C++ на основе библиотеки wxWidgets, которая определяет GUI и производит 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 .
1 ответ
Для объектов курсора, должно быть хорошо просто использовать cursor.kind. Возможно, проблема в том, что вы ходите по токенам вместо дочерних объектов курсора (не уверен насчет этого). Вместо get_tokens вы можете использовать get_children, чтобы пройти AST.
Чтобы увидеть, как выглядит AST, когда я хочу написать функцию ходьбы AST, я использую этот скрипт: https://gist.github.com/2503232. Это просто показывает cursor.kind и дает разумные результаты в моей системе. нет CursorKind.INVALID_FILE.