dub 0.2.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dub might be problematic. Click here for more details.

Files changed (277) hide show
  1. data/History.txt +92 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +115 -0
  4. data/Rakefile +59 -0
  5. data/dub.gemspec +197 -0
  6. data/lib/dub/argument.rb +286 -0
  7. data/lib/dub/entities_unescape.rb +9 -0
  8. data/lib/dub/function.rb +177 -0
  9. data/lib/dub/function_group.rb +72 -0
  10. data/lib/dub/generator.rb +15 -0
  11. data/lib/dub/group.rb +20 -0
  12. data/lib/dub/klass.rb +338 -0
  13. data/lib/dub/lua/class.cpp.erb +114 -0
  14. data/lib/dub/lua/class_gen.rb +96 -0
  15. data/lib/dub/lua/function.cpp.erb +15 -0
  16. data/lib/dub/lua/function_gen.rb +329 -0
  17. data/lib/dub/lua/group.cpp.erb +9 -0
  18. data/lib/dub/lua/lua_cpp_helper.cpp +259 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +219 -0
  20. data/lib/dub/lua/lua_object.cpp +158 -0
  21. data/lib/dub/lua/lua_object.h +69 -0
  22. data/lib/dub/lua/namespace.cpp.erb +42 -0
  23. data/lib/dub/lua/namespace_gen.rb +69 -0
  24. data/lib/dub/lua.rb +24 -0
  25. data/lib/dub/member_extraction.rb +128 -0
  26. data/lib/dub/namespace.rb +295 -0
  27. data/lib/dub/opts_parser.rb +30 -0
  28. data/lib/dub/parser.rb +46 -0
  29. data/lib/dub/templates/lua_template.erb +21 -0
  30. data/lib/dub/version.rb +3 -0
  31. data/lib/dub.rb +24 -20
  32. data/test/argument_test.rb +581 -0
  33. data/test/fixtures/app/CMakeLists.txt +54 -0
  34. data/test/fixtures/app/Doxyfile +1600 -0
  35. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  36. data/test/fixtures/app/include/matrix.h +283 -0
  37. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  38. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  39. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  40. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  41. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  42. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  43. data/test/fixtures/app/vendor/lua/README +37 -0
  44. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  45. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  46. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  47. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  48. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  49. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  50. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  51. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  52. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  53. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  54. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  55. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  56. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  57. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  58. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  59. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  60. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  61. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  62. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  63. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  64. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  65. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  66. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  67. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  68. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  69. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  70. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  71. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  72. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  73. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  74. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  75. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  76. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  77. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  78. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  79. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  80. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  81. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  82. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  83. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  84. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  85. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  86. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  87. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  88. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  89. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  90. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  91. data/test/fixtures/app/vendor/lua/luac +0 -0
  92. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  93. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  94. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  95. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  96. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  97. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  98. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  99. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  100. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  101. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  102. data/test/fixtures/app/vendor/lua/print.c +227 -0
  103. data/test/fixtures/app/vendor/lua/test/README +26 -0
  104. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  105. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  106. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  107. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  108. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  109. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  110. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  111. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  112. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  113. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  114. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  115. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  116. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  118. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  119. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  120. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  121. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  122. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  123. data/test/fixtures/app/xml/classdub_1_1_base.xml +85 -0
  124. data/test/fixtures/app/xml/classdub_1_1_custom_destructor.xml +67 -0
  125. data/test/fixtures/app/xml/classdub_1_1_deletable_out_of_lua.xml +43 -0
  126. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +482 -0
  127. data/test/fixtures/app/xml/classdub_1_1_no_destructor.xml +49 -0
  128. data/test/fixtures/app/xml/classdub_1_1_priv_sub_base.xml +89 -0
  129. data/test/fixtures/app/xml/classdub_1_1_private_constr.xml +68 -0
  130. data/test/fixtures/app/xml/classdub_1_1_static_constr.xml +69 -0
  131. data/test/fixtures/app/xml/classdub_1_1_sub_base.xml +89 -0
  132. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
  133. data/test/fixtures/app/xml/combine.xslt +15 -0
  134. data/test/fixtures/app/xml/compound.xsd +814 -0
  135. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  136. data/test/fixtures/app/xml/index.xml +91 -0
  137. data/test/fixtures/app/xml/index.xsd +66 -0
  138. data/test/fixtures/app/xml/matrix_8h.xml +310 -0
  139. data/test/fixtures/app/xml/namespacedub.xml +48 -0
  140. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  141. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  142. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  143. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  144. data/test/fixtures/dummy_class.cpp.erb +1 -0
  145. data/test/fixtures/dummy_function.cpp.erb +1 -0
  146. data/test/fixtures/group___magic_type.xml +406 -0
  147. data/test/fixtures/namespacecv.xml +12659 -0
  148. data/test/function_group_test.rb +43 -0
  149. data/test/function_test.rb +405 -0
  150. data/test/group_test.rb +241 -0
  151. data/test/helper.rb +34 -0
  152. data/test/klass_test.rb +551 -0
  153. data/test/lua_function_gen_test.rb +242 -0
  154. data/test/namespace_test.rb +220 -0
  155. data/test/parser_test.rb +36 -0
  156. metadata +229 -272
  157. checksums.yaml +0 -7
  158. data/lib/open_api_sdk/analytics.rb +0 -99
  159. data/lib/open_api_sdk/domains.rb +0 -353
  160. data/lib/open_api_sdk/dub.rb +0 -88
  161. data/lib/open_api_sdk/links.rb +0 -766
  162. data/lib/open_api_sdk/metatags.rb +0 -54
  163. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  164. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  165. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  166. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  168. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  169. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  170. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  171. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  172. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  173. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  174. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  175. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  178. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  179. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  180. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  181. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  182. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  183. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  184. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  185. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  186. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  187. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  188. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  189. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  190. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  191. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  193. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  194. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  196. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  197. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  198. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  199. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  200. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  201. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  202. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  203. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  204. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  205. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  206. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  207. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  208. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  209. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  210. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  211. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  213. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  215. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  216. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  217. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  218. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  219. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  220. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  221. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  222. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  223. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  224. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  225. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  226. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  227. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  228. data/lib/open_api_sdk/models/operations.rb +0 -74
  229. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  230. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  231. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  232. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  236. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  237. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  238. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  239. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  240. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  241. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  242. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  243. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  245. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  246. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  247. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  248. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  249. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  250. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  251. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  252. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  253. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  254. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  255. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  256. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  257. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  258. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  259. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  260. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  261. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  262. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  263. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  264. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  265. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  266. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  267. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  268. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  269. data/lib/open_api_sdk/models/shared.rb +0 -49
  270. data/lib/open_api_sdk/qr_codes.rb +0 -97
  271. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  272. data/lib/open_api_sdk/tags.rb +0 -272
  273. data/lib/open_api_sdk/track.rb +0 -276
  274. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  275. data/lib/open_api_sdk/utils/t.rb +0 -59
  276. data/lib/open_api_sdk/utils/utils.rb +0 -772
  277. data/lib/open_api_sdk/workspaces.rb +0 -192
