private static string CppTypeConvert_vector(TypeTreeNode varNode, List <TypeTreeNode> varTreeNodes, out List <TypeTreeNode> varFieldTypeNodes) { var tempIdx = varNode.m_Index; //check { Debug.Assert(varTreeNodes[tempIdx + 1].m_Name == "Array"); Debug.Assert(varTreeNodes[tempIdx + 2].m_Name == "size"); Debug.Assert(varTreeNodes[tempIdx + 3].m_Name == "data"); } var tempFieldDes = varTreeNodes[tempIdx + 3].GetNodeCsharpTypeDes(varTreeNodes, out varFieldTypeNodes); return(string.Format("List<{0}>", tempFieldDes)); }
public static List <TypeTree2Class> Convert(TypeTreeNode varFieldCls, List <TypeTreeNode> varTreeNodes) { PPtr.IsPPtr(varFieldCls.m_Type, out var tempClsName); if (string.IsNullOrEmpty(tempClsName)) { tempClsName = varFieldCls.m_Type; } var tempTreeClses = new List <TypeTree2Class>(); var tempAlignFields = new HashSet <string>(); var tempFieldNames = new Dictionary <string, string>(); for (int iT = varFieldCls.m_Index + 1; iT < varTreeNodes.Count; ++iT) { var tempNode = varTreeNodes[iT]; if (tempNode.m_Level <= varFieldCls.m_Level) { break; } if (tempNode.m_Level != varFieldCls.m_Level + 1) { continue; } var tempFieldName = CorrectFieldName(tempNode.m_Name); if ((tempNode.m_MetaFlag & (int)TypeTreeNode.TransferMetaFlags.kAlignBytesFlag) != 0) { tempAlignFields.Add(tempFieldName); } tempFieldNames.Add(tempFieldName, tempNode.GetNodeCsharpTypeDes(varTreeNodes, out var tempFieldTypes)); foreach (var item in tempFieldTypes) { if (!item.IsVauleType()) { tempTreeClses.AddRange(TypeTree2Class.Convert(item, varTreeNodes)); } } } tempTreeClses.Add(new TypeTree2Class(tempClsName, tempFieldNames, tempAlignFields)); return(tempTreeClses); }
/// <summary> /// 解析Field的变量Type结构 /// </summary> /// <param name="varNode"></param> /// <param name="varTreeNodes"></param> /// <param name="varFieldTypeNodes"></param> /// <returns></returns> public static string GetNodeCsharpTypeDes(this TypeTreeNode varNode, List <TypeTreeNode> varTreeNodes, out List <TypeTreeNode> varFieldTypeNodes) { if (_CppType2CSharp.TryGetValue(varNode.m_Type, out var tempTypeVal)) { varFieldTypeNodes = new List <TypeTreeNode>() { varNode }; return(tempTypeVal); } if (_CppTypeConvert.TryGetValue(varNode.m_Type, out var tempConverter)) { return(tempConverter(varNode, varTreeNodes, out varFieldTypeNodes)); } //Debug.LogWarningFormat("GetNodeCsharpTypeDes not support [{0}]", varNode.m_Type); varFieldTypeNodes = new List <TypeTreeNode>() { varNode }; return(varNode.m_Type); }
public TypeTree Parse(EndianBinaryReader varStream, SerializedFileFormatVersion varFormat) { var tempNodeCount = varStream.ReadInt32(); var tempStringBufferSize = varStream.ReadInt32(); Nodes = new List <TypeTreeNode>(tempNodeCount); for (int i = 0; i < tempNodeCount; ++i) { var tempNode = new TypeTreeNode().Parse(varStream, varFormat); Nodes.Add(tempNode); } m_StringBuffer = varStream.ReadBytes(tempStringBufferSize); using (var stringBufferReader = new BinaryReader(new MemoryStream(m_StringBuffer))) { for (int i = 0; i < tempNodeCount; ++i) { var m_Node = Nodes[i]; m_Node.m_Type = ReadCommonString(stringBufferReader, m_Node.m_TypeStrOffset); m_Node.m_Name = ReadCommonString(stringBufferReader, m_Node.m_NameStrOffset); } } return(this); }
public static bool IsVauleType(this TypeTreeNode varNode) => _CppType2CSharp.ContainsKey(varNode.m_Type);