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
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
|
|
|