예제 #1
0
 public static void GenerateCSFunction(string definition,Lua4NetSerializer serializer,Action<Lua4NetSerializer> OnGetBody)
 {
     serializer.NewLine(definition);
     serializer.BeginBlock("{");
         OnGetBody(serializer);
     serializer.EndBlock("}");
 }
예제 #2
0
 public static void GenerateMethod(string methodName, Type type, Lua4NetSerializer serializer, Action<List<Type>> OnGetBody)
 {
     serializer.NewLine(methodName + "(");
     List<Type> args = new List<Type>();
     if (type.IsGenericType)
         args = type.GetGenericArguments().ToList();
     else
     {
         (type.GetMembers()[0] as MethodBase).GetParameters().ToList().ForEach(pi =>
         {
             args.Add(pi.ParameterType);
         }); ;
     }
     int nNextArgIndex = 0;
     while (nNextArgIndex < args.Count)
     {
         Type arg = args[nNextArgIndex];
         serializer.Apppend(GeneratorHelper.GetTypeName(arg) + " arg" + nNextArgIndex.ToString());
         ++nNextArgIndex;
         if (nNextArgIndex <= (args.Count - 1))
             serializer.Apppend(",");
     }
     serializer.Apppend(")");
     serializer.BeginBlock("{");
     OnGetBody(args);
     serializer.EndBlock("}");
 }
예제 #3
0
        public static void Generate(EventInfo ei, Lua4NetSerializer serializer)
        {
            serializer.NewLine();
            serializer.NewLine(string.Format("class {0}Delegate:LuaRefFunction", ei.Name));
            serializer.BeginBlock("{");
            // 构造函数
            serializer.NewLine(string.Format("public {0}Delegate(int ref_,IntPtr l)", ei.Name));
            serializer.NewLine("    :base(ref_,l)");
            serializer.BeginBlock("{");
            serializer.EndBlock("}");

            // 调用函数
            serializer.NewLine();
            GeneratorHelper.GenerateMethod("public void Call", ei.EventHandlerType, serializer, (args) =>
            {
                GeneratorHelper.GenerateMethodCall("LuaManager.Instance.Call", new string[] { "this" }, args, serializer);
            });
            serializer.EndBlock("}");
        }
예제 #4
0
 private static void GenerateStaticFields(ClassDescription cd,Lua4NetSerializer serializer)
 {
     serializer.NewLine(string.Format("delegate int Lua4NetFunc({0} Instance,IntPtr l);", cd.ClassName));
     serializer.NewLine("private static Lua4NetFunc[] _Methods=");
     serializer.BeginBlock("{");
     int methodid = 0;
     foreach (ConstructorDescription ctor in cd.Constructors)
     {
         serializer.NewLine(ctor.NickName+",");
         serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
     }
     foreach (MethodDescription md in cd.Methods)
     {
         serializer.NewLine(md.NickName + ",");
         serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
     }
     foreach (PropertyFieldDescription pfd in cd.Propertys)
     {
         if (pfd.GetMethod != null)
         {
             serializer.NewLine(pfd.GetMethod.NickName + ",");
             serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
         }
         if (pfd.SetMethod != null)
         {
             serializer.NewLine(pfd.SetMethod.NickName + ",");
             serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
         }
     }
     foreach (EventDescription ed in cd.Events)
     {
         if (ed.AddMethod != null)
         {
             serializer.NewLine(ed.AddMethod.Name + ",");
             serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
         }
         if (ed.RemoveMethod != null)
         {
             serializer.NewLine(ed.RemoveMethod.Name + ",");
             serializer.Apppend(string.Format(" // methodid = {0}", methodid++));
         }
     }
     serializer.NewLine("null");
     serializer.EndBlock("};");
 }
