diff --git a/apps/twnlua/docgen.py b/apps/twnlua/docgen.py index a57aba1..734443e 100755 --- a/apps/twnlua/docgen.py +++ b/apps/twnlua/docgen.py @@ -7,9 +7,11 @@ with open(sys.argv[1], 'r') if sys.argv[1] != "-" else sys.stdin as f: api = json.loads(api_source) -def to_lua_type_annot(typename): - basetype = typename.rsplit(' *', 1)[0] - if typename == "char *": +def to_lua_type_annot(typedesc): + if type(typedesc) is dict: + return r'{ %s }' % ','.join('%s: %s' % (f["name"], to_lua_type_annot(f["type"])) for f in typedesc["fields"]) + basetype = typedesc.rsplit(' *', 1)[0] + if typedesc == "char *": return "string" elif basetype == "float": return "number" @@ -27,7 +29,7 @@ def to_lua_type_annot(typename): return r"{ x: number, y: number, w: number, h: number }" else: return "unknown" - # raise BaseException("Unhandled type for annotation: %s" % typename) + # raise BaseException("Unhandled type for annotation: %s" % typedesc) type_annotations, enum_annotations = {}, {} type_annotations["ctx"] = r"{ %s, udata: table }" % \ @@ -45,9 +47,14 @@ for annot in enum_annotations: procedure_annotations = {} for procedure, procedure_desc in api["procedures"].items(): - procedure_annotations[procedure] = r"{ %s }" % \ + procedure_annotations[procedure] = {} + procedure_annotations[procedure]["params"] = r"{ %s }" % \ ', '.join("%s: %s" % (p["name"], to_lua_type_annot(p["type"]) + '?' * ("default" in p)) for p in procedure_desc["params"]) + if "return" in procedure_desc: + procedure_annotations[procedure]["return"] = to_lua_type_annot(procedure_desc["return"]) for annot in procedure_annotations: - print("---@param args " + procedure_annotations[annot]) + print("---@param args " + procedure_annotations[annot]["params"]) + if "return" in procedure_annotations[annot]: + print("---@return " + procedure_annotations[annot]["return"]) print("function %s(args) end" % annot)