# -*- coding: utf-8 -*- import clang.cindex from clang.cindex import CursorKind class AST_Parser: def __init__(self,library_file=None): if not clang.cindex.Config.loaded: print("Using libclang from: %s", library_file) clang.cindex.Config.set_library_file(library_file) def parse(self, filename, content): index = clang.cindex.Index.create() arguments = ["-x", "c"] options = clang.cindex.TranslationUnit.PARSE_SKIP_FUNCTION_BODIES content = [(filename, content)] translation_unit = index.parse(filename, unsaved_files=content, args=arguments, options=options) ret = self._parse(translation_unit.cursor, filename) return ret def _get_children_filelocal(self, cursor, path): return [c for c in cursor.get_children() if c.location.file and c.location.file.name == path] def _parse(self, cursor, path): item = {} excluded_cursortypes = [CursorKind.INTEGER_LITERAL] if not cursor.kind in excluded_cursortypes: if not str(cursor.kind) == "": item["kind"] = str(cursor.kind) if not cursor.spelling == "": item["name"] = cursor.spelling if not cursor.displayname == "": item["displayname"] = cursor.displayname if not cursor.type.spelling == "": item["type"] = cursor.type.spelling if not cursor.result_type.spelling == "": item["result_type"] = cursor.result_type.spelling if cursor.kind == CursorKind.ENUM_CONSTANT_DECL: item["value"] = cursor.enum_value child_cursors = self._get_children_filelocal(cursor, path) if len(child_cursors) > 0: child_arr = [] for child_cursor in child_cursors: child_result = self._parse(child_cursor, path) if child_result: child_arr.append(child_result) if child_arr: item["children"] = child_arr return item