Initial Commit
This commit is contained in:
commit
2e1762f851
375
gtkts.js
Normal file
375
gtkts.js
Normal file
@ -0,0 +1,375 @@
|
||||
const kExportAllInOne = false
|
||||
|
||||
let repo = AuGlib.GetGTKRepo()
|
||||
let buffer = ""
|
||||
|
||||
let namespaceMap = {
|
||||
"Gtk": "AuGTK",
|
||||
"GtkSource": "AuGtkSource",
|
||||
"GLib": "AuGlibEx",
|
||||
"Gio": "AuGIO",
|
||||
"Gdk": "AuGDK",
|
||||
"Pango": "AuPango",
|
||||
"GdkPixbuf": "AuGDKPixBuf",
|
||||
"cario": "AuCairo"
|
||||
}
|
||||
|
||||
function getNamespace(ns) {
|
||||
return namespaceMap[ns] ?? ns
|
||||
}
|
||||
|
||||
function sanitize(name) {
|
||||
if (name == "function") return "_func"
|
||||
if (name == "new") return "_new"
|
||||
if (name == "") return "_"
|
||||
if (name == "constructor") return "_constructor"
|
||||
return name
|
||||
}
|
||||
|
||||
function isBlackListed(name) {
|
||||
return name == "MainContext" ||
|
||||
name == "Cond" ||
|
||||
name == "Scanner" ||
|
||||
name == "TypeValueTable" ||
|
||||
name == "VideoScaler" ||
|
||||
name == "InitiallyUnownedClass" ||
|
||||
name == "VideoFrameFlags" ||
|
||||
name == "VideoBufferFlags"
|
||||
}
|
||||
|
||||
function isInvalidType(name) {
|
||||
return name == "AuGlibEx.Mutex" ||
|
||||
name == "HarfBuzz.var_int_t" ||
|
||||
name == "GObject._Value__data__union"||
|
||||
name == "GObject._Value__data__union[]" ||
|
||||
name == "GModule.Module" ||
|
||||
name == "HarfBuzz.var_num_t" ||
|
||||
name == "void[]"
|
||||
}
|
||||
|
||||
function dumpType(namespace, type) {
|
||||
let tag = type.getTag()
|
||||
switch (Number(tag)) {
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_VOID : { buffer += "void"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UINT8 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_BOOLEAN : { buffer += "boolean"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UINT16 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_INT8 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_INTERFACE : {
|
||||
if (type.getInterface().isICallable()) {
|
||||
dumpFunction(type.getInterface().asICallable())
|
||||
break;
|
||||
}
|
||||
|
||||
buffer += getNamespace(type.getInterface().getNamespace()) + "." + type.getInterface().getName();
|
||||
break;
|
||||
}
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_INT16 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_INT32 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UINT32 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_DOUBLE : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_INT64 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UINT64 : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_FLOAT : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_GTYPE : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UTF8 : { buffer += "string"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_FILENAME : { buffer += "string"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_ARRAY :
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_GLIST :
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_GSLIST : { dumpType("", type.getParameterType(0)); buffer += "[]"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_GHASH : { buffer += "number"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_ERROR : { buffer += "AuGlibEx.Error"; break; }
|
||||
case AuGlib.GITypeTag.GI_TYPE_TAG_UNICHAR : { buffer += "string"; break; }
|
||||
default: buffer += "unhandled case " + AuGlib.GITypeTag[tag];
|
||||
}
|
||||
}
|
||||
|
||||
function dumpConstants(namespace, constants, preface, tbl) {
|
||||
constants.forEach((constant) => {
|
||||
let name = constant.getMemberNameLocalized()
|
||||
if (tbl) {
|
||||
if (!tbl[name]) {
|
||||
return;
|
||||
}
|
||||
tbl[name] = 1
|
||||
}
|
||||
buffer += preface ?? "" + "\tlet " + name + " : "
|
||||
dumpType(namespace, constant.getType())
|
||||
buffer += ";\n"
|
||||
})
|
||||
}
|
||||
|
||||
function dumpMethod(method) {
|
||||
let name = method.getMemberNameLocalized()
|
||||
|
||||
if (name == "new") return
|
||||
|
||||
if (!method.isMethod())
|
||||
buffer += "static ";
|
||||
|
||||
buffer += sanitize(name)
|
||||
buffer += "("
|
||||
|
||||
for (let i = 0; i < method.getNArgs(); i++) {
|
||||
if (i != 0) buffer += ", "
|
||||
|
||||
let arg = method.getArg(i);
|
||||
buffer += sanitize(arg.asBase().getName()) + ": "
|
||||
dumpType("", arg.getType())
|
||||
}
|
||||
|
||||
buffer += "): "
|
||||
dumpType("", method.getReturnType())
|
||||
}
|
||||
|
||||
function dumpFunction(method) {
|
||||
buffer += "("
|
||||
|
||||
for (let i = 0; i < method.getNArgs(); i++) {
|
||||
if (i != 0) buffer += ", "
|
||||
|
||||
let arg = method.getArg(i);
|
||||
buffer += sanitize(arg.asBase().getName()) + ": "
|
||||
dumpType("", arg.getType())
|
||||
}
|
||||
|
||||
buffer += ") => "
|
||||
dumpType("", method.getReturnType())
|
||||
}
|
||||
|
||||
|
||||
function dumpInterfaces(namespace, objs) {
|
||||
objs.forEach((iface) => {
|
||||
buffer += "\tclass " + iface.asBase().getName() + " {\n"
|
||||
|
||||
let consts = iface.getConstants()
|
||||
let known = {}
|
||||
|
||||
if (consts.length) {
|
||||
consts.forEach((constant) => {
|
||||
known[constant.getMemberNameLocalized()] = 1
|
||||
dumpConstants(namespace, constant, "\t")
|
||||
})
|
||||
|
||||
buffer += "\n"
|
||||
}
|
||||
|
||||
iface.getMethods().forEach((method) => {
|
||||
if (known[method.getMemberNameLocalized()]){
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\t\t"
|
||||
dumpMethod(method)
|
||||
buffer += ";\n"
|
||||
})
|
||||
|
||||
buffer += "\t}\n\n"
|
||||
})
|
||||
}
|
||||
|
||||
function dumpField(namespace, constant, preface) {
|
||||
var start = buffer.length
|
||||
buffer += "\t\t" + sanitize(constant.getMemberNameLocalized()) + " : "
|
||||
|
||||
var len = buffer.length
|
||||
|
||||
dumpType(namespace, constant.getType())
|
||||
|
||||
if (isInvalidType(buffer.substr(len))) {
|
||||
buffer = buffer.substr(0, start)
|
||||
} else{
|
||||
buffer += ";\n"
|
||||
}
|
||||
}
|
||||
|
||||
function dumpObjects(namespace, objs) {
|
||||
objs.forEach((obj) => {
|
||||
let name = obj.asBase().getName()
|
||||
if (isBlackListed(name)) {
|
||||
buffer += "\tclass " + name + " { /*unsupported*/ }\n\n"
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\tclass " + name + " {\n"
|
||||
|
||||
let consts = obj.getConstants()
|
||||
|
||||
if (consts.length) {
|
||||
consts.forEach((constant) => {
|
||||
dumpConstants(namespace, constant, "\t")
|
||||
})
|
||||
|
||||
buffer += "\n"
|
||||
}
|
||||
|
||||
buffer += "\t\tconstructor(initializerList: any);\n\n"
|
||||
|
||||
let fields = obj.getFields()
|
||||
let known = {}
|
||||
|
||||
if (fields.length) {
|
||||
fields.forEach((field) => {
|
||||
known[field.getMemberNameLocalized()] = 1
|
||||
dumpField(namespace, field, "\t")
|
||||
})
|
||||
|
||||
buffer += "\n"
|
||||
}
|
||||
|
||||
obj.getMethods().forEach((method) => {
|
||||
if (known[method.getMemberNameLocalized()]){
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\t\t"
|
||||
var len = buffer.length
|
||||
dumpMethod(method)
|
||||
if (buffer.length == len) {
|
||||
buffer = buffer.substr(0, buffer.length - 2)
|
||||
} else{
|
||||
buffer += ";\n"
|
||||
}
|
||||
})
|
||||
|
||||
buffer += "\t}\n\n"
|
||||
})
|
||||
}
|
||||
|
||||
function dumpEnums(namespace, enums) {
|
||||
enums.forEach((enumVal) => {
|
||||
let name = enumVal.asBase().getName()
|
||||
|
||||
if (isBlackListed(name)) {
|
||||
buffer += "\tclass " + name + " { /*unsupported*/ }\n\n"
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\tclass " + name + " {\n"
|
||||
|
||||
buffer += ` // Enumerations hack...
|
||||
\t\ttoString(radix ? : number | undefined) : string;
|
||||
\t\ttoFixed(fractionDigits ? : number | undefined) : string;
|
||||
\t\ttoExponential(fractionDigits ? : number | undefined) : string;
|
||||
\t\ttoPrecision(precision ? : number | undefined) : string;
|
||||
\t\tvalueOf() : number;
|
||||
\t\ttoLocaleString(locales ? : string | string[] | undefined, options ? : Intl.NumberFormatOptions | undefined) : string;\n
|
||||
\t\tstatic [s:number]: string;\n
|
||||
`
|
||||
|
||||
let values = enumVal.getValues()
|
||||
values.forEach((val) => {
|
||||
buffer += "\t\tstatic readonly \""
|
||||
buffer += val.getLocalizedName()
|
||||
buffer += "\": " + name
|
||||
buffer += "\n"
|
||||
})
|
||||
|
||||
buffer += "\t}\n\n"
|
||||
})
|
||||
}
|
||||
|
||||
function dumpStructs(namespace, objs) {
|
||||
objs.forEach((obj) => {
|
||||
let name = obj.asBase().getName()
|
||||
|
||||
if (isBlackListed(name)) {
|
||||
buffer += "\tclass " + name + " { /*unsupported*/ }\n\n"
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\tclass " + name + " {\n"
|
||||
|
||||
let fields = obj.getFields()
|
||||
let known = {}
|
||||
|
||||
if (fields.length) {
|
||||
|
||||
fields.forEach((field) => {
|
||||
known[field.getMemberNameLocalized()] = 1
|
||||
if (field.getMemberNameLocalized() == "data" && name == "Value") return;
|
||||
dumpField(namespace, field, "\t")
|
||||
})
|
||||
|
||||
buffer += "\n"
|
||||
}
|
||||
|
||||
obj.getMethods().forEach((method) => {
|
||||
if (known[method.getMemberNameLocalized()]){
|
||||
return
|
||||
}
|
||||
|
||||
buffer += "\t\t"
|
||||
dumpMethod(method)
|
||||
buffer += ";\n"
|
||||
})
|
||||
|
||||
buffer += "\t}\n\n"
|
||||
})
|
||||
}
|
||||
|
||||
function printOptNewline() {
|
||||
if (buffer[buffer.length - 1] != '\n') buffer += "\n"
|
||||
}
|
||||
|
||||
function dumpNamespace(namespace) {
|
||||
let infos = repo.getInfos(namespace);
|
||||
|
||||
let enums = infos.filter((info) => { return info.isEnum() }).map((info) => info.asEnumInfo())
|
||||
let structs = infos.filter((info) => { return info.isStruct() }).map((info) => info.asStructInfo())
|
||||
let objects = infos.filter((info) => { return info.isObject() }).map((info) => info.asObjectInfo())
|
||||
let interfaces = infos.filter((info) => { return info.isInterface() }).map((info) => info.asInterfaceInfo())
|
||||
let constants = infos.filter((info) => { return info.isConstant() }).map((info) => info.asConstantInfo())
|
||||
|
||||
|
||||
buffer += "declare namespace " + (namespaceMap[namespace] ?? namespace) + " {\n"
|
||||
|
||||
let constRef = {}
|
||||
dumpConstants(namespace, constants, undefined, constRef)
|
||||
|
||||
printOptNewline()
|
||||
|
||||
dumpEnums(namespace, enums)
|
||||
|
||||
printOptNewline()
|
||||
|
||||
dumpInterfaces(namespace, interfaces)
|
||||
|
||||
printOptNewline()
|
||||
|
||||
dumpStructs(namespace, structs)
|
||||
|
||||
printOptNewline()
|
||||
|
||||
dumpObjects(namespace, objects)
|
||||
|
||||
buffer = buffer.substr(0, buffer.length - 1)
|
||||
buffer += "}"
|
||||
|
||||
if (!kExportAllInOne) {
|
||||
AuFS.WriteString(`./Export/${namespace}.d.ts`, buffer)
|
||||
buffer = ""
|
||||
}
|
||||
}
|
||||
|
||||
dumpNamespace("Gtk")
|
||||
dumpNamespace("Gdk")
|
||||
dumpNamespace("Gsk")
|
||||
dumpNamespace("GLib")
|
||||
dumpNamespace("Gio")
|
||||
dumpNamespace("GtkSource")
|
||||
dumpNamespace("GstPlay")
|
||||
dumpNamespace("GstPlayer")
|
||||
dumpNamespace("Pango")
|
||||
dumpNamespace("GObject")
|
||||
dumpNamespace("GdkPixbuf")
|
||||
dumpNamespace("cairo")
|
||||
dumpNamespace("Graphene")
|
||||
dumpNamespace("Gst")
|
||||
dumpNamespace("GstVideo")
|
||||
dumpNamespace("HarfBuzz")
|
||||
dumpNamespace("GstBase")
|
||||
|
||||
if (kExportAllInOne) {
|
||||
AuFS.WriteString(`./Export/AllInOne.d.ts`, buffer)
|
||||
}
|
Loading…
Reference in New Issue
Block a user