예제 #5
0
        private static void GenerateRootMethod(ClassDescription cd, Lua4NetSerializer serializer)
        {
            if (cd.aot)
            {
                serializer.NewLine("[AOT.MonoPInvokeCallback(typeof(LuaCSFunction))]");
            }
            serializer.NewLine(string.Format("private static int {0}(IntPtr l)", cd.ServantCallName));
            serializer.BeginBlock("{");
            serializer.NewLine("try");

            serializer.BeginBlock("{");

            serializer.NewLine("// get object and methodid");
            serializer.NewLine(string.Format("int nObjectId = (int)LuaApi.lua_tonumber(l,1);", cd.ClassName));
            serializer.NewLine("int  nMethodId = (int)LuaApi.lua_tonumber(l,2);");
            serializer.NewLine(string.Format("{0} obj = LuaManager.Instance.GetObjectT<{0}>(nObjectId);", cd.ClassName));

            serializer.NewLine();
            serializer.NewLine("// call member function");
            serializer.NewLine(string.Format("return _Methods[nMethodId](obj,l);", cd.ClassName));

            serializer.EndBlock("}");

            serializer.NewLine("catch(System.Exception ex)");
            serializer.BeginBlock("{");
                serializer.NewLine("LuaManager.Instance.Log(ex.Message);");
                serializer.NewLine("return 0;");
            serializer.EndBlock("}");
            serializer.EndBlock("}");
        }
예제 #6
0
 private static void GenerateRegisterFunction(ClassDescription cd, Lua4NetSerializer serializer)
 {
     serializer.NewLine(string.Format("public override void Register(IntPtr l)"));
     serializer.BeginBlock("{");
         serializer.NewLine(string.Format("LuaApi.lua_pushstring(l,\"{0}\");", cd.ServantCallName));
         serializer.NewLine(string.Format("LuaApi.lua_pushcfunction(l,{0});", cd.ServantCallName));
         serializer.NewLine(string.Format("LuaApi.lua_settable(l,(int)LuaIndex.LUA_GLOBALSINDEX);"));
     serializer.EndBlock("}");
 }
예제 #7
0
        private static void GenerateEvent(ClassDescription cd, EventDescription ed, Lua4NetSerializer serializer)
        {
            #region add
            {
                serializer.NewLine();
                string methodName = ed.Ei.GetAddMethod().Name;
                string funcdef = string.Format("private static int {0}({1} Instance,IntPtr l)", methodName, cd.ClassName);
                GeneratorHelper.GenerateCSFunction(funcdef, serializer, s =>
                {
                    string classOrInstance = ed.IsStatic ? cd.ClassName : "Instance";
                    serializer.NewLine(string.Format("{0}Delegate d = new {0}Delegate(3,l);", ed.Ei.Name));
                    serializer.NewLine(string.Format("{0}.{1} += d.Call;",classOrInstance,ed.Ei.Name));
                    serializer.NewLine("int id = LuaManager.Instance.PushStackObject(d);");
                    serializer.NewLine("LuaApi.lua_pushnumber(l,id);");
                    serializer.NewLine("return 1;");
                });
            }
            #endregion

            #region remove
            {
                serializer.NewLine();
                string methodName = ed.Ei.GetRemoveMethod().Name;
                string funcdef = string.Format("private static int {0}({1} Instance,IntPtr l)", methodName, cd.ClassName);
                GeneratorHelper.GenerateCSFunction(funcdef, serializer, s =>
                {
                    serializer.NewLine("int id = (int)LuaApi.lua_tonumber(l,3);");
                    serializer.NewLine(string.Format("{0}Delegate d = LuaManager.Instance.GetObjectT<{0}Delegate>(id);", ed.Ei.Name));
                    serializer.NewLine("if(null != d)");
                    serializer.BeginBlock("{");
                        serializer.NewLine(string.Format("Instance.{0} -= d.Call;", ed.Ei.Name));
                    serializer.EndBlock("}");
                    serializer.NewLine("return 0;");
                });
            }
            #endregion
        }
예제 #8
0
        private void Generate(string path, ClassDescription cd, Func<ClassDescription, Lua4NetSerializer, string> GetContent)
        {
            Lua4NetSerializer serializer = new Lua4NetSerializer(0);

            List<string> namespaces = new List<string>() { "System", "Lua4Net" };
            GenerateNamespace(cd, ns =>
            {
                foreach (string n in ns)
                {
                    if (!namespaces.Contains(n))
                        namespaces.Add(n);
                }
            });

            namespaces.ForEach(n =>
            {
                serializer.NewLine(string.Format("using {0};", n));
            });

            serializer.NewLine();
            serializer.NewLine(string.Format("namespace {0}", "Lua4Net"));
            serializer.BeginBlock("{");
            string file = GetContent(cd, serializer);
            serializer.EndBlock("}");

            string fullpath = Path.Combine(path, file);
            string content = serializer.ToString();
            Console.WriteLine(content);
            SaveAsFile(fullpath, content);
        }
