
1 changed files with 0 additions and 143 deletions
@ -1,143 +0,0 @@ |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
class SimpleAST: |
|||
def __init__(self): |
|||
pass |
|||
|
|||
def create_simple_ast(self,ast): |
|||
elems = {"functions": "", |
|||
"typedefs": "", |
|||
"structs": "", |
|||
"enums": ""} |
|||
elems["functions"] = self.extract_functions_from_ast(ast) |
|||
elems["typedefs"] = self.extract_typedefs_from_ast(ast) |
|||
elems["structs"] = self.extract_structs_from_ast(ast) |
|||
elems["enums"] = self.extract_enums_from_ast(ast) |
|||
return elems |
|||
|
|||
|
|||
# extracts top level functions only (is there anything else in C?) |
|||
def extract_functions_from_ast(self,ast): |
|||
functions = [] |
|||
for child in ast["children"]: |
|||
if child["kind"] == "CursorKind.FUNCTION_DECL": |
|||
functions.append(self._simple_ast_functions(child)) |
|||
return functions |
|||
|
|||
|
|||
def _simple_ast_functions(self, func_ast): |
|||
simple_func = {"name": "", |
|||
"return_type": "", |
|||
"arguments": []} |
|||
|
|||
simple_func["name"] = func_ast["name"] |
|||
simple_func["return_type"] = func_ast["result_type"] |
|||
arguments = [] |
|||
# check if func has args |
|||
if "children" in func_ast: |
|||
for arg_ast in func_ast["children"]: |
|||
arg_simple = None |
|||
if arg_ast["kind"] == "CursorKind.PARM_DECL": |
|||
arg_simple = {"name": "", |
|||
"type": ""} |
|||
arg_simple["name"] = arg_ast["name"] |
|||
arg_simple["type"] = arg_ast["type"] |
|||
if arg_simple: |
|||
arguments.append(arg_simple) |
|||
|
|||
if arguments: |
|||
simple_func["arguments"] = arguments |
|||
return simple_func |
|||
|
|||
|
|||
# only typedef enums |
|||
def extract_enums_from_ast(self, ast): |
|||
enums = [] |
|||
for typedef in ast["children"]: |
|||
if typedef["kind"] == "CursorKind.TYPEDEF_DECL": |
|||
typename = typedef["type"] |
|||
if "children" in typedef: |
|||
for enum in typedef["children"]: |
|||
if enum["kind"] == "CursorKind.ENUM_DECL": |
|||
enums.append(self._simple_ast_enums(enum, typename)) |
|||
|
|||
return enums |
|||
|
|||
|
|||
def _simple_ast_enums(self, enum_ast, typename): |
|||
simple_enum = {"name": typename, |
|||
"items": []} |
|||
|
|||
items = [] |
|||
if "children" in enum_ast: |
|||
for item in enum_ast["children"]: |
|||
if item["kind"] == "CursorKind.ENUM_CONSTANT_DECL": |
|||
simple_item = {"name": "", |
|||
"value": ""} |
|||
simple_item["name"] = item["name"] |
|||
simple_item["value"] = item["value"] |
|||
items.append(simple_item) |
|||
|
|||
if items: |
|||
simple_enum["items"] = items |
|||
|
|||
return simple_enum |
|||
|
|||
|
|||
# only typedef structs |
|||
def extract_structs_from_ast(self, ast): |
|||
structs = [] |
|||
for typedef in ast["children"]: |
|||
if typedef["kind"] == "CursorKind.TYPEDEF_DECL": |
|||
typename = typedef["type"] |
|||
if "children" in typedef: |
|||
for struct in typedef["children"]: |
|||
if struct["kind"] == "CursorKind.STRUCT_DECL": |
|||
structs.append(self._simple_ast_structs(struct, typename)) |
|||
|
|||
return structs |
|||
|
|||
|
|||
def _simple_ast_structs(self, struct_ast, typename): |
|||
simple_struct = {"name": typename, |
|||
"fields": []} |
|||
|
|||
fields = [] |
|||
if "children" in struct_ast: |
|||
for field in struct_ast["children"]: |
|||
if field["kind"] == "CursorKind.FIELD_DECL": |
|||
simple_field = {"name": "", |
|||
"type": ""} |
|||
simple_field["name"] = field["name"] |
|||
simple_field["type"] = field["type"] |
|||
fields.append(simple_field) |
|||
|
|||
if fields: |
|||
simple_struct["fields"] = fields |
|||
|
|||
return simple_struct |
|||
|
|||
|
|||
def extract_typedefs_from_ast(self, ast): |
|||
typdefs = [] |
|||
for typedef in ast["children"]: |
|||
if typedef["kind"] == "CursorKind.TYPEDEF_DECL": |
|||
typename = typedef["type"] |
|||
if "children" in typedef: |
|||
children = typedef["children"] |
|||
if children: |
|||
ref = children[0] |
|||
if ref["kind"] == "CursorKind.TYPE_REF": |
|||
typdefs.append(self._simple_ast_typedefs(ref, typename)) |
|||
|
|||
return typdefs |
|||
|
|||
|
|||
def _simple_ast_typedefs(self, typedef_ast, typename): |
|||
simple_typedef = {"name": typename, |
|||
"kind" : "", |
|||
"value": ""} |
|||
simple_typedef["kind"] = typedef_ast["kind"] |
|||
simple_typedef["value"] = typedef_ast["name"] |
|||
|
|||
return simple_typedef |
Loading…
Reference in new issue