Пример #1
0
        /*
         * static event global::UnityEngine.Application.LogCallback _logMessageReceived;
         * static Action<int, int, int> logMessageReceivedAction = OnlogMessageReceived;
         * static void OnlogMessageReceived(int arg0,int arg1,int arg2)
         * {
         *  _logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2));
         * }
         * public static event global::UnityEngine.Application.LogCallback logMessageReceived
         *      {
         *              add
         *              {
         *      bool add = _logMessageReceived == null;
         *      _logMessageReceived += value;
         *      if(add)
         *      {
         *          var value_p = Marshal.GetFunctionPointerForDelegate(logMessageReceivedAction);
         *          MonoBind.UnityEngine_Application_add_logMessageReceived(value_p);
         *      }
         *              }
         *              remove
         *              {
         *      _logMessageReceived -= value;
         *      if(_logMessageReceived == null)
         *      {
         *          var value_p = Marshal.GetFunctionPointerForDelegate(logMessageReceivedAction);
         *          MonoBind.UnityEngine_Application_remove_logMessageReceived(value_p);
         *      }
         *              }
         *      }
         */
        public override void Gen()
        {
            var name = genName;

            var flag = isStatic ? "static" : "";

            flag += isEvent ? " event" : "";
            var type = genType; // LogCallback(string condition, string stackTrace, LogType type);

            var eventTypeName = TypeResolver.Resolve(type).RealTypeName();

            if (type.IsGenericInstance)
            {
                eventTypeName = Utils.GetGenericTypeName(type);
            }

            var eventDeclear   = Utils.GetDelegateWrapTypeName(type, isStatic ? null : declarType);               //Action <int,int,int>
            var paramTpes      = Utils.GetDelegateParams(type, isStatic ? null : declarType, out var returnType); // string , string , LogType ,returnType
            var returnTypeName = returnType != null?TypeResolver.Resolve(returnType).RealTypeName() : "void";

            //static event global::UnityEngine.Application.LogCallback _logMessageReceived;
            CS.Writer.WriteLine($"public {flag} {eventTypeName} _{name}");

            //static Action<int, int, int> logMessageReceivedAction = OnlogMessageReceived;
            CS.Writer.WriteLine($"static {eventDeclear} {name}Action = On{name}");

            //static void OnlogMessageReceived(int arg0,int arg1,int arg2)
            var eventFuncDeclear = $"static {returnTypeName} On{name}(";

            for (int i = 0; i < paramTpes.Count; i++)
            {
                var p = paramTpes[i];
                eventFuncDeclear += TypeResolver.Resolve(p).LocalVariable($"arg{i}");
                if (i != paramTpes.Count - 1)
                {
                    eventFuncDeclear += ",";
                }
            }
            eventFuncDeclear += ")";

            CS.Writer.Start(eventFuncDeclear);
            CS.Writer.WriteLine("Exception __e = null");
            CS.Writer.Start("try");
            //_logMessageReceived(unbox(arg0), unbox(arg1), unbox(arg2));
            var callCmd   = $"_{name}(";
            var targetObj = "";

            for (int i = 0; i < paramTpes.Count; i++)
            {
                var p     = paramTpes[i];
                var param = TypeResolver.Resolve(p).Unbox($"arg{i}");

                if (i == 0 && !isStatic)
                {
                    targetObj = param + ".";
                    continue;
                }

                callCmd += param;
                if (i != paramTpes.Count - 1)
                {
                    callCmd += ",";
                }
            }
            callCmd += ")";

            if (!string.IsNullOrEmpty(targetObj))
            {
                callCmd = targetObj + callCmd;
            }
            if (returnType != null)
            {
                callCmd = $"var res = " + callCmd;
            }

            CS.Writer.WriteLine(callCmd);
            if (returnType != null)
            {
                var res = TypeResolver.Resolve(returnType).Box("res");
                CS.Writer.WriteLine($"return {res}");
            }
            CS.Writer.End();//try
            CS.Writer.Start("catch(Exception e)");
            CS.Writer.WriteLine("__e = e");
            CS.Writer.End();//catch
            CS.Writer.WriteLine("if(__e != null)", false);
            CS.Writer.WriteLine("ScriptEngine.OnException(__e.ToString())");
            if (returnType != null)
            {
                CS.Writer.WriteLine($"return default({returnTypeName})");
            }

            CS.Writer.End();//method

            //public static event LogCallback logMessageReceived
            CS.Writer.Start($"public {flag} {eventTypeName} {name}");

            var targetHandle = isStatic ? "" : "this.Handle, ";

            if (addMethod != null || setMethod != null)
            {
                var method = isEvent ? addMethod : setMethod;
                var op     = isEvent ? "+=" : "=";
                CS.Writer.Start(isEvent? "add":"set");
                CS.Writer.WriteLine($"bool attach = (_{name} == null)");
                CS.Writer.WriteLine($"_{name} {op} value");

                CS.Writer.Start("if(attach)");
                var res = TypeResolver.Resolve(type).Box($"{name}Action");

                CS.Writer.WriteLine(Utils.BindMethodName(method, false, false) + $"({targetHandle}{res})");
                //var value_p = Marshal.GetFunctionPointerForDelegate(logMessageReceivedAction);
                //MonoBind.UnityEngine_Application_add_logMessageReceived(value_p);
                CS.Writer.WriteLine("ScriptEngine.CheckException()");
                CS.Writer.End(); //if(attach)
                CS.Writer.End(); // add
            }
            if (removeMethod != null)
            {
                CS.Writer.Start("remove");
                CS.Writer.WriteLine($"_{name} -= value");

                CS.Writer.Start($"if(_{name} == null)");
                var res = TypeResolver.Resolve(type).Box($"{name}Action");
                CS.Writer.WriteLine(Utils.BindMethodName(removeMethod, false, false) + $"({targetHandle}{res})");
                CS.Writer.WriteLine("ScriptEngine.CheckException()");
                CS.Writer.End(); //if(attach)
                CS.Writer.End(); // remove
            }
            else if (getMethod != null)
            {
                CS.Writer.Start("get");
                CS.Writer.WriteLine($"return _{name}");
                CS.Writer.End(); //get
            }

            CS.Writer.End();
        }