예제 #9
0
        public void GenerateServantRoot(string path)
        {
            Lua4NetSerializer serializer = new Lua4NetSerializer(0);
            serializer.NewLine("using System;");
            serializer.NewLine("namespace Lua4Net");
            serializer.BeginBlock("{");

            serializer.NewLine();
            serializer.NewLine("public class Lua4NetRoot : LuaRegister");
            serializer.BeginBlock("{");

            serializer.NewLine("private LuaRegister[] allRegister = ");
            serializer.BeginBlock("{");
            for (int i = 0; i < allServants.Count; ++i)
            {
                serializer.NewLine(string.Format("new {0}()", allServants[i]));
                if (i != (allServants.Count - 1))
                    serializer.Apppend(",");
            }
            serializer.EndBlock("};");

            serializer.NewLine();
            serializer.NewLine("public override void Register(IntPtr l)");
            serializer.BeginBlock("{");
            serializer.NewLine("foreach(LuaRegister r in allRegister)");
            serializer.BeginBlock("{");
            serializer.NewLine("r.Register(l);");
            serializer.EndBlock("}");
            serializer.EndBlock("}");

            serializer.EndBlock("}");

            serializer.EndBlock("}");

            string fullpath = Path.Combine(path, "Lua4NetRoot.cs");
            string content = serializer.ToString();
            SaveAsFile(fullpath, content);
        }
예제 #10
0
 private static void GenerateConvertFrom(ClassDescription csd, Lua4NetSerializer serializer)
 {
     serializer.NewLine();
     serializer.NewLine(string.Format("function {0}.ConvertFrom(t)", csd.GetNamespaceName(csd.ProxyName)));
     serializer.BeginBlock(string.Empty);
         serializer.NewLine(string.Format("return {0}.Get(t.Id)", csd.GetNamespaceName(csd.ProxyName)));
     serializer.EndBlock("end");
 }
예제 #11
0
 private static void GenerateSetPropertys(ClassDescription csd, Lua4NetSerializer serializer)
 {
     serializer.NewLine();
     serializer.NewLine(csd.GetNamespaceName(csd.ProxyName) + ".__SetProperty = ");
     serializer.BeginBlock("{");
     int nNextProp = 0;
     while (nNextProp < csd.Propertys.Count)
     {
         PropertyFieldDescription pfd = csd.Propertys[nNextProp];
         if (pfd.SetMethod != null)
         {
             serializer.NewLine(string.Format("{0} = {1}.{2}", pfd.Name, csd.GetNamespaceName(csd.ProxyName), pfd.SetMethod.Name));
         }
         ++nNextProp;
         if (nNextProp <= (csd.Propertys.Count - 1) && pfd.SetMethod != null)
         {
             serializer.Apppend(",");
         }
     }
     serializer.EndBlock("}");
 }
예제 #12
0
        private static void GenerateNewIndex(ClassDescription csd, Lua4NetSerializer serializer)
        {
            serializer.NewLine();
            serializer.NewLine(string.Format("function {0}.__SetByIndex(t,k,v)", csd.GetNamespaceName(csd.ProxyName)));
            serializer.BeginBlock("");
            serializer.NewLine(string.Format("local pf = {0}.__SetProperty[k]", csd.GetNamespaceName(csd.ProxyName)));
            serializer.NewLine("if pf ~= nil then");
            serializer.BeginBlock("");
            serializer.Apppend("        pf(t,v)");
            serializer.NewLine("return");
            serializer.EndBlock("end");

            if (csd.HasBaseClassDescription)
            {
                serializer.NewLine(string.Format("{0}.__SetByIndex(t,k,v)", csd.GetBaseClassProxyName()));
                serializer.NewLine("return");
            }
            else
            {
                serializer.NewLine("print(k .. ' is not a property')");
            }
            serializer.EndBlock("end");
        }
