public void init(CSWC swc) { this.swc = swc; arrayType = typeof(Array); link_type = new Dictionary <Type, RunTimeDataType>(); link_type.Add(typeof(int), RunTimeDataType.rt_int); link_type.Add(typeof(string), RunTimeDataType.rt_string); link_type.Add(typeof(double), RunTimeDataType.rt_number); link_type.Add(typeof(bool), RunTimeDataType.rt_boolean); link_type.Add(typeof(uint), RunTimeDataType.rt_uint); link_type.Add(typeof(ASBinCode.rtData.rtArray), RunTimeDataType.rt_array); link_type.Add(typeof(ASBinCode.rtData.rtFunction), RunTimeDataType.rt_function); link_type.Add(typeof(DictionaryKey), _DICT_KEY); link_type.Add(typeof(RunTimeValueBase), _OBJECT_LINK); link_type.Add(typeof(float), _FLOAT); link_type.Add(typeof(short), _SHORT); link_type.Add(typeof(ushort), _USHORT); foreach (var item in swc.creator_Class) { link_type.Add(item.Key.getLinkSystemObjType(), item.Value.getRtType()); link_type.Add(new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType()), item.Value.staticClass.getRtType()); if (item.Key.getLinkSystemObjType().Equals(typeof(object))) { _objectType_ = item.Value.getRtType(); } } type_link = new Dictionary <RunTimeDataType, Type>(); type_link.Add(RunTimeDataType.rt_int, typeof(int)); type_link.Add(RunTimeDataType.rt_string, typeof(string)); type_link.Add(RunTimeDataType.rt_number, typeof(double)); type_link.Add(RunTimeDataType.rt_boolean, typeof(bool)); type_link.Add(RunTimeDataType.rt_uint, typeof(uint)); type_link.Add(RunTimeDataType.rt_array, typeof(ASBinCode.rtData.rtArray)); type_link.Add(RunTimeDataType.rt_function, typeof(ASBinCode.rtData.rtFunction)); type_link.Add(_DICT_KEY, typeof(DictionaryKey)); type_link.Add(_OBJECT_LINK, typeof(RunTimeValueBase)); type_link.Add(_FLOAT, typeof(float)); type_link.Add(_SHORT, typeof(short)); type_link.Add(_USHORT, typeof(ushort)); foreach (var item in swc.creator_Class) { type_link.Add(item.Value.getRtType(), item.Key.getLinkSystemObjType()); type_link.Add(item.Value.staticClass.getRtType(), new AS3Class_Type(item.Value.staticClass.getRtType(), item.Key.getLinkSystemObjType())); } if (swc.TypeClass == null) { return; } { var clsint = swc.getClassDefinitionByName("int").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsint, typeof(int)), clsint); type_link.Add(clsint, new AS3Class_Type(clsint, typeof(int))); } { var clsuint = swc.getClassDefinitionByName("uint").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsuint, typeof(uint)), clsuint); type_link.Add(clsuint, new AS3Class_Type(clsuint, typeof(uint))); } { var clsstring = swc.getClassDefinitionByName("String").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsstring, typeof(string)), clsstring); type_link.Add(clsstring, new AS3Class_Type(clsstring, typeof(string))); } { var clsboolean = swc.getClassDefinitionByName("Boolean").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsboolean, typeof(bool)), clsboolean); type_link.Add(clsboolean, new AS3Class_Type(clsboolean, typeof(bool))); } { var clsnumber = swc.getClassDefinitionByName("Number").staticClass.getRtType(); link_type.Add(new AS3Class_Type(clsnumber, typeof(double)), clsnumber); type_link.Add(clsnumber, new AS3Class_Type(clsnumber, typeof(double))); } }
public string GetCode() { if (as3class.super.name == "Object") { StringBuilder content = new StringBuilder(); foreach (var item in as3class.staticClass.fields) { if (item.inheritFrom == null) { content.Append("\t\t"); string field = ""; //item.isPublic ? "public" : (item.isInternal ? "internal" : "private"); //if (item.isProtectd) field += " protected"; //if (item.isConst) field += " const"; //field += " " + GetTypeString(item.valueType); field += " " + GetName(item.name); if (item.defaultValue != null) { field += " = " + item.defaultValue.ToString(); } else { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("发现枚举字段没有默认值." + as3class.name + ":" + item.name); Console.ResetColor(); } field += ","; content.AppendLine(field); } } //Enum文档 foreach (var item in as3class.fields) { if (item.inheritFrom == null) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("发现枚举类中的非静态字段:" + as3class.name + ":" + item.name); Console.ResetColor(); } } var tempate = Properties.Resources.EnumTemplate; tempate = tempate.Replace("[PACKAGE]", as3class.package) .Replace("[CLASSNAME]", as3class.name) .Replace("[CONTENT]", content.ToString()); return(tempate.ToString()); } else if (as3class.super.name == "Message") { var enumtype = swc.getClassDefinitionByName("com.netease.protobuf.fieldDescriptors.FieldDescriptor_TYPE_ENUM"); var repeatEnum = swc.getClassDefinitionByName("com.netease.protobuf.fieldDescriptors.RepeatedFieldDescriptor_TYPE_ENUM"); //****查询元数据*** foreach (var item in as3class.staticClass.classMembers) { if (item.valueType == enumtype.getRtType()) { var findenum = ((ASBinCode.rtData.rtObject)player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".enumType")).value._class.instanceClass; var bindmember = player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".name"); enumMembers.Add(bindmember.ToString(), findenum.package + (string.IsNullOrEmpty(findenum.package) ? "" : ".") + findenum.name); } else if (item.valueType == repeatEnum.getRtType()) { var findenum = ((ASBinCode.rtData.rtObject)player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".enumType")).value._class.instanceClass; var bindmember = player.getMemberValue(as3class.package + (string.IsNullOrEmpty(as3class.package) ? "" : ".") + as3class.name, item.name + ".name"); repeatEnumMembers.Add(bindmember.ToString(), findenum.package + (string.IsNullOrEmpty(findenum.package) ? "" : ".") + findenum.name); } } StringBuilder content = new StringBuilder(); List <ASBinCode.rtti.ClassMember> fieldlist = new List <ASBinCode.rtti.ClassMember>(); List <ASBinCode.rtti.ClassMember> propertylist = new List <ASBinCode.rtti.ClassMember>(); foreach (var member in as3class.classMembers) { if (member.inheritFrom != null && (member.inheritFrom.name != "Message" || member.inheritSrcMember.isConstructor)) { continue; } if (member.isConstructor) { continue; } if (!member.isPublic) { continue; } if (member.isGetter || member.isSetter) { continue; } if (member.valueType == RunTimeDataType.rt_function) { if (member.inheritFrom != null) { continue; } var function = swc.functions[((MethodGetterBase)member.bindField).functionId]; string type = GetTypeString(function.signature.returnType); string method = "\t\tpublic "; if (member.isOverride) { method += "override "; } method += type + " "; method += GetName(member.name); method += "("; for (int i = 0; i < function.signature.parameters.Count; i++) { var p = function.signature.parameters[i]; string paratype = GetTypeString(p.type); if (paratype == "flash.utils.IDataInput") { paratype = "System.IO.MemoryStream"; } else if (paratype == "flash.utils.IDataOutput") { paratype = "System.IO.MemoryStream"; } else if (paratype == "flash.utils.ByteArray") { paratype = "byte[]"; } else if (paratype == "com.netease.protobuf.UInt64") { paratype = "System.UInt64"; } else if (paratype == "com.netease.protobuf.Int64") { paratype = "System.Int64"; } method += paratype + " " + p.name; if (i < function.signature.parameters.Count - 1) { method += ","; } } method += "){"; method += " player.invokeMethod(as3Object, \"" + member.name + "\""; for (int i = 0; i < function.signature.parameters.Count; i++) { method += "," + GetConvertToAS3ParameterFunctionName(function.signature.parameters[i].type) + "(" + function.signature.parameters[i].name + ")"; } method += ");"; method += "}"; content.AppendLine(method); } else if (member.bindField is ASBinCode.ClassPropertyGetter) { string propertytype = GetTypeString(member.valueType); if (propertytype == "flash.utils.ByteArray") { propertytype = "byte[]"; } else if (propertytype == "com.netease.protobuf.UInt64") { propertytype = "System.UInt64"; } else if (propertytype == "com.netease.protobuf.Int64") { propertytype = "System.Int64"; } if ((propertytype == "byte[]") || (propertytype == "System.UInt64") || (propertytype == "System.Int64") || ((member.valueType < RunTimeDataType._OBJECT))) { bool isenum = false; if (enumMembers.ContainsKey(member.name)) { propertytype = enumMembers[member.name]; isenum = true; } string filed = "\t\tpublic " + propertytype + " " + GetName(member.name) + "{"; ClassPropertyGetter prop = (ClassPropertyGetter)member.bindField; if (prop.getter != null && prop.getter.classmember.isPublic) { filed += "get { return (" + propertytype + ")(" + GetConvertFromAS3ParameterFunctionName(member.valueType) + "(player.getMemberValue(as3Object, \"" + member.name + "\"))); }"; } if (prop.setter != null && prop.setter.classmember.isPublic) { filed += "set { player.setMemberValue(as3Object, \"" + member.name + "\", " + GetConvertToAS3ParameterFunctionName(member.valueType) + (isenum?"(int)":"") + "(value)); }"; } filed += "}"; content.AppendLine(filed); } else { string field = Properties.Resources.ClassPropertyTemplate .Replace("[PROPERTYTYPE]", propertytype) .Replace("[CNAME]", GetName(member.name)) .Replace("[NAME]", member.name) ; content.AppendLine(field); propertylist.Add(member); } } else if (as3class.fields.Contains(member)) { fieldlist.Add(member); string fieldtype = GetTypeString(member.valueType); if (fieldtype == "System.Collections.Generic.List<{0}>") { Field f = (Field)member.bindField; foreach (var item in f.metas) { if (item.MetaName == "ArrayElementType") { if (repeatEnumMembers.ContainsKey(member.name)) { fieldtype = string.Format(fieldtype, repeatEnumMembers[member.name]); } else { fieldtype = string.Format(fieldtype, item.MetaData.ToString()); } break; } } } else if (fieldtype == "flash.utils.ByteArray") { fieldtype = "byte[]"; } else if (fieldtype == "com.netease.protobuf.UInt64") { fieldtype = "System.UInt64"; } else if (fieldtype == "com.netease.protobuf.Int64") { fieldtype = "System.Int64"; } if (enumMembers.ContainsKey(member.name)) { fieldtype = enumMembers[member.name]; } string field = "\t\tpublic " + fieldtype + " " + GetName(member.name) + " ;"; content.AppendLine(field); } } string afterMergeFrom = string.Empty; string beforeWriteTo = string.Empty; if (fieldlist.Count > 0) { //***追加afterMergeFrom() afterMergeFrom = "\t\tprivate bool _isreadding;\n"; afterMergeFrom += "\t\tprotected override void afterMergeFrom()\n"; afterMergeFrom += "\t\t{\n"; afterMergeFrom += "\t\t\tif(_isreadding) { return;} else { _isreadding=true; }\n"; afterMergeFrom += "\t\t\ttry\n"; afterMergeFrom += "\t\t\t{\n"; for (int i = 0; i < fieldlist.Count; i++) { var member = fieldlist[i]; string fieldtype = GetTypeString(member.valueType); if (fieldtype == "System.Collections.Generic.List<{0}>") { Field f = (Field)member.bindField; string vectortype = string.Empty; string elementtype = string.Empty; foreach (var item in f.metas) { if (item.MetaName == "ArrayElementType") { vectortype = item.MetaData.ToString(); if (repeatEnumMembers.ContainsKey(member.name)) { fieldtype = string.Format(fieldtype, repeatEnumMembers[member.name]); } else { fieldtype = string.Format(fieldtype, item.MetaData.ToString()); } elementtype = vectortype; if (repeatEnumMembers.ContainsKey(member.name)) { elementtype = repeatEnumMembers[member.name]; } if (elementtype == "flash.utils.ByteArray") { elementtype = "byte[]"; } else if (elementtype == "com.netease.protobuf.UInt64") { elementtype = "System.UInt64"; } else if (elementtype == "com.netease.protobuf.Int64") { elementtype = "System.Int64"; } else if (elementtype == "Number") { elementtype = "double"; } break; } } string listtemplate = @" { [CNAME] = new [LIST](); uint len = (uint)player.getMemberValue(as3Object, ""[NAME].length""); for (int i = 0; i < len; i++) { [VECTORTYPE] v = default([VECTORTYPE]); [SETVALUE] [CNAME].Add(v); } } "; bool isclass = false; var c = swc.getClassDefinitionByName(vectortype); if (c != null) { RunTimeDataType primtype; if (ASRuntime.TypeConverter.Object_CanImplicit_ToPrimitive(c, out primtype)) { isclass = false; } else { isclass = true; } } afterMergeFrom += listtemplate.Replace("[CNAME]", GetName(member.name)) .Replace("[NAME]", member.name) .Replace("[VECTORTYPE]", elementtype) .Replace("[SETVALUE]", GetLoadFieldValueStmt("v", elementtype, member, isclass, "i", "\t\t")) .Replace("[LIST]", fieldtype) ; continue; } else if (fieldtype == "flash.utils.ByteArray") { fieldtype = "byte[]"; } else if (fieldtype == "com.netease.protobuf.UInt64") { fieldtype = "System.UInt64"; } else if (fieldtype == "com.netease.protobuf.Int64") { fieldtype = "System.Int64"; } afterMergeFrom += GetLoadFieldValueStmt(GetName(member.name), fieldtype, member, member.valueType > RunTimeDataType._OBJECT, null); } afterMergeFrom += "\t\t\t}\n"; afterMergeFrom += "\t\t\tfinally\n"; afterMergeFrom += "\t\t\t{\n"; afterMergeFrom += "\t\t\t_isreadding=false;\n"; afterMergeFrom += "\t\t\t}\n"; afterMergeFrom += "\t\t}\n"; //****追加beforeWriteTo****** beforeWriteTo = "\t\tprivate bool _iswritting;\n"; beforeWriteTo += "\t\tprotected override void beforeWriteTo()\n"; beforeWriteTo += "\t\t{\n"; beforeWriteTo += "\t\t\tif(_iswritting) { return;} else { _iswritting=true; }\n"; beforeWriteTo += "\t\t\ttry\n"; beforeWriteTo += "\t\t\t{\n"; for (int i = 0; i < fieldlist.Count; i++) { var member = fieldlist[i]; string fieldtype = GetTypeString(member.valueType); if (fieldtype == "System.Collections.Generic.List<{0}>") { Field f = (Field)member.bindField; string vectortype = string.Empty; string elementtype = string.Empty; foreach (var item in f.metas) { if (item.MetaName == "ArrayElementType") { vectortype = item.MetaData.ToString(); fieldtype = string.Format(fieldtype, item.MetaData.ToString()); elementtype = vectortype; if (elementtype == "flash.utils.ByteArray") { elementtype = "byte[]"; } else if (elementtype == "com.netease.protobuf.UInt64") { elementtype = "System.UInt64"; } else if (elementtype == "com.netease.protobuf.Int64") { elementtype = "System.Int64"; } else if (elementtype == "Number") { elementtype = "double"; } break; } } string listtemplate = @" { player.setMemberValue(as3Object, ""[CNAME].length"", [CNAME].Count); for (int i = 0; i < [CNAME].Count; i++) { var v = [CNAME][i]; [SAVEVALUE] } } "; bool isclass = false; var c = swc.getClassDefinitionByName(vectortype); if (c != null) { RunTimeDataType primtype; if (ASRuntime.TypeConverter.Object_CanImplicit_ToPrimitive(c, out primtype)) { isclass = false; } else { isclass = true; } } beforeWriteTo += listtemplate.Replace("[CNAME]", GetName(member.name)) .Replace("[SAVEVALUE]", GetSaveFieldValueStmt("v", elementtype, vectortype, member.name, isclass, "i", "\t\t")); ; continue; } else if (fieldtype == "flash.utils.ByteArray") { fieldtype = "byte[]"; } else if (fieldtype == "com.netease.protobuf.UInt64") { fieldtype = "System.UInt64"; } else if (fieldtype == "com.netease.protobuf.Int64") { fieldtype = "System.Int64"; } beforeWriteTo += GetSaveFieldValueStmt(GetName(member.name), fieldtype, GetTypeString(member.valueType), member.name, member.valueType > RunTimeDataType._OBJECT, null); } for (int i = 0; i < propertylist.Count; i++) { var member = propertylist[i]; string template = Properties.Resources.ClassPropertyBeforeWriteTo; beforeWriteTo += template.Replace("[CNAME]", GetName(member.name)) .Replace("[NAME]", member.name) ; } beforeWriteTo += "\t\t\t}\n"; beforeWriteTo += "\t\t\tfinally\n"; beforeWriteTo += "\t\t\t{\n"; beforeWriteTo += "\t\t\t_iswritting=false;\n"; beforeWriteTo += "\t\t\t}\n"; beforeWriteTo += "\t\t}\n"; } var tempate = Properties.Resources.MessageTemplate; tempate = tempate.Replace("[PACKAGE]", as3class.package) .Replace("[AS3PROTOTYPE]", as3class.package + (string.IsNullOrEmpty(as3class.package)?"":".") + as3class.name) .Replace("[CLASSNAME]", as3class.name) .Replace("[afterMergeFrom]", afterMergeFrom) .Replace("[beforeWriteTo]", beforeWriteTo) .Replace("[CONTENT]", content.ToString()); return(tempate.ToString()); } else { return(string.Empty); } }