源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

960 行
38 KiB

  1. -- --
  2. -- --------------------------------------------------------------------------------
  3. -- -- FILE: protobuf.lua
  4. -- -- DESCRIPTION: protoc-gen-lua
  5. -- -- Google's Protocol Buffers project, ported to lua.
  6. -- -- https://code.google.com/p/protoc-gen-lua/
  7. -- --
  8. -- -- Copyright (c) 2010 , 林卓毅 (Zhuoyi Lin) netsnail@gmail.com
  9. -- -- All rights reserved.
  10. -- --
  11. -- -- Use, modification and distribution are subject to the "New BSD License"
  12. -- -- as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
  13. -- --
  14. -- -- COMPANY: NetEase
  15. -- -- CREATED: 2010年07月29日 14时30分02秒 CST
  16. -- --------------------------------------------------------------------------------
  17. -- --
  18. -- local setmetatable = setmetatable
  19. -- local rawset = rawset
  20. -- local rawget = rawget
  21. -- local error = error
  22. -- local ipairs = ipairs
  23. -- local pairs = pairs
  24. -- local print = print
  25. -- local table = table
  26. -- local string = string
  27. -- local tostring = tostring
  28. -- local type = type
  29. -- local pb = require "pb"
  30. -- local wire_format = require "protobuf.wire_format"
  31. -- local type_checkers = require "protobuf.type_checkers"
  32. -- local encoder = require "protobuf.encoder"
  33. -- local decoder = require "protobuf.decoder"
  34. -- local listener_mod = require "protobuf.listener"
  35. -- local containers = require "protobuf.containers"
  36. -- local descriptor = require "protobuf.descriptor"
  37. -- local FieldDescriptor = descriptor.FieldDescriptor
  38. -- local text_format = require "protobuf.text_format"
  39. -- module("protobuf.protobuf")
  40. -- local function make_descriptor(name, descriptor, usable_key)
  41. -- local meta = {
  42. -- __newindex = function(self, key, value)
  43. -- if usable_key[key] then
  44. -- rawset(self, key, value)
  45. -- else
  46. -- LogError("error key: "..key)
  47. -- end
  48. -- end
  49. -- };
  50. -- meta.__index = meta
  51. -- meta.__call = function()
  52. -- return setmetatable({}, meta)
  53. -- end
  54. -- _M[name] = setmetatable(descriptor, meta);
  55. -- end
  56. -- make_descriptor("Descriptor", {}, {
  57. -- name = true,
  58. -- full_name = true,
  59. -- filename = true,
  60. -- containing_type = true,
  61. -- fields = true,
  62. -- nested_types = true,
  63. -- enum_types = true,
  64. -- extensions = true,
  65. -- options = true,
  66. -- is_extendable = true,
  67. -- extension_ranges = true,
  68. -- })
  69. -- make_descriptor("FieldDescriptor", FieldDescriptor, {
  70. -- name = true,
  71. -- full_name = true,
  72. -- index = true,
  73. -- number = true,
  74. -- type = true,
  75. -- cpp_type = true,
  76. -- label = true,
  77. -- has_default_value = true,
  78. -- default_value = true,
  79. -- containing_type = true,
  80. -- message_type = true,
  81. -- enum_type = true,
  82. -- is_extension = true,
  83. -- extension_scope = true,
  84. -- })
  85. -- make_descriptor("EnumDescriptor", {}, {
  86. -- name = true,
  87. -- full_name = true,
  88. -- values = true,
  89. -- containing_type = true,
  90. -- options = true
  91. -- })
  92. -- make_descriptor("EnumValueDescriptor", {}, {
  93. -- name = true,
  94. -- index = true,
  95. -- number = true,
  96. -- type = true,
  97. -- options = true
  98. -- })
  99. -- -- Maps from field type to expected wiretype.
  100. -- local FIELD_TYPE_TO_WIRE_TYPE = {
  101. -- [FieldDescriptor.TYPE_DOUBLE] = wire_format.WIRETYPE_FIXED64,
  102. -- [FieldDescriptor.TYPE_FLOAT] = wire_format.WIRETYPE_FIXED32,
  103. -- [FieldDescriptor.TYPE_INT64] = wire_format.WIRETYPE_VARINT,
  104. -- [FieldDescriptor.TYPE_UINT64] = wire_format.WIRETYPE_VARINT,
  105. -- [FieldDescriptor.TYPE_INT32] = wire_format.WIRETYPE_VARINT,
  106. -- [FieldDescriptor.TYPE_FIXED64] = wire_format.WIRETYPE_FIXED64,
  107. -- [FieldDescriptor.TYPE_FIXED32] = wire_format.WIRETYPE_FIXED32,
  108. -- [FieldDescriptor.TYPE_BOOL] = wire_format.WIRETYPE_VARINT,
  109. -- [FieldDescriptor.TYPE_STRING] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  110. -- [FieldDescriptor.TYPE_GROUP] = wire_format.WIRETYPE_START_GROUP,
  111. -- [FieldDescriptor.TYPE_MESSAGE] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  112. -- [FieldDescriptor.TYPE_BYTES] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  113. -- [FieldDescriptor.TYPE_UINT32] = wire_format.WIRETYPE_VARINT,
  114. -- [FieldDescriptor.TYPE_ENUM] = wire_format.WIRETYPE_VARINT,
  115. -- [FieldDescriptor.TYPE_SFIXED32] = wire_format.WIRETYPE_FIXED32,
  116. -- [FieldDescriptor.TYPE_SFIXED64] = wire_format.WIRETYPE_FIXED64,
  117. -- [FieldDescriptor.TYPE_SINT32] = wire_format.WIRETYPE_VARINT,
  118. -- [FieldDescriptor.TYPE_SINT64] = wire_format.WIRETYPE_VARINT
  119. -- }
  120. -- local NON_PACKABLE_TYPES = {
  121. -- [FieldDescriptor.TYPE_STRING] = true,
  122. -- [FieldDescriptor.TYPE_GROUP] = true,
  123. -- [FieldDescriptor.TYPE_MESSAGE] = true,
  124. -- [FieldDescriptor.TYPE_BYTES] = true
  125. -- }
  126. -- local _VALUE_CHECKERS = {
  127. -- [FieldDescriptor.CPPTYPE_INT32] = type_checkers.Int32ValueChecker(),
  128. -- [FieldDescriptor.CPPTYPE_INT64] = type_checkers.TypeChecker({string = true, number = true}),
  129. -- [FieldDescriptor.CPPTYPE_UINT32] = type_checkers.Uint32ValueChecker(),
  130. -- [FieldDescriptor.CPPTYPE_UINT64] = type_checkers.TypeChecker({string = true, number = true}),
  131. -- [FieldDescriptor.CPPTYPE_DOUBLE] = type_checkers.TypeChecker({number = true}),
  132. -- [FieldDescriptor.CPPTYPE_FLOAT] = type_checkers.TypeChecker({number = true}),
  133. -- [FieldDescriptor.CPPTYPE_BOOL] = type_checkers.TypeChecker({boolean = true, bool = true, int=true}),
  134. -- [FieldDescriptor.CPPTYPE_ENUM] = type_checkers.Int32ValueChecker(),
  135. -- [FieldDescriptor.CPPTYPE_STRING] = type_checkers.TypeChecker({string = true})
  136. -- }
  137. -- local TYPE_TO_BYTE_SIZE_FN = {
  138. -- [FieldDescriptor.TYPE_DOUBLE] = wire_format.DoubleByteSize,
  139. -- [FieldDescriptor.TYPE_FLOAT] = wire_format.FloatByteSize,
  140. -- [FieldDescriptor.TYPE_INT64] = wire_format.Int64ByteSize,
  141. -- [FieldDescriptor.TYPE_UINT64] = wire_format.UInt64ByteSize,
  142. -- [FieldDescriptor.TYPE_INT32] = wire_format.Int32ByteSize,
  143. -- [FieldDescriptor.TYPE_FIXED64] = wire_format.Fixed64ByteSize,
  144. -- [FieldDescriptor.TYPE_FIXED32] = wire_format.Fixed32ByteSize,
  145. -- [FieldDescriptor.TYPE_BOOL] = wire_format.BoolByteSize,
  146. -- [FieldDescriptor.TYPE_STRING] = wire_format.StringByteSize,
  147. -- [FieldDescriptor.TYPE_GROUP] = wire_format.GroupByteSize,
  148. -- [FieldDescriptor.TYPE_MESSAGE] = wire_format.MessageByteSize,
  149. -- [FieldDescriptor.TYPE_BYTES] = wire_format.BytesByteSize,
  150. -- [FieldDescriptor.TYPE_UINT32] = wire_format.UInt32ByteSize,
  151. -- [FieldDescriptor.TYPE_ENUM] = wire_format.EnumByteSize,
  152. -- [FieldDescriptor.TYPE_SFIXED32] = wire_format.SFixed32ByteSize,
  153. -- [FieldDescriptor.TYPE_SFIXED64] = wire_format.SFixed64ByteSize,
  154. -- [FieldDescriptor.TYPE_SINT32] = wire_format.SInt32ByteSize,
  155. -- [FieldDescriptor.TYPE_SINT64] = wire_format.SInt64ByteSize
  156. -- }
  157. -- local TYPE_TO_ENCODER = {
  158. -- [FieldDescriptor.TYPE_DOUBLE] = encoder.DoubleEncoder,
  159. -- [FieldDescriptor.TYPE_FLOAT] = encoder.FloatEncoder,
  160. -- [FieldDescriptor.TYPE_INT64] = encoder.Int64Encoder,
  161. -- [FieldDescriptor.TYPE_UINT64] = encoder.UInt64Encoder,
  162. -- [FieldDescriptor.TYPE_INT32] = encoder.Int32Encoder,
  163. -- [FieldDescriptor.TYPE_FIXED64] = encoder.Fixed64Encoder,
  164. -- [FieldDescriptor.TYPE_FIXED32] = encoder.Fixed32Encoder,
  165. -- [FieldDescriptor.TYPE_BOOL] = encoder.BoolEncoder,
  166. -- [FieldDescriptor.TYPE_STRING] = encoder.StringEncoder,
  167. -- [FieldDescriptor.TYPE_GROUP] = encoder.GroupEncoder,
  168. -- [FieldDescriptor.TYPE_MESSAGE] = encoder.MessageEncoder,
  169. -- [FieldDescriptor.TYPE_BYTES] = encoder.BytesEncoder,
  170. -- [FieldDescriptor.TYPE_UINT32] = encoder.UInt32Encoder,
  171. -- [FieldDescriptor.TYPE_ENUM] = encoder.EnumEncoder,
  172. -- [FieldDescriptor.TYPE_SFIXED32] = encoder.SFixed32Encoder,
  173. -- [FieldDescriptor.TYPE_SFIXED64] = encoder.SFixed64Encoder,
  174. -- [FieldDescriptor.TYPE_SINT32] = encoder.SInt32Encoder,
  175. -- [FieldDescriptor.TYPE_SINT64] = encoder.SInt64Encoder
  176. -- }
  177. -- local TYPE_TO_SIZER = {
  178. -- [FieldDescriptor.TYPE_DOUBLE] = encoder.DoubleSizer,
  179. -- [FieldDescriptor.TYPE_FLOAT] = encoder.FloatSizer,
  180. -- [FieldDescriptor.TYPE_INT64] = encoder.Int64Sizer,
  181. -- [FieldDescriptor.TYPE_UINT64] = encoder.UInt64Sizer,
  182. -- [FieldDescriptor.TYPE_INT32] = encoder.Int32Sizer,
  183. -- [FieldDescriptor.TYPE_FIXED64] = encoder.Fixed64Sizer,
  184. -- [FieldDescriptor.TYPE_FIXED32] = encoder.Fixed32Sizer,
  185. -- [FieldDescriptor.TYPE_BOOL] = encoder.BoolSizer,
  186. -- [FieldDescriptor.TYPE_STRING] = encoder.StringSizer,
  187. -- [FieldDescriptor.TYPE_GROUP] = encoder.GroupSizer,
  188. -- [FieldDescriptor.TYPE_MESSAGE] = encoder.MessageSizer,
  189. -- [FieldDescriptor.TYPE_BYTES] = encoder.BytesSizer,
  190. -- [FieldDescriptor.TYPE_UINT32] = encoder.UInt32Sizer,
  191. -- [FieldDescriptor.TYPE_ENUM] = encoder.EnumSizer,
  192. -- [FieldDescriptor.TYPE_SFIXED32] = encoder.SFixed32Sizer,
  193. -- [FieldDescriptor.TYPE_SFIXED64] = encoder.SFixed64Sizer,
  194. -- [FieldDescriptor.TYPE_SINT32] = encoder.SInt32Sizer,
  195. -- [FieldDescriptor.TYPE_SINT64] = encoder.SInt64Sizer
  196. -- }
  197. -- local TYPE_TO_DECODER = {
  198. -- [FieldDescriptor.TYPE_DOUBLE] = decoder.DoubleDecoder,
  199. -- [FieldDescriptor.TYPE_FLOAT] = decoder.FloatDecoder,
  200. -- [FieldDescriptor.TYPE_INT64] = decoder.Int64Decoder,
  201. -- [FieldDescriptor.TYPE_UINT64] = decoder.UInt64Decoder,
  202. -- [FieldDescriptor.TYPE_INT32] = decoder.Int32Decoder,
  203. -- [FieldDescriptor.TYPE_FIXED64] = decoder.Fixed64Decoder,
  204. -- [FieldDescriptor.TYPE_FIXED32] = decoder.Fixed32Decoder,
  205. -- [FieldDescriptor.TYPE_BOOL] = decoder.BoolDecoder,
  206. -- [FieldDescriptor.TYPE_STRING] = decoder.StringDecoder,
  207. -- [FieldDescriptor.TYPE_GROUP] = decoder.GroupDecoder,
  208. -- [FieldDescriptor.TYPE_MESSAGE] = decoder.MessageDecoder,
  209. -- [FieldDescriptor.TYPE_BYTES] = decoder.BytesDecoder,
  210. -- [FieldDescriptor.TYPE_UINT32] = decoder.UInt32Decoder,
  211. -- [FieldDescriptor.TYPE_ENUM] = decoder.EnumDecoder,
  212. -- [FieldDescriptor.TYPE_SFIXED32] = decoder.SFixed32Decoder,
  213. -- [FieldDescriptor.TYPE_SFIXED64] = decoder.SFixed64Decoder,
  214. -- [FieldDescriptor.TYPE_SINT32] = decoder.SInt32Decoder,
  215. -- [FieldDescriptor.TYPE_SINT64] = decoder.SInt64Decoder
  216. -- }
  217. -- local FIELD_TYPE_TO_WIRE_TYPE = {
  218. -- [FieldDescriptor.TYPE_DOUBLE] = wire_format.WIRETYPE_FIXED64,
  219. -- [FieldDescriptor.TYPE_FLOAT] = wire_format.WIRETYPE_FIXED32,
  220. -- [FieldDescriptor.TYPE_INT64] = wire_format.WIRETYPE_VARINT,
  221. -- [FieldDescriptor.TYPE_UINT64] = wire_format.WIRETYPE_VARINT,
  222. -- [FieldDescriptor.TYPE_INT32] = wire_format.WIRETYPE_VARINT,
  223. -- [FieldDescriptor.TYPE_FIXED64] = wire_format.WIRETYPE_FIXED64,
  224. -- [FieldDescriptor.TYPE_FIXED32] = wire_format.WIRETYPE_FIXED32,
  225. -- [FieldDescriptor.TYPE_BOOL] = wire_format.WIRETYPE_VARINT,
  226. -- [FieldDescriptor.TYPE_STRING] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  227. -- [FieldDescriptor.TYPE_GROUP] = wire_format.WIRETYPE_START_GROUP,
  228. -- [FieldDescriptor.TYPE_MESSAGE] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  229. -- [FieldDescriptor.TYPE_BYTES] = wire_format.WIRETYPE_LENGTH_DELIMITED,
  230. -- [FieldDescriptor.TYPE_UINT32] = wire_format.WIRETYPE_VARINT,
  231. -- [FieldDescriptor.TYPE_ENUM] = wire_format.WIRETYPE_VARINT,
  232. -- [FieldDescriptor.TYPE_SFIXED32] = wire_format.WIRETYPE_FIXED32,
  233. -- [FieldDescriptor.TYPE_SFIXED64] = wire_format.WIRETYPE_FIXED64,
  234. -- [FieldDescriptor.TYPE_SINT32] = wire_format.WIRETYPE_VARINT,
  235. -- [FieldDescriptor.TYPE_SINT64] = wire_format.WIRETYPE_VARINT
  236. -- }
  237. -- local function IsTypePackable(field_type)
  238. -- return NON_PACKABLE_TYPES[field_type] == nil
  239. -- end
  240. -- local function GetTypeChecker(cpp_type, field_type)
  241. -- if (cpp_type == FieldDescriptor.CPPTYPE_STRING and field_type == FieldDescriptor.TYPE_STRING) then
  242. -- return type_checkers.UnicodeValueChecker()
  243. -- end
  244. -- return _VALUE_CHECKERS[cpp_type]
  245. -- end
  246. -- local function _DefaultValueConstructorForField(field)
  247. -- if field.label == FieldDescriptor.LABEL_REPEATED then
  248. -- if type(field.default_value) ~= "table" or #(field.default_value) ~= 0 then
  249. -- LogError('Repeated field default value not empty list:' .. tostring(field.default_value))
  250. -- end
  251. -- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  252. -- local message_type = field.message_type
  253. -- return function (message)
  254. -- return containers.RepeatedCompositeFieldContainer(message._listener_for_children, message_type)
  255. -- end
  256. -- else
  257. -- local type_checker = GetTypeChecker(field.cpp_type, field.type)
  258. -- return function (message)
  259. -- return containers.RepeatedScalarFieldContainer(message._listener_for_children, type_checker)
  260. -- end
  261. -- end
  262. -- end
  263. -- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  264. -- local message_type = field.message_type
  265. -- return function (message)
  266. -- result = message_type._concrete_class()
  267. -- result._SetListener(message._listener_for_children)
  268. -- return result
  269. -- end
  270. -- end
  271. -- return function (message)
  272. -- return field.default_value
  273. -- end
  274. -- end
  275. -- local function _AttachFieldHelpers(message_meta, field_descriptor)
  276. -- local is_repeated = (field_descriptor.label == FieldDescriptor.LABEL_REPEATED)
  277. -- local is_packed = (field_descriptor.has_options and field_descriptor.GetOptions().packed)
  278. -- rawset(field_descriptor, "_encoder", TYPE_TO_ENCODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
  279. -- rawset(field_descriptor, "_sizer", TYPE_TO_SIZER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
  280. -- rawset(field_descriptor, "_default_constructor", _DefaultValueConstructorForField(field_descriptor))
  281. -- local AddDecoder = function(wiretype, is_packed)
  282. -- local tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype)
  283. -- message_meta._decoders_by_tag[tag_bytes] = TYPE_TO_DECODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed, field_descriptor, field_descriptor._default_constructor)
  284. -- end
  285. -- AddDecoder(FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], False)
  286. -- if is_repeated and IsTypePackable(field_descriptor.type) then
  287. -- AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True)
  288. -- end
  289. -- end
  290. -- local function _AddEnumValues(descriptor, message_meta)
  291. -- for _, enum_type in ipairs(descriptor.enum_types) do
  292. -- for _, enum_value in ipairs(enum_type.values) do
  293. -- message_meta._member[enum_value.name] = enum_value.number
  294. -- end
  295. -- end
  296. -- end
  297. -- local function _InitMethod(message_meta)
  298. -- return function()
  299. -- local self = {}
  300. -- self._cached_byte_size = 0
  301. -- self._cached_byte_size_dirty = false
  302. -- self._fields = {}
  303. -- self._is_present_in_parent = false
  304. -- self._listener = listener_mod.NullMessageListener()
  305. -- self._listener_for_children = listener_mod.Listener(self)
  306. -- return setmetatable(self, message_meta)
  307. -- end
  308. -- end
  309. -- local function _AddPropertiesForRepeatedField(field, message_meta)
  310. -- local property_name = field.name
  311. -- message_meta._getter[property_name] = function(self)
  312. -- local field_value = self._fields[field]
  313. -- if field_value == nil then
  314. -- field_value = field._default_constructor(self)
  315. -- self._fields[field] = field_value
  316. -- if not self._cached_byte_size_dirty then
  317. -- message_meta._member._Modified(self)
  318. -- end
  319. -- end
  320. -- return field_value
  321. -- end
  322. -- message_meta._setter[property_name] = function(self)
  323. -- LogError('Assignment not allowed to repeated field "' .. property_name .. '" in protocol message object.')
  324. -- end
  325. -- end
  326. -- local function _AddPropertiesForNonRepeatedCompositeField(field, message_meta)
  327. -- local property_name = field.name
  328. -- local message_type = field.message_type
  329. -- message_meta._getter[property_name] = function(self)
  330. -- local field_value = self._fields[field]
  331. -- if field_value == nil then
  332. -- field_value = message_type._concrete_class()
  333. -- field_value:_SetListener(self._listener_for_children)
  334. -- self._fields[field] = field_value
  335. -- if not self._cached_byte_size_dirty then
  336. -- message_meta._member._Modified(self)
  337. -- end
  338. -- end
  339. -- return field_value
  340. -- end
  341. -- message_meta._setter[property_name] = function(self, new_value)
  342. -- LogError('Assignment not allowed to composite field' .. property_name .. 'in protocol message object.' )
  343. -- end
  344. -- end
  345. -- local function _AddPropertiesForNonRepeatedScalarField(field, message)
  346. -- local property_name = field.name
  347. -- local type_checker = GetTypeChecker(field.cpp_type, field.type)
  348. -- local default_value = field.default_value
  349. -- message._getter[property_name] = function(self)
  350. -- local value = self._fields[field]
  351. -- if value ~= nil then
  352. -- return self._fields[field]
  353. -- else
  354. -- return default_value
  355. -- end
  356. -- end
  357. -- message._setter[property_name] = function(self, new_value)
  358. -- type_checker(new_value)
  359. -- self._fields[field] = new_value
  360. -- if not self._cached_byte_size_dirty then
  361. -- message._member._Modified(self)
  362. -- end
  363. -- end
  364. -- end
  365. -- local function _AddPropertiesForField(field, message_meta)
  366. -- constant_name = field.name:upper() .. "_FIELD_NUMBER"
  367. -- message_meta._member[constant_name] = field.number
  368. -- if field.label == FieldDescriptor.LABEL_REPEATED then
  369. -- _AddPropertiesForRepeatedField(field, message_meta)
  370. -- elseif field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  371. -- _AddPropertiesForNonRepeatedCompositeField(field, message_meta)
  372. -- else
  373. -- _AddPropertiesForNonRepeatedScalarField(field, message_meta)
  374. -- end
  375. -- end
  376. -- local _ED_meta = {
  377. -- __index = function(self, extension_handle)
  378. -- local _extended_message = rawget(self, "_extended_message")
  379. -- local value = _extended_message._fields[extension_handle]
  380. -- if value ~= nil then
  381. -- return value
  382. -- end
  383. -- if extension_handle.label == FieldDescriptor.LABEL_REPEATED then
  384. -- value = extension_handle._default_constructor(self._extended_message)
  385. -- elseif extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  386. -- value = extension_handle.message_type._concrete_class()
  387. -- value:_SetListener(_extended_message._listener_for_children)
  388. -- else
  389. -- return extension_handle.default_value
  390. -- end
  391. -- _extended_message._fields[extension_handle] = value
  392. -- return value
  393. -- end,
  394. -- __newindex = function(self, extension_handle, value)
  395. -- local _extended_message = rawget(self, "_extended_message")
  396. -- if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or
  397. -- extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE) then
  398. -- error('Cannot assign to extension "'.. extension_handle.full_name .. '" because it is a repeated or composite type.')
  399. -- end
  400. -- local type_checker = GetTypeChecker(extension_handle.cpp_type, extension_handle.type)
  401. -- type_checker.CheckValue(value)
  402. -- _extended_message._fields[extension_handle] = value
  403. -- _extended_message._Modified()
  404. -- end
  405. -- }
  406. -- local function _ExtensionDict(message)
  407. -- local o = {}
  408. -- o._extended_message = message
  409. -- return setmetatable(o, _ED_meta)
  410. -- end
  411. -- local function _AddPropertiesForFields(descriptor, message_meta)
  412. -- for _, field in ipairs(descriptor.fields) do
  413. -- _AddPropertiesForField(field, message_meta)
  414. -- end
  415. -- if descriptor.is_extendable then
  416. -- message_meta._getter.Extensions = function(self) return _ExtensionDict(self) end
  417. -- end
  418. -- end
  419. -- local function _AddPropertiesForExtensions(descriptor, message_meta)
  420. -- local extension_dict = descriptor._extensions_by_name
  421. -- for extension_name, extension_field in pairs(extension_dict) do
  422. -- local constant_name = string.upper(extension_name) .. "_FIELD_NUMBER"
  423. -- message_meta._member[constant_name] = extension_field.number
  424. -- end
  425. -- end
  426. -- local function _AddStaticMethods(message_meta)
  427. -- message_meta._member.RegisterExtension = function(extension_handle)
  428. -- extension_handle.containing_type = message_meta._descriptor
  429. -- _AttachFieldHelpers(message_meta, extension_handle)
  430. -- if message_meta._extensions_by_number[extension_handle.number] == nil then
  431. -- message_meta._extensions_by_number[extension_handle.number] = extension_handle
  432. -- else
  433. -- LogError(
  434. -- string.format('Extensions "%s" and "%s" both try to extend message type "%s" with field number %d.',
  435. -- extension_handle.full_name, actual_handle.full_name,
  436. -- message_meta._descriptor.full_name, extension_handle.number))
  437. -- end
  438. -- message_meta._extensions_by_name[extension_handle.full_name] = extension_handle
  439. -- end
  440. -- message_meta._member.FromString = function(s)
  441. -- local message = message_meta._member.__call()
  442. -- message.MergeFromString(s)
  443. -- return message
  444. -- end
  445. -- end
  446. -- local function _IsPresent(descriptor, value)
  447. -- if descriptor.label == FieldDescriptor.LABEL_REPEATED then
  448. -- return value
  449. -- elseif descriptor.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  450. -- return value._is_present_in_parent
  451. -- else
  452. -- return true
  453. -- end
  454. -- end
  455. -- function sortFunc(a, b)
  456. -- return a.index < b.index
  457. -- end
  458. -- function pairsByKeys (t, f)
  459. -- local a = {}
  460. -- for n in pairs(t) do table.insert(a, n) end
  461. -- table.sort(a, f)
  462. -- local i = 0 -- iterator variable
  463. -- local iter = function () -- iterator function
  464. -- i = i + 1
  465. -- if a[i] == nil then return nil
  466. -- else return a[i], t[a[i]]
  467. -- end
  468. -- end
  469. -- return iter
  470. -- end
  471. -- local function _AddListFieldsMethod(message_descriptor, message_meta)
  472. -- message_meta._member.ListFields = function (self)
  473. -- local list_field = function(fields)
  474. -- --local f, s, v = pairs(self._fields)
  475. -- local f,s,v = pairsByKeys(self._fields, sortFunc)
  476. -- local iter = function(a, i)
  477. -- while true do
  478. -- local descriptor, value = f(a, i)
  479. -- if descriptor == nil then
  480. -- return
  481. -- elseif _IsPresent(descriptor, value) then
  482. -- return descriptor, value
  483. -- end
  484. -- end
  485. -- end
  486. -- return iter, s, v
  487. -- end
  488. -- return list_field(self._fields)
  489. -- end
  490. -- end
  491. -- local function _AddHasFieldMethod(message_descriptor, message_meta)
  492. -- local singular_fields = {}
  493. -- for _, field in ipairs(message_descriptor.fields) do
  494. -- if field.label ~= FieldDescriptor.LABEL_REPEATED then
  495. -- singular_fields[field.name] = field
  496. -- end
  497. -- end
  498. -- message_meta._member.HasField = function (self, field_name)
  499. -- field = singular_fields[field_name]
  500. -- if field == nil then
  501. -- LogError('Protocol message has no singular "'.. field_name.. '" field.')
  502. -- end
  503. -- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  504. -- value = self._fields[field]
  505. -- return value ~= nil and value._is_present_in_parent
  506. -- else
  507. -- local valueTmp = self._fields[field]
  508. -- return valueTmp ~= nil
  509. -- end
  510. -- end
  511. -- end
  512. -- local function _AddClearFieldMethod(message_descriptor, message_meta)
  513. -- local singular_fields = {}
  514. -- for _, field in ipairs(message_descriptor.fields) do
  515. -- if field.label ~= FieldDescriptor.LABEL_REPEATED then
  516. -- singular_fields[field.name] = field
  517. -- end
  518. -- end
  519. -- message_meta._member.ClearField = function(self, field_name)
  520. -- field = singular_fields[field_name]
  521. -- if field == nil then
  522. -- LogError('Protocol message has no singular "'.. field_name.. '" field.')
  523. -- end
  524. -- if self._fields[field] then
  525. -- self._fields[field] = nil
  526. -- end
  527. -- message_meta._member._Modified(self)
  528. -- end
  529. -- end
  530. -- local function _AddClearExtensionMethod(message_meta)
  531. -- message_meta._member.ClearExtension = function(self, extension_handle)
  532. -- if self._fields[extension_handle] == nil then
  533. -- self._fields[extension_handle] = nil
  534. -- end
  535. -- message_meta._member._Modified(self)
  536. -- end
  537. -- end
  538. -- local function _AddClearMethod(message_descriptor, message_meta)
  539. -- message_meta._member.Clear = function(self)
  540. -- self._fields = {}
  541. -- message_meta._member._Modified(self)
  542. -- end
  543. -- end
  544. -- local function _AddStrMethod(message_meta)
  545. -- local format = text_format.msg_format
  546. -- message_meta.__tostring = function(self)
  547. -- return format(self)
  548. -- end
  549. -- end
  550. -- local function _AddHasExtensionMethod(message_meta)
  551. -- message_meta._member.HasExtension = function(self, extension_handle)
  552. -- if extension_handle.label == FieldDescriptor.LABEL_REPEATED then
  553. -- LogError(extension_handle.full_name .. ' is repeated.')
  554. -- end
  555. -- if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  556. -- value = self._fields[extension_handle]
  557. -- return value ~= nil and value._is_present_in_parent
  558. -- else
  559. -- return self._fields[extension_handle]
  560. -- end
  561. -- end
  562. -- end
  563. -- local function _AddSetListenerMethod(message_meta)
  564. -- message_meta._member._SetListener = function(self, listener)
  565. -- if listener ~= nil then
  566. -- self._listener = listener_mod.NullMessageListener()
  567. -- else
  568. -- self._listener = listener
  569. -- end
  570. -- end
  571. -- end
  572. -- local function _AddByteSizeMethod(message_descriptor, message_meta)
  573. -- message_meta._member.ByteSize = function(self)
  574. -- --kaiser
  575. -- --bug:这里在Repeat字段的结构体如果第一个字段不是int变量会产生_cached_byte_size_dirty为false而导致byte size为0
  576. -- --如果bytesize为0让它强制计算byte size
  577. -- if not self._cached_byte_size_dirty and self._cached_byte_size > 0 then
  578. -- return self._cached_byte_size
  579. -- end
  580. -- local size = 0
  581. -- for field_descriptor, field_value in message_meta._member.ListFields(self) do
  582. -- size = field_descriptor._sizer(field_value) + size
  583. -- end
  584. -- self._cached_byte_size = size
  585. -- self._cached_byte_size_dirty = false
  586. -- self._listener_for_children.dirty = false
  587. -- return size
  588. -- end
  589. -- end
  590. -- local function _AddSerializeToStringMethod(message_descriptor, message_meta)
  591. -- message_meta._member.SerializeToString = function(self)
  592. -- if not message_meta._member.IsInitialized(self) then
  593. -- LogError('Message is missing required fields: ' ..
  594. -- table.concat(message_meta._member.FindInitializationErrors(self), ','))
  595. -- end
  596. -- return message_meta._member.SerializePartialToString(self)
  597. -- end
  598. -- message_meta._member.SerializeToIOString = function(self, iostring)
  599. -- if not message_meta._member.IsInitialized(self) then
  600. -- LogError('Message is missing required fields: ' ..
  601. -- table.concat(message_meta._member.FindInitializationErrors(self), ','))
  602. -- end
  603. -- return message_meta._member.SerializePartialToIOString(self, iostring)
  604. -- end
  605. -- end
  606. -- local function _AddSerializePartialToStringMethod(message_descriptor, message_meta)
  607. -- local concat = table.concat
  608. -- local _internal_serialize = function(self, write_bytes)
  609. -- for field_descriptor, field_value in message_meta._member.ListFields(self) do
  610. -- field_descriptor._encoder(write_bytes, field_value)
  611. -- end
  612. -- end
  613. -- local _serialize_partial_to_iostring = function(self, iostring)
  614. -- local w = iostring.write
  615. -- local write = function(value)
  616. -- w(iostring, value)
  617. -- end
  618. -- _internal_serialize(self, write)
  619. -- return
  620. -- end
  621. -- local _serialize_partial_to_string = function(self)
  622. -- local out = {}
  623. -- local write = function(value)
  624. -- out[#out + 1] = value
  625. -- end
  626. -- _internal_serialize(self, write)
  627. -- return concat(out)
  628. -- end
  629. -- message_meta._member._InternalSerialize = _internal_serialize
  630. -- message_meta._member.SerializePartialToIOString = _serialize_partial_to_iostring
  631. -- message_meta._member.SerializePartialToString = _serialize_partial_to_string
  632. -- end
  633. -- local function _AddMergeFromStringMethod(message_descriptor, message_meta)
  634. -- local ReadTag = decoder.ReadTag
  635. -- local SkipField = decoder.SkipField
  636. -- local decoders_by_tag = message_meta._decoders_by_tag
  637. -- local _internal_parse = function(self, buffer, pos, pend)
  638. -- message_meta._member._Modified(self)
  639. -- local field_dict = self._fields
  640. -- local tag_bytes, new_pos
  641. -- local field_decoder
  642. -- while pos ~= pend do
  643. -- tag_bytes, new_pos = ReadTag(buffer, pos)
  644. -- field_decoder = decoders_by_tag[tag_bytes]
  645. -- if field_decoder == nil then
  646. -- new_pos = SkipField(buffer, new_pos, pend, tag_bytes)
  647. -- if new_pos == -1 then
  648. -- return pos
  649. -- end
  650. -- pos = new_pos
  651. -- else
  652. -- pos = field_decoder(buffer, new_pos, pend, self, field_dict)
  653. -- end
  654. -- end
  655. -- return pos
  656. -- end
  657. -- message_meta._member._InternalParse = _internal_parse
  658. -- local merge_from_string = function(self, serialized)
  659. -- local length = #serialized
  660. -- if _internal_parse(self, serialized, 0, length) ~= length then
  661. -- LogError('Unexpected end-group tag.')
  662. -- end
  663. -- return length
  664. -- end
  665. -- message_meta._member.MergeFromString = merge_from_string
  666. -- message_meta._member.ParseFromString = function(self, serialized)
  667. -- message_meta._member.Clear(self)
  668. -- merge_from_string(self, serialized)
  669. -- end
  670. -- end
  671. -- local function _AddIsInitializedMethod(message_descriptor, message_meta)
  672. -- local required_fields = {}
  673. -- for _, field in ipairs(message_descriptor.fields) do
  674. -- if field.label == FieldDescriptor.LABEL_REQUIRED then
  675. -- required_fields[#required_fields + 1] = field
  676. -- end
  677. -- end
  678. -- message_meta._member.IsInitialized = function(self, errors)
  679. -- for _, field in ipairs(required_fields) do
  680. -- if self._fields[field] == nil or
  681. -- (field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE and not self._fields[field]._is_present_in_parent) then
  682. -- if errors ~= nil then
  683. -- errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  684. -- end
  685. -- return false
  686. -- end
  687. -- end
  688. -- for field, value in pairs(self._fields) do
  689. -- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  690. -- if field.label == FieldDescriptor.LABEL_REPEATED then
  691. -- for _, element in ipairs(value) do
  692. -- if not element:IsInitialized() then
  693. -- if errors ~= nil then
  694. -- errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  695. -- end
  696. -- return false
  697. -- end
  698. -- end
  699. -- elseif value._is_present_in_parent and not value:IsInitialized() then
  700. -- if errors ~= nil then
  701. -- errors[#errors + 1] = message_meta._member.FindInitializationErrors(self)
  702. -- end
  703. -- return false
  704. -- end
  705. -- end
  706. -- end
  707. -- return true
  708. -- end
  709. -- message_meta._member.FindInitializationErrors = function(self)
  710. -- local errors = {}
  711. -- for _,field in ipairs(required_fields) do
  712. -- if not message_meta._member.HasField(self, field.name) then
  713. -- errors.append(field.name)
  714. -- end
  715. -- end
  716. -- for field, value in message_meta._member.ListFields(self) do
  717. -- if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
  718. -- if field.is_extension then
  719. -- name = io:format("(%s)", field.full_name)
  720. -- else
  721. -- name = field.name
  722. -- end
  723. -- if field.label == FieldDescriptor.LABEL_REPEATED then
  724. -- for i, element in ipairs(value) do
  725. -- prefix = io:format("%s[%d].", name, i)
  726. -- sub_errors = element:FindInitializationErrors()
  727. -- for _, e in ipairs(sub_errors) do
  728. -- errors[#errors + 1] = prefix .. e
  729. -- end
  730. -- end
  731. -- else
  732. -- prefix = name .. "."
  733. -- sub_errors = value:FindInitializationErrors()
  734. -- for _, e in ipairs(sub_errors) do
  735. -- errors[#errors + 1] = prefix .. e
  736. -- end
  737. -- end
  738. -- end
  739. -- end
  740. -- return errors
  741. -- end
  742. -- end
  743. -- local function _AddMergeFromMethod(message_meta)
  744. -- local LABEL_REPEATED = FieldDescriptor.LABEL_REPEATED
  745. -- local CPPTYPE_MESSAGE = FieldDescriptor.CPPTYPE_MESSAGE
  746. -- message_meta._member.MergeFrom = function (self, msg)
  747. -- assert(msg ~= self)
  748. -- message_meta._member._Modified(self)
  749. -- local fields = self._fields
  750. -- for field, value in pairs(msg._fields) do
  751. -- if field.label == LABEL_REPEATED or field.cpp_type == CPPTYPE_MESSAGE then
  752. -- field_value = fields[field]
  753. -- if field_value == nil then
  754. -- field_value = field._default_constructor(self)
  755. -- fields[field] = field_value
  756. -- end
  757. -- field_value:MergeFrom(value)
  758. -- else
  759. -- self._fields[field] = value
  760. -- end
  761. -- end
  762. -- end
  763. -- end
  764. -- local function _AddMessageMethods(message_descriptor, message_meta)
  765. -- _AddListFieldsMethod(message_descriptor, message_meta)
  766. -- _AddHasFieldMethod(message_descriptor, message_meta)
  767. -- _AddClearFieldMethod(message_descriptor, message_meta)
  768. -- if message_descriptor.is_extendable then
  769. -- _AddClearExtensionMethod(message_meta)
  770. -- _AddHasExtensionMethod(message_meta)
  771. -- end
  772. -- _AddClearMethod(message_descriptor, message_meta)
  773. -- -- _AddEqualsMethod(message_descriptor, message_meta)
  774. -- _AddStrMethod(message_meta)
  775. -- _AddSetListenerMethod(message_meta)
  776. -- _AddByteSizeMethod(message_descriptor, message_meta)
  777. -- _AddSerializeToStringMethod(message_descriptor, message_meta)
  778. -- _AddSerializePartialToStringMethod(message_descriptor, message_meta)
  779. -- _AddMergeFromStringMethod(message_descriptor, message_meta)
  780. -- _AddIsInitializedMethod(message_descriptor, message_meta)
  781. -- _AddMergeFromMethod(message_meta)
  782. -- end
  783. -- local function _AddPrivateHelperMethods(message_meta)
  784. -- local Modified = function (self)
  785. -- if not self._cached_byte_size_dirty then
  786. -- self._cached_byte_size_dirty = true
  787. -- self._listener_for_children.dirty = true
  788. -- self._is_present_in_parent = true
  789. -- self._listener:Modified()
  790. -- end
  791. -- end
  792. -- message_meta._member._Modified = Modified
  793. -- message_meta._member.SetInParent = Modified
  794. -- end
  795. -- local function property_getter(message_meta)
  796. -- local getter = message_meta._getter
  797. -- local member = message_meta._member
  798. -- return function (self, property)
  799. -- local g = getter[property]
  800. -- if g then
  801. -- return g(self)
  802. -- else
  803. -- return member[property]
  804. -- end
  805. -- end
  806. -- end
  807. -- local function property_setter(message_meta)
  808. -- local setter = message_meta._setter
  809. -- return function (self, property, value)
  810. -- local s = setter[property]
  811. -- if s then
  812. -- s(self, value)
  813. -- else
  814. -- LogError(property .. " not found")
  815. -- end
  816. -- end
  817. -- end
  818. -- function _AddClassAttributesForNestedExtensions(descriptor, message_meta)
  819. -- local extension_dict = descriptor._extensions_by_name
  820. -- for extension_name, extension_field in pairs(extension_dict) do
  821. -- message_meta._member[extension_name] = extension_field
  822. -- end
  823. -- end
  824. -- local function Message(descriptor)
  825. -- local message_meta = {}
  826. -- message_meta._decoders_by_tag = {}
  827. -- rawset(descriptor, "_extensions_by_name", {})
  828. -- for _, k in ipairs(descriptor.extensions) do
  829. -- descriptor._extensions_by_name[k.name] = k
  830. -- end
  831. -- rawset(descriptor, "_extensions_by_number", {})
  832. -- for _, k in ipairs(descriptor.extensions) do
  833. -- descriptor._extensions_by_number[k.number] = k
  834. -- end
  835. -- message_meta._descriptor = descriptor
  836. -- message_meta._extensions_by_name = {}
  837. -- message_meta._extensions_by_number = {}
  838. -- message_meta._getter = {}
  839. -- message_meta._setter = {}
  840. -- message_meta._member = {}
  841. -- -- message_meta._name = descriptor.full_name
  842. -- local ns = setmetatable({}, message_meta._member)
  843. -- message_meta._member.__call = _InitMethod(message_meta)
  844. -- message_meta._member.__index = message_meta._member
  845. -- message_meta._member.type = ns
  846. -- if rawget(descriptor, "_concrete_class") == nil then
  847. -- rawset(descriptor, "_concrete_class", ns)
  848. -- for k, field in ipairs(descriptor.fields) do
  849. -- _AttachFieldHelpers(message_meta, field)
  850. -- end
  851. -- end
  852. -- _AddEnumValues(descriptor, message_meta)
  853. -- _AddClassAttributesForNestedExtensions(descriptor, message_meta)
  854. -- _AddPropertiesForFields(descriptor, message_meta)
  855. -- _AddPropertiesForExtensions(descriptor, message_meta)
  856. -- _AddStaticMethods(message_meta)
  857. -- _AddMessageMethods(descriptor, message_meta)
  858. -- _AddPrivateHelperMethods(message_meta)
  859. -- message_meta.__index = property_getter(message_meta)
  860. -- message_meta.__newindex = property_setter(message_meta)
  861. -- return ns
  862. -- end
  863. -- _M.Message = Message