
3 changed files with 58 additions and 55 deletions
@ -0,0 +1,57 @@ |
|||||
|
# -*- 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 |
Loading…
Reference in new issue