Как использовать compile_commands.json с привязками python llvm clang (версия 7.0.1)?

Я пытаюсь распечатать все узлы AST в данном файле C ++. И я предоставляю действительный файл C ++, в родительском каталоге которого есть файл compile_commands.json. Все шаги такие же, как Как использовать compile_commands .json с привязками clang python? и моя версия clang: "clang version 7.0.1 (tags / RELEASE_701 / final) Цель: x86_64-pc-windows-msvc Модель потока: posix InstalledDir: C: \ Program Files \ LLVM \ bin ". ОС - windows10, версия python - 2.7. Однако, когда я запускаю этот сценарий ниже.

введите код сюда

import clang.cindex
from clang.cindex import *

libclang_path = r'C:\Program Files\LLVM\bin\libclang.dll'

if Config.loaded == True:
    pass
else:
    Config.set_library_file(libclang_path)


def node_info(node):
    return {'kind': node.kind,
            'usr': node.get_usr(),
            'spelling': node.spelling,
            'location': node.location,
            'file': node.location.file.name,
            'extent.start': node.extent.start,
            'extent.end': node.extent.end,
            'is_definition': node.is_definition()
            }


def get_nodes_in_file(node, filename, ls=None):
    ls = ls if ls is not None else []
    for n in node.get_children():
        if n.location.file is not None and n.location.file.name == filename:
            ls.append(n)
            get_nodes_in_file(n, filename, ls)
    return ls


def main():
    compilation_database_path = 'C:/Users/liqiu/Desktop/md/gn/build/win/x64'

    source_file_path = 'C:/Users/liqiu/Desktop/md/.../video_camera_source.cpp'

    index = clang.cindex.Index.create()
    compdb = clang.cindex.CompilationDatabase.fromDirectory(compilation_database_path)

    try:
        file_args = compdb.getCompileCommands(source_file_path)
        translation_unit = index.parse(source_file_path, file_args)
        file_nodes = get_nodes_in_file(translation_unit.cursor, source_file_path)
        print [p.spelling for p in file_nodes]
    except clang.cindex.CompilationDatabaseError:
        print 'Could not load compilation flags for', source_file_path


if __name__ == '__main__':
    main()

Есть некоторые ошибки, подобные следующим. Я думаю, что причиной этой ошибки является «file_args = compdb. GetCompileCommands (source_file_path)», эта строка возвращает экземпляр CompileCommand, а не строковый или целочисленный тип, поэтому index.parse () не может напрямую принимать этот экземпляр в качестве параметра. Но похоже, что это вернуло какой-то строковый тип «Команды» в старых версиях libclang. Теперь это меня сбило с толку.

D:\Python27\python.exe C:/Users/liqiu/Desktop/libclang_parse/parser.py
Traceback (most recent call last):
  File "C:/Users/liqiu/Desktop/libclang_parse/parser.py", line 51, in <module>
    main()
  File "C:/Users/liqiu/Desktop/libclang_parse/parser.py", line 43, in main
    translation_unit = index.parse(source_file_path, file_args)
  File "C:\Users\liqiu\Desktop\libclang_parse\clang\cindex.py", line 2689, in parse
    self)
  File "C:\Users\liqiu\Desktop\libclang_parse\clang\cindex.py", line 2783, in from_source
    args_array = (c_char_p * len(args))(*[b(x) for x in args])
TypeError: string or integer address expected instead of CompileCommand instance

Process finished with exit code 1



person Abigtree    schedule 28.11.2019    source источник


Ответы (1)


Поскольку это листитератор, мы должны обрабатывать его следующим образом:

  file_args = compdb.getCompileCommands(source_file_path)
  arguments = list(iter(file_args).next().arguments)
person Abigtree    schedule 13.12.2019