dub 0.2.2 → 0.6.2

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 (266) hide show
  1. data/.gitignore +8 -0
  2. data/History.txt +32 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +48 -0
  5. data/Rakefile +58 -0
  6. data/dub.gemspec +197 -0
  7. data/lib/dub/argument.rb +275 -0
  8. data/lib/dub/entities_unescape.rb +16 -0
  9. data/lib/dub/function.rb +163 -0
  10. data/lib/dub/function_group.rb +72 -0
  11. data/lib/dub/generator.rb +15 -0
  12. data/lib/dub/group.rb +24 -0
  13. data/lib/dub/klass.rb +231 -0
  14. data/lib/dub/lua/class.cpp.erb +83 -0
  15. data/lib/dub/lua/class_gen.rb +97 -0
  16. data/lib/dub/lua/function.cpp.erb +18 -0
  17. data/lib/dub/lua/function_gen.rb +258 -0
  18. data/lib/dub/lua/group.cpp.erb +9 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +141 -0
  20. data/lib/dub/lua/namespace.cpp.erb +40 -0
  21. data/lib/dub/lua/namespace_gen.rb +88 -0
  22. data/lib/dub/lua.rb +24 -0
  23. data/lib/dub/member_extraction.rb +92 -0
  24. data/lib/dub/namespace.rb +277 -0
  25. data/lib/dub/parser.rb +46 -0
  26. data/lib/dub/templates/lua_template.erb +21 -0
  27. data/lib/dub/version.rb +3 -0
  28. data/lib/dub.rb +23 -20
  29. data/test/argument_test.rb +547 -0
  30. data/test/fixtures/app/CMakeLists.txt +54 -0
  31. data/test/fixtures/app/Doxyfile +1600 -0
  32. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  33. data/test/fixtures/app/include/matrix.h +140 -0
  34. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  35. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  36. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  37. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  38. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  39. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  40. data/test/fixtures/app/vendor/lua/README +37 -0
  41. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  42. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  43. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  44. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  45. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  46. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  47. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  48. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  49. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  50. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  51. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  52. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  53. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  54. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  55. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  56. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  57. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  58. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  59. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  60. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  61. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  62. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  63. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  64. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  65. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  66. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  67. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  68. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  69. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  70. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  71. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  72. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  73. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  74. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  75. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  76. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  77. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  78. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  79. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  80. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  81. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  82. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  83. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  84. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  85. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  86. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  87. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  88. data/test/fixtures/app/vendor/lua/luac +0 -0
  89. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  90. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  91. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  92. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  93. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  94. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  95. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  96. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  97. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  98. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  99. data/test/fixtures/app/vendor/lua/print.c +227 -0
  100. data/test/fixtures/app/vendor/lua/test/README +26 -0
  101. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  102. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  103. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  104. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  105. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  106. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  107. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  108. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  109. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  110. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  111. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  112. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  113. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  114. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  115. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  116. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  118. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  119. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  120. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +281 -0
  121. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +233 -0
  122. data/test/fixtures/app/xml/combine.xslt +15 -0
  123. data/test/fixtures/app/xml/compound.xsd +814 -0
  124. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  125. data/test/fixtures/app/xml/index.xml +44 -0
  126. data/test/fixtures/app/xml/index.xsd +66 -0
  127. data/test/fixtures/app/xml/matrix_8h.xml +157 -0
  128. data/test/fixtures/app/xml/namespacedub.xml +41 -0
  129. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  130. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  131. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  132. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  133. data/test/fixtures/dummy_class.cpp.erb +1 -0
  134. data/test/fixtures/dummy_function.cpp.erb +1 -0
  135. data/test/fixtures/group___magic_type.xml +406 -0
  136. data/test/fixtures/namespacecv.xml +12659 -0
  137. data/test/function_group_test.rb +24 -0
  138. data/test/function_test.rb +395 -0
  139. data/test/group_test.rb +155 -0
  140. data/test/helper.rb +34 -0
  141. data/test/klass_test.rb +387 -0
  142. data/test/lua_function_gen_test.rb +195 -0
  143. data/test/namespace_test.rb +220 -0
  144. data/test/parser_test.rb +36 -0
  145. metadata +211 -275
  146. checksums.yaml +0 -7
  147. data/lib/open_api_sdk/analytics.rb +0 -99
  148. data/lib/open_api_sdk/domains.rb +0 -353
  149. data/lib/open_api_sdk/dub.rb +0 -88
  150. data/lib/open_api_sdk/links.rb +0 -766
  151. data/lib/open_api_sdk/metatags.rb +0 -54
  152. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  153. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  154. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  155. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  156. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  157. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  158. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  159. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  160. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  161. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  162. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  163. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  164. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  165. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  166. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  168. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  169. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  170. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  171. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  172. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  173. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  174. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  175. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  178. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  179. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  180. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  181. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  182. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  183. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  184. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  185. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  186. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  187. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  188. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  189. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  190. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  191. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  193. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  194. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  196. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  197. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  198. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  199. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  200. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  201. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  202. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  203. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  204. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  205. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  206. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  207. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  208. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  209. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  210. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  211. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  213. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  215. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  216. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  217. data/lib/open_api_sdk/models/operations.rb +0 -74
  218. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  219. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  220. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  221. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  222. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  223. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  224. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  225. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  226. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  227. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  228. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  229. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  230. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  231. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  232. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  236. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  237. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  238. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  239. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  240. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  241. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  242. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  243. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  245. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  246. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  247. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  248. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  249. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  250. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  251. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  252. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  253. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  254. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  255. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  256. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  257. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  258. data/lib/open_api_sdk/models/shared.rb +0 -49
  259. data/lib/open_api_sdk/qr_codes.rb +0 -97
  260. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  261. data/lib/open_api_sdk/tags.rb +0 -272
  262. data/lib/open_api_sdk/track.rb +0 -276
  263. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  264. data/lib/open_api_sdk/utils/t.rb +0 -59
  265. data/lib/open_api_sdk/utils/utils.rb +0 -772
  266. data/lib/open_api_sdk/workspaces.rb +0 -192