예제 #13
0
        private static void GenerateMethod(ClassDescription csd, MethodDescription md, int methodId, Lua4NetSerializer serializer)
        {
            serializer.NewLine();
            serializer.NewLine(string.Format("function {0}{1}{2}(", csd.GetNamespaceName(csd.ProxyName), md.IsStatic ? "." : ":", md.NickName));
            int nNextArg = 0;
            while (nNextArg < md.InputArgs.Count)
            {
                serializer.Apppend(md.InputArgs[nNextArg].Name);
                nNextArg++;
                if (nNextArg <= (md.InputArgs.Count - 1))
                    serializer.Apppend(",");
            }
            serializer.Apppend(")");
            serializer.BeginBlock(string.Empty);

            if (md.Output != null)
            {
                if (md.Output.Type == MessageFieldType.ClientType)
                {
                    serializer.NewLine(string.Format("local id = {0}({1},{2}", csd.ServantCallName,
                           md.IsConstructor || md.IsStatic ? "0" : "self.Id",
                           methodId));
                }
                else
                {
                    serializer.NewLine(string.Format("return {0}({1},{2}", csd.ServantCallName,
                                               md.IsConstructor || md.IsStatic ? "0" : "self.Id",
                                               methodId));
                }
            }
            else
            {
                if (md.IsConstructor)
                {
                    serializer.NewLine(string.Format("local id = {0}({1},{2}", csd.ServantCallName,
                                       md.IsConstructor || md.IsStatic ? "0" : "self.Id",
                                       methodId));
                }
                else
                {
                    serializer.NewLine(string.Format("{0}({1},{2}", csd.ServantCallName,
                               md.IsConstructor || md.IsStatic ? "0" : "self.Id",
                               methodId));
                }
            }

            if (md.InputArgs.Count > 0)
                serializer.Apppend(",");
            nNextArg = 0;
            while (nNextArg < md.InputArgs.Count)
            {
                MethodFieldDescription mfd = md.InputArgs[nNextArg];
                if (mfd.Type == MessageFieldType.ClientType)
                {
                    serializer.Apppend(md.InputArgs[nNextArg].Name+".Id");
                }
                else
                {
                    serializer.Apppend(md.InputArgs[nNextArg].Name);
                }
                nNextArg++;
                if (nNextArg <= (md.InputArgs.Count - 1))
                    serializer.Apppend(",");
            }
            serializer.Apppend(")");

            if (md.Output != null)
            {
                if (md.Output.Type == MessageFieldType.ClientType)
                {
                    serializer.NewLine(string.Format("return {0}.Get(id)", md.GetOutputProxyName()));
                }
            }
            else if (md.IsConstructor)
            {
                serializer.NewLine(string.Format("return {0}.Get(id)", csd.GetNamespaceName(csd.ProxyName)));
            }
            serializer.EndBlock("end");
        }
예제 #14
0
        private static void GenerateIndex(ClassDescription csd, Lua4NetSerializer serializer)
        {
            serializer.NewLine();
            serializer.NewLine(string.Format("function {0}.__GetByIndex(t,k)", csd.GetNamespaceName(csd.ProxyName)));
            serializer.BeginBlock("");
                serializer.NewLine(string.Format("local pf = {0}.__GetProperty[k]", csd.GetNamespaceName(csd.ProxyName)));
                serializer.NewLine("if pf ~= nil then");
                serializer.BeginBlock("");
                    serializer.Apppend("    return pf(t)");
                serializer.EndBlock("end");

                serializer.NewLine(string.Format("local f = {0}.__Method[k]", csd.GetNamespaceName(csd.ProxyName)));
                serializer.NewLine("if f ~= nil then");
                serializer.BeginBlock("");
                serializer.Apppend("    return f");
                serializer.EndBlock("end");
                if (csd.HasBaseClassDescription)
                {
                    serializer.NewLine(string.Format("return {0}.__GetByIndex(t,k)", csd.GetBaseClassProxyName()));
                }
                else
                {
                    serializer.NewLine("return nil");
                }
            serializer.EndBlock("end");
        }
예제 #15
0
 private static void GenerateGet(ClassDescription csd, Lua4NetSerializer serializer)
 {
     serializer.NewLine();
     serializer.NewLine(string.Format("function {0}.Get(id)", csd.GetNamespaceName(csd.ProxyName)));
     serializer.BeginBlock(string.Empty);
         serializer.NewLine("local t = { Id = id }");
         serializer.NewLine(string.Format("setmetatable(t,{0}.MetaTable)", csd.GetNamespaceName(csd.ProxyName)));
         serializer.NewLine("return t");
         serializer.NewLine();
     serializer.EndBlock("end");
 }