Esempio n. 1
0
 public void EnterType(Metadata.DB_Type type)
 {
     if (string.IsNullOrEmpty(outNamespace))
     {
         Console.Error.WriteLine("未指定外部命名空间");
     }
     currentType = type;
 }
Esempio n. 2
0
        void ConvertMemberCpp(Metadata.DB_Member member)
        {
            Metadata.DB_Type member_type = Model.GetType(member.typeName);
            if (member.member_type == (int)Metadata.MemberTypes.Field)
            {
                if (member.is_static)
                {
                    if (member_type.is_class)
                    {
                        AppendLine("Ref<" + GetCppTypeName(Model.GetType(member.type)) + "> " + GetCppTypeName(Model.GetType(member.declaring_type)) + "::" + member.name + ";");
                    }
                    else if (member_type.is_value_type)
                    {
                        Append(GetCppTypeName(Model.GetType(member.type)) + " " + GetCppTypeName(Model.GetType(member.declaring_type)) + "::" + member.name);
                        if (member.field_initializer != null)
                        {
                            sb.Append("=");
                            sb.Append(ExpressionToString(member.field_initializer));
                        }
                        sb.AppendLine(";");
                    }
                }
            }
            else if (member.member_type == (int)Metadata.MemberTypes.Method)
            {
                Model.EnterMethod(member);
                Metadata.DB_Type declare_type = Model.GetType(member.declaring_type);
                if (!declare_type.is_generic_type_definition && member.method_body != null)
                {
                    if (member.member_type == (int)Metadata.MemberTypes.Method)
                    {
                        sb.Append(string.Format("{0} {1}::{2}", member.type.IsVoid ? "void" : GetCppTypeWrapName(Model.GetType(member.type)), GetCppTypeName(Model.GetType(member.declaring_type)), member.name));
                    }
                    else
                    {
                        sb.Append(string.Format("{1}::{2}", "", GetCppTypeName(Model.GetType(member.declaring_type)), member.name));
                    }
                    sb.Append("(");
                    if (member.method_args != null)
                    {
                        for (int i = 0; i < member.method_args.Length; i++)
                        {
                            sb.Append(string.Format("{0} {1} {2}", GetCppTypeWrapName(Model.GetType(member.method_args[i].type)), member.method_args[i].is_ref ? "&" : "", member.method_args[i].name));
                            if (i < member.method_args.Length - 1)
                            {
                                sb.Append(",");
                            }
                        }
                    }
                    sb.AppendLine(")");

                    ConvertStatement(member.method_body);
                }
                Model.LeaveMethod();
            }
        }
Esempio n. 3
0
        public bool SupportType(IConverter Converter, Metadata.DB_Type type)
        {
            switch (type.name)
            {
            case "int32":
            case "Object":
                return(true);
            }

            return(false);
        }
Esempio n. 4
0
        string GetCppTypeName(Metadata.DB_Type type)
        {
            ITypeConverter tc = Converter.GetTypeConverter(type);

            if (tc != null)
            {
                string name;
                if (tc.GetCppTypeName(out name))
                {
                    return(name);
                }
            }
            if (type.is_generic_paramter)
            {
                return(type.name);
            }
            if (type.is_generic_type)
            {
                StringBuilder sb = new StringBuilder();
                //sb.Append(type._namespace);
                //sb.Append("::");
                sb.Append(type.name);
                sb.Append("<");
                for (int i = 0; i < type.generic_parameters.Count; i++)
                {
                    sb.Append(GetCppTypeName(Model.GetType(type.generic_parameters[i])));
                    if (i < type.generic_parameters.Count - 1)
                    {
                        sb.Append(",");
                    }
                }
                sb.Append(">");
                return(sb.ToString());
            }
            if (type.is_interface)
            {
                return /*type._namespace + "::" +*/ (type.name);
            }
            if (type.is_class)
            {
                return /*type._namespace + "::" +*/ (type.name);
            }
            if (type.is_value_type)
            {
                return /*type._namespace + "::" +*/ (type.name);
            }
            if (type.is_enum)
            {
                return /*type._namespace + "::" +*/ (type.name);
            }

            return(type.static_full_name);
        }
Esempio n. 5
0
 public bool ConvertMethodExp(IConverter Converter, Metadata.DB_Type type, Metadata.Expression.MethodExp me, out string exp_string)
 {
     if (type.name == "Object")
     {
         if (me.Name == "ToString")
         {
             exp_string = string.Format("Object::ToString({1})", Converter.ExpressionToString(me.Caller));
             return(true);
         }
     }
     exp_string = "";
     return(false);
 }
