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.
276 lines
7.1 KiB
276 lines
7.1 KiB
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from gen_cid import generate_cid
|
|
from gen_cid import utils
|
|
|
|
|
|
class CID2YML:
|
|
|
|
def generate_yml(self, cid):
|
|
ret = ""
|
|
ret += self.generate_functions(cid)
|
|
ret += self.generate_structs(cid)
|
|
ret += self.generate_enums(cid)
|
|
return ret
|
|
|
|
def generate_functions(self, cid):
|
|
data_root = cid["functions"]
|
|
|
|
# Main
|
|
tmpl_main = ""
|
|
tmpl_main += 'method {name} {{\n'
|
|
tmpl_main += ' return {return_type}\n'
|
|
tmpl_main += '{subitems}'
|
|
tmpl_main += '}}\n\n'
|
|
|
|
kind_main = "CursorKind.FUNCTION_DECL"
|
|
|
|
def format_func_main(tmpl, item, subitems_str):
|
|
return tmpl.format(
|
|
name=item["name"],
|
|
return_type=item["result_type"],
|
|
subitems=subitems_str)
|
|
|
|
# Sub
|
|
tmpl_sub = ""
|
|
tmpl_sub += ' use "{type}" "{name}"'
|
|
|
|
kind_sub = "CursorKind.PARM_DECL"
|
|
|
|
def format_func_sub(tmpl, item):
|
|
return tmpl.format(
|
|
type=item["type"],
|
|
name=item["name"])
|
|
|
|
ret = self._format(data_root, tmpl_main, kind_main, format_func_main, tmpl_sub, kind_sub, format_func_sub)
|
|
|
|
return ret
|
|
|
|
def generate_structs(self, cid):
|
|
data_root = cid["types"]
|
|
|
|
# Main
|
|
tmpl_main = ""
|
|
tmpl_main += 'struct {name} {{\n'
|
|
tmpl_main += '{subitems}'
|
|
tmpl_main += '}}\n\n'
|
|
|
|
kind_main = "CursorKind.STRUCT_DECL"
|
|
|
|
def format_func_main(tmpl, item, subitems_str):
|
|
return tmpl.format(
|
|
name=item["name"],
|
|
subitems=subitems_str)
|
|
|
|
# Sub
|
|
tmpl_sub = ""
|
|
tmpl_sub+=' field "{type}" "{name}"'
|
|
kind_sub = "CursorKind.FIELD_DECL"
|
|
|
|
def format_func_sub(tmpl, item):
|
|
return tmpl.format(
|
|
type=item["type"],
|
|
name=item["name"])
|
|
|
|
ret = self._format(data_root, tmpl_main, kind_main, format_func_main, tmpl_sub, kind_sub, format_func_sub)
|
|
|
|
return ret
|
|
|
|
def generate_enums(self, cid):
|
|
data_root = cid["types"]
|
|
|
|
# Main
|
|
tmpl_main = ""
|
|
tmpl_main += 'enum {name} {{\n'
|
|
tmpl_main += '{subitems}'
|
|
tmpl_main += '}}\n\n'
|
|
|
|
kind_main = "CursorKind.ENUM_DECL"
|
|
|
|
def format_func_main(tmpl, item, subitems_str):
|
|
return tmpl.format(
|
|
name=item["name"],
|
|
subitems=subitems_str)
|
|
|
|
# Sub
|
|
tmpl_sub = ""
|
|
tmpl_sub+= ' item "{name}" "{value}"'
|
|
kind_sub = "CursorKind.ENUM_CONSTANT_DECL"
|
|
|
|
def format_func_sub(tmpl, item):
|
|
return tmpl.format(
|
|
name=item["name"],
|
|
value=item["value"])
|
|
|
|
ret = self._format(data_root, tmpl_main, kind_main, format_func_main, tmpl_sub, kind_sub, format_func_sub)
|
|
|
|
return ret
|
|
|
|
def _format(self, data, tmpl_main, kind_main, func_main, tmpl_sub, kind_sub, func_sub):
|
|
ret = ""
|
|
|
|
def filt(item):
|
|
if item["kind"] == kind_main:
|
|
return True
|
|
|
|
main_items = utils.recursive_query(data, filt)
|
|
|
|
for item in main_items:
|
|
subitems_str = self._format_subitems(item, tmpl_sub, kind_sub, func_sub)
|
|
ret += func_main(tmpl_main, item, subitems_str)
|
|
|
|
return ret
|
|
|
|
def _format_subitems(self, data, tmpl, kind, func):
|
|
ret = ""
|
|
|
|
def filt(data):
|
|
if data["kind"] == kind:
|
|
return True
|
|
|
|
subitems = utils.recursive_query(data, filt)
|
|
|
|
for item in subitems:
|
|
ret += func(tmpl, item) + "\n"
|
|
|
|
return ret
|
|
|
|
|
|
# ENUMS
|
|
#
|
|
|
|
# def _format_enums(self, cid):
|
|
# ret = ""
|
|
# enums = self._extract_enums(cid["types"])
|
|
# for enum in enums:
|
|
# ret += self._format_enum(enum)
|
|
# return ret
|
|
#
|
|
# def _extract_enums(self, cid):
|
|
# def functions_filt(item):
|
|
# if item["kind"] == "CursorKind.ENUM_DECL":
|
|
# return True
|
|
#
|
|
# enums = utils.recursive_query(cid, functions_filt)
|
|
# return enums
|
|
#
|
|
# def _format_enum(self, enum):
|
|
# ret = ""
|
|
# items = self._extract_enum_items(enum)
|
|
# items_str = self._format_enum_items(items)
|
|
#
|
|
# ret = self.enum_tmpl.format(
|
|
# name=enum["name"],
|
|
# enum_items=items_str)
|
|
# return ret
|
|
#
|
|
# def _extract_enum_items(self, func):
|
|
# ret = []
|
|
#
|
|
# def extract_items(data):
|
|
# if data["kind"] == "CursorKind.ENUM_CONSTANT_DECL":
|
|
# return True
|
|
#
|
|
# ret = utils.recursive_query(func, extract_items)
|
|
# return ret
|
|
#
|
|
# def _format_enum_items(self, items):
|
|
# ret = ""
|
|
# for item in items:
|
|
# ret += self._format_function_param(item)
|
|
# return ret
|
|
#
|
|
# def _format_enum_item(self, param):
|
|
# ret = ""
|
|
# ret = self.enum_item_tmpl.format(
|
|
# name=param["name"],
|
|
# value=param["value"])
|
|
# return ret
|
|
#
|
|
# #
|
|
# # FUNCTIONS
|
|
# #
|
|
#
|
|
# def _format_functions(self, cid):
|
|
# ret = ""
|
|
# funcs = self._extract_functions(cid["functions"])
|
|
# for func in funcs:
|
|
# ret += self._format_function(func)
|
|
# return ret
|
|
#
|
|
# def _extract_functions(self, cid):
|
|
# def functions_filt(item):
|
|
# if item["kind"] == "CursorKind.FUNCTION_DECL":
|
|
# return True
|
|
#
|
|
# funcs = utils.recursive_query(cid, functions_filt)
|
|
# return funcs
|
|
#
|
|
# def _format_function(self, func):
|
|
# ret = ""
|
|
# params = self._extract_params(func)
|
|
# params_str = self._format_function_params(params)
|
|
#
|
|
# ret = self.func_tmpl.format(
|
|
# name=func["name"],
|
|
# return_type=func["result_type"],
|
|
# params=params_str)
|
|
# return ret
|
|
#
|
|
# def _extract_params(self, func):
|
|
# ret = []
|
|
#
|
|
# def extract_params(data):
|
|
# if data["kind"] == "CursorKind.PARM_DECL":
|
|
# return True
|
|
#
|
|
# ret = utils.recursive_query(func, extract_params)
|
|
# return ret
|
|
#
|
|
# def _format_function_params(self, params):
|
|
# ret = ""
|
|
# for param in params:
|
|
# ret += self._format_function_param(param)
|
|
# return ret
|
|
#
|
|
# def _format_function_param(self, param):
|
|
# ret = ""
|
|
# ret = self.func_item_tmpl.format(
|
|
# name=param["name"],
|
|
# type=param["type"])
|
|
# return ret
|
|
|
|
|
|
def main():
|
|
vars = []
|
|
funcs = []
|
|
funcs.append("init_synth_shed")
|
|
funcs.append("synth_create")
|
|
funcs.append("synth_set_osc_count")
|
|
funcs.append("tech_to_string")
|
|
funcs.append("update_identity")
|
|
funcs.append("filtertype_to_string")
|
|
funcs.append("play_synth")
|
|
|
|
header_filename = "../../src/synth_shed/synth_shed.h"
|
|
libclang_path = "/opt/local/libexec/llvm-9.0/lib/libclang.dylib"
|
|
header = generate_cid.parse(libclang_path, header_filename, funcs, vars)
|
|
|
|
# Debug output
|
|
utils.write_json(header["ast"], "./" + "/" + header["filename"] + ".ast.json")
|
|
utils.write_json(header["cid"], "./" + "/" + header["filename"] + ".cid.json")
|
|
utils.write_json(header, "./" + "/" + header["filename"] + ".header.json")
|
|
|
|
cid = header["cid"]
|
|
|
|
cid2yml = CID2YML()
|
|
|
|
funcs_str = cid2yml.generate_yml(cid)
|
|
|
|
print(funcs_str)
|
|
utils.write_file("./" + "/" + header["filename"] + ".cid.yml2", funcs_str)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|