You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

154 lines
3.8 KiB

# -*- coding: utf-8 -*-
# This file is under GNU Affero General Public License 3.0
# see LICENSE.txt
from . import utils
def generate_acid_yml(acid, module_name):
ret = ""
ret += _grammar_header()
ret += "module " + module_name + " {\n"
ret += _generate_functions(acid)
ret += _generate_structs(acid)
ret += _generate_enums(acid)
ret += "}"
return ret
def _grammar_header():
grammar = """decl module @name;
decl method @name;
decl struct @name;
decl field @name;
decl enum @name;
decl item @name;
"""
return grammar
def _generate_functions(acid):
data_root = acid["functions"]
# Main
tmpl_main = 'method {name} {{\n'
tmpl_main += ' signature string="{sig}";\n'
tmpl_main += ' return type="{return_type}";\n'
tmpl_main += '{subitems}'
tmpl_main += '}};\n\n'
# Sub
tmpl_sub = ' use {name} type="{type}";'
def filt(item):
if item["kind"] == "CursorKind.FUNCTION_DECL":
return True
main_items = utils.recursive_query(data_root, filt)
ret = ""
for item in main_items:
def filt(data):
if data["kind"] == "CursorKind.PARM_DECL":
return True
subitems = utils.recursive_query(item, filt)
subitems_str = ""
for subitem in subitems:
subitems_str += tmpl_sub.format(type=subitem["type"], name=subitem["name"]) + "\n"
# (PEP_STATUS(*)(void*,const char*,const char*,const char*,const char*,const char*))
sig_ret = item["result_type"] + "(*)"
sig_parms = ""
for subitem in subitems:
sig_parms += subitem["type"] + ", "
sig_parms = sig_parms[:-2]
sig_str = "(" + sig_ret + "(" +sig_parms + "))"
ret += tmpl_main.format(name=item["name"], return_type=item["result_type"], sig=sig_str, subitems=subitems_str)
return ret
def _generate_structs(acid):
data_root = acid["types"]
# Main
tmpl_main = 'struct {name} {{\n'
tmpl_main += '{subitems}'
tmpl_main += '}};\n\n'
# Sub
tmpl_sub = ' field {name} type="{type}";'
def filt(item):
if item["kind"] == "CursorKind.STRUCT_DECL":
return True
main_items = utils.recursive_query(data_root, filt)
ret = ""
for item in sorted(main_items, key=lambda k: k["name"]):
def filt(data):
if data["kind"] == "CursorKind.FIELD_DECL":
return True
subitems = utils.recursive_query(item, filt)
subitems_str = ""
for subitem in subitems:
subitems_str += tmpl_sub.format(type=subitem["type"], name=subitem["name"]) + "\n"
ret += tmpl_main.format(name=item["name"], subitems=subitems_str)
return ret
def _generate_enums(acid):
data_root = acid["types"]
# Main
tmpl_main = 'enum {name} {{\n'
tmpl_main += '{subitems}'
tmpl_main += '}};\n\n'
# Sub
tmpl_sub = ' item {name} value={value};'
def filt(item):
if item["kind"] == "CursorKind.ENUM_DECL":
return True
main_items = utils.recursive_query(data_root, filt)
ret = ""
for item in sorted(main_items, key=lambda k: k["name"]):
def filt(data):
if data["kind"] == "CursorKind.ENUM_CONSTANT_DECL":
return True
subitems = utils.recursive_query(item, filt)
subitems_str = ""
for subitem in subitems:
subitems_str += tmpl_sub.format(name=subitem["name"], value=subitem["value"]) + "\n"
name = ""
if item["name"]:
name = item["name"]
else:
name = item["type"]
if name == "":
print(__file__, " - warning: enum without a name or type extracted")
ret += tmpl_main.format(name=name, subitems=subitems_str)
return ret