Esempio n. 6
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");
        }
Esempio n. 7
0
 string GetCppTypeWrapName(Metadata.DB_Type type)
 {
     if (type.GetRefType().IsVoid)
     {
         return("void");
     }
     if (type.is_value_type)
     {
         return(GetCppTypeName(type));
     }
     else
     {
         return(string.Format("{0}*", GetCppTypeName(type)));
     }
 }
Esempio n. 8
0
        public bool GetCppTypeName(IConverter Converter, Metadata.DB_Type type, out string name)
        {
            switch (type.name)
            {
            case "int32":
                name = "UE_Int32";
                break;

            case "Object":
                name = "UObject";
                break;

            default:
                name = "";
                return(false);
            }
            return(true);
        }
Esempio n. 9
0
 void ConvertStatement(Metadata.DB_LocalDeclarationStatementSyntax bs)
 {
     Metadata.DB_Type type = Model.GetType(bs.Declaration.Type);
     if (type.is_class)
     {
         Append("Ref<" + GetCppTypeName(type) + "> ");
     }
     else
     {
         Append(GetCppTypeName(type) + " ");
     }
     for (int i = 0; i < bs.Declaration.Variables.Count; i++)
     {
         sb.Append(ExpressionToString(bs.Declaration.Variables[i]));
         if (i < bs.Declaration.Variables.Count - 2)
         {
             sb.Append(",");
         }
         Model.AddLocal(bs.Declaration.Variables[i].Identifier, Model.GetType(bs.Declaration.Type));
     }
     sb.AppendLine(";");
 }
Esempio n. 10
0
        public void ConvertType(Metadata.DB_Type type)
        {
            string         outputDir = Converter.GetProject().output_dir;
            ITypeConverter tc        = Converter.GetTypeConverter(type);

            if (tc != null)
            {
                sb.Clear();
                string content;
                if (tc.ConvertTypeHeader(Converter, type, out content))
                {
                    sb.Append(content);
                    System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, GetTypeHeader(type)), sb.ToString());
                }

                sb.Clear();
                if (tc.ConvertTypeCpp(Converter, type, out content))
                {
                    sb.Append(content);
                    System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, type.name + ".cpp"), sb.ToString());
                }
            }
            else
            {
                sb.Clear();
                ConvertTypeHeader(type);
                //sb.Append(ConvertTypeHeader(type));
                System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, GetTypeHeader(type)), sb.ToString());


                sb.Clear();
                ConvertTypeCpp(type);
                //sb.Append(ConvertTypeCpp(type));
                System.IO.File.WriteAllText(System.IO.Path.Combine(outputDir, type.name + ".cpp"), sb.ToString());
            }
        }
Esempio n. 11
0
 public void LeaveType()
 {
     currentType = null;
 }
Esempio n. 12
0
 public bool ConvertTypeHeader(IConverter Converter, Metadata.DB_Type type, out string header)
 {
     header = "";
     return(false);
 }
