LuaEnumWrap.tpl.txt 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #if USE_UNI_LUA
  2. using LuaAPI = UniLua.Lua;
  3. using RealStatePtr = UniLua.ILuaState;
  4. using LuaCSFunction = UniLua.CSharpFunctionDelegate;
  5. #else
  6. using LuaAPI = XLua.LuaDLL.Lua;
  7. using RealStatePtr = System.IntPtr;
  8. using LuaCSFunction = XLua.LuaDLL.lua_CSFunction;
  9. #endif
  10. using XLua;
  11. using System.Collections.Generic;
  12. <%
  13. require "TemplateCommon"
  14. local enum_or_op = debug.getmetatable(CS.System.Reflection.BindingFlags.Public).__bor
  15. %>
  16. namespace XLua.CSObjectWrap
  17. {
  18. using Utils = XLua.Utils;
  19. <%ForEachCsList(types, function(type)
  20. local fields = type2fields and type2fields[type] or type:GetFields(enum_or_op(CS.System.Reflection.BindingFlags.Public, CS.System.Reflection.BindingFlags.Static))
  21. local fields_to_gen = {}
  22. ForEachCsList(fields, function(field)
  23. if field.Name ~= "value__" and not IsObsolute(field) then
  24. table.insert(fields_to_gen, field)
  25. end
  26. end)
  27. %>
  28. public class <%=CSVariableName(type)%>Wrap
  29. {
  30. public static void __Register(RealStatePtr L)
  31. {
  32. ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
  33. Utils.BeginObjectRegister(typeof(<%=CsFullTypeName(type)%>), L, translator, 0, 0, 0, 0);
  34. Utils.EndObjectRegister(typeof(<%=CsFullTypeName(type)%>), L, translator, null, null, null, null, null);
  35. Utils.BeginClassRegister(typeof(<%=CsFullTypeName(type)%>), L, null, <%=fields.Length + 1%>, 0, 0);
  36. <%if #fields_to_gen <= 20 then%>
  37. <% ForEachCsList(fields, function(field)
  38. if field.Name == "value__" or IsObsolute(field) then return end
  39. %>
  40. Utils.RegisterObject(L, translator, Utils.CLS_IDX, "<%=field.Name%>", <%=CsFullTypeName(type)%>.<%=UnK(field.Name)%>);
  41. <%end)%>
  42. <%else%>
  43. Utils.RegisterEnumType(L, typeof(<%=CsFullTypeName(type)%>));
  44. <%end%>
  45. Utils.RegisterFunc(L, Utils.CLS_IDX, "__CastFrom", __CastFrom);
  46. Utils.EndClassRegister(typeof(<%=CsFullTypeName(type)%>), L, translator);
  47. }
  48. [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
  49. static int __CastFrom(RealStatePtr L)
  50. {
  51. ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L);
  52. LuaTypes lua_type = LuaAPI.lua_type(L, 1);
  53. if (lua_type == LuaTypes.LUA_TNUMBER)
  54. {
  55. translator.Push<%=CSVariableName(type)%>(L, (<%=CsFullTypeName(type)%>)LuaAPI.xlua_tointeger(L, 1));
  56. }
  57. <%if #fields_to_gen > 0 then%>
  58. else if(lua_type == LuaTypes.LUA_TSTRING)
  59. {
  60. <%if #fields_to_gen <= 20 then%>
  61. <%
  62. local is_first = true
  63. ForEachCsList(fields, function(field, i)
  64. if field.Name == "value__" or IsObsolute(field) then return end
  65. %><%=(is_first and "" or "else ")%>if (LuaAPI.xlua_is_eq_str(L, 1, "<%=field.Name%>"))
  66. {
  67. translator.Push<%=CSVariableName(type)%>(L, <%=CsFullTypeName(type)%>.<%=UnK(field.Name)%>);
  68. }
  69. <%
  70. is_first = false
  71. end)
  72. %>else
  73. {
  74. return LuaAPI.luaL_error(L, "invalid string for <%=CsFullTypeName(type)%>!");
  75. }
  76. <%else%>
  77. try
  78. {
  79. translator.TranslateToEnumToTop(L, typeof(<%=CsFullTypeName(type)%>), 1);
  80. }
  81. catch (System.Exception e)
  82. {
  83. return LuaAPI.luaL_error(L, "cast to " + typeof(<%=CsFullTypeName(type)%>) + " exception:" + e);
  84. }
  85. <%end%>
  86. }
  87. <%end%>
  88. else
  89. {
  90. return LuaAPI.luaL_error(L, "invalid lua type for <%=CsFullTypeName(type)%>! Expect number or string, got + " + lua_type);
  91. }
  92. return 1;
  93. }
  94. }
  95. <%end)%>
  96. }