public static string GetFieldType(Field field) { if (field.container == Container.NONE) return GetDataType(field.value); else if (field.container == Container.MAP || field.container == Container.HASH_MAP) return String.Format("{0}<{1}, {2}>", GetContainerType(field.container), GetDataType(field.key), GetDataType(field.value)); else return String.Format("{0}<{1}>", GetContainerType(field.container), GetDataType(field.value)); }
private string GetContainer(Field field) { switch(field.container) { case Container.NONE: return "PROTO_NIL"; case Container.VEC: case Container.LIST: return "PROTO_VEC"; case Container.SET: case Container.HASH_SET: return "PROTO_SET"; case Container.MAP: case Container.HASH_MAP: return "PROTO_MAP"; default: return "nil"; } }
private Field ParseStructField(string data, int line) { Field field = new Field(); string[] tokens; // (deprecated) (container)type name (= index) string type_name; if (data.IndexOf('=') != -1) { tokens = data.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); field.index = UInt32.Parse(tokens[1]); type_name = tokens[0].Trim(); } else { type_name = data; } // check deprecated if(type_name.StartsWith("deprecated ")) { field.deprecated = true; type_name = type_name.Substring("deprecated ".Length); } // parse type name int index = type_name.LastIndexOf('*'); if (index != -1) field.pointer = true; // 解析类型和name,最后一个必然是name tokens = type_name.Split(new char[] { ' ', '<', ',', '>', '*', ':' }, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length < 2) throw new Exception("bad field"); field.container = Field.ParseContainer(tokens[0]); if(tokens.Length != field.tokenSize) throw new Exception("bad field"); field.name = tokens[tokens.Length - 1]; field.value.SetName(tokens[tokens.Length - 2]); if(field.container == Container.MAP || field.container == Container.HASH_MAP) { field.key.SetName(tokens[1]); } return field; }
private Field ParseEnumField(string data, int line) { Field field = new Field(); string[] tokens = data.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (tokens.Length == 0 || tokens.Length > 2) throw new Exception("bad enum field" + line + data); field.name = tokens[0].Trim(); if(tokens.Length == 2) field.index = UInt32.Parse(tokens[1]); return field; }