Esempio n. 13
0
        public IndifierInfo GetIndifierInfo(string name, string name_space = "", EIndifierFlag flag = EIndifierFlag.IF_All)
        {
            IndifierInfo info = new IndifierInfo();

            //在指定的命名空间查找标示符
            if (!string.IsNullOrEmpty(name_space))
            {
                DB_Type type = Finder.FindType(name_space + "." + name);
                if (type != null)
                {
                    info.is_type = true;
                    info.type    = type;
                    return(info);
                }
                return(null);
            }

            //查找本地变量
            foreach (var v in stackLocalVariables)
            {
                if (v.ContainsKey(name))
                {
                    info.is_var = true;
                    info.type   = v[name];
                    return(info);
                }
            }

            //泛型参数
            if (currentMethod != null)
            {
                foreach (var gd in currentMethod.method_generic_parameter_definitions)
                {
                    if (gd.type_name == name)
                    {
                        info.is_method_type_parameter = true;
                        Metadata.DB_Type constraintType = Finder.FindType(gd.constraint, this);
                        info.type = Metadata.DB_Type.MakeGenericParameterType(constraintType, name);
                        return(info);
                    }
                }
            }

            //查找成员变量
            if (currentType != null)
            {
                if ((flag & EIndifierFlag.IF_Local) != 0)
                {
                    if (currentType.FindField(name, this) != null)
                    {
                        info.is_field = true;
                        info.type     = GetType(currentType.FindField(name, this).typeName);
                        return(info);
                    }
                    if (currentType.FindProperty(name, this) != null)
                    {
                        info.is_property = true;
                        info.type        = GetType(currentType.FindProperty(name, this).typeName);
                        return(info);
                    }
                    if (currentType.FindEvent(name, this) != null)
                    {
                        info.is_event = true;
                        info.type     = GetType(currentType.FindEvent(name, this).typeName);
                        return(info);
                    }
                }
                if ((flag & EIndifierFlag.IF_Method) != 0)
                {
                    List <DB_Member> methods = currentType.FindMethod(name, this);
                    if (methods.Count > 0)
                    {
                        info.is_method = true;
                        info.methods   = methods;
                        return(info);
                    }
                }
                if ((flag & EIndifierFlag.IF_Type) != 0)
                {
                    //查找泛型
                    if (currentType.is_generic_type_definition)
                    {
                        foreach (var gd in currentType.generic_parameter_definitions)
                        {
                            if (gd.type_name == name)
                            {
                                info.is_class_type_parameter = true;
                                Metadata.DB_Type constraintType = Finder.FindType(gd.constraint, this);
                                info.type = Metadata.DB_Type.MakeGenericParameterType(constraintType, name);
                                return(info);
                            }
                        }
                    }
                    else if (currentType.is_generic_type)
                    {
                        //泛型实例,已经被替换了参数,所以无需查找
                    }
                    //当前命名空间查找
                    foreach (var nsName in currentType.usingNamespace)
                    {
                        DB_Type type = FindTypeInNamespace(name, nsName);
                        if (type != null)
                        {
                            info.is_type = true;
                            info.type    = type;
                            return(info);
                        }
                    }
                }
            }

            if ((flag & EIndifierFlag.IF_Type) != 0)
            {
                //当前命名空间查找
                if (!string.IsNullOrEmpty(outNamespace))
                {
                    DB_Type type = FindTypeInNamespace(name, outNamespace);
                    if (type != null)
                    {
                        info.is_type = true;
                        info.type    = type;
                        return(info);
                    }
                }
                foreach (var nsName in usingNamespace)
                {
                    DB_Type type = FindTypeInNamespace(name, nsName);
                    if (type != null)
                    {
                        info.is_type = true;
                        info.type    = type;
                        return(info);
                    }
                }
            }
            return(null);
        }
