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"); }
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(); } }
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(); } }