Exemple #1
0
        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));
        }
Exemple #2
0
        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;
        }