Esempio n. 14
0
        public DB_Type GetExpType(Expression.Exp exp, Expression.Exp outer = null)
        {
            if (exp is Metadata.Expression.ConstExp)
            {
                Metadata.Expression.ConstExp e = exp as Metadata.Expression.ConstExp;

                int int_v;
                if (int.TryParse(e.value, out int_v))
                {
                    return(GetType("System.Int32"));
                }

                long long_v;
                if (long.TryParse(e.value, out long_v))
                {
                    return(GetType("System.Int64"));
                }

                bool b_v;
                if (bool.TryParse(e.value, out b_v))
                {
                    return(GetType("System.Boolean"));
                }

                float single_v;
                if (float.TryParse(e.value, out single_v))
                {
                    return(GetType("System.Single"));
                }

                double double_v;
                if (double.TryParse(e.value, out double_v))
                {
                    return(GetType("System.Double"));
                }

                if (e.value == "null")
                {
                    return(GetType("System.Object"));
                }

                if (e.value.StartsWith("'"))
                {
                    return(GetType("System.Char"));
                }

                return(GetType("System.String"));
            }

            else if (exp is Metadata.Expression.FieldExp)
            {
                Metadata.Expression.FieldExp e           = exp as Metadata.Expression.FieldExp;
                Metadata.DB_Type             caller_type = GetExpType(e.Caller);

                if (outer is MethodExp)
                {
                    MethodExp methodExp = outer as MethodExp;
                    List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                    foreach (var t in methodExp.Args)
                    {
                        argTypes.Add(GetExpType(t));
                    }
                    Metadata.DB_Member member = caller_type.FindMethod(e.Name, argTypes, this);
                    return(GetType(member.typeName));
                }
                else
                {
                    DB_Member field = caller_type.FindField(e.Name, this);
                    if (field == null)
                    {
                        field = caller_type.FindProperty(e.Name, this);
                    }

                    if (field == null)
                    {
                        return(null);
                    }
                    return(GetType(field.typeName));
                }
            }

            else if (exp is Metadata.Expression.IndifierExp)
            {
                Metadata.Expression.IndifierExp e = exp as Metadata.Expression.IndifierExp;
                IndifierInfo info = GetIndifierInfo(e.Name);
                //if(outer is MethodExp)
                //{
                //    MethodExp methodExp = outer as MethodExp;
                //    List<Metadata.DB_Type> argTypes = new List<Metadata.DB_Type>();
                //    foreach (var t in methodExp.Args)
                //    {
                //        argTypes.Add(GetExpType(t));
                //    }
                //    foreach(var m in info.methods)
                //    {
                //        if(m.MatchingParameter(argTypes,this))
                //        {
                //            return GetType(m.typeName);
                //        }
                //    }

                //}
                //else
                {
                    return(info.type);
                }
            }

            else if (exp is Metadata.Expression.MethodExp)
            {
                Metadata.Expression.MethodExp me = exp as Metadata.Expression.MethodExp;

                List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                foreach (var t in me.Args)
                {
                    argTypes.Add(GetExpType(t));
                }

                if (me.Caller is FieldExp)
                {
                    FieldExp         fe          = me.Caller as FieldExp;
                    Metadata.DB_Type caller_type = GetExpType(fe.Caller, fe);
                    return(GetType(caller_type.FindMethod(fe.Name, argTypes, this).typeName));
                }
                else if (me.Caller is IndifierExp)
                {
                    IndifierExp  ie   = me.Caller as IndifierExp;
                    IndifierInfo info = GetIndifierInfo(ie.Name);

                    if (info.is_method)
                    {
                        foreach (var m in info.methods)
                        {
                            if (m.MatchingParameter(argTypes, this))
                            {
                                return(GetType(m.typeName));
                            }
                        }
                    }
                    else
                    {
                        return(info.type);
                    }
                }
            }

            else if (exp is Metadata.Expression.ObjectCreateExp)
            {
                Metadata.Expression.ObjectCreateExp e = exp as Metadata.Expression.ObjectCreateExp;
                return(GetType(e.Type));
            }

            else if (exp is Metadata.Expression.BaseExp)
            {
                return(GetType(currentType.base_type));
            }

            else if (exp is Metadata.Expression.ThisExp)
            {
                return(currentType);
            }

            else if (exp is Metadata.Expression.BinaryExpressionSyntax)
            {
                Metadata.Expression.BinaryExpressionSyntax me = exp as Metadata.Expression.BinaryExpressionSyntax;
                Metadata.DB_Type        caller_type           = GetExpType(me.Left);
                List <Metadata.DB_Type> argTypes = new List <Metadata.DB_Type>();
                argTypes.Add(GetExpType(me.Right));

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.PostfixUnaryExpressionSyntax)
            {
                Metadata.Expression.PostfixUnaryExpressionSyntax me = exp as Metadata.Expression.PostfixUnaryExpressionSyntax;
                Metadata.DB_Type        caller_type = GetExpType(me.Operand);
                List <Metadata.DB_Type> argTypes    = new List <Metadata.DB_Type>();
                argTypes.Add(caller_type);

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.PrefixUnaryExpressionSyntax)
            {
                Metadata.Expression.PrefixUnaryExpressionSyntax me = exp as Metadata.Expression.PrefixUnaryExpressionSyntax;
                Metadata.DB_Type        caller_type = GetExpType(me.Operand);
                List <Metadata.DB_Type> argTypes    = new List <Metadata.DB_Type>();
                argTypes.Add(caller_type);

                Metadata.DB_Member member = caller_type.FindMethod(me.OperatorToken, argTypes, this);
                return(GetType(member.typeName));
            }

            else if (exp is Metadata.Expression.ParenthesizedExpressionSyntax)
            {
                Metadata.Expression.ParenthesizedExpressionSyntax pes = exp as Metadata.Expression.ParenthesizedExpressionSyntax;
                return(GetExpType(pes.exp));
            }
            else if (exp is Metadata.Expression.ElementAccessExp)
            {
                Metadata.Expression.ElementAccessExp eae = exp as Metadata.Expression.ElementAccessExp;
                Metadata.DB_Type        caller_type      = GetExpType(eae.exp);
                List <Metadata.DB_Type> argTypes         = new List <Metadata.DB_Type>();
                foreach (var a in eae.args)
                {
                    argTypes.Add(GetExpType(a));
                }


                return(GetType(caller_type.FindProperty("Index", this).type));

                //string methodName = "";

                //if(outer is Metadata.Expression.AssignmentExpressionSyntax && ((Metadata.Expression.AssignmentExpressionSyntax)outer).Left == exp)
                //{
                //    methodName = "set_Index";
                //}
                //else
                //{
                //    methodName = "get_Index";
                //}

                //Metadata.DB_Member member = caller_type.FindMethod(methodName, argTypes, this);
                //return GetType(member.typeName);
            }
            else
            {
                Console.Error.WriteLine("无法确定表达式类型 " + exp.GetType().Name);
            }
            return(null);
        }
