public static void GenerateCSFunction(string definition,Lua4NetSerializer serializer,Action<Lua4NetSerializer> OnGetBody) { serializer.NewLine(definition); serializer.BeginBlock("{"); OnGetBody(serializer); serializer.EndBlock("}"); }
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("}"); }
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("}"); }
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("};"); }
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("}"); }
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("}"); }
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 }
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); }
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); }
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"); }
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("}"); }
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"); }
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"); }
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"); }
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"); }