data/lib/dub/klass.rb ADDED
@@ -0,0 +1,338 @@
1
+ require 'yaml'
2
+ module Dub
3
+ module MemberExtraction
4
+ end
5
+ end
6
+ require 'dub/member_extraction'
7
+
8
+ module Dub
9
+ class Klass
10
+ include MemberExtraction
11
+ attr_reader :name, :xml, :prefix, :constructor, :alias_names, :enums, :ancestors, :parent, :instanciations
12
+ attr_accessor :opts
13
+
14
+ def initialize(parent, name, xml, prefix = '')
15
+ @parent, @name, @xml, @prefix = parent, name, xml, prefix
16
+
17
+ @alias_names = []
18
+ @enums = []
19
+ @ignores = []
20
+ @instanciations = {}
21
+ @opts = {}
22
+ parse_xml
23
+ end
24
+
25
+ def bind(generator)
26
+ self.gen = generator.class_generator
27
+ end
28
+
29
+ def gen=(generator)
30
+ @gen = generator
31
+ @gen_members = nil
32
+ end
33
+
34
+ def to_s
35
+ generator.klass(self)
36
+ end
37
+
38
+ def generator
39
+ @gen || (@parent && @parent.class_generator)
40
+ end
41
+
42
+ def function_generator
43
+ if generator = self.generator
44
+ generator.function_generator
45
+ else
46
+ nil
47
+ end
48
+ end
49
+
50
+ alias gen generator
51
+
52
+ def ignore(list)
53
+ list = [list].flatten
54
+ @ignores += list
55
+ @ignores.uniq!
56
+ @gen_members = nil
57
+ end
58
+
59
+ def members
60
+ list = super(@ignores)
61
+ if self.generator
62
+ list = @gen_members ||= self.generator.members_list(list.reject {|m| m.constructor?})
63
+ end
64
+ # Copy members from super classes
65
+ superclasses = (@opts[:super] || '').split(',').map(&:strip)
66
+ @super_members ||= superclasses.map do |id_name|
67
+ if id_name =~ /([^\.])\.(.*)/
68
+ namespace = Dub::Namespace.find($1)
69
+ class_name = $2
70
+ else
71
+ namespace = self.parent
72
+ class_name = id_name
73
+ end
74
+ if x = namespace[class_name]
75
+ x.members
76
+ else
77
+ Dub.logger.warn "Could not find superclass '#{id_name}'"
78
+ nil
79
+ end
80
+ end.compact.flatten
81
+ (list + @super_members).sort do |a,b|
82
+ a.name <=> b.name
83
+ end
84
+ end
85
+
86
+ def <=>(other)
87
+ (name || "") <=> (other.name || "")
88
+ end
89
+
90
+ def [](name)
91
+ name.to_s == @name ? constructor : get_member(name.to_s)
92
+ end
93
+
94
+ def class_methods
95
+ []
96
+ end
97
+
98
+ def template?
99
+ !@template_params.nil?
100
+ end
101
+
102
+ def has_constants?
103
+ has_enums?
104
+ end
105
+
106
+ def has_enums?
107
+ !@enums.empty?
108
+ end
109
+
110
+ # Special or no destructor: class construction
111
+ # and method calls are treated differently because
112
+ # the object can be destroyed out of Lua (and Lua
113
+ # should call a special method on garbage collection).
114
+ def custom_destructor?
115
+ @opts[:destructor]
116
+ end
117
+
118
+ # Use a static method as constructor.
119
+ def custom_constructor?
120
+ @opts[:constructor]
121
+ end
122
+
123
+ def template_params
124
+ @template_params
125
+ end
126
+
127
+ def class_with_params(template_params)
128
+ @instanciations[template_params]
129
+ end
130
+
131
+ def register_instanciation(template_params, klass)
132
+ @instanciations[template_params] = klass
133
+ end
134
+
135
+ def source
136
+ loc = (@xml/'location').first.attributes
137
+ "#{loc['file'].split('/')[-3..-1].join('/')}:#{loc['line']}"
138
+ end
139
+
140
+ def header
141
+ @opts[:header] ||= (@xml/'location').first.attributes['file'].split('/').last
142
+ end
143
+
144
+ def full_type
145
+ @parent ? "#{@parent.full_type}::#{name}" : name
146
+ end
147
+
148
+ def lib_name
149
+ @opts[:lib_name] || name
150
+ end
151
+
152
+ def id_name(name = self.name)
153
+ "#{prefix}.#{name}"
154
+ end
155
+
156
+ def destructor_name
157
+ "#{name}_destructor"
158
+ end
159
+
160
+ def is_deleted_name
161
+ "#{name}_deleted"
162
+ end
163
+
164
+ def tostring_name
165
+ "#{name}__tostring"
166
+ end
167
+
168
+ def constructor
169
+ if custom_constructor?
170
+ # Using a static member built with member list
171
+ return nil
172
+ end
173
+
174
+ if defined?(@constructor)
175
+ @constructor
176
+ else
177
+ self.members
178
+ @constructor ||= nil
179
+ end
180
+ @constructor
181
+ end
182
+
183
+ def names
184
+ [@name] + @alias_names
185
+ end
186
+
187
+ # Uses the bind declaration to read function bodies from a yml file:
188
+ # @dub bind: Foo.yml
189
+ def custom_bind(lang)
190
+ if !@bind_hash then
191
+ if file = @opts[:bind] then
192
+ header = (@xml/'location').first[:file]
193
+ path = header.split('/')
194
+ path.pop
195
+ path = (path + [file]).join('/')
196
+ if File.exist?(path) then
197
+ data = File.read(path)
198
+ @bind_hash = YAML::load(data)
199
+ else
200
+ @bind_hash = {}
201
+ Dub.logger.warn "Missing binding file '#{path}'"
202
+ end
203
+ else
204
+ @bind_hash = {}
205
+ end
206
+ end
207
+ @bind_hash[lang] ||= {}
208
+ end
209
+
210
+ private
211
+ def parse_xml
212
+ parse_opts_hash
213
+ parse_ancestors
214
+ parse_enums
215
+ parse_members
216
+ parse_template_params
217
+ parse_instanciations
218
+ parse_alias_names
219
+ end
220
+
221
+ def parse_opts_hash
222
+ if hash = Dub::OptsParser.extract_hash(@xml)
223
+ if hash.kind_of?(Hash)
224
+ if ignore = hash[:ignore]
225
+ self.ignore(ignore.split(',').map(&:strip))
226
+ end
227
+ @opts.merge!(hash)
228
+ else
229
+ raise "Could not parse @dub parameters #{hash.inspect}"
230
+ end
231
+ end
232
+ end
233
+
234
+ def parse_enums
235
+ @enums = (@xml/"enumvalue/name").map{|e| e.innerHTML}
236
+ end
237
+
238
+ def parse_ancestors
239
+ @ancestors = (@xml/'inheritancegraph'/'label').map{|a| a.innerHTML}
240
+ end
241
+
242
+ def parse_template_params
243
+ template_params = (@xml/'/templateparamlist/param')
244
+ if !template_params.empty?
245
+ @template_params = template_params.map do |param|
246
+ (param/'/type').innerHTML.gsub(/^\s*(typename|class)\s+/,'')
247
+ end
248
+ end
249
+ end
250
+
251
+ def parse_instanciations
252
+ (@xml/'instanciation').each do |klass|
253
+ name = (klass/'name').innerHTML
254
+ params = (klass/'param').map do |p|
255
+ p.innerHTML
256
+ end
257
+
258
+ @instanciations[params] = @parent[name]
259
+ end
260
+ end
261
+
262
+ def parse_alias_names
263
+ (@xml/'aliases/name').each do |name|
264
+ name = name.innerHTML
265
+ if name.size < @name.size
266
+ @alias_names << @name
267
+ change_name(name)
268
+ else
269
+ @alias_names << name
270
+ end
271
+
272
+ if @parent
273
+ @parent.register_alias(name, self)
274
+ end
275
+ end
276
+ end
277
+
278
+ def make_member(name, xml)
279
+ member = super
280
+ return nil unless member
281
+
282
+ if names.include?(name)
283
+ member.name = @name # force key name
284
+ member.set_as_constructor
285
+
286
+ # special handling of constructors
287
+ if @constructor.kind_of?(FunctionGroup)
288
+ @constructor << member
289
+ elsif @constructor
290
+ list = Dub::FunctionGroup.new(self)
291
+ list << @constructor
292
+ list << member
293
+ @constructor = list
294
+ else
295
+ @constructor = member
296
+ end
297
+ end
298
+
299
+ member
300
+ end
301
+
302
+ def change_name(new_name)
303
+ @name = new_name
304
+ if @constructor.kind_of?(Array)
305
+ @constructor.each do |c|
306
+ c.name = new_name
307
+ end
308
+ elsif @constructor
309
+ @constructor.name = new_name
310
+ end
311
+ end
312
+
313
+ def method_missing(met, *args)
314
+ if args.empty? && @opts.has_key?(met.to_sym)
315
+ @opts[met.to_sym]
316
+ elsif args.size == 1 && met.to_s =~ /^(.+)=$/
317
+ @opts[$1.to_sym] = args.first
318
+ else
319
+ super
320
+ end
321
+ end
322
+
323
+ def ignore_member?(member)
324
+ if custom_destructor?
325
+ if member.name == opts[:destructor] || member.name == 'set_userdata_ptr'
326
+ return true
327
+ end
328
+ end
329
+ if custom_constructor?
330
+ if member.constructor?
331
+ return true
332
+ end
333
+ end
334
+ super
335
+ end
336
+
337
+ end
338
+ end
@@ -0,0 +1,114 @@
1
+ #include "<%= @class.header %>"
2
+
3
+ #include "lua_cpp_helper.h"
4
+
5
+ <%# We need this to serialize superclass members properly %>
6
+ <% Lua.function_generator.klass = @class %>
7
+
8
+ <% if @class.prefix %>
9
+ using namespace <%= @class.prefix %>;
10
+ <% end %>
11
+
12
+ /* ============================ Constructors ====================== */
13
+
14
+ <%= @class.constructor %>
15
+
16
+ <% if @class.opts[:destructor] == '' %>
17
+ // Destructor disabled for this class
18
+ <% else %>
19
+ /* ============================ Destructor ====================== */
20
+
21
+ static int <%= @class.destructor_name %>(lua_State *L) {
22
+ <%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
23
+
24
+ <% if @class.custom_destructor? %>
25
+ // custom destructor
26
+ if (*userdata) (*userdata)-><%= @class.opts[:destructor] %>();
27
+ <% else %>
28
+ if (*userdata) delete *userdata;
29
+ <% end %>
30
+ *userdata = NULL;
31
+ return 0;
32
+ }
33
+ <% end %>
34
+
35
+ <% if @class.custom_destructor? %>
36
+
37
+ // test if class is deleted
38
+ static int <%= @class.is_deleted_name %>(lua_State *L) {
39
+ <%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
40
+ lua_pushboolean(L, *userdata == NULL);
41
+ return 1;
42
+ }
43
+ <% end %>
44
+ /* ============================ tostring ====================== */
45
+
46
+ static int <%= @class.tostring_name %>(lua_State *L) {
47
+ <%= @class.name %> **userdata = (<%= @class.name %>**)dubL_checksdata_n(L, 1, <%= @class.id_name.inspect %>);
48
+ <% if @class.custom_destructor? %>
49
+ if (!*userdata) {
50
+ lua_pushstring(L, "<<%= @class.id_name %>: NULL>");
51
+ return 1;
52
+ }
53
+ <% end %>
54
+ <% if @class.opts[:string_format] %>
55
+ lua_pushfstring(L, "<<%= @class.id_name %>: %p <%= @class.string_format %>>", *userdata, <%= @class.string_args %>);
56
+ <% else %>
57
+ lua_pushfstring(L, "<<%= @class.id_name %>: %p>", *userdata);
58
+ <% end %>
59
+ return 1;
60
+ }
61
+
62
+ /* ============================ Member Methods ====================== */
63
+
64
+ <% if @class.members; @class.members.each do |function| %>
65
+ <%= function %>
66
+
67
+ <% end; end %>
68
+
69
+
70
+ /* ============================ Lua Registration ====================== */
71
+
72
+ static const struct luaL_Reg <%= @class.name %>_member_methods[] = {
73
+ <%= indent(method_registration, 2) %>,
74
+ {NULL, NULL},
75
+ };
76
+
77
+ static const struct luaL_Reg <%= @class.name %>_namespace_methods[] = {
78
+ <%= indent(namespace_methods_registration, 2) %>,
79
+ {NULL, NULL},
80
+ };
81
+
82
+ <% if @class.has_constants? %>
83
+ static const struct lua_constants_Reg <%= @class.name %>_namespace_constants[] = {
84
+ <%= indent(constants_registration, 2) %>,
85
+ {NULL, NULL},
86
+ };
87
+ <% end %>
88
+
89
+ #ifdef DUB_LUA_NO_OPEN
90
+ int luaload_<%= @class.prefix %>_<%= @class.lib_name %>(lua_State *L) {
91
+ #else
92
+ extern "C" int luaopen_<%= @class.prefix %>_<%= @class.lib_name %>(lua_State *L) {
93
+ #endif
94
+ // Create the metatable which will contain all the member methods
95
+ luaL_newmetatable(L, <%= @class.id_name.inspect %>);
96
+
97
+ // metatable.__index = metatable (find methods in the table itself)
98
+ lua_pushvalue(L, -1);
99
+ lua_setfield(L, -2, "__index");
100
+
101
+ // register member methods
102
+ luaL_register(L, NULL, <%= @class.name %>_member_methods);
103
+ // save meta-table in <%= @class.prefix %>.<%= @class.name %>_
104
+ register_mt(L, <%= @class.prefix.inspect %>, <%= @class.name.inspect %>);
105
+
106
+ // register class methods in a global namespace table
107
+ luaL_register(L, <%= @class.prefix.inspect %>, <%= @class.name %>_namespace_methods);
108
+
109
+ <% if @class.has_constants? %>
110
+ // register class enums
111
+ register_constants(L, <%= (@class.id_name + '_const').inspect %>, <%= @class.name %>_namespace_constants);
112
+ <% end %>
113
+ return 1;
114
+ }
@@ -0,0 +1,96 @@
1
+
2
+ require 'dub/generator'
3
+ require 'erb'
4
+
5
+ module Dub
6
+ module Lua
7
+ class ClassGen < Dub::Generator
8
+ attr_accessor :template_path
9
+
10
+ def initialize
11
+ load_erb
12
+ end
13
+
14
+ def template_path=(template_path)
15
+ @template_path = template_path
16
+ load_erb
17
+ end
18
+
19
+ def klass(klass)
20
+ @class = klass
21
+ @class_template.result(binding)
22
+ end
23
+
24
+ def function_generator
25
+ Lua.function_generator
26
+ end
27
+
28
+ def method_registration(klass = @class)
29
+ member_methods = (klass.members || []).map do |method|
30
+ next if method.static?
31
+ "{%-20s, #{method.method_name(0)}}" % method.name.inspect
32
+ end.compact
33
+
34
+ member_methods << "{%-20s, #{klass.tostring_name}}" % "__tostring".inspect
35
+ if klass.opts[:destructor] != ''
36
+ member_methods << "{%-20s, #{klass.destructor_name}}" % "__gc".inspect
37
+ end
38
+ if klass.custom_destructor?
39
+ member_methods << "{%-20s, #{klass.is_deleted_name}}" % "deleted".inspect
40
+ end
41
+
42
+ member_methods.join(",\n")
43
+ end
44
+
45
+ def namespace_methods_registration(klass = @class)
46
+ if custom_ctor = klass.opts[:constructor]
47
+ ctor = klass[custom_ctor.to_sym]
48
+ raise "#{klass.name} custom constructor '#{custom_ctor}' not found !" unless ctor
49
+ raise "#{klass.name} custom constructor '#{custom_ctor}' not a static function !" unless ctor.static?
50
+
51
+ global_methods = klass.names.map do |name|
52
+ "{%-20s, #{ctor.method_name(0)}}" % name.inspect
53
+ end
54
+ else
55
+ global_methods = klass.names.map do |name|
56
+ "{%-20s, #{(klass[klass.opts[:constructor]] || klass.constructor).method_name(0)}}" % name.inspect
57
+ end
58
+ end
59
+
60
+ (klass.members || []).map do |method|
61
+ next unless method.static?
62
+ next if method.name == custom_ctor
63
+ global_methods << "{%-20s, #{method.method_name(0)}}" % "#{klass.name}_#{method.name}".inspect
64
+ end
65
+
66
+ global_methods.join(",\n")
67
+ end
68
+
69
+ def constants_registration(klass = @class)
70
+ klass.enums.map do |name|
71
+ "{%-20s, #{klass.full_type}::#{name}}" % name.inspect
72
+ end.join(",\n")
73
+ end
74
+
75
+ def members_list(all_members)
76
+ all_members
77
+ #list = all_members.map do |member_or_group|
78
+ # if member_or_group.kind_of?(Array)
79
+ # members_list(member_or_group)
80
+ # elsif ignore_member?(member_or_group)
81
+ # nil
82
+ # else
83
+ # member_or_group
84
+ # end
85
+ #end
86
+ #
87
+ #list.compact!
88
+ #list == [] ? nil : list
89
+ end
90
+
91
+ def load_erb
92
+ @class_template = ::ERB.new(File.read(@template_path || File.join(File.dirname(__FILE__), 'class.cpp.erb')))
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,15 @@
1
+ <%= comment(@function) %>
2
+ <%= signature(@function) %> {
3
+ <% if @function.throws? -%>
4
+ try {
5
+ <%= indent(body(@function, 'dub'), 4) %>
6
+ } catch (std::exception &e) {
7
+ lua_pushfstring(L, "<%= @function.name %>: %s", e.what());
8
+ } catch (...) {
9
+ lua_pushfstring(L, "<%= @function.name %>: Unknown exception");
10
+ }
11
+ return lua_error(L);
12
+ <% else -%>
13
+ <%= indent(body(@function, 'lua'), 2) %>
14
+ <% end -%>
15
+ }