Пример #1
0
        public string GetTypeHeader(Metadata.DB_Type type)
        {
            TypeConfig tc = Converter.GetTypeConfig(type);

            if (tc != null)
            {
                if (!string.IsNullOrEmpty(tc.header_path))
                {
                    return(tc.header_path);
                }
            }

            return(type.name + ".h");
        }
Пример #2
0
        public void ConvertTypeHeader(Metadata.DB_Type type)
        {
            Model.EnterType(type);
            //头文件
            {
                sb.Clear();
                sb.AppendLine("#pragma once");

                //包含头文件
                HashSet <string> depTypes = Converter.GetTypeDependences(type);

                HashSet <string> NoDeclareTypes = Converter.GetTypeDependencesNoDeclareType(type);
                foreach (var t in depTypes)
                {
                    Metadata.DB_Type depType = Model.GetType(t);
                    if (!depType.is_generic_paramter && t != type.static_full_name)
                    {
                        if (NoDeclareTypes.Contains(t))
                        {
                            sb.AppendLine("#include \"" + GetTypeHeader(depType) + "\"");
                        }
                        else
                        {
                            //前向声明
                            //sb.AppendLine("namespace " + depType._namespace);
                            //sb.AppendLine("{");
                            if (depType.is_generic_type_definition)
                            {
                                sb.Append("template");
                                sb.Append("<");
                                for (int i = 0; i < depType.generic_parameter_definitions.Count; i++)
                                {
                                    sb.Append(depType.generic_parameter_definitions[i].type_name);
                                    if (i < depType.generic_parameter_definitions.Count - 1)
                                    {
                                        sb.Append(",");
                                    }
                                }
                                sb.AppendLine(">");
                                if (depType.is_value_type)
                                {
                                    sb.AppendLine("struct " + depType.name + ";");
                                }
                                else
                                {
                                    sb.AppendLine("class " + depType.name + ";");
                                }
                            }
                            else
                            {
                                if (depType.is_value_type)
                                {
                                    sb.AppendLine("struct " + depType.name + ";");
                                }
                                else
                                {
                                    sb.AppendLine("class " + depType.name + ";");
                                }
                            }
                            //sb.AppendLine("}");
                        }
                    }
                }


                if (HasCppAttribute(type.attributes))
                {
                    //包含虚幻生成的头文件
                    AppendLine(string.Format("#include \"{0}.generated.h\"", type.name));

                    //属性
                    AppendLine(ConvertCppAttribute(type.attributes));
                }


                //sb.AppendLine(string.Format("namespace {0}{{", type._namespace));
                {
                    //depth++;
                    if (type.is_enum)
                    {
                        Append(string.Format("enum {0}", type.name));
                    }
                    else
                    {
                        if (type.is_generic_type_definition)
                        {
                            Append("template<");
                            for (int i = 0; i < type.generic_parameter_definitions.Count; i++)
                            {
                                sb.Append("class " + type.generic_parameter_definitions[i].type_name);
                                if (i < type.generic_parameter_definitions.Count - 1)
                                {
                                    sb.Append(",");
                                }
                            }
                            sb.AppendLine(">");
                        }
                        else if (type.is_value_type)
                        {
                            Append(string.Format("struct {0}", type.name));
                        }
                        else
                        {
                            Append(string.Format("class {0}", type.name));
                        }
                        if (!type.base_type.IsVoid && !type.is_value_type || type.interfaces.Count > 0)
                        {
                            sb.Append(":");
                            if (!type.base_type.IsVoid && !type.is_value_type)
                            {
                                sb.Append("public " + GetCppTypeName(Model.GetType(type.base_type)));
                                if (type.interfaces.Count > 0)
                                {
                                    sb.Append(",");
                                }
                            }
                            for (int i = 0; i < type.interfaces.Count; i++)
                            {
                                sb.Append("public " + GetCppTypeName(Model.GetType(type.interfaces[i])));
                                if (i < type.interfaces.Count - 1)
                                {
                                    sb.Append(",");
                                }
                            }
                            sb.AppendLine();
                        }
                    }

                    AppendLine("{");
                    {
                        depth++;

                        if (type.is_enum)
                        {
                            List <Metadata.DB_Member> members = type.members.Values.ToList();
                            //members.Sort((a, b) => { return a.order <= b.order ? -1 : 1; });
                            for (int i = 0; i < members.Count; i++)
                            {
                                Append(members[i].name);
                                if (i < members.Count - 1)
                                {
                                    sb.Append(",");
                                }
                                sb.AppendLine();
                            }
                        }
                        else
                        {
                            if (HasCppAttribute(type.attributes))
                            {
                                AppendLine("GENERATED_BODY()");
                            }

                            foreach (var m in type.members.Values)
                            {
                                ConvertMemberHeader(m);
                            }
                        }

                        depth--;
                    }

                    TypeConfig tc = Converter.GetTypeConfig(type);

                    if (tc != null)
                    {
                        if (!string.IsNullOrEmpty(tc.ext_header))
                        {
                            AppendLine("#include \"" + tc.ext_header + "\"");
                        }
                    }

                    AppendLine("};");
                    //depth--;
                }

                //sb.AppendLine("}");

                //System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, GetTypeHeader(type)), sb.ToString());
                Model.LeaveType();
                //return sb.ToString();
            }
        }
Пример #3
0
        public void ConvertTypeCpp(Metadata.DB_Type type)
        {
            Model.EnterType(type);
            //StringBuilder sb = new StringBuilder();
            //cpp文件
            {
                sb.Clear();
                Project cfg = Converter.GetProject();
                if (!type.is_enum && !type.is_generic_type_definition)
                {
                    if (!string.IsNullOrEmpty(cfg.precompile_header))
                    {
                        sb.AppendLine(string.Format("#include \"{0}\"", cfg.precompile_header));
                    }
                    sb.AppendLine("#include \"" + GetTypeHeader(type) + "\"");
                    //sb.AppendLine(string.Format("namespace {0}{{", type._namespace));

                    //包含依赖的头文件
                    HashSet <string> depTypes     = Converter.GetMethodBodyDependences(type);
                    HashSet <string> headDepTypes = Converter.GetTypeDependences(type);
                    foreach (var t in headDepTypes)
                    {
                        Metadata.DB_Type depType = Model.GetType(t);
                        if (!depType.is_generic_paramter && t != type.static_full_name)
                        {
                            sb.AppendLine("#include \"" + GetTypeHeader(depType) + "\"");
                        }
                    }
                    foreach (var t in depTypes)
                    {
                        if (!headDepTypes.Contains(t))
                        {
                            Metadata.DB_Type depType = Model.GetType(t);
                            if (!depType.is_generic_paramter && t != type.static_full_name)
                            {
                                sb.AppendLine("#include \"" + GetTypeHeader(depType) + "\"");
                            }
                        }
                    }


                    //foreach (var us in type.usingNamespace)
                    //{
                    //    if(us!="UnrealEngine")
                    //        sb.AppendLine("using namespace " + us + ";");
                    //}

                    TypeConfig tc = Converter.GetTypeConfig(type);

                    if (tc != null)
                    {
                        if (!string.IsNullOrEmpty(tc.ext_cpp))
                        {
                            AppendLine("#include \"" + tc.ext_cpp + "\"");
                        }
                    }

                    foreach (var m in type.members.Values)
                    {
                        ConvertMemberCpp(m);
                    }

                    //sb.AppendLine("}");
                    //System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, type.name + ".cpp"), sb.ToString());
                }
                Model.LeaveType();
                //return sb.ToString();
            }
        }