Пример #2
0
        /// <summary>
        /// var thizObj = (GameObject)ObjectStore.Get(thiz_h);
        /// var value = thizObj.GetComponent(type);
        /// var value_h = ObjectStore.Store(value);
        /// return value_h;
        /// </summary>
        /// <returns> value_h </returns>
        public virtual string Implement(string name)
        {
            var thizObj = GetThizObj();

            if (method.ReturnType.IsVoid())
            {
                CS.Writer.WriteLine("", false);
            }
            else
            {
                CS.Writer.WriteLine($"var {name} = ", false);
            }

            string paramSeparation = ",";

            if (method.Name == "op_Implicit")
            {
                CS.Writer.Write($"");
            }
            else if (method.Name == "op_Equality")
            {
                paramSeparation = "==";
            }
            else if (method.Name == "op_Inequality")
            {
                paramSeparation = "!=";
            }

            else if (method.Name == "op_Addition")
            {
                paramSeparation = "+";
            }
            else if (method.Name == "op_Subtraction")
            {
                paramSeparation = "-";
            }
            else if (method.Name == "op_Multiply")
            {
                paramSeparation = "*";
            }
            else if (method.Name == "op_Division")
            {
                paramSeparation = "/";
            }
            else if (method.Name == "op_LessThan")
            {
                paramSeparation = "<";
            }
            else if (method.Name == "op_GreaterThan")
            {
                paramSeparation = ">";
            }
            else if (method.Name == "op_Explicit")
            {
                CS.Writer.Write($"({TypeResolver.Resolve(method.ReturnType).RealTypeName()})");
            }
            else if (method.Name == "op_UnaryNegation")
            {
                CS.Writer.Write($"-");
            }



            else
            {
                CS.Writer.Write($"{thizObj}.{method.Name}");
            }

            CS.Writer.Write($"(");
            var lastP = method.Parameters.LastOrDefault();

            foreach (var p in method.Parameters)
            {
                var value = TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true);
                //if (p.ParameterType.IsByReference)
                //    value = "ref " + value;

                CS.Writer.Write(value);
                if (lastP != p)
                {
                    CS.Writer.Write(paramSeparation);
                }
            }
            CS.Writer.Write(");");

            return(TypeResolver.Resolve(method.ReturnType).Box(name));
        }
Пример #3
0
 public virtual string ReturnType()
 {
     return(TypeResolver.Resolve(method.ReturnType).TypeName());
 }
