protected void ParseOneOf(List <pb_lex_words> aWords, ref int nStart, int nEnd) { PBOneOfDesc pChild = null; int nLeft = PBLex.FindFirstWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_left_brace, nStart, nEnd); int nRight = PBLex.FindNextWords(aWords, pb_lex_words_type.lex_left_brace, pb_lex_words_type.lex_right_brace, nStart, nEnd); if (nLeft < nRight && nLeft > nStart) { // 找到了 message xxx{ } if (nStart + 2 == nLeft) { pb_lex_words name_class = aWords[nStart + 1]; pChild = new PBOneOfDesc(); pChild.m_nIndex = m_OneOf.Count; pChild.m_szClassName = name_class.GetString(); pChild.m_szName = MakeOneOfValueName(pChild.m_nIndex); PBOneOfDesc pOldOneOf = m_pCurOneOf; m_pCurOneOf = pChild; m_OneOf.Add(pChild); Parse(aWords, nLeft + 1, nRight); m_pCurOneOf = pOldOneOf; } nStart = nRight; } }
void ExportFC_WriteOneOf(ref StringBuilder szOut, ref int nStart, PBOneOfDesc pOneOf, int nSpaceCount) { szOut.AppendFormat(" switch({0})\r\n", pOneOf.m_szName); szOut.Append(" {\r\n"); MessageItem pChild = null; for (int i = 0; i < pOneOf.m_Childs.Count; ++i) { pChild = pOneOf.m_Childs[i]; szOut.AppendFormat(" case {0}:\r\n", pChild.m_ID); ExportFC_WriteChild(ref szOut, pChild, nSpaceCount + 4); szOut.Append(" break;\r\n"); } szOut.Append(" default:\r\n"); szOut.Append(" break;\r\n"); szOut.Append(" }\r\n"); nStart += pOneOf.m_Childs.Count - 1; }
void ExportFC_OneOfFunc(ref StringBuilder szOut, MessageItem pItem, bool bSetFunc, int nSpaceCount) { PBOneOfDesc pOneOf = pItem.m_pOneOfDesc; string szOneOfValueName = pOneOf.m_szName; string szValueClassName = GetValueTypeName(pItem); if (bSetFunc) { // set_xxxx(_Ty value) // _Ty mutable_xxxx(); szOut.AppendFormat(" public void set_{0}({1} _{2})\r\n", pItem.m_szName, szValueClassName, pItem.m_szName); szOut.Append(" {\r\n"); szOut.AppendFormat(" {0} = {1};\r\n", szOneOfValueName, pItem.m_ID); szOut.AppendFormat(" {0} = _{1};\r\n", pItem.m_szName, pItem.m_szName); szOut.Append(" }\r\n"); if (pItem.m_item_type != PBValueType.Value_Base || pItem.m_key.m_type == pb_type.pb_none) { szOut.AppendFormat(" public {0} mutable_{1}()\r\n", szValueClassName, pItem.m_szName); szOut.Append(" {\r\n"); szOut.AppendFormat(" {0} = {1};\r\n", szOneOfValueName, pItem.m_ID); szOut.AppendFormat(" if(null == {0})\r\n", pItem.m_szName); szOut.AppendFormat(" {0} = new {1}();\r\n", pItem.m_szName, szValueClassName); szOut.AppendFormat(" return {0};\r\n", pItem.m_szName); szOut.Append(" }\r\n"); } } else { // has_xxxx() szOut.AppendFormat(" public bool has_{0}()\r\n", pItem.m_szName); szOut.Append(" {\r\n"); szOut.AppendFormat(" return {0} == {1};\r\n", pItem.m_ID, szOneOfValueName); szOut.Append(" }\r\n"); szOut.AppendFormat(" public {0} get_{1}()\r\n", szValueClassName, pItem.m_szName); szOut.Append(" {\r\n"); szOut.AppendFormat(" return {0};\r\n", pItem.m_szName); szOut.Append(" }\r\n"); } }
void ExportFC_OneofEnum(ref StringBuilder szOut, int nSpaceCount) { int nSize = m_OneOf.Count; for (int i = 0; i < nSize; ++i) { PBOneOfDesc pOneOf = m_OneOf[i]; int nEnumCount = pOneOf.m_Childs.Count; szOut.Append(' ', nSpaceCount); szOut.AppendFormat("public enum {0}Case\r\n", pOneOf.m_szClassName); szOut.Append(' ', nSpaceCount); szOut.Append("{\r\n"); for (int j = 0; j < nEnumCount; ++j) { szOut.Append(' ', nSpaceCount + 4); szOut.AppendFormat("k{0} = {1},\r\n", pOneOf.m_Childs[j].m_szName, pOneOf.m_Childs[j].m_ID); } string szName = pOneOf.m_szClassName.ToUpper(); szOut.Append(' ', nSpaceCount + 4); szOut.AppendFormat("{0}_NOT_SET = 0,\r\n", szName); szOut.Append(' ', nSpaceCount); szOut.Append("};\r\n"); } }
// ------------------------------------------------------------- public void ExportFCScript(ref StringBuilder szOut, int nSpaceCount, bool bExportReadWriteFunc) { int nParentSpaceCount = nSpaceCount; szOut.Append("\r\n"); // 先生成枚举 ExportFC_InnerEnum(ref szOut, nSpaceCount); // 先将类内的函数,生成到类外吧 ExportFC_InnerClass(ref szOut, nSpaceCount, bExportReadWriteFunc); szOut.Append("\r\n"); // 导出类 szOut.Append(' ', nParentSpaceCount); szOut.AppendFormat("public class {0}\r\n", m_szClassName); szOut.Append(' ', nParentSpaceCount); szOut.Append("{\r\n"); nSpaceCount += 4; // 生成内部的枚举 szOut.Append(' ', nSpaceCount); szOut.Append("//-----------------------------\r\n"); ExportFC_OneofEnum(ref szOut, nSpaceCount); szOut.Append(' ', nSpaceCount); szOut.Append("//-----------------------------\r\n"); // 生成变量 int nSize = m_Member.Count; PBOneOfDesc pOneOfPtr = null; for (int i = 0; i < nSize; ++i) { MessageItem pItem = m_Member[i]; if (pOneOfPtr != pItem.m_pOneOfDesc) { szOut.Append(" //-----------------------------\r\n"); PBOneOfDesc pOneOf = pItem.m_pOneOfDesc; if (pOneOf != null) { szOut.AppendFormat(" int {0}; // {1}\r\n", pOneOf.m_szName, pOneOf.m_szClassName); } } pOneOfPtr = pItem.m_pOneOfDesc; ExportFC_ValueReflexTable(ref szOut, pItem, nSpaceCount); if (string.IsNullOrEmpty(pItem.m_default)) { szOut.AppendFormat(" public {0} {1};// = {2}\r\n", GetValueTypeName(pItem), pItem.m_szName, pItem.m_ID); } else { szOut.AppendFormat(" public {0} {1} = {2};// = {3}\r\n", GetValueTypeName(pItem), pItem.m_szName, pItem.m_default, pItem.m_ID); } } if (pOneOfPtr != null) { szOut.Append(" //-----------------------------\r\n"); } // 生成Set函数 ExportFC_SetFunc(ref szOut, nSpaceCount); // 生成Get函数 ExportFC_GetFunc(ref szOut, nSpaceCount); // 生成写函数 if (bExportReadWriteFunc) { ExportFC_WriteFunc(ref szOut, nSpaceCount); } // 生成读函数 if (bExportReadWriteFunc) { ExportFC_ReadFunc(ref szOut, nSpaceCount); } szOut.Append(' ', nParentSpaceCount); szOut.Append("};\r\n"); }