private string GenEnumCsCode(ProtoEnum en) { var template = @" /// <summary> /// [NODE] /// </summary> public enum [NAME] { [FIELDS] }"; var sb = new StringBuilder(); foreach (var i in en.Fields) { var templateField = @" /// <summary> /// [NOTE] /// </summary> [FIELD]"; templateField = templateField.Replace("[NOTE]", i.Note); if (!string.IsNullOrEmpty(i.Value)) { templateField = templateField.Replace("[FIELD]", string.Format("{0}={1},", i.Name, i.Value)); } else { templateField = templateField.Replace("[FIELD]", string.Format("{0},", i.Name)); } sb.AppendLine(templateField); } return(template.Replace("[NAME]", en.Name).Replace("[FIELDS]", sb.ToString()).Replace("[NODE]", en.Node)); }
public void ReadLine(string line) { var code = line.Trim(); if (code.StartsWith("{")) { return; //开始 } if (code.StartsWith("/")) { Comm = code.Replace("/", ""); return; //注释 } if (code.StartsWith("}")) //结束 { CurrentEnum = null; CurrentStruct = null; return; } #region Enum if (CurrentEnum != null) { int indexEqual = code.IndexOf("="); string enumFileName, enumFileValue, enumFieldNote; if (indexEqual > -1) { enumFileName = code.Split('=')[0].Trim(); enumFileValue = code.Substring(indexEqual + 1).Split("//".ToArray())[0].Trim("\t ;".ToArray()); var tempNotes = code.Split("//".ToArray()); var tempSb = new StringBuilder(); for (var i = 1; i < tempNotes.Length; i++) { tempSb.Append(tempNotes[i].Trim("\t".ToArray())); } enumFieldNote = tempSb.ToString(); CurrentEnum.AddField(new ProtoEnumField { Name = enumFileName, Value = enumFileValue, Note = enumFieldNote }); } } #endregion var args = code.Split(" \t\\;".ToArray()); //Console.WriteLine(code); var notes = code.Split("//".ToArray()); var tempFieldSb = new StringBuilder(); for (var i = 1; i < notes.Length; i++) { tempFieldSb.Append(notes[i].Trim()); } //Console.WriteLine(tempFieldSb.ToString()); switch (args[0]) { case "package": Package = args[1].Trim(); break; case "import": var importFile = args[1].Trim("\'\" \t\\;".ToArray()); LoadEnumTypes(importFile); break; case "message": CurrentStruct = new ProtoStruct(args[1], Comm); Structs.Add(CurrentStruct); break; case "enum": CurrentEnum = new ProtoEnum(args[1], Comm); Enums.Add(CurrentEnum); break; case "optional": case "required": case "repeated": var fieldType = args[1]; var fieldName = args[2].Split("\t\\;".ToArray())[0].Trim(); var fieldNote = string.Empty; fieldNote = tempFieldSb.ToString(); if (CurrentStruct == null) { throw new Exception("解析错误:" + code); } CurrentStruct.AddField(new ProtoField { IsArray = args[0] == "repeated", Name = fieldName, Type = fieldType, Note = fieldNote }); break; } Comm = string.Empty; }