Accounting/FUI_UserData/ASH/plugins/myEditorExtention/GenCode_CSharp.js

247 lines
11 KiB
JavaScript
Raw Normal View History

2023-09-24 21:35:44 +08:00
"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;