Пример #4
0
        /*
         * static Action <int,int,int> logMessageReceived;
         * static void OnlogMessageReceived(string arg0, string arg1, LogType arg2)
         * {
         * logMessageReceived(box(arg0), box(arg1), box(arg2));
         * }
         * [MonoPInvokeCallback(typeof(UnityEngine_Application_logMessageReceived_Type))]
         * static void UnityEngine_Application_logMessageReceived (IntPtr value_p)
         * {
         * logMessageReceived = Marshal.GetDelegateForFunctionPointer<Action<int, int, int>>(value_p);
         * UnityEngine.Application.logMessageReceived += OnlogMessageReceived;
         * }
         */
        public override string Implement(string name)
        {
            var isStatic = method.IsStatic;

            var type         = method.Parameters.FirstOrDefault().ParameterType;                                        // LogCallback(string condition, string stackTrace, LogType type);
            var paramTpes    = Utils.GetDelegateParams(type, isStatic? null: method.DeclaringType, out var returnType); // string , string , LogType ,returnType
            var eventDeclear = Utils.GetDelegateWrapTypeName(type, isStatic ? null : method.DeclaringType);             //Action <int,int,int>

            var returnTypeName = returnType != null?TypeResolver.Resolve(returnType).RealTypeName() : "void";

            //static void OnlogMessageReceived(string arg0, string arg1, LogType arg2)
            var eventFuncDeclear = $"static {returnTypeName} On{uniqueName}(";

            for (int i = 0; i < paramTpes.Count; i++)
            {
                var p = paramTpes[i];
                if (!isStatic && i == 0)
                {
                    eventFuncDeclear += "this ";
                }
                eventFuncDeclear += $"{TypeResolver.Resolve(p).RealTypeName()} arg{i}";
                if (i != paramTpes.Count - 1)
                {
                    eventFuncDeclear += ",";
                }
            }
            eventFuncDeclear += ")";

            using (new LP(CS.Writer.GetLinePoint("//Method")))
            {
                CS.Writer.WriteLine($"static {eventDeclear} {uniqueName}");

                CS.Writer.Start(eventFuncDeclear);

                var callCmd = $"{uniqueName}(";
                if (returnType != null)
                {
                    callCmd = "var res = " + callCmd;
                }

                for (int i = 0; i < paramTpes.Count; i++)
                {
                    var p = paramTpes[i];
                    callCmd += TypeResolver.Resolve(p).Box($"arg{i}");

                    if (i != paramTpes.Count - 1)
                    {
                        callCmd += ",";
                    }
                }

                callCmd += ")";
                CS.Writer.WriteLine(callCmd);
                CS.Writer.WriteLine("ScriptEngine.CheckException()");
                if (returnType != null)
                {
                    var res = TypeResolver.Resolve(returnType).Box("res");
                    CS.Writer.WriteLine($"return {res}");
                }

                CS.Writer.End();
            }

            name = "value";
            var thizObj = GetThizObj();

            CS.Writer.WriteLine($"{uniqueName} = Marshal.GetDelegateForFunctionPointer<{eventDeclear}>({name}_p)");

            var actionTarget = isStatic ? $"On{uniqueName}" : $"{thizObj}.On{uniqueName}";
            var op           = isEvent ? "+=" : "=";

            CS.Writer.WriteLine($"{thizObj}.{propertyName} {op} {actionTarget}");

            return("");
        }