Esempio n. 15
0
 public void AddLocal(string name, Metadata.DB_Type type)
 {
     stackLocalVariables.Peek().Add(name, type);
 }
Esempio n. 16
0
        string ExpressionToString(Metadata.Expression.FieldExp es)
        {
            ITypeConverter tc = Converter.GetTypeConverter(Model.currentType);

            if (tc != null)
            {
                string content;
                if (tc.ConvertFieldExp(Converter, Model.currentType, es, out content))
                {
                    return(content);
                }
            }

            if (es.Caller == null)   //本地变量或者类变量,或者全局类
            {
                return(es.Name);
            }
            else
            {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.Append(ExpressionToString(es.Caller));

                Metadata.DB_Type caller_type = null;

                if (es.Caller is Metadata.Expression.IndifierExp)
                {
                    Metadata.Expression.IndifierExp ie = es.Caller as Metadata.Expression.IndifierExp;
                    Metadata.Model.IndifierInfo     ii = Model.GetIndifierInfo(ie.Name);
                    if (ii.is_namespace || ii.is_type)
                    {
                        stringBuilder.Append("::");
                        caller_type = null;
                    }
                    else
                    {
                        caller_type = ii.type;
                    }
                }
                else
                {
                    caller_type = Model.GetExpType(es.Caller);
                }

                if (caller_type != null)
                {
                    if (caller_type.is_class)
                    {
                        //Metadata.DB_Member member = caller_type.members[es.Name];
                        //if (member.is_static)
                        stringBuilder.Append("->");
                        //else if (member.member_type == (int)Metadata.MemberTypes.Method)
                        //{

                        //}
                    }
                    else
                    {
                        stringBuilder.Append(".");
                    }
                }

                stringBuilder.Append(es.Name);
                return(stringBuilder.ToString());
            }
        }
Esempio n. 17
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();
            }
        }
Esempio n. 18
0
 public bool ConvertTypeCpp(IConverter Converter, Metadata.DB_Type type, out string cpp)
 {
     cpp = "";
     return(false);
 }
Esempio n. 19
0
        void ConvertMemberHeader(Metadata.DB_Member member)
        {
            Metadata.DB_Type member_type = Model.GetType(member.typeName);
            if (member.member_type == (int)Metadata.MemberTypes.Field)
            {
                AppendLine(GetModifierString(member.modifier) + ":");
                //属性
                AppendLine(ConvertCppAttribute(member.attributes));
                if (member.is_static)
                {
                    Append("static ");
                }
                else
                {
                    Append("");
                }


                if (member_type.is_class)
                {
                    AppendLine(string.Format("{0}* {1};", GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
                else
                {
                    AppendLine(string.Format("{0} {1};", GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
            }
            else if (member.member_type == (int)Metadata.MemberTypes.Method)
            {
                Model.EnterMethod(member);

                AppendLine(GetModifierString(member.modifier) + ":");


                //属性
                AppendLine(ConvertCppAttribute(member.attributes));

                if (member.is_static)
                {
                    Append("static ");
                }
                else
                {
                    Append("");
                }

                if (member.method_abstract)
                {
                    sb.Append("abstract ");
                }
                if (member.method_virtual)
                {
                    sb.Append("virtual ");
                }

                if (member.member_type == (int)Metadata.MemberTypes.Method)
                {
                    sb.Append(string.Format("{1} {2}", "", member.type.IsVoid ? "void" : GetCppTypeWrapName(Model.GetType(member.type)), member.name));
                }
                else
                {
                    sb.Append(string.Format("{0}", member.name));
                }
                sb.Append("(");
                if (member.method_args != null)
                {
                    for (int i = 0; i < member.method_args.Length; i++)
                    {
                        sb.Append(string.Format("{0} {1} {2}", GetCppTypeWrapName(Model.GetType(member.method_args[i].type)), member.method_args[i].is_ref ? "&" : "", member.method_args[i].name));
                        if (i < member.method_args.Length - 1)
                        {
                            sb.Append(",");
                        }
                    }
                }

                Metadata.DB_Type declare_type = Model.GetType(member.declaring_type);

                if (declare_type.is_generic_type_definition)
                {
                    sb.AppendLine(")");
                    ConvertStatement(member.method_body);
                }
                else
                {
                    sb.AppendLine(");");
                }

                Model.LeaveMethod();
            }
        }
Esempio n. 20
0
 public bool ConvertFieldExp(IConverter Converter, Metadata.DB_Type type, Metadata.Expression.FieldExp fe, out string exp_string)
 {
     exp_string = "";
     return(false);
 }
Esempio n. 21
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();
            }
        }