@@ -0,0 +1,163 @@
1
+ require 'dub/argument'
2
+ require 'dub/entities_unescape'
3
+
4
+ module Dub
5
+ class Function
6
+ include Dub::EntitiesUnescape
7
+ attr_reader :arguments, :prefix, :overloaded_index, :return_value, :xml, :parent
8
+ attr_accessor :gen, :name, :is_constructor
9
+
10
+ def initialize(parent, name, xml, prefix = '', overloaded_index = nil)
11
+ @parent, @name = parent, name
12
+ @xml, @prefix, @overloaded_index = xml, prefix, overloaded_index
13
+ parse_xml
14
+ parse_template_params
15
+ end
16
+
17
+ def set_as_constructor
18
+ @return_value = Argument.new(self, (Hpricot::XML("<type>#{name} *</type>")/''))
19
+ @is_constructor = true
20
+ end
21
+
22
+ def bind(generator)
23
+ @gen = generator.function_generator
24
+ end
25
+
26
+ def to_s
27
+ generator.function(self)
28
+ end
29
+
30
+ def generator
31
+ @gen || (@parent && @parent.function_generator)
32
+ end
33
+
34
+ def klass
35
+ @parent.kind_of?(Klass) ? @parent : nil
36
+ end
37
+
38
+ def member_method?
39
+ !klass.nil?
40
+ end
41
+
42
+ def constructor?
43
+ @is_constructor
44
+ end
45
+
46
+ def static?
47
+ @is_static
48
+ end
49
+
50
+ alias gen generator
51
+
52
+ def name=(n)
53
+ @name = n
54
+ if constructor?
55
+ @return_value.type = n
56
+ end
57
+ end
58
+
59
+ def call_name
60
+ if klass
61
+ static? ? "#{klass.name}::#{name}" : name
62
+ else
63
+ name
64
+ end
65
+ end
66
+
67
+ def id_name
68
+ @parent ? "#{@parent.id_name}.#{name}" : name
69
+ end
70
+
71
+ def source
72
+ loc = (@xml/'location').first.attributes
73
+ "#{loc['file'].split('/')[-3..-1].join('/')}:#{loc['line']}"
74
+ end
75
+
76
+ def original_signature
77
+ unescape "#{(@xml/'definition').innerHTML}#{(@xml/'argsstring').innerHTML}"
78
+ end
79
+
80
+ def has_default_arguments?
81
+ return @has_defaults if defined?(@has_defaults)
82
+ @has_defaults = !@arguments.detect {|a| a.has_default? }.nil?
83
+ end
84
+
85
+ def has_array_arguments?
86
+ return @has_array_arguments if defined?(@has_array_arguments)
87
+ @has_array_arguments = !@arguments.detect {|a| a.array_suffix }.nil?
88
+ end
89
+
90
+ def has_class_pointer_arguments?
91
+ return @has_class_pointer_arguments if defined?(@has_class_pointer_arguments)
92
+ @has_class_pointer_arguments = !@arguments.detect {|a| !a.is_native? && a.is_pointer? }.nil?
93
+ end
94
+
95
+ def has_complex_arguments?
96
+ return @has_complex_arguments if defined?(@has_complex_arguments)
97
+ @has_complex_arguments = !(@arguments + [@return_value]).compact.detect {|a| a.complex? }.nil?
98
+ end
99
+
100
+ def vararg?
101
+ @arguments.last && @arguments.last.vararg?
102
+ end
103
+
104
+ def arg_is_list(list_position, count_position)
105
+ @arguments[list_position ].is_list = true
106
+ @arguments[count_position].is_list_count = true
107
+ end
108
+
109
+ def template?
110
+ !@template_params.nil?
111
+ end
112
+
113
+ def template_params
114
+ @template_params
115
+ end
116
+
117
+ def inspect
118
+ "#<Function #{@prefix}_#{@name}(#{@arguments.inspect[1..-2]})>"
119
+ end
120
+
121
+ def <=>(other)
122
+ name <=> other.name
123
+ end
124
+
125
+ # ====== these methods are alias to
126
+ # generator methods on this object
127
+
128
+ def method_name(overloaded_index = nil)
129
+ gen.method_name(self, overloaded_index)
130
+ end
131
+
132
+ # =================================
133
+
134
+ private
135
+ def parse_xml
136
+ @arguments = []
137
+
138
+ (@xml/'param').each_with_index do |arg, i|
139
+ @arguments << Argument.new(self, arg, i + 1)
140
+ end
141
+
142
+ raw_type = (@xml/'/type').innerHTML
143
+
144
+ if raw_type.strip == ''
145
+ # no return type
146
+ else
147
+ arg = Argument.new(self, (@xml/'/type'))
148
+ @return_value = arg unless arg.create_type =~ /void\s*$/
149
+ end
150
+
151
+ @is_static = @xml[:static] == 'yes'
152
+ end
153
+
154
+ def parse_template_params
155
+ template_params = (@xml/'/templateparamlist/param')
156
+ if !template_params.empty?
157
+ @template_params = template_params.map do |param|
158
+ (param/'/type').innerHTML.gsub(/^\s*(typename|class)\s+/,'')
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end # Namespace
@@ -0,0 +1,72 @@
1
+ module Dub
2
+ class FunctionGroup < Array
3
+ def initialize(parent, gen = nil)
4
+ @parent, @gen = parent, gen
5
+ end
6
+
7
+ def bind(generator)
8
+ self.gen = generator.function_generator
9
+ end
10
+
11
+ def generator
12
+ @gen || (@parent && @parent.function_generator)
13
+ end
14
+
15
+ def gen=(generator)
16
+ @gen = generator
17
+ @gen_members = nil
18
+ end
19
+
20
+ alias gen generator
21
+
22
+ def members
23
+ if self.generator
24
+ if @parent.generator
25
+ @gen_members ||= @parent.generator.members_list(self)
26
+ else
27
+ @gen_members ||= generator.namespace_generator.members_list(self)
28
+ end
29
+ else
30
+ self
31
+ end
32
+ end
33
+
34
+ def to_s
35
+ generator.group(self)
36
+ end
37
+
38
+ def method_name(overloaded_index = nil)
39
+ first.method_name(overloaded_index)
40
+ end
41
+
42
+ def map(&block)
43
+ list = self.class.new(@parent, @gen)
44
+ super(&block).each do |e|
45
+ list << e
46
+ end
47
+ list
48
+ end
49
+
50
+ def compact
51
+ list = self.class.new(@parent, @gen)
52
+ super.each do |e|
53
+ list << e
54
+ end
55
+ list
56
+ end
57
+
58
+ def overloaded_index
59
+ nil
60
+ end
61
+
62
+ def <=>(other)
63
+ name <=> other.name
64
+ end
65
+
66
+ private
67
+ def method_missing(method, *args)
68
+ first.send(method, *args)
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,15 @@
1
+ require 'dub/function'
2
+
3
+ module Dub
4
+ class Generator
5
+
6
+ def comment(func)
7
+ "/** #{func.original_signature}\n * #{func.source}\n */"
8
+ end
9
+
10
+ protected
11
+ def indent(str, indent)
12
+ str.gsub(/^/, ' ' * indent)
13
+ end
14
+ end # Generator
15
+ end # Dub
data/lib/dub/group.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'dub/namespace'
2
+
3
+ module Dub
4
+ class Group < Namespace
5
+ def parse_xml
6
+ super
7
+ parse_defines
8
+ end
9
+
10
+ def arg_is_list(argument_pos, count_pos)
11
+ each do |f|
12
+ f.arg_is_list(argument_pos, count_pos)
13
+ end
14
+ end
15
+
16
+ def members
17
+ if self.generator
18
+ @gen_members ||= self.generator.members_list(super, @ignores)
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+ end
data/lib/dub/klass.rb ADDED
@@ -0,0 +1,231 @@
1
+ module Dub
2
+ module MemberExtraction
3
+ end
4
+ end
5
+ require 'dub/member_extraction'
6
+
7
+ module Dub
8
+ class Klass
9
+ include MemberExtraction
10
+ attr_reader :name, :xml, :prefix, :constructor, :alias_names, :enums, :parent, :instanciations
11
+ attr_accessor :header, :string_format, :string_args
12
+
13
+ def initialize(parent, name, xml, prefix = '')
14
+ @parent, @name, @xml, @prefix = parent, name, xml, prefix
15
+
16
+ @alias_names = []
17
+ @enums = []
18
+ @ignores = []
19
+ @instanciations = {}
20
+ parse_xml
21
+ end
22
+
23
+ def bind(generator)
24
+ self.gen = generator.class_generator
25
+ end
26
+
27
+ def gen=(generator)
28
+ @gen = generator
29
+ @gen_members = nil
30
+ end
31
+
32
+ def to_s
33
+ generator.klass(self)
34
+ end
35
+
36
+ def generator
37
+ @gen || (@parent && @parent.class_generator)
38
+ end
39
+
40
+ def function_generator
41
+ if generator = self.generator
42
+ generator.function_generator
43
+ else
44
+ nil
45
+ end
46
+ end
47
+
48
+ alias gen generator
49
+
50
+ def ignore(list)
51
+ list = [list].flatten
52
+ @ignores += list
53
+ @ignores.uniq!
54
+ @gen_members = nil
55
+ end
56
+
57
+ def members
58
+ if self.generator
59
+ @gen_members ||= self.generator.members_list(super, @ignores)
60
+ else
61
+ super
62
+ end
63
+ end
64
+
65
+ def <=>(other)
66
+ (name || "") <=> (other.name || "")
67
+ end
68
+
69
+ def [](name)
70
+ name.to_s == @name ? constructor : get_member(name.to_s)
71
+ end
72
+
73
+ def class_methods
74
+ []
75
+ end
76
+
77
+ def template?
78
+ !@template_params.nil?
79
+ end
80
+
81
+ def has_constants?
82
+ has_enums?
83
+ end
84
+
85
+ def has_enums?
86
+ !@enums.empty?
87
+ end
88
+
89
+ def template_params
90
+ @template_params
91
+ end
92
+
93
+ def class_with_params(template_params)
94
+ @instanciations[template_params]
95
+ end
96
+
97
+ def register_instanciation(template_params, klass)
98
+ @instanciations[template_params] = klass
99
+ end
100
+
101
+ def source
102
+ loc = (@xml/'location').first.attributes
103
+ "#{loc['file'].split('/')[-3..-1].join('/')}:#{loc['line']}"
104
+ end
105
+
106
+ def header
107
+ @header ||= (@xml/'location').first.attributes['file'].split('/').last
108
+ end
109
+
110
+ def full_type
111
+ @parent ? "#{@parent.full_type}::#{name}" : name
112
+ end
113
+
114
+ def lib_name
115
+ "#{prefix}_#{name}"
116
+ end
117
+
118
+ def id_name(name = self.name)
119
+ "#{prefix}.#{name}"
120
+ end
121
+
122
+ def destructor_name
123
+ "#{name}_destructor"
124
+ end
125
+
126
+ def tostring_name
127
+ "#{name}__tostring"
128
+ end
129
+
130
+ def constructor
131
+ if defined?(@constructor)
132
+ @constructor
133
+ else
134
+ self.members
135
+ @constructor ||= nil
136
+ end
137
+ @constructor
138
+ end
139
+
140
+ def names
141
+ [@name] + @alias_names
142
+ end
143
+
144
+ private
145
+ def parse_xml
146
+ parse_enums
147
+ parse_members
148
+ parse_template_params
149
+ parse_instanciations
150
+ parse_alias_names
151
+ end
152
+
153
+ def parse_enums
154
+ @enums = (@xml/"enumvalue/name").map{|e| e.innerHTML}
155
+ end
156
+
157
+ def parse_template_params
158
+ template_params = (@xml/'/templateparamlist/param')
159
+ if !template_params.empty?
160
+ @template_params = template_params.map do |param|
161
+ (param/'/type').innerHTML.gsub(/^\s*(typename|class)\s+/,'')
162
+ end
163
+ end
164
+ end
165
+
166
+ def parse_instanciations
167
+ (@xml/'instanciation').each do |klass|
168
+ name = (klass/'name').innerHTML
169
+ params = (klass/'param').map do |p|
170
+ p.innerHTML
171
+ end
172
+
173
+ @instanciations[params] = @parent[name]
174
+ end
175
+ end
176
+
177
+ def parse_alias_names
178
+ (@xml/'aliases/name').each do |name|
179
+ name = name.innerHTML
180
+ if name.size < @name.size
181
+ @alias_names << @name
182
+ change_name(name)
183
+ else
184
+ @alias_names << name
185
+ end
186
+
187
+ if @parent
188
+ @parent.register_alias(name, self)
189
+ end
190
+ end
191
+ end
192
+
193
+ def make_member(name, member, overloaded_index = nil)
194
+ if names.include?(name)
195
+ # keep constructors out of members list
196
+ if @constructor.kind_of?(FunctionGroup)
197
+ constr = super
198
+ constr.name = @name # force key name
199
+ constr.set_as_constructor
200
+ @constructor << constr
201
+ elsif @constructor
202
+ constr = super
203
+ constr.name = @name
204
+ constr.set_as_constructor
205
+ list = Dub::FunctionGroup.new(self)
206
+ list << @constructor
207
+ list << constr
208
+ @constructor = list
209
+ else
210
+ @constructor = super
211
+ @constructor.set_as_constructor
212
+ @constructor.name = @name
213
+ end
214
+ nil
215
+ else
216
+ super
217
+ end
218
+ end
219
+
220
+ def change_name(new_name)
221
+ @name = new_name
222
+ if @constructor.kind_of?(Array)
223
+ @constructor.each do |c|
224
+ c.name = new_name
225
+ end
226
+ elsif @constructor
227
+ @constructor.name = new_name
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,83 @@
1
+ #include "<%= @class.header %>"
2
+
3
+ #include "lua_cpp_helper.h"
4
+
5
+ <% if @class.prefix %>
6
+ using namespace <%= @class.prefix %>;
7
+ <% end %>
8
+
9
+ /* ============================ Constructors ====================== */
10
+
11
+ <%= @class.constructor %>
12
+
13
+ /* ============================ Destructor ====================== */
14
+
15
+ static int <%= @class.destructor_name %>(lua_State *L) {
16
+ <%= @class.name %> **userdata = (<%= @class.name %>**)luaL_checkudata(L, 1, <%= @class.id_name.inspect %>);
17
+ if (*userdata) delete *userdata;
18
+ *userdata = NULL;
19
+ return 0;
20
+ }
21
+
22
+ /* ============================ tostring ====================== */
23
+
24
+ static int <%= @class.tostring_name %>(lua_State *L) {
25
+ <%= @class.name %> **userdata = (<%= @class.name %>**)luaL_checkudata(L, 1, <%= @class.id_name.inspect %>);
26
+ <% if @class.string_format %>
27
+ lua_pushfstring(L, "<<%= @class.id_name %>: %p <%= @class.string_format %>>", *userdata, <%= @class.string_args %>);
28
+ <% else %>
29
+ lua_pushfstring(L, "<<%= @class.id_name %>: %p>", *userdata);
30
+ <% end %>
31
+ return 1;
32
+ }
33
+
34
+ /* ============================ Member Methods ====================== */
35
+
36
+ <% if @class.members; @class.members.each do |function| %>
37
+ <%= function %>
38
+
39
+ <% end; end %>
40
+
41
+
42
+ /* ============================ Lua Registration ====================== */
43
+
44
+ static const struct luaL_Reg <%= @class.name %>_member_methods[] = {
45
+ <%= indent(method_registration, 2) %>,
46
+ {NULL, NULL},
47
+ };
48
+
49
+ static const struct luaL_Reg <%= @class.name %>_namespace_methods[] = {
50
+ <%= indent(namespace_methods_registration, 2) %>,
51
+ {NULL, NULL},
52
+ };
53
+
54
+ <% if @class.has_constants? %>
55
+ static const struct lua_constants_Reg <%= @class.name %>_namespace_constants[] = {
56
+ <%= indent(constants_registration, 2) %>,
57
+ {NULL, NULL},
58
+ };
59
+ <% end %>
60
+
61
+ #ifdef DUB_LUA_NO_OPEN
62
+ int luaload_<%= @class.lib_name %>(lua_State *L) {
63
+ #else
64
+ extern "C" int luaopen_<%= @class.lib_name %>(lua_State *L) {
65
+ #endif
66
+ // Create the metatable which will contain all the member methods
67
+ luaL_newmetatable(L, <%= @class.id_name.inspect %>);
68
+
69
+ // metatable.__index = metatable (find methods in the table itself)
70
+ lua_pushvalue(L, -1);
71
+ lua_setfield(L, -2, "__index");
72
+
73
+ // register member methods
74
+ luaL_register(L, NULL, <%= @class.name %>_member_methods);
75
+
76
+ // register class methods in a global namespace table
77
+ luaL_register(L, <%= @class.prefix.inspect %>, <%= @class.name %>_namespace_methods);
78
+
79
+ <% if @class.has_constants? %>
80
+ // register class enums
81
+ register_constants(L, <%= (@class.id_name + '_const').inspect %>, <%= @class.name %>_namespace_constants);
82
+ <% end %>
83
+ }
@@ -0,0 +1,97 @@
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
+ member_methods << "{%-20s, #{klass.destructor_name}}" % "__gc".inspect
36
+
37
+ member_methods.join(",\n")
38
+ end
39
+
40
+ def namespace_methods_registration(klass = @class)
41
+ global_methods = klass.names.map do |name|
42
+ "{%-20s, #{klass.constructor.method_name(0)}}" % name.inspect
43
+ end
44
+
45
+ (klass.members || []).map do |method|
46
+ next unless method.static?
47
+ global_methods << "{%-20s, #{method.method_name(0)}}" % "#{klass.name}_#{method.name}".inspect
48
+ end
49
+
50
+ global_methods.join(",\n")
51
+ end
52
+
53
+ def constants_registration(klass = @class)
54
+ klass.enums.map do |name|
55
+ "{%-20s, #{klass.full_type}::#{name}}" % name.inspect
56
+ end.join(",\n")
57
+ end
58
+
59
+ def members_list(all_members, ignore_list = [])
60
+ list = all_members.map do |member_or_group|
61
+ if ignore_list.include?(member_or_group.name)
62
+ nil
63
+ elsif member_or_group.kind_of?(Array)
64
+ members_list(member_or_group)
65
+ elsif ignore_member?(member_or_group)
66
+ nil
67
+ else
68
+ member_or_group
69
+ end
70
+ end
71
+
72
+ list.compact!
73
+ list == [] ? nil : list
74
+ end
75
+
76
+ def ignore_member?(member)
77
+ if member.name =~ /^~/ || # do not build constructor
78
+ member.name =~ /^operator/ || # no conversion operators
79
+ member.has_complex_arguments? || # no complex arguments or return values
80
+ member.has_array_arguments? ||
81
+ member.vararg? ||
82
+ member.original_signature =~ /void\s+\*/ # used to detect return value and parameters
83
+ true # ignore
84
+ elsif return_value = member.return_value
85
+ return_value.type =~ />$/ || # no complex return types
86
+ return_value.is_native? && member.return_value.is_pointer?
87
+ else
88
+ false # ok, do not ignore
89
+ end
90
+ end
91
+
92
+ def load_erb
93
+ @class_template = ::ERB.new(File.read(@template_path || File.join(File.dirname(__FILE__), 'class.cpp.erb')))
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,18 @@
1
+ <%= comment(@function) %>
2
+ <%= signature(@function) %> {
3
+ try {
4
+ <%= indent(body(@function), 4) %>
5
+ } catch (std::exception &e) {
6
+ std::string *s = new std::string("<%= @function.id_name %>: ");
7
+ s->append(e.what());
8
+ lua_pushstring(L, s->c_str());
9
+ delete s;
10
+ lua_error(L);
11
+ // never reached
12
+ return 0;
13
+ } catch (...) {
14
+ lua_pushstring(L, "<%= @function.id_name %>: Unknown exception");
15
+ lua_error(L);
16
+ return 0;
17
+ }
18
+ }