Пример #5
0
        /// <summary>
        /// var value = new GameObject(name);
        /// var valueHandle = ObjectStore.Store(value);
        /// return valueHandle;
        /// </summary>
        /// <returns> valueHandle </returns>
        public override string Implement(string name)
        {
            if (!IsValueTypeConstructor)
            {
                CS.Writer.WriteLine($"var {name} = new {TypeResolver.Resolve(method.DeclaringType).RealTypeName()}(", false);
                var lastP = method.Parameters.LastOrDefault();
                foreach (var p in method.Parameters)
                {
                    CS.Writer.Write(TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true));
                    if (lastP != p)
                    {
                        CS.Writer.Write(",");
                    }
                }
                CS.Writer.Write(");");

                CS.Writer.WriteLine($"var {name}Handle = ObjectStore.Store({name})");
                return($"{name}Handle");
            }
            else
            {
                //if (UnityEngine_Vector3__ctor_94_info == null)
                //    UnityEngine_Vector3__ctor_94_info = typeof(UnityEngine.Vector3).GetConstructor(new Type[] { typeof(System.Single), typeof(System.Single), typeof(System.Single) });
                //UnityEngine_Vector3__ctor_94_info.Invoke(thiz, System.Reflection.BindingFlags.Default, Type.DefaultBinder, new object[] { x, y, z }, null);

                /*var infoName = Utils.BindMethodName(method, true, false) + "_info";
                 * CS.Writer.WriteLine($"if({infoName} == null)", false);
                 * CS.Writer.Write($"{infoName} = typeof({TypeResolver.Resolve(method.DeclaringType).RealTypeName()}).GetConstructor(new Type[] {{ ");
                 * var lastP = method.Parameters.LastOrDefault();
                 * foreach (var p in method.Parameters)
                 * {
                 *  CS.Writer.Write($"typeof({TypeResolver.Resolve(p.ParameterType).RealTypeName()})");
                 *  if (lastP != p)
                 *      CS.Writer.Write(",");
                 * }
                 * CS.Writer.Write(" });");
                 *
                 * CS.Writer.WriteLine($"{infoName}.Invoke(thiz, System.Reflection.BindingFlags.Default, Type.DefaultBinder, new object[] {{", false);
                 * lastP = method.Parameters.LastOrDefault();
                 * foreach (var p in method.Parameters)
                 * {
                 *  CS.Writer.Write(TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true));
                 *  if (lastP != p)
                 *      CS.Writer.Write(",");
                 * }
                 * CS.Writer.Write("}, null);");*/

                CS.Writer.WriteLine($"var n = new {TypeResolver.Resolve(method.DeclaringType).RealTypeName()}(", false);
                var lastP = method.Parameters.LastOrDefault();
                foreach (var p in method.Parameters)
                {
                    CS.Writer.Write(TypeResolver.Resolve(p.ParameterType).Unbox(p.Name, true));
                    if (lastP != p)
                    {
                        CS.Writer.Write(",");
                    }
                }
                CS.Writer.Write(");");
                CS.Writer.WriteLine("thiz = n");
                return("");
            }
        }
Пример #6
0
        string GetMethodDelcear()
        {
            string declear = "public ";

            if (genMethod.IsStatic)
            {
                declear += "static ";
            }

            if (Utils.IsUnsafeMethod(genMethod))
            {
                declear += "unsafe ";
            }

            if (genMethod.IsAbstract)
            {
                declear += "abstract ";
            }
            else if (genMethod.IsOverride())
            {
                declear += "override ";
            }
            else if (genMethod.IsVirtual && !genMethod.IsFinal)
            {
                declear += "virtual ";
            }

            var methodName = genMethod.Name;

            switch (methodName)
            {
            case "op_Addition":
                methodName = "operator+";
                break;

            case "op_Subtraction":
                methodName = "operator-";
                break;

            case "op_UnaryNegation":
                methodName = "operator-";
                break;

            case "op_Multiply":
                methodName = "operator*";
                break;

            case "op_Division":
                methodName = "operator/";
                break;

            case "op_Equality":
                methodName = "operator==";
                break;

            case "op_Inequality":
                methodName = "operator!=";
                break;

            case "op_Implicit":
                methodName = "implicit operator " + genMethod.ReturnType.Name;
                break;

            case "op_Explicit":
                methodName = "explicit operator " + genMethod.ReturnType.Name;
                break;
            }

            if (!genMethod.IsConstructor)
            {
                if (!methodName.StartsWith("implicit") && !methodName.StartsWith("explicit"))
                {
                    declear += TypeResolver.Resolve(genMethod.ReturnType).RealTypeName() + " ";
                }
                declear += methodName;
            }
            else
            {
                declear += genMethod.DeclaringType.Name;
            }

            var param = "(";
            var lastP = genMethod.Parameters.LastOrDefault();

            foreach (var p in genMethod.Parameters)
            {
                var type     = p.ParameterType;
                var typeName = TypeResolver.Resolve(type).RealTypeName();
                if (type.IsGenericInstance)
                {
                    typeName = Utils.GetGenericTypeName(type);
                }

                param += $"{typeName} {p.Name}" + (p == lastP ? "" : ", ");
            }
            param += ")";

            declear += param;

            if (genMethod.IsConstructor && genMethod.DeclaringType.IsValueType)
            {
                declear += ":this()";
            }

            return(declear);
        }