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
@@ -0,0 +1,286 @@
1
+ require 'dub/entities_unescape'
2
+
3
+ module Dub
4
+ class Argument
5
+ include Dub::EntitiesUnescape
6
+ attr_reader :name, :default, :function, :xml
7
+ attr_accessor :type, :is_list, :is_list_count
8
+ TYPE_REGEXP = %r{^\s*(\w+\s+|)(const\s+|)([\w\:]+|\.\.\.)(\s*<(.+)>|)(\s*\*+|\s*&|)$}
9
+ NUMBER_TYPES = [
10
+ 'float',
11
+ 'double',
12
+ 'size_t',
13
+ 'unsigned int',
14
+ 'uint',
15
+ 'int',
16
+ 'size_t',
17
+ 'time_t',
18
+ 'unsigned int',
19
+ 'uint',
20
+ 'bool',
21
+ 'uchar',
22
+ 'void',
23
+ 'int64',
24
+ ]
25
+
26
+ STRING_TYPES = [
27
+ 'char',
28
+ ]
29
+
30
+ BOOL_TYPES = [
31
+ 'bool',
32
+ ]
33
+
34
+ NATIVE_C_TYPES = NUMBER_TYPES + STRING_TYPES + BOOL_TYPES
35
+
36
+ class << self
37
+
38
+ # This is used to resolve overloaded functions
39
+ def type_group(arg)
40
+ # exact same type
41
+ if NATIVE_C_TYPES.include?(arg.type)
42
+ if BOOL_TYPES.include?(arg.type)
43
+ :boolean
44
+ elsif STRING_TYPES.include?(arg.type) && arg.is_pointer?
45
+ :string
46
+ else
47
+ # number synonym
48
+ arg.is_pointer? ? :number_ptr : :number
49
+ end
50
+ else
51
+ # custom class / type
52
+ arg.id_name
53
+ end
54
+ end
55
+
56
+ # group is a list of functions, index = argument index
57
+ def decision_tree(group)
58
+ hash = {}
59
+ group.each do |function|
60
+ insert_by_arg(hash, function)
61
+ end
62
+ hash
63
+ end
64
+
65
+ # Insert a function into the hash, using the argument at the given
66
+ # index to filter
67
+ def insert_by_arg(hash, function, index = 0)
68
+ arg = function.arguments[index]
69
+ type = arg ? type_group(arg) : nil
70
+ insert_by_type(hash, function, index, type)
71
+ if arg && arg.has_default?
72
+ insert_by_type(hash, function, index, nil)
73
+ end
74
+ end
75
+
76
+ def insert_by_type(hash, function, index, type)
77
+ # hash[nil] ==> there is a default argument
78
+ slot = hash[type]
79
+ if slot.nil?
80
+ hash[type] = function
81
+ elsif slot.kind_of?(Hash)
82
+ insert_by_arg(slot, function, index + 1)
83
+ elsif type.nil?
84
+ # ignore
85
+
86
+ # TODO: log level
87
+ # puts "Cannot filter functions #{function.source}"
88
+ else
89
+ h = {}
90
+ insert_by_arg(h, slot, index + 1)
91
+ insert_by_arg(h, function, index + 1)
92
+ hash[type] = h
93
+ end
94
+ end
95
+ end
96
+
97
+ def initialize(function, xml, arg_pos = nil)
98
+ @function, @xml, @argument_position = function, xml, arg_pos
99
+ parse_xml
100
+ end
101
+
102
+ def signature
103
+ "#{is_const? ? 'const ' : ''}#{type}#{is_ref? ? '&' : ''}"
104
+ end
105
+
106
+ def full_type
107
+ if type =~ /::/
108
+ type
109
+ else
110
+ container = function.parent
111
+ if container.kind_of?(Klass)
112
+ container = container.parent
113
+ end
114
+ container ? "#{container.name}::#{type}" : type
115
+ end
116
+ end
117
+
118
+ def id_name
119
+ full_type.gsub('::', '.')
120
+ end
121
+
122
+ alias inspect signature
123
+
124
+ def is_ref?
125
+ @ref
126
+ end
127
+
128
+ def is_pointer?
129
+ !@pointer.nil?
130
+ end
131
+
132
+ def is_const?
133
+ @const
134
+ end
135
+
136
+ def has_default?
137
+ !@default.nil?
138
+ end
139
+
140
+ def is_return_value?
141
+ @is_return_value
142
+ end
143
+
144
+ def is_native?
145
+ NATIVE_C_TYPES.include?(type)
146
+ end
147
+
148
+ def type
149
+ resolve_type if @template_params
150
+ @type
151
+ end
152
+
153
+ def vararg?
154
+ @type == '...'
155
+ end
156
+
157
+ def complex?
158
+ resolve_type if @template_params
159
+ @is_complex
160
+ end
161
+
162
+ def is_list?
163
+ @is_list
164
+ end
165
+
166
+ def is_list_count?
167
+ @is_list_count
168
+ end
169
+
170
+ def create_type
171
+ resolve_type if @template_params
172
+ (is_const? ? 'const ' : '') +
173
+ if (is_return_value? && !is_pointer?) || (is_native? && !is_pointer?)
174
+ "#{type} "
175
+ else
176
+ "#{type} *"
177
+ end
178
+ end
179
+
180
+ # this is for the cases where we have signatures like
181
+ # HuMoments(double moments[7])
182
+ def array_suffix
183
+ @array_suffix
184
+ end
185
+
186
+ def in_call_type
187
+ (is_native? || is_pointer?) ? name : "*#{name}"
188
+ end
189
+
190
+ private
191
+ def parse_xml
192
+ if type = (@xml/'type').first
193
+ # param
194
+ set_type(type)
195
+
196
+ @name = unescape((@xml/'declname').innerHTML)
197
+ if @name == ''
198
+ @name = "arg#{@argument_position}"
199
+ elsif @name == @function.name
200
+ @name = "arg_#{@name}"
201
+ end
202
+
203
+ if ref = (@xml/'defval/ref').first
204
+ ref.swap(ref.innerHTML)
205
+ end
206
+ @default = (@xml/'defval') ? unescape((@xml/'defval').innerHTML) : nil
207
+ @default = nil if @default == ''
208
+ expand_default_type if @default
209
+ else
210
+ # return value
211
+ @is_return_value = true
212
+ set_type(@xml/'')
213
+ end
214
+
215
+ if array = (@xml/'array').first
216
+ @array_suffix = array.innerHTML
217
+ end
218
+ end
219
+
220
+ def set_type(type)
221
+ # <type>const <ref refid="classcv_1_1_point__" kindref="compound">Point_</ref>&lt; int &gt; &amp;</type>
222
+ if ref = (type/'ref').first
223
+ @refid = ref[:refid]
224
+ ref.swap(ref.innerHTML)
225
+ end
226
+
227
+ type = type.innerHTML
228
+ type = unescape(type).strip
229
+
230
+ if type =~ TYPE_REGEXP
231
+ res = $~.to_a
232
+
233
+ if res[1].strip == 'const'
234
+ res[2] = res[1]
235
+ res[1] = ""
236
+ end
237
+
238
+ @const = res[2].strip == 'const'
239
+ @type = res[3]
240
+
241
+ if res[6] == ''
242
+ @pointer = nil
243
+ @res = nil
244
+ elsif res[6] =~ /^\s*(\*+)\s*$/
245
+ @pointer = $1
246
+ else
247
+ @ref = res[6].strip
248
+ end
249
+
250
+ @template_params = res[5] ? res[5].split(',').map(&:strip) : nil
251
+ else
252
+ # ERROR
253
+ end
254
+ end
255
+
256
+ # Replace something like AUTO_STEP by cv::Mat::AUTO_STEP
257
+ def expand_default_type
258
+ container = @function.parent
259
+ if container && container.enums.include?(@default)
260
+ @default = "#{container.full_type}::#{@default}"
261
+ elsif container = container.parent && container.enums.include?(@default)
262
+ @default = "#{container.full_type}::#{@default}"
263
+ end
264
+ end
265
+
266
+ def resolve_type
267
+ params = @template_params
268
+ @template_params = nil
269
+ if container = @function.parent
270
+ if container.kind_of?(Klass)
271
+ container = container.parent
272
+ end
273
+ if container && tclass = container.template_class(@type)
274
+ if instanciation = tclass.instanciations[params]
275
+ @type = instanciation.name
276
+ return
277
+ end
278
+ end
279
+ end
280
+
281
+ @type = "#{@type}< #{params.join(', ')} >"
282
+ Dub.logger.warn "Could not resolve templated type #{@type}"
283
+ @is_complex = true
284
+ end
285
+ end
286
+ end # Namespace
@@ -0,0 +1,9 @@
1
+ require 'htmlentities'
2
+ module Dub
3
+ module EntitiesUnescape
4
+ Decoder = HTMLEntities.new
5
+ def unescape(str)
6
+ Decoder.decode(str)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,177 @@
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, :return_value, :xml, :parent
8
+ attr_accessor :gen, :name, :is_constructor, :overloaded_index
9
+
10
+ def initialize(parent, name, xml, prefix = '')
11
+ @parent, @name = parent, name
12
+ @xml, @prefix = xml, prefix
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 throws?
47
+ @throw ||= (@xml/'exceptions').innerHTML || ''
48
+ @throw = (@throw =~ /throw\s*\(\s*\)/) ? :nothing : :any
49
+ @throw != :nothing
50
+ end
51
+
52
+ def custom_body(lang)
53
+ klass ? klass.custom_bind(lang)[self.name] : nil
54
+ end
55
+
56
+ def static?
57
+ @is_static
58
+ end
59
+
60
+ alias gen generator
61
+
62
+ def name=(n)
63
+ @name = n
64
+ if constructor?
65
+ @return_value.type = n
66
+ end
67
+ end
68
+
69
+ def call_name
70
+ if klass
71
+ static? ? "#{klass.name}::#{name}" : name
72
+ else
73
+ name
74
+ end
75
+ end
76
+
77
+ def id_name
78
+ @parent ? "#{@parent.id_name}.#{name}" : name
79
+ end
80
+
81
+ def source
82
+ loc = (@xml/'location').first.attributes
83
+ "#{loc['file'].split('/')[-3..-1].join('/')}:#{loc['line']}"
84
+ end
85
+
86
+ def original_signature
87
+ unescape "#{(@xml/'definition').innerHTML}#{(@xml/'argsstring').innerHTML}"
88
+ end
89
+
90
+ def has_default_arguments?
91
+ return @has_defaults if defined?(@has_defaults)
92
+ @has_defaults = !@arguments.detect {|a| a.has_default? }.nil?
93
+ end
94
+
95
+ def has_array_arguments?
96
+ return @has_array_arguments if defined?(@has_array_arguments)
97
+ @has_array_arguments = !@arguments.detect {|a| a.array_suffix }.nil?
98
+ end
99
+
100
+ def has_class_pointer_arguments?
101
+ return @has_class_pointer_arguments if defined?(@has_class_pointer_arguments)
102
+ @has_class_pointer_arguments = !@arguments.detect {|a| !a.is_native? && a.is_pointer? }.nil?
103
+ end
104
+
105
+ def has_complex_arguments?
106
+ return @has_complex_arguments if defined?(@has_complex_arguments)
107
+ @has_complex_arguments = !(@arguments + [@return_value]).compact.detect {|a| a.complex? }.nil?
108
+ end
109
+
110
+ def vararg?
111
+ @arguments.last && @arguments.last.vararg?
112
+ end
113
+
114
+ def arg_is_list(list_position, count_position)
115
+ @arguments[list_position ].is_list = true
116
+ @arguments[count_position].is_list_count = true
117
+ end
118
+
119
+ def template?
120
+ !@template_params.nil?
121
+ end
122
+
123
+ def public?
124
+ @xml[:prot] == 'public'
125
+ end
126
+
127
+ def template_params
128
+ @template_params
129
+ end
130
+
131
+ def inspect
132
+ "#<Function #{@prefix}_#{@name}(#{@arguments.inspect[1..-2]})>"
133
+ end
134
+
135
+ def <=>(other)
136
+ name <=> other.name
137
+ end
138
+
139
+ # ====== these methods are alias to
140
+ # generator methods on this object
141
+
142
+ def method_name(overloaded_index = nil)
143
+ gen.method_name(self, overloaded_index)
144
+ end
145
+
146
+ # =================================
147
+
148
+ private
149
+ def parse_xml
150
+ @arguments = []
151
+
152
+ (@xml/'param').each_with_index do |arg, i|
153
+ @arguments << Argument.new(self, arg, i + 1)
154
+ end
155
+
156
+ raw_type = (@xml/'/type').innerHTML
157
+
158
+ if raw_type.strip == ''
159
+ # no return type
160
+ else
161
+ arg = Argument.new(self, (@xml/'/type'))
162
+ @return_value = arg unless arg.create_type =~ /void\s*$/
163
+ end
164
+
165
+ @is_static = @xml[:static] == 'yes'
166
+ end
167
+
168
+ def parse_template_params
169
+ template_params = (@xml/'/templateparamlist/param')
170
+ if !template_params.empty?
171
+ @template_params = template_params.map do |param|
172
+ (param/'/type').innerHTML.gsub(/^\s*(typename|class)\s+/,'')
173
+ end
174
+ end
175
+ end
176
+ end
177
+ 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,20 @@
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 constructor?
17
+ f.first.constructor?
18
+ end
19
+ end
20
+ end