Example #1
0
        public static IDLEnum FindUsingEnum(IDLMeta meta, string enum_name)
        {
            if (meta.meta_enum.TryGetValue(enum_name, out IDLEnum enumtype))
            {
                return(enumtype);
            }

            foreach (var u in meta.meta_using)
            {
                var c = CodeGenHelper.FindMetaEnum(u.using_name, enum_name);
                if (c != null)
                {
                    return(c);
                }
            }
            return(null);
        }
Example #2
0
        public static IDLClass FindUsingClass(IDLMeta meta, string class_name)
        {
            if (class_name == null)
            {
                return(null);
            }
            if (meta.meta_class.TryGetValue(class_name, out IDLClass classtype))
            {
                return(classtype);
            }

            foreach (var u in meta.meta_using)
            {
                var c = CodeGenHelper.FindMetaClass(u.using_name, class_name);
                if (c != null)
                {
                    return(c);
                }
            }
            return(null);
        }
Example #3
0
        public static IDLMeta Parse(string idl)
        {
            IDLMeta  meta    = new IDLMeta();
            IDLClass m_class = null;
            IDLEnum  m_enum  = null;

            string[] lines    = File.ReadAllLines(idl);
            string   metaname = new string(Path.GetFileNameWithoutExtension(idl).TakeWhile(c => c != '.').ToArray());

            meta.meta_file_path = Path.Combine(Path.GetDirectoryName(idl), metaname).Replace('\\', '/');
            meta.meta_name      = CodeGenHelper.NameMangling(metaname, NameManglingType.AaBb);
            string     comment      = null;
            IDLAttr    attr         = null;
            ParseState m_parseState = ParseState.End;

            for (int i = 0; i < lines.Count(); i++)
            {
                //注释
                string cc = parseComment(ref lines[i]);
                if (!string.IsNullOrEmpty(cc))
                {
                    comment = cc;
                }
                //空行
                if (Regex.IsMatch(lines[i], @"^\s*$"))
                {
                    continue;
                }
                //特性
                if (Regex.IsMatch(lines[i], @"^\s*\[.*\]\s*$"))
                {
                    attr = IDLAttr.ParseAttr(lines[i]);
                    continue;
                }
                //变量
                Match match = Regex.Match(lines[i], @"^\s*set\s+(\w+)\s*=\s*(\w+)\s*;\s*$");
                if (match.Success)
                {
                    string key = match.Groups[1].Value;
                    string val = match.Groups[2].Value;
                    meta.meta_variant.Add(key, val);
                    continue;
                }
                //引用
                match = Regex.Match(lines[i], @"^\s*using\s+(\w+)\s*;\s*$");
                if (match.Success)
                {
                    IDLUsing u = new IDLUsing();
                    u.comment    = comment;
                    u.using_name = match.Groups[1].Value;
                    u.Meta       = meta;
                    meta.meta_using.Add(u);
                    comment = null;
                    continue;
                }

                //结束
                if (Regex.IsMatch(lines[i], @"^\s*};?\s*$"))
                {
                    if (m_parseState == ParseState.End)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }
                    if (m_parseState == ParseState.BeginClass)
                    {
                        meta.meta_class.Add(m_class.class_name, m_class);
                        m_class = null;
                    }
                    else if (m_parseState == ParseState.BeginEnum)
                    {
                        meta.meta_enum.Add(m_enum.enum_name, m_enum);
                        m_enum = null;
                    }
                    m_parseState = ParseState.End;

                    continue;
                }
                //开始
                if (Regex.IsMatch(lines[i], @"^\s*{\s*$"))
                {
                    if (m_parseState != ParseState.BeginClass && m_parseState != ParseState.BeginEnum)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }
                    continue;
                }
                //枚举开始
                match = Regex.Match(lines[i], @"^\s*enum\s*(\w+)\s*{?\s*$");
                if (match.Success)
                {
                    if (m_parseState != ParseState.End)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }
                    m_parseState     = ParseState.BeginEnum;
                    m_enum           = new IDLEnum();
                    m_enum.comment   = comment;
                    m_enum.enum_name = match.Groups[1].Value;
                    m_enum.Meta      = meta;
                    attr             = null;//用完清空
                    comment          = null;
                    continue;
                }

                //结构体开始
                match = Regex.Match(lines[i], @"^\s*(struct|class)\s*(\w+)\s*{?\s*$");
                if (match.Success)
                {
                    if (m_parseState != ParseState.End)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }
                    m_parseState       = ParseState.BeginClass;
                    m_class            = new IDLClass();
                    m_class.comment    = comment;
                    m_class.class_name = match.Groups[2].Value;
                    m_class.Meta       = meta;
                    if (attr != null)
                    {
                        m_class.attrs.Add(attr);
                    }
                    if (attr != null && attr.attr_name == "root")
                    {
                        meta.root_class_name = m_class.class_name;
                    }
                    attr    = null;//用完清空
                    comment = null;
                    continue;
                }


                //结构体
                if (m_parseState == ParseState.BeginClass)
                {
                    parseGenericType(ref lines[i]);
                    string def = parseDefaultValue(ref lines[i]);
                    Match  m   = Regex.Match(lines[i], @"\s*(\S+)\s+(\w+)\s*;\s*$");
                    if (m.Success == false)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }

                    IDLClassField field = new IDLClassField();
                    field.comment       = comment;
                    field.type_name     = m.Groups[1].Value;
                    field.field_name    = m.Groups[2].Value;
                    field.default_value = def;
                    if (attr != null)
                    {
                        field.attrs.Add(attr);
                    }
                    field.Class = m_class;
                    if (!ParseFieldType(meta, field.type_name, field.field_type, true))
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }
                    m_class.fieldList.Add(field);
                    attr    = null;//用完清空
                    comment = null;
                    continue;
                }

                //枚举
                if (m_parseState == ParseState.BeginEnum)
                {
                    Match m = Regex.Match(lines[i], @"\s*(\w+)\s*=\s*(\w+)\s*,\s*$");
                    if (m.Success == false)
                    {
                        throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
                    }

                    IDLEnumField item = new IDLEnumField();
                    item.comment    = comment;
                    item.item_name  = m.Groups[1].Value;
                    item.item_value = m.Groups[2].Value;
                    item.Enum       = m_enum;
                    m_enum.enum_fields.Add(item.item_name, item);
                    attr    = null;//用完清空
                    comment = null;
                    continue;
                }

                throw new Exception($"idl文件错误:第{i + 1}行,{lines[i]}");
            }
            return(meta);
        }
Example #4
0
        static void Main(string[] args)
        {
            Console.WriteLine("usage1: CodeDump --idldir=test/xml/ --tpldir=template/ --tardir=test/dumpcode/");
            Console.WriteLine("usage2: CodeDump --idl=xxx.idl --tpldir=template/ --tardir=test/dumpcode/");
            Stopwatch sw = new Stopwatch();

            sw.Start();

            string idldir  = "./xml/";
            string tpldir  = "./template/";
            string tardir  = "./dumpcode/";
            string idlfile = "";

            for (int i = 0; i < args.Length; i++)
            {
                Console.WriteLine(" {0}", args[i]);

                var ss = args[i].Split('=');
                if (ss[0] == "--idldir")
                {
                    idldir = ss[1];
                }
                if (ss[0] == "--tpldir")
                {
                    tpldir = ss[1];
                }
                if (ss[0] == "--tardir")
                {
                    tardir = ss[1];
                }
                if (ss[0] == "--idl")
                {
                    idlfile = ss[1];
                }
            }

            CodeGenHelper code_gen = new CodeGenHelper();

            code_gen.Init();

            //生成一个idl文件的代码
            if (Path.GetExtension(idlfile) == ".idl")
            {
                foreach (string tpl in Directory.EnumerateFiles(tpldir))
                {
                    code_gen.GenerateAllCodes(idlfile, tpl, tardir);
                }
                Console.ReadKey();
                return;
            }

            //为一个目录下的所有idl文件生成代码
            Action <string> DoGenerater = (string _xmldir) =>
            {
                //遍历目录下的idl文件
                foreach (string idl in Directory.EnumerateFiles(_xmldir))
                {
                    if (Path.GetExtension(idl) == ".idl")
                    {
                        //遍历template文件
                        foreach (string tpl in Directory.EnumerateFiles(tpldir))
                        {
                            code_gen.GenerateAllCodes(idl, tpl, tardir);
                        }
                    }
                }
            };

            DoGenerater(idldir);
            //遍历子目录
            foreach (string dir in Directory.EnumerateDirectories(idldir))
            {
                DoGenerater(dir);
            }

            code_gen.SaveCodeGenTime();
            sw.Stop();
            Console.WriteLine("生成代码完成!用时{0}秒!", sw.ElapsedMilliseconds / 1000.0f);
        }