"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.genCode = void 0; const CodeWriter_1 = require("./CodeWriter"); function genCode(handler, calData) { let settings = handler.project.GetSettings("Publish").codeGeneration; let properties = handler.project.GetSettings("CustomProperties").elements; if (!properties.ContainsKey("NameSpace")) { console.error("请添加属性:NameSpace"); } if (!properties.ContainsKey("ChineseToPinYin")) { console.error("请添加属性:ChineseToPinYin"); } let namespaceName = properties.get_Item("NameSpace"); let toPinYin = properties.get_Item("ChineseToPinYin") == "true"; let codePkgName; if (toPinYin) { codePkgName = handler.ToFilename(handler.pkg.name); //convert chinese to pinyin, remove special chars etc. } else { if (RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(handler.pkg.name)) { codePkgName = handler.pkg.name; } else { console.error("名字包含非法字符:" + handler.pkg.name); } } let exportCodePath = handler.exportCodePath + '/' + codePkgName; //CollectClasses(stripeMemeber, stripeClass, fguiNamespace) let classes = handler.CollectClasses(true, false, null); handler.SetupCodeFolder(exportCodePath, "cs"); //check if target folder exists, and delete old files let getMemberByName = settings.getMemberByName; let classCnt = classes.Count; let writer = new CodeWriter_1.default(); for (let i = 0; i < classCnt; i++) { let classInfo = classes.get_Item(i); let url = classInfo.res.GetURL(); let data = calData.GetData(url); if (!data || !data.isGenerate) { continue; } let className = classInfo.className; if (!toPinYin) { className = settings.classNamePrefix + classInfo.resName; if (!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(className)) { console.error("名字包含非法字符:" + className); className = classInfo.className; } } let members = classInfo.members; writer.reset(); writer.writeln('using FairyGUI;'); writer.writeln('using FairyGUI.Utils;'); writer.writeln('using DragonSoul.Shared;'); writer.writeln('using System;'); writer.writeln(); writer.writeln('namespace %s', namespaceName); writer.startBlock(); writer.writeln("public partial class %s", className); writer.startBlock(); writer.writeln("public const string UIPackageName = \"%s\";", codePkgName); writer.writeln("public const string UIResName = \"%s\";", classInfo.resName); writer.writeln(); writer.writeln("public %s self;", classInfo.superClassName); writer.writeln(); let memberCnt = members.Count; // 是否为自定义类型组件标记数组 // 是否为跨包组件标记数组 let crossPackageFlagsArray = new Array(memberCnt); //是否生成代码 let customTypeArray = new Array(memberCnt); let baseTypeNameArray = new Array(memberCnt); let memberTypeNameArray = new Array(memberCnt); for (let j = 0; j < memberCnt; j++) { let memberInfo = members.get_Item(j); crossPackageFlagsArray[j] = false; customTypeArray[j] = false; baseTypeNameArray[j] = memberInfo.type; memberTypeNameArray[j] = memberInfo.type; let hasRes = memberInfo.res != null; if (!hasRes) { customTypeArray[j] = false; } else { let url = memberInfo.res.GetURL(); let data = calData.GetData(url); customTypeArray[j] = data && data.isGenerate; } let typeName = memberInfo.type; if (!toPinYin && memberInfo.res) { typeName = settings.classNamePrefix + memberInfo.res.name; if (!RegExp(/^[\u4e00-\u9fa5_a-zA-Z][\u4e00-\u9fa5_a-zA-Z0-9]*$/).test(typeName)) { console.error("名字包含非法字符:" + typeName); typeName = memberInfo.type; } } // 判断是不是跨包类型组件 let crossPkg = hasRes ? memberInfo.res.owner.name != handler.pkg.name : false; crossPackageFlagsArray[j] = crossPkg; if (crossPkg) { if (!customTypeArray[j]) { for (let k = 0; k < classCnt; k++) { var __classInfo = classes.get_Item(k); if (memberInfo.res.name == __classInfo.resName) { console.log(111); typeName = __classInfo.superClassName; baseTypeNameArray[j] = typeName; break; } } typeName = baseTypeNameArray[j]; memberTypeNameArray[j] = typeName; writer.writeln('public %s %s;', typeName, memberInfo.varName); } else { baseTypeNameArray[j] = typeName; memberTypeNameArray[j] = typeName; writer.writeln('public %s %s;', typeName, memberInfo.varName); } } else { if (hasRes) { if (customTypeArray[j]) { writer.writeln('public %s %s;', typeName, memberInfo.varName); } else { //寻找名称一样的组件的基础类型 for (let k = 0; k < classCnt; k++) { var __classInfo = classes.get_Item(k); if (memberInfo.res.name == __classInfo.resName) { typeName = __classInfo.superClassName; baseTypeNameArray[j] = typeName; break; } } writer.writeln('public %s %s;', typeName, memberInfo.varName); } } else { writer.writeln('public %s %s;', typeName, memberInfo.varName); } memberTypeNameArray[j] = typeName; } } writer.writeln('public const string URL = "ui://%s%s";', handler.pkg.id, classInfo.resId); writer.writeln(); writer.writeln('public %s(GObject go=null)', className); writer.startBlock(); writer.writeln('if (go == null)'); writer.startBlock(); writer.writeln('throw new Exception($\"can\'t create view : {this.GetType()}\");'); writer.endBlock(); writer.writeln('self = (%s)go;', classInfo.superClassName); writer.writeln('var com = go.asCom;'); writer.writeln(); writer.writeln('if(com != null)'); writer.startBlock(); for (let j = 0; j < memberCnt; j++) { let memberInfo = members.get_Item(j); let typeName = baseTypeNameArray[j]; let memberTypeName = memberTypeNameArray[j]; let bIsCrassPkg = crossPackageFlagsArray[j]; let bIsCustomComponent = customTypeArray[j]; if (memberInfo.group == 0) { { //跨包必定导出,必定自定义 if (bIsCrassPkg) if (bIsCustomComponent) { writer.writeln('%s = Create<%s>(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index); } else writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index); else { if (bIsCustomComponent) { writer.writeln('%s = Create<%s>(this, com.GetChildAt(%s));', memberInfo.varName, memberTypeName, memberInfo.index); } else { writer.writeln('%s = (%s)com.GetChildAt(%s);', memberInfo.varName, memberTypeName, memberInfo.index); } } } } else if (memberInfo.group == 1) { if (getMemberByName) { writer.writeln('%s = com.GetController("%s");', memberInfo.varName, memberInfo.name); } else writer.writeln('%s = com.GetControllerAt(%s);', memberInfo.varName, memberInfo.index); } else { if (getMemberByName) { writer.writeln('%s = com.GetTransition("%s");', memberInfo.varName, memberInfo.name); } else writer.writeln('%s = com.GetTransitionAt(%s);', memberInfo.varName, memberInfo.index); } } writer.endBlock(); writer.endBlock(); writer.writeln('public void Dispose()'); writer.startBlock(); writer.writeln('self = null;'); for (let j = 0; j < memberCnt; j++) { let memberInfo = members.get_Item(j); let bIsCustomComponent = customTypeArray[j]; if (memberInfo.group == 0) { if (!bIsCustomComponent) { writer.writeln('%s = null;', memberInfo.varName); } } else if (memberInfo.group == 1) { if (getMemberByName) { writer.writeln('%s = null;', memberInfo.varName); } else writer.writeln('%s = null;', memberInfo.varName); } else { if (getMemberByName) writer.writeln('%s = null;', memberInfo.varName); else { writer.writeln('%s = null;', memberInfo.varName); } } } writer.endBlock(); writer.endBlock(); //class writer.endBlock(); //namepsace writer.save(exportCodePath + '/' + className + '.cs'); } writer.reset(); writer.writeln('namespace %s', namespaceName); writer.startBlock(); writer.writeln('public static partial class FUIPackage'); writer.startBlock(); writer.writeln('public const string %s = "%s";', codePkgName, codePkgName); for (let k = 0; k < classCnt; k++) { var classInfo = classes.get_Item(k); writer.writeln('public const string %s_%s = "ui://%s/%s";', codePkgName, classInfo.resName, codePkgName, classInfo.resName); } writer.endBlock(); //class writer.endBlock(); //namespace let binderPackageName = 'Package' + codePkgName; writer.save(exportCodePath + '/' + binderPackageName + '.cs'); } exports.genCode = genCode;