qtbindings 4.8.6.2 → 4.8.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (666) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING.LIB.txt +510 -510
  3. data/COPYING.txt +286 -286
  4. data/KNOWN_ISSUES.txt +17 -17
  5. data/Rakefile +5 -5
  6. data/bin/rbqtapi +0 -0
  7. data/bin/rbrcc +0 -0
  8. data/bin/rbuic4 +0 -0
  9. data/bin/smokeapi +0 -0
  10. data/bin/smokedeptool +0 -0
  11. data/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -5
  12. data/examples/designer/calculatorbuilder/calculatorform.rb +60 -60
  13. data/examples/designer/calculatorbuilder/calculatorform.ui +299 -299
  14. data/examples/designer/calculatorbuilder/main.rb +34 -34
  15. data/examples/designer/calculatorbuilder/makefile +2 -2
  16. data/examples/designer/calculatorform/calculatorform.rb +46 -46
  17. data/examples/designer/calculatorform/calculatorform.ui +277 -277
  18. data/examples/designer/calculatorform/main.rb +32 -32
  19. data/examples/designer/calculatorform/makefile +3 -3
  20. data/examples/desktop/screenshot/main.rb +32 -32
  21. data/examples/desktop/screenshot/screenshot.rb +157 -157
  22. data/examples/desktop/systray/images/bad.svg +64 -64
  23. data/examples/desktop/systray/images/heart.svg +55 -55
  24. data/examples/desktop/systray/images/trash.svg +58 -58
  25. data/examples/desktop/systray/main.rb +41 -41
  26. data/examples/desktop/systray/makefile +2 -2
  27. data/examples/desktop/systray/systray.qrc +7 -7
  28. data/examples/desktop/systray/window.rb +219 -219
  29. data/examples/dialogs/complexwizard/complexwizard.rb +140 -140
  30. data/examples/dialogs/complexwizard/licensewizard.rb +294 -294
  31. data/examples/dialogs/complexwizard/main.rb +31 -31
  32. data/examples/dialogs/configdialog/configdialog.rb +109 -109
  33. data/examples/dialogs/configdialog/main.rb +31 -31
  34. data/examples/dialogs/configdialog/pages.rb +140 -140
  35. data/examples/dialogs/extension/finddialog.rb +89 -89
  36. data/examples/dialogs/extension/main.rb +31 -31
  37. data/examples/dialogs/findfiles/main.rb +32 -32
  38. data/examples/dialogs/findfiles/window.rb +177 -177
  39. data/examples/dialogs/simplewizard/classwizard.rb +374 -374
  40. data/examples/dialogs/simplewizard/main.rb +31 -31
  41. data/examples/dialogs/simplewizard/simplewizard.rb +110 -110
  42. data/examples/dialogs/standarddialogs/dialog.rb +340 -340
  43. data/examples/dialogs/standarddialogs/main.rb +31 -31
  44. data/examples/dialogs/tabdialog/main.rb +38 -38
  45. data/examples/dialogs/tabdialog/tabdialog.rb +178 -178
  46. data/examples/draganddrop/draggableicons/dragwidget.rb +125 -125
  47. data/examples/draganddrop/draggableicons/main.rb +41 -41
  48. data/examples/draganddrop/draggabletext/draglabel.rb +51 -51
  49. data/examples/draganddrop/draggabletext/dragwidget.rb +94 -94
  50. data/examples/draganddrop/draggabletext/main.rb +33 -33
  51. data/examples/draganddrop/draggabletext/words.txt +41 -41
  52. data/examples/draganddrop/dropsite/dropsitewidget.rb +99 -99
  53. data/examples/draganddrop/dropsite/dropsitewindow.rb +114 -114
  54. data/examples/draganddrop/dropsite/main.rb +33 -33
  55. data/examples/draganddrop/fridgemagnets/draglabel.rb +78 -78
  56. data/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -130
  57. data/examples/draganddrop/fridgemagnets/main.rb +33 -33
  58. data/examples/draganddrop/fridgemagnets/words.txt +48 -48
  59. data/examples/draganddrop/puzzle/main.rb +33 -33
  60. data/examples/draganddrop/puzzle/mainwindow.rb +136 -136
  61. data/examples/draganddrop/puzzle/pieceslist.rb +95 -95
  62. data/examples/draganddrop/puzzle/puzzlewidget.rb +190 -190
  63. data/examples/graphicsview/collidingmice/main.rb +53 -53
  64. data/examples/graphicsview/collidingmice/makefile +2 -2
  65. data/examples/graphicsview/collidingmice/mice.qrc +5 -5
  66. data/examples/graphicsview/collidingmice/mouse.rb +176 -176
  67. data/examples/graphicsview/dragdroprobot/coloritem.rb +86 -86
  68. data/examples/graphicsview/dragdroprobot/main.rb +57 -57
  69. data/examples/graphicsview/dragdroprobot/makefile +2 -2
  70. data/examples/graphicsview/dragdroprobot/robot.qrc +5 -5
  71. data/examples/graphicsview/dragdroprobot/robot.rb +246 -246
  72. data/examples/itemviews/chart/chart.qrc +5 -5
  73. data/examples/itemviews/chart/main.rb +33 -33
  74. data/examples/itemviews/chart/mainwindow.rb +151 -151
  75. data/examples/itemviews/chart/makefile +2 -2
  76. data/examples/itemviews/chart/mydata.cht +8 -8
  77. data/examples/itemviews/chart/pieview.rb +516 -516
  78. data/examples/itemviews/chart/qtdata.cht +14 -14
  79. data/examples/itemviews/dirview/main.rb +39 -39
  80. data/examples/itemviews/pixelator/imagemodel.rb +51 -51
  81. data/examples/itemviews/pixelator/images.qrc +5 -5
  82. data/examples/itemviews/pixelator/main.rb +34 -34
  83. data/examples/itemviews/pixelator/mainwindow.rb +218 -218
  84. data/examples/itemviews/pixelator/makefile +3 -3
  85. data/examples/itemviews/pixelator/pixeldelegate.rb +67 -67
  86. data/examples/itemviews/puzzle/main.rb +36 -36
  87. data/examples/itemviews/puzzle/mainwindow.rb +143 -143
  88. data/examples/itemviews/puzzle/piecesmodel.rb +174 -174
  89. data/examples/itemviews/puzzle/puzzlewidget.rb +192 -192
  90. data/examples/itemviews/simpledommodel/domitem.rb +62 -62
  91. data/examples/itemviews/simpledommodel/dommodel.rb +139 -139
  92. data/examples/itemviews/simpledommodel/main.rb +33 -33
  93. data/examples/itemviews/simpledommodel/mainwindow.rb +66 -66
  94. data/examples/itemviews/simpletreemodel/default.txt +40 -40
  95. data/examples/itemviews/simpletreemodel/main.rb +41 -41
  96. data/examples/itemviews/simpletreemodel/makefile +2 -2
  97. data/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -5
  98. data/examples/itemviews/simpletreemodel/treeitem.rb +67 -67
  99. data/examples/itemviews/simpletreemodel/treemodel.rb +164 -164
  100. data/examples/itemviews/sortingmodel/default.txt +40 -40
  101. data/examples/itemviews/sortingmodel/main.rb +53 -53
  102. data/examples/itemviews/sortingmodel/treeitem.rb +73 -73
  103. data/examples/itemviews/sortingmodel/treemodel.rb +166 -166
  104. data/examples/itemviews/spinboxdelegate/main.rb +47 -47
  105. data/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -62
  106. data/examples/killerfilter/killerfilter.rb +55 -55
  107. data/examples/layouts/basiclayouts/dialog.rb +110 -110
  108. data/examples/layouts/basiclayouts/main.rb +31 -31
  109. data/examples/layouts/borderlayout/borderlayout.rb +190 -190
  110. data/examples/layouts/borderlayout/main.rb +32 -32
  111. data/examples/layouts/borderlayout/window.rb +52 -52
  112. data/examples/layouts/flowlayouts/flowlayout.rb +108 -108
  113. data/examples/layouts/flowlayouts/main.rb +32 -32
  114. data/examples/layouts/flowlayouts/window.rb +43 -43
  115. data/examples/mainwindows/application/main.rb +32 -32
  116. data/examples/mainwindows/application/mainwindow.rb +285 -285
  117. data/examples/mainwindows/dockwidgets/main.rb +32 -32
  118. data/examples/mainwindows/dockwidgets/mainwindow.rb +302 -302
  119. data/examples/mainwindows/mdi/main.rb +32 -32
  120. data/examples/mainwindows/mdi/mainwindow.rb +363 -363
  121. data/examples/mainwindows/mdi/mdichild.rb +152 -152
  122. data/examples/mainwindows/menus/main.rb +32 -32
  123. data/examples/mainwindows/menus/mainwindow.rb +327 -327
  124. data/examples/mainwindows/recentfiles/main.rb +32 -32
  125. data/examples/mainwindows/recentfiles/mainwindow.rb +258 -258
  126. data/examples/mainwindows/sdi/main.rb +32 -32
  127. data/examples/mainwindows/sdi/mainwindow.rb +335 -335
  128. data/examples/network/broadcastreceiver/main.rb +32 -32
  129. data/examples/network/broadcastreceiver/receiver.rb +64 -64
  130. data/examples/network/broadcastsender/main.rb +32 -32
  131. data/examples/network/broadcastsender/sender.rb +72 -72
  132. data/examples/network/fortuneclient/client.rb +149 -149
  133. data/examples/network/fortuneclient/main.rb +32 -32
  134. data/examples/network/fortuneserver/main.rb +32 -32
  135. data/examples/network/fortuneserver/server.rb +88 -88
  136. data/examples/network/ftp/ftpwindow.rb +259 -259
  137. data/examples/network/ftp/main.rb +32 -32
  138. data/examples/network/http/httpwindow.rb +187 -187
  139. data/examples/network/http/main.rb +32 -32
  140. data/examples/network/loopback/dialog.rb +163 -163
  141. data/examples/network/loopback/main.rb +32 -32
  142. data/examples/opengl/grabber/glwidget.rb +265 -265
  143. data/examples/opengl/grabber/main.rb +32 -32
  144. data/examples/opengl/grabber/mainwindow.rb +189 -189
  145. data/examples/opengl/hellogl/glwidget.rb +226 -226
  146. data/examples/opengl/hellogl/main.rb +32 -32
  147. data/examples/opengl/hellogl/window.rb +66 -66
  148. data/examples/opengl/textures/glwidget.rb +151 -151
  149. data/examples/opengl/textures/main.rb +32 -32
  150. data/examples/opengl/textures/window.rb +77 -77
  151. data/examples/painting/basicdrawing/main.rb +32 -32
  152. data/examples/painting/basicdrawing/renderarea.rb +166 -166
  153. data/examples/painting/basicdrawing/window.rb +215 -215
  154. data/examples/painting/concentriccircles/circlewidget.rb +88 -88
  155. data/examples/painting/concentriccircles/main.rb +32 -32
  156. data/examples/painting/concentriccircles/window.rb +72 -72
  157. data/examples/painting/fontsampler/main.rb +32 -32
  158. data/examples/painting/fontsampler/mainwindow.rb +369 -369
  159. data/examples/painting/fontsampler/mainwindowbase.ui +136 -136
  160. data/examples/painting/fontsampler/makefile +8 -8
  161. data/examples/painting/fontsampler/previewdialog.rb +257 -257
  162. data/examples/painting/fontsampler/previewdialogbase.ui +224 -224
  163. data/examples/painting/fontsampler/previewlabel.rb +43 -43
  164. data/examples/painting/imagecomposition/imagecomposer.rb +152 -152
  165. data/examples/painting/imagecomposition/imagecomposition.qrc +6 -6
  166. data/examples/painting/imagecomposition/main.rb +33 -33
  167. data/examples/painting/imagecomposition/makefile +2 -2
  168. data/examples/painting/painterpaths/main.rb +32 -32
  169. data/examples/painting/painterpaths/renderarea.rb +97 -97
  170. data/examples/painting/painterpaths/window.rb +247 -247
  171. data/examples/painting/svgviewer/files/bubbles.svg +212 -212
  172. data/examples/painting/svgviewer/files/cubic.svg +77 -77
  173. data/examples/painting/svgviewer/files/spheres.svg +79 -79
  174. data/examples/painting/svgviewer/main.rb +38 -38
  175. data/examples/painting/svgviewer/mainwindow.rb +99 -99
  176. data/examples/painting/svgviewer/makefile +2 -2
  177. data/examples/painting/svgviewer/svgview.rb +156 -156
  178. data/examples/painting/svgviewer/svgviewer.qrc +6 -6
  179. data/examples/painting/svgviewer/svgwindow.rb +87 -87
  180. data/examples/painting/transformations/main.rb +32 -32
  181. data/examples/painting/transformations/renderarea.rb +127 -127
  182. data/examples/painting/transformations/window.rb +153 -153
  183. data/examples/passivepopup/passivepopup.rb +38 -38
  184. data/examples/qdbus/chat/chat.rb +146 -146
  185. data/examples/qdbus/chat/chat_adaptor.rb +12 -12
  186. data/examples/qdbus/chat/chat_interface.rb +13 -13
  187. data/examples/qdbus/chat/chatmainwindow.ui +184 -184
  188. data/examples/qdbus/chat/chatsetnickname.ui +145 -145
  189. data/examples/qdbus/chat/makefile +8 -8
  190. data/examples/qdbus/complexpingpong/complexping.rb +92 -92
  191. data/examples/qdbus/complexpingpong/complexpong.rb +83 -83
  192. data/examples/qdbus/complexpingpong/ping-common.rb +1 -1
  193. data/examples/qdbus/listnames/listnames.rb +69 -69
  194. data/examples/qdbus/pingpong/ping-common.rb +1 -1
  195. data/examples/qdbus/pingpong/ping.rb +52 -52
  196. data/examples/qdbus/pingpong/pong.rb +55 -55
  197. data/examples/qdbus/remotecontrolledcar/car/car.rb +151 -151
  198. data/examples/qdbus/remotecontrolledcar/car/main.rb +50 -50
  199. data/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -66
  200. data/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -61
  201. data/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -32
  202. data/examples/qdbus/remotecontrolledcar/controller/makefile +2 -2
  203. data/examples/qtscribble/scribble.rb +270 -270
  204. data/examples/richtext/calendar/main.rb +33 -33
  205. data/examples/richtext/calendar/mainwindow.rb +173 -173
  206. data/examples/richtext/orderform/detailsdialog.rb +130 -130
  207. data/examples/richtext/orderform/main.rb +34 -34
  208. data/examples/richtext/orderform/mainwindow.rb +194 -194
  209. data/examples/richtext/syntaxhighlighter/examples/example +79 -79
  210. data/examples/richtext/syntaxhighlighter/highlighter.rb +90 -90
  211. data/examples/richtext/syntaxhighlighter/main.rb +34 -34
  212. data/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -105
  213. data/examples/ruboids/LICENSE.txt +58 -58
  214. data/examples/ruboids/Manifest +26 -26
  215. data/examples/ruboids/README +53 -53
  216. data/examples/ruboids/TODO +29 -29
  217. data/examples/ruboids/boids.properties +33 -33
  218. data/examples/ruboids/generateManifest.rb +42 -42
  219. data/examples/ruboids/release.rb +152 -152
  220. data/examples/ruboids/ruboids/Boid.rb +141 -141
  221. data/examples/ruboids/ruboids/BoidView.rb +159 -159
  222. data/examples/ruboids/ruboids/Camera.rb +24 -24
  223. data/examples/ruboids/ruboids/CameraDialog.rb +218 -218
  224. data/examples/ruboids/ruboids/Canvas.rb +143 -143
  225. data/examples/ruboids/ruboids/Cloud.rb +61 -61
  226. data/examples/ruboids/ruboids/CloudView.rb +54 -54
  227. data/examples/ruboids/ruboids/Flock.rb +47 -47
  228. data/examples/ruboids/ruboids/Graphics.rb +278 -278
  229. data/examples/ruboids/ruboids/Params.rb +87 -87
  230. data/examples/ruboids/ruboids/Point.rb +153 -153
  231. data/examples/ruboids/ruboids/Thing.rb +34 -34
  232. data/examples/ruboids/ruboids/Triangle.rb +21 -21
  233. data/examples/ruboids/ruboids/View.rb +88 -88
  234. data/examples/ruboids/ruboids/World.rb +82 -82
  235. data/examples/ruboids/ruboids/WorldWindow.rb +52 -52
  236. data/examples/ruboids/ruboids/info.rb +12 -12
  237. data/examples/ruboids/ruboids/ruboids.rb +29 -29
  238. data/examples/threading/main_thread.rb +19 -19
  239. data/examples/tutorial/t1/t1.rb +10 -10
  240. data/examples/tutorial/t10/cannon.rb +72 -72
  241. data/examples/tutorial/t10/lcdrange.rb +45 -45
  242. data/examples/tutorial/t10/t10.rb +55 -55
  243. data/examples/tutorial/t11/cannon.rb +124 -124
  244. data/examples/tutorial/t11/lcdrange.rb +45 -45
  245. data/examples/tutorial/t11/t11.rb +65 -65
  246. data/examples/tutorial/t12/cannon.rb +158 -158
  247. data/examples/tutorial/t12/lcdrange.rb +59 -59
  248. data/examples/tutorial/t12/t12.rb +66 -66
  249. data/examples/tutorial/t13/cannon.rb +208 -208
  250. data/examples/tutorial/t13/gamebrd.rb +113 -113
  251. data/examples/tutorial/t13/lcdrange.rb +60 -60
  252. data/examples/tutorial/t13/t13.rb +11 -11
  253. data/examples/tutorial/t14/cannon.rb +263 -263
  254. data/examples/tutorial/t14/gamebrd.rb +123 -123
  255. data/examples/tutorial/t14/lcdrange.rb +63 -63
  256. data/examples/tutorial/t14/t14.rb +11 -11
  257. data/examples/tutorial/t2/t2.rb +16 -16
  258. data/examples/tutorial/t3/t3.rb +18 -18
  259. data/examples/tutorial/t4/t4.rb +25 -25
  260. data/examples/tutorial/t5/t5.rb +37 -37
  261. data/examples/tutorial/t6/t6.rb +52 -52
  262. data/examples/tutorial/t7/lcdrange.rb +32 -32
  263. data/examples/tutorial/t7/t7.rb +42 -42
  264. data/examples/tutorial/t8/cannon.rb +38 -38
  265. data/examples/tutorial/t8/lcdrange.rb +45 -45
  266. data/examples/tutorial/t8/t8.rb +43 -43
  267. data/examples/tutorial/t9/cannon.rb +45 -45
  268. data/examples/tutorial/t9/lcdrange.rb +46 -46
  269. data/examples/tutorial/t9/t9.rb +43 -43
  270. data/examples/widgets/analogclock/analogclock.rb +94 -94
  271. data/examples/widgets/analogclock/main.rb +9 -9
  272. data/examples/widgets/calculator/button.rb +45 -45
  273. data/examples/widgets/calculator/calculator.rb +382 -382
  274. data/examples/widgets/calculator/main.rb +32 -32
  275. data/examples/widgets/charactermap/characterwidget.rb +109 -109
  276. data/examples/widgets/charactermap/main.rb +32 -32
  277. data/examples/widgets/charactermap/mainwindow.rb +118 -118
  278. data/examples/widgets/digitalclock/digitalclock.rb +30 -30
  279. data/examples/widgets/digitalclock/main.rb +9 -9
  280. data/examples/widgets/groupbox/main.rb +32 -32
  281. data/examples/widgets/groupbox/window.rb +134 -134
  282. data/examples/widgets/icons/iconpreviewarea.rb +110 -110
  283. data/examples/widgets/icons/iconsizespinbox.rb +39 -39
  284. data/examples/widgets/icons/imagedelegate.rb +73 -73
  285. data/examples/widgets/icons/main.rb +32 -32
  286. data/examples/widgets/icons/mainwindow.rb +351 -351
  287. data/examples/widgets/imageviewer/imageviewer.rb +219 -219
  288. data/examples/widgets/imageviewer/main.rb +32 -32
  289. data/examples/widgets/lineedits/main.rb +32 -32
  290. data/examples/widgets/lineedits/window.rb +199 -199
  291. data/examples/widgets/movie/main.rb +32 -32
  292. data/examples/widgets/movie/movieplayer.rb +201 -201
  293. data/examples/widgets/screenshot/main.rb +32 -32
  294. data/examples/widgets/screenshot/screenshot.rb +154 -154
  295. data/examples/widgets/scribble/main.rb +32 -32
  296. data/examples/widgets/scribble/mainwindow.rb +202 -202
  297. data/examples/widgets/scribble/scribblearea.rb +154 -154
  298. data/examples/widgets/sliders/main.rb +32 -32
  299. data/examples/widgets/sliders/slidersgroup.rb +97 -97
  300. data/examples/widgets/sliders/window.rb +124 -124
  301. data/examples/widgets/spinboxes/main.rb +32 -32
  302. data/examples/widgets/spinboxes/window.rb +213 -213
  303. data/examples/widgets/tetrix/main.rb +33 -33
  304. data/examples/widgets/tetrix/tetrixboard.rb +346 -346
  305. data/examples/widgets/tetrix/tetrixpiece.rb +135 -135
  306. data/examples/widgets/tetrix/tetrixwindow.rb +88 -88
  307. data/examples/widgets/tooltips/main.rb +32 -32
  308. data/examples/widgets/tooltips/shapeitem.rb +31 -31
  309. data/examples/widgets/tooltips/sortingbox.rb +222 -222
  310. data/examples/widgets/wiggly/dialog.rb +48 -48
  311. data/examples/widgets/wiggly/main.rb +9 -9
  312. data/examples/widgets/wiggly/wigglywidget.rb +75 -75
  313. data/examples/widgets/windowflags/controllerwindow.rb +195 -195
  314. data/examples/widgets/windowflags/main.rb +32 -32
  315. data/examples/widgets/windowflags/previewwindow.rb +103 -103
  316. data/examples/xml/dombookmarks/frank.xbel +230 -230
  317. data/examples/xml/dombookmarks/jennifer.xbel +93 -93
  318. data/examples/xml/dombookmarks/main.rb +34 -34
  319. data/examples/xml/dombookmarks/mainwindow.rb +129 -129
  320. data/examples/xml/dombookmarks/xbeltree.rb +172 -172
  321. data/examples/xml/saxbookmarks/frank.xbel +230 -230
  322. data/examples/xml/saxbookmarks/jennifer.xbel +93 -93
  323. data/examples/xml/saxbookmarks/main.rb +34 -34
  324. data/examples/xml/saxbookmarks/mainwindow.rb +144 -144
  325. data/examples/xml/saxbookmarks/xbelgenerator.rb +95 -95
  326. data/examples/xml/saxbookmarks/xbelhandler.rb +122 -122
  327. data/ext/CMakeLists.txt +3 -0
  328. data/ext/cmake/modules/BasicFindPackageVersion.cmake.in +30 -30
  329. data/ext/cmake/modules/CMakeCSharpCompiler.cmake.in +7 -7
  330. data/ext/cmake/modules/CMakeCSharpInformation.cmake +366 -366
  331. data/ext/cmake/modules/CMakeDetermineCSharpCompiler.cmake +85 -85
  332. data/ext/cmake/modules/CMakeTestCSharpCompiler.cmake +1 -1
  333. data/ext/cmake/modules/FindLibraryWithDebug.cmake +113 -113
  334. data/ext/cmake/modules/FindMono.cmake +36 -36
  335. data/ext/cmake/modules/FindPHP5.cmake +179 -179
  336. data/ext/cmake/modules/FindPerlMore.cmake +78 -78
  337. data/ext/cmake/modules/FindPhonon.cmake +71 -71
  338. data/ext/cmake/modules/FindQImageBlitz.cmake +51 -51
  339. data/ext/cmake/modules/FindQScintilla.cmake +57 -57
  340. data/ext/cmake/modules/FindQwt5.cmake +104 -104
  341. data/ext/cmake/modules/FindRuby.cmake +279 -279
  342. data/ext/cmake/modules/FindSmoke.cmake +78 -78
  343. data/ext/cmake/modules/MacroLogFeature.cmake +146 -146
  344. data/ext/cmake/modules/MacroOptionalAddBindings.cmake +47 -47
  345. data/ext/cmake/modules/MacroOptionalFindPackage.cmake +28 -28
  346. data/ext/cmake/modules/MacroPushRequiredVars.cmake +47 -47
  347. data/ext/cmake/modules/MacroWriteBasicCMakeVersionFile.cmake +22 -22
  348. data/ext/cmake/modules/SmokeConfig.cmake.in +109 -109
  349. data/ext/generator/CMakeLists.txt +38 -38
  350. data/ext/generator/cmake/BasicFindPackageVersion.cmake.in +30 -30
  351. data/ext/generator/cmake/CMakeLists.txt +24 -24
  352. data/ext/generator/cmake/FindLibraryWithDebug.cmake +113 -113
  353. data/ext/generator/cmake/FindPhonon.cmake +71 -71
  354. data/ext/generator/cmake/FindQImageBlitz.cmake +51 -51
  355. data/ext/generator/cmake/FindQScintilla.cmake +57 -57
  356. data/ext/generator/cmake/FindQwt5.cmake +104 -104
  357. data/ext/generator/cmake/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -85
  358. data/ext/generator/cmake/MacroLogFeature.cmake +146 -146
  359. data/ext/generator/cmake/MacroOptionalAddBindings.cmake +47 -47
  360. data/ext/generator/cmake/MacroOptionalFindPackage.cmake +28 -28
  361. data/ext/generator/cmake/MacroWriteBasicCMakeVersionFile.cmake +22 -22
  362. data/ext/generator/cmake/SmokeConfig.cmake.in +109 -109
  363. data/ext/generator/config.h +25 -25
  364. data/ext/generator/generator_export.h +31 -31
  365. data/ext/generator/generatorenvironment.cpp +52 -52
  366. data/ext/generator/generatorenvironment.h +35 -35
  367. data/ext/generator/generatorpreprocessor.cpp +303 -303
  368. data/ext/generator/generatorpreprocessor.h +83 -83
  369. data/ext/generator/generators/CMakeLists.txt +4 -4
  370. data/ext/generator/generators/dump/CMakeLists.txt +15 -15
  371. data/ext/generator/generators/dump/generator_dump.cpp +36 -36
  372. data/ext/generator/generators/smoke/CMakeLists.txt +18 -18
  373. data/ext/generator/generators/smoke/generator_smoke.cpp +240 -240
  374. data/ext/generator/generators/smoke/globals.h +140 -140
  375. data/ext/generator/generators/smoke/helpers.cpp +793 -793
  376. data/ext/generator/generators/smoke/writeClasses.cpp +502 -502
  377. data/ext/generator/generators/smoke/writeSmokeDataFile.cpp +754 -754
  378. data/ext/generator/generatorvisitor.cpp +922 -922
  379. data/ext/generator/generatorvisitor.h +119 -119
  380. data/ext/generator/name_compiler.cpp +205 -205
  381. data/ext/generator/name_compiler.h +76 -76
  382. data/ext/generator/options.cpp +33 -33
  383. data/ext/generator/options.h +46 -46
  384. data/ext/generator/parser/CMakeLists.txt +50 -50
  385. data/ext/generator/parser/ast.cpp +21 -21
  386. data/ext/generator/parser/ast.h +923 -923
  387. data/ext/generator/parser/astutilities.h +65 -65
  388. data/ext/generator/parser/codegenerator.cpp +867 -867
  389. data/ext/generator/parser/codegenerator.h +180 -180
  390. data/ext/generator/parser/codemodel_fwd.h +76 -76
  391. data/ext/generator/parser/commentformatter.cpp +54 -54
  392. data/ext/generator/parser/commentformatter.h +45 -45
  393. data/ext/generator/parser/commentparser.cpp +109 -109
  394. data/ext/generator/parser/commentparser.h +84 -84
  395. data/ext/generator/parser/control.cpp +40 -40
  396. data/ext/generator/parser/control.h +51 -51
  397. data/ext/generator/parser/cppparser_export.h +33 -33
  398. data/ext/generator/parser/default_visitor.cpp +470 -470
  399. data/ext/generator/parser/default_visitor.h +116 -116
  400. data/ext/generator/parser/dumptree.cpp +146 -146
  401. data/ext/generator/parser/dumptree.h +50 -50
  402. data/ext/generator/parser/indexedstring.cpp +213 -213
  403. data/ext/generator/parser/indexedstring.h +147 -147
  404. data/ext/generator/parser/kdevelop-parser-rev +1 -1
  405. data/ext/generator/parser/kdevvarlengtharray.h +346 -346
  406. data/ext/generator/parser/lexer.cpp +964 -964
  407. data/ext/generator/parser/lexer.h +308 -308
  408. data/ext/generator/parser/listnode.cpp +20 -20
  409. data/ext/generator/parser/listnode.h +97 -97
  410. data/ext/generator/parser/memorypool.cpp +20 -20
  411. data/ext/generator/parser/memorypool.h +41 -41
  412. data/ext/generator/parser/name_compiler.cpp +190 -190
  413. data/ext/generator/parser/name_compiler.h +77 -77
  414. data/ext/generator/parser/parser.cpp +4708 -4708
  415. data/ext/generator/parser/parser.h +290 -290
  416. data/ext/generator/parser/parsesession.cpp +106 -106
  417. data/ext/generator/parser/parsesession.h +87 -87
  418. data/ext/generator/parser/problem.h +21 -21
  419. data/ext/generator/parser/rpp/CMakeLists.txt +45 -45
  420. data/ext/generator/parser/rpp/Makefile.am +13 -13
  421. data/ext/generator/parser/rpp/anchor.h +51 -51
  422. data/ext/generator/parser/rpp/appendedlist.h +363 -363
  423. data/ext/generator/parser/rpp/chartools.cpp +146 -146
  424. data/ext/generator/parser/rpp/chartools.h +99 -99
  425. data/ext/generator/parser/rpp/macrorepository.cpp +44 -44
  426. data/ext/generator/parser/rpp/macrorepository.h +59 -59
  427. data/ext/generator/parser/rpp/pp-configuration +86 -86
  428. data/ext/generator/parser/rpp/pp-engine.h +267 -267
  429. data/ext/generator/parser/rpp/pp-environment.cpp +271 -271
  430. data/ext/generator/parser/rpp/pp-environment.h +119 -119
  431. data/ext/generator/parser/rpp/pp-internal.cpp +38 -38
  432. data/ext/generator/parser/rpp/pp-internal.h +37 -37
  433. data/ext/generator/parser/rpp/pp-location.cpp +191 -191
  434. data/ext/generator/parser/rpp/pp-location.h +89 -89
  435. data/ext/generator/parser/rpp/pp-macro-expander.cpp +568 -568
  436. data/ext/generator/parser/rpp/pp-macro-expander.cpp.orig +558 -558
  437. data/ext/generator/parser/rpp/pp-macro-expander.h +130 -130
  438. data/ext/generator/parser/rpp/pp-macro.cpp +153 -153
  439. data/ext/generator/parser/rpp/pp-macro.h +176 -176
  440. data/ext/generator/parser/rpp/pp-scanner.cpp +311 -311
  441. data/ext/generator/parser/rpp/pp-scanner.h +97 -97
  442. data/ext/generator/parser/rpp/pp-stream.cpp +425 -425
  443. data/ext/generator/parser/rpp/pp-stream.h +183 -183
  444. data/ext/generator/parser/rpp/preprocessor.cpp +65 -65
  445. data/ext/generator/parser/rpp/preprocessor.h +80 -80
  446. data/ext/generator/parser/rpp/rpp.pri +2 -2
  447. data/ext/generator/parser/rpp/test/t001.cpp +23 -23
  448. data/ext/generator/parser/rpp/test/t002.cpp +15 -15
  449. data/ext/generator/parser/rpp/test/t003.cpp +10 -10
  450. data/ext/generator/parser/rpp/test/t004.cpp +9 -9
  451. data/ext/generator/parser/rpp/test/t005.cpp +10 -10
  452. data/ext/generator/parser/rpp/test/t006.cpp +10 -10
  453. data/ext/generator/parser/rpp/test/t007.cpp +6 -6
  454. data/ext/generator/parser/rpp/test/t008.cpp +6 -6
  455. data/ext/generator/parser/rpp/test/t009.cpp +5 -5
  456. data/ext/generator/parser/rpp/test/t010.cpp +15 -15
  457. data/ext/generator/parser/rpp/test/t011.cpp +9 -9
  458. data/ext/generator/parser/rpp/tests/CMakeLists.txt +17 -17
  459. data/ext/generator/parser/rpp/tests/main.cpp +69 -69
  460. data/ext/generator/parser/rxx.pri +50 -50
  461. data/ext/generator/parser/rxx_allocator.h +128 -128
  462. data/ext/generator/parser/safetycounter.h +57 -57
  463. data/ext/generator/parser/simplecursor.h +74 -74
  464. data/ext/generator/parser/stringhelpers.cpp +577 -577
  465. data/ext/generator/parser/stringhelpers.h +118 -118
  466. data/ext/generator/parser/symbol.h +140 -140
  467. data/ext/generator/parser/tests/CMakeLists.txt +46 -46
  468. data/ext/generator/parser/tests/test_generator.cpp +259 -259
  469. data/ext/generator/parser/tests/test_parser.cpp +474 -474
  470. data/ext/generator/parser/tests/test_pool.cpp +109 -109
  471. data/ext/generator/parser/tests/test_pool.h +35 -35
  472. data/ext/generator/parser/tests/testconfig.h.cmake +4 -4
  473. data/ext/generator/parser/tokens.cpp +367 -367
  474. data/ext/generator/parser/tokens.h +148 -148
  475. data/ext/generator/parser/type_compiler.cpp +135 -135
  476. data/ext/generator/parser/type_compiler.h +68 -68
  477. data/ext/generator/parser/visitor.cpp +115 -115
  478. data/ext/generator/parser/visitor.h +138 -138
  479. data/ext/generator/smoke.h +557 -557
  480. data/ext/generator/smokegen_string.h +43 -43
  481. data/ext/generator/type.cpp +204 -204
  482. data/ext/generator/type.h +497 -497
  483. data/ext/generator/type_compiler.cpp +277 -277
  484. data/ext/generator/type_compiler.h +80 -80
  485. data/ext/ruby/CMakeLists.txt +64 -64
  486. data/ext/ruby/qtdeclarative/CMakeLists.txt +17 -17
  487. data/ext/ruby/qtdeclarative/qtdeclarative.cpp +67 -67
  488. data/ext/ruby/qtdeclarative/qtdeclarative.rb +17 -17
  489. data/ext/ruby/qtdeclarative/qtdeclarativehandlers.cpp +36 -36
  490. data/ext/ruby/qtruby/AUTHORS +54 -54
  491. data/ext/ruby/qtruby/COPYING +355 -355
  492. data/ext/ruby/qtruby/COPYING.LIB +510 -510
  493. data/ext/ruby/qtruby/ChangeLog +3732 -3732
  494. data/ext/ruby/qtruby/INSTALL +79 -79
  495. data/ext/ruby/qtruby/README +264 -264
  496. data/ext/ruby/qtruby/TODO +8 -8
  497. data/ext/ruby/qtruby/bin/rbqtapi +152 -152
  498. data/ext/ruby/qtruby/rails_support/CMakeLists.txt +1 -1
  499. data/ext/ruby/qtruby/rails_support/active_item_model.rb +234 -234
  500. data/ext/ruby/qtruby/rails_support/active_table_model.rb +122 -122
  501. data/ext/ruby/qtruby/src/Qt.cpp +8 -8
  502. data/ext/ruby/qtruby/src/marshall_basetypes.h +208 -208
  503. data/ext/ruby/qtruby/src/marshall_complex.h +175 -175
  504. data/ext/ruby/qtruby/src/marshall_macros.h +647 -647
  505. data/ext/ruby/qtruby/src/marshall_types.cpp +815 -815
  506. data/ext/ruby/qtruby/src/marshall_types.h +240 -240
  507. data/ext/ruby/qtruby/src/qtruby.cpp +69 -12
  508. data/ext/ruby/qtruby/src/qtruby.h +1 -1
  509. data/ext/ruby/qtruby/test/opoverloading.rb +46 -46
  510. data/ext/ruby/qtruby/test/unittests.rb +151 -151
  511. data/ext/ruby/qtruby/tools/rbrcc/main.cpp +173 -173
  512. data/ext/ruby/qtruby/tools/rbrcc/rbrcc.pro +14 -14
  513. data/ext/ruby/qtruby/tools/rbrcc/rcc.cpp +648 -648
  514. data/ext/ruby/qtruby/tools/rbrcc/rcc.h +165 -165
  515. data/ext/ruby/qtruby/tools/rbuic/LICENSE.GPL +280 -280
  516. data/ext/ruby/qtruby/tools/rbuic/TODO +4 -4
  517. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.cpp +106 -106
  518. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.h +95 -95
  519. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.cpp +102 -102
  520. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.h +85 -85
  521. data/ext/ruby/qtruby/tools/rbuic/driver.cpp +384 -384
  522. data/ext/ruby/qtruby/tools/rbuic/driver.h +141 -141
  523. data/ext/ruby/qtruby/tools/rbuic/option.h +3 -0
  524. data/ext/ruby/qtruby/tools/rbuic/rbuic.pri +23 -23
  525. data/ext/ruby/qtruby/tools/rbuic/rbuic4.pro +43 -43
  526. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.cpp +150 -150
  527. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.h +83 -83
  528. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.cpp +217 -217
  529. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.h +85 -85
  530. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.cpp +185 -185
  531. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.h +86 -86
  532. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.cpp +88 -88
  533. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.h +83 -83
  534. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.cpp +126 -126
  535. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.h +87 -87
  536. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.cpp +2478 -2478
  537. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.h +314 -314
  538. data/ext/ruby/qtruby/tools/rbuic/ruby/ruby.pri +18 -18
  539. data/ext/ruby/qtruby/tools/rbuic/treewalker.cpp +318 -318
  540. data/ext/ruby/qtruby/tools/rbuic/treewalker.h +139 -139
  541. data/ext/ruby/qtruby/tools/rbuic/ui4.cpp +7623 -7623
  542. data/ext/ruby/qtruby/tools/rbuic/ui4.h +3180 -3180
  543. data/ext/ruby/qtruby/tools/rbuic/utils.h +125 -125
  544. data/ext/ruby/qtruby/tools/rbuic/validator.cpp +100 -100
  545. data/ext/ruby/qtruby/tools/rbuic/validator.h +80 -80
  546. data/ext/ruby/qtscript/CMakeLists.txt +19 -19
  547. data/ext/ruby/qtscript/qtscript.cpp +83 -83
  548. data/ext/ruby/qtscript/qtscript.rb +40 -40
  549. data/ext/ruby/qtscript/qtscripthandlers.cpp +37 -37
  550. data/ext/ruby/qtscript/smokedata.cpp +1403 -1403
  551. data/ext/ruby/qttest/CMakeLists.txt +18 -18
  552. data/ext/ruby/qttest/ChangeLog +9 -9
  553. data/ext/ruby/qttest/examples/myfirsttest.rb +30 -30
  554. data/ext/ruby/qttest/qttest.cpp +83 -83
  555. data/ext/ruby/qttest/qttest.rb +166 -166
  556. data/ext/ruby/qttest/qttesthandlers.cpp +37 -37
  557. data/ext/ruby/qtuitools/CMakeLists.txt +16 -16
  558. data/ext/ruby/qtuitools/qtuitools.cpp +83 -83
  559. data/ext/ruby/qtuitools/qtuitools.rb +17 -17
  560. data/ext/ruby/qtuitools/qtuitoolshandlers.cpp +32 -32
  561. data/ext/ruby/qtwebkit/CMakeLists.txt +17 -17
  562. data/ext/ruby/qtwebkit/qtwebkit.cpp +67 -67
  563. data/ext/ruby/qtwebkit/qtwebkit.rb +17 -17
  564. data/ext/ruby/qtwebkit/qtwebkithandlers.cpp +40 -40
  565. data/ext/smoke/deptool/CMakeLists.txt +7 -7
  566. data/ext/smoke/deptool/main.cpp +128 -128
  567. data/ext/smoke/qtcore/CMakeLists.txt +88 -88
  568. data/ext/smoke/qtcore/QtGuess.txt +180 -180
  569. data/ext/smoke/qtcore/config.xml.cmake +10 -10
  570. data/ext/smoke/qtcore/qt-config.xml.cmake +21 -21
  571. data/ext/smoke/qtcore/qtcore_includes.h +1 -1
  572. data/ext/smoke/qtcore/smokeconfig.xml +193 -193
  573. data/ext/smoke/qtcore/tests/CMakeLists.txt +13 -13
  574. data/ext/smoke/qtcore/tests/test.cpp +846 -846
  575. data/ext/smoke/qtcore_smoke.h +16 -16
  576. data/ext/smoke/qtdbus/CMakeLists.txt +38 -38
  577. data/ext/smoke/qtdbus/config.xml.cmake +11 -11
  578. data/ext/smoke/qtdbus/qtdbus_includes.h +2 -2
  579. data/ext/smoke/qtdbus/smokeconfig.xml +65 -65
  580. data/ext/smoke/qtdbus_smoke.h +16 -16
  581. data/ext/smoke/qtdeclarative/CMakeLists.txt +45 -45
  582. data/ext/smoke/qtdeclarative/config.xml.cmake +12 -12
  583. data/ext/smoke/qtdeclarative/qtdeclarative_includes.h +3 -3
  584. data/ext/smoke/qtdeclarative/smokeconfig.xml +59 -59
  585. data/ext/smoke/qtdeclarative_smoke.h +16 -16
  586. data/ext/smoke/qtgui/CMakeLists.txt +76 -76
  587. data/ext/smoke/qtgui/config.xml.cmake +11 -11
  588. data/ext/smoke/qtgui/qtgui_includes.h +7 -7
  589. data/ext/smoke/qtgui/smokeconfig.xml +500 -500
  590. data/ext/smoke/qtgui_smoke.h +16 -16
  591. data/ext/smoke/qthelp/CMakeLists.txt +45 -45
  592. data/ext/smoke/qthelp/config.xml.cmake +13 -13
  593. data/ext/smoke/qthelp/qthelp_includes.h +3 -3
  594. data/ext/smoke/qthelp/smokeconfig.xml +54 -54
  595. data/ext/smoke/qthelp_smoke.h +16 -16
  596. data/ext/smoke/qtmultimedia/CMakeLists.txt +42 -42
  597. data/ext/smoke/qtmultimedia/config.xml.cmake +12 -12
  598. data/ext/smoke/qtmultimedia/qtmultimedia_includes.h +3 -3
  599. data/ext/smoke/qtmultimedia/smokeconfig.xml +51 -51
  600. data/ext/smoke/qtmultimedia_smoke.h +16 -16
  601. data/ext/smoke/qtnetwork/CMakeLists.txt +38 -38
  602. data/ext/smoke/qtnetwork/config.xml.cmake +11 -11
  603. data/ext/smoke/qtnetwork/qtnetwork_includes.h +2 -2
  604. data/ext/smoke/qtnetwork/smokeconfig.xml +81 -81
  605. data/ext/smoke/qtnetwork_smoke.h +16 -16
  606. data/ext/smoke/qtopengl/CMakeLists.txt +43 -43
  607. data/ext/smoke/qtopengl/config.xml.cmake +13 -13
  608. data/ext/smoke/qtopengl/qtopengl_includes.h +3 -3
  609. data/ext/smoke/qtopengl/smokeconfig.xml +58 -58
  610. data/ext/smoke/qtopengl_smoke.h +16 -16
  611. data/ext/smoke/qtscript/CMakeLists.txt +31 -31
  612. data/ext/smoke/qtscript/config.xml.cmake +11 -11
  613. data/ext/smoke/qtscript/qtscript_includes.h +14 -14
  614. data/ext/smoke/qtscript/smokeconfig.xml +39 -39
  615. data/ext/smoke/qtscript_smoke.h +16 -16
  616. data/ext/smoke/qtsql/CMakeLists.txt +45 -45
  617. data/ext/smoke/qtsql/config.xml.cmake +11 -11
  618. data/ext/smoke/qtsql/qtsql_includes.h +3 -3
  619. data/ext/smoke/qtsql/smokeconfig.xml +60 -60
  620. data/ext/smoke/qtsql_smoke.h +16 -16
  621. data/ext/smoke/qtsvg/CMakeLists.txt +43 -43
  622. data/ext/smoke/qtsvg/config.xml.cmake +12 -12
  623. data/ext/smoke/qtsvg/qtsvg_includes.h +3 -3
  624. data/ext/smoke/qtsvg/smokeconfig.xml +46 -46
  625. data/ext/smoke/qtsvg_smoke.h +16 -16
  626. data/ext/smoke/qttest/CMakeLists.txt +35 -35
  627. data/ext/smoke/qttest/config.xml.cmake +12 -12
  628. data/ext/smoke/qttest/qttest_includes.h +14 -14
  629. data/ext/smoke/qttest/smokeconfig.xml +36 -36
  630. data/ext/smoke/qttest_smoke.h +16 -16
  631. data/ext/smoke/qtuitools/CMakeLists.txt +30 -30
  632. data/ext/smoke/qtuitools/config.xml.cmake +12 -12
  633. data/ext/smoke/qtuitools/qtuitools_includes.h +1 -1
  634. data/ext/smoke/qtuitools/smokeconfig.xml +20 -20
  635. data/ext/smoke/qtuitools_smoke.h +16 -16
  636. data/ext/smoke/qtwebkit/CMakeLists.txt +36 -36
  637. data/ext/smoke/qtwebkit/config.xml.cmake +11 -11
  638. data/ext/smoke/qtwebkit/qtwebkit_includes.h +1 -1
  639. data/ext/smoke/qtwebkit/smokeconfig.xml +48 -48
  640. data/ext/smoke/qtwebkit_smoke.h +16 -16
  641. data/ext/smoke/qtxml/CMakeLists.txt +41 -41
  642. data/ext/smoke/qtxml/config.xml.cmake +11 -11
  643. data/ext/smoke/qtxml/qtxml_includes.h +2 -2
  644. data/ext/smoke/qtxml/smokeconfig.xml +70 -70
  645. data/ext/smoke/qtxml_smoke.h +16 -16
  646. data/ext/smoke/qtxmlpatterns/CMakeLists.txt +42 -42
  647. data/ext/smoke/qtxmlpatterns/config.xml.cmake +12 -12
  648. data/ext/smoke/qtxmlpatterns/qtxmlpatterns_includes.h +3 -3
  649. data/ext/smoke/qtxmlpatterns/smokeconfig.xml +80 -80
  650. data/ext/smoke/qtxmlpatterns_smoke.h +16 -16
  651. data/ext/smoke/smokeapi/CMakeLists.txt +9 -9
  652. data/ext/smoke/smokeapi/main.cpp +309 -309
  653. data/ext/smoke/smokebase/CMakeLists.txt +11 -11
  654. data/ext/smoke/smokebase/smokebase.cpp +6 -6
  655. data/ext/smoke/solid_smoke.h +16 -16
  656. data/extconf.rb +2 -2
  657. data/lib/Qt.rb +1 -1
  658. data/lib/Qt4.rb +111 -111
  659. data/lib/qtbindings_version.rb +2 -2
  660. data/lib/qtdeclarative/qtdeclarative.rb +17 -17
  661. data/lib/qtscript/qtscript.rb +40 -40
  662. data/lib/qttest/qttest.rb +166 -166
  663. data/lib/qtuitools/qtuitools.rb +17 -17
  664. data/lib/qtwebkit/qtwebkit.rb +17 -17
  665. data/qtbindings.gemspec +18 -18
  666. metadata +48 -48
@@ -1,754 +1,754 @@
1
- /*
2
- Generator for the SMOKE sources
3
- Copyright (C) 2009 Arno Rehn <arno@arnorehn.de>
4
-
5
- This program is free software; you can redistribute it and/or modify
6
- it under the terms of the GNU General Public License as published by
7
- the Free Software Foundation; either version 2 of the License, or
8
- (at your option) any later version.
9
-
10
- This program is distributed in the hope that it will be useful,
11
- but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- GNU General Public License for more details.
14
-
15
- You should have received a copy of the GNU General Public License along
16
- with this program; if not, write to the Free Software Foundation, Inc.,
17
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
- */
19
-
20
- #include <QDir>
21
- #include <QFile>
22
- #include <QFileInfo>
23
- #include <QMap>
24
- #include <QTextStream>
25
-
26
- #include <type.h>
27
-
28
- #include "globals.h"
29
- #include "../../options.h"
30
-
31
- uint qHash(const QVector<int> intList)
32
- {
33
- const char *byteArray = (const char*) intList.constData();
34
- int length = sizeof(int) * intList.count();
35
- return qHash(QByteArray::fromRawData(byteArray, length));
36
- }
37
-
38
- SmokeDataFile::SmokeDataFile()
39
- {
40
- qDebug("preparing SMOKE data [%s]", qPrintable(Options::module));
41
-
42
- for (QHash<QString, Class>::const_iterator iter = ::classes.constBegin(); iter != ::classes.constEnd(); iter++) {
43
- if (Options::classList.contains(iter.key()) && !iter.value().isForwardDecl()) {
44
- classIndex[iter.key()] = 1;
45
- }
46
- }
47
-
48
- // superclasses might be in different modules, still they need to be indexed for inheritanceList to work properly
49
- QSet<const Class*> superClasses;
50
- includedClasses = classIndex.keys();
51
- Util::preparse(&usedTypes, &superClasses, includedClasses); // collect all used types, add c'tors.. etc.
52
-
53
- // Collect the classes that are inherited by classes in this smoke module and provide virtual methods.
54
- // These classes need to be indexed as well.
55
- foreach (const QString& className, includedClasses) {
56
- const Class* klass = &classes[className];
57
- QList<const Method*> list = Util::virtualMethodsForClass(klass);
58
- foreach (const Method* meth, list) {
59
- usedTypes << meth->type();
60
- foreach (const Parameter& param, meth->parameters()) {
61
- usedTypes << param.type();
62
- if (meth->isSlot() || meth->isSignal() || meth->isQPropertyAccessor()) {
63
- usedTypes << Util::normalizeType(param.type());
64
- }
65
- }
66
- declaredVirtualMethods[meth->getClass()] << meth;
67
- }
68
- }
69
-
70
- // if a class is used somewhere but not listed in the class list, mark it external
71
- for (QHash<QString, Class>::iterator iter = ::classes.begin(); iter != ::classes.end(); iter++) {
72
- if (iter.value().isTemplate() || Options::voidpTypes.contains(iter.key()))
73
- continue;
74
-
75
- if ( (isClassUsed(&iter.value()) && iter.value().access() != Access_private)
76
- || superClasses.contains(&iter.value())
77
- || declaredVirtualMethods.contains(&iter.value()))
78
- {
79
- classIndex[iter.key()] = 1;
80
-
81
- if (!Options::classList.contains(iter.key()) || iter.value().isForwardDecl())
82
- externalClasses << &iter.value();
83
- else if (!includedClasses.contains(iter.key()))
84
- includedClasses << iter.key();
85
- } else if (iter.value().isNameSpace() && (Options::classList.contains(iter.key()) || iter.key() == "QGlobalSpace")) {
86
- // wanted namespace or QGlobalSpace
87
- classIndex[iter.key()] = 1;
88
- includedClasses << iter.key();
89
- }
90
- }
91
-
92
- // build class index here because the list needs to be sorted
93
- int i = 1;
94
- for (QMap<QString, int>::iterator iter = classIndex.begin(); iter != classIndex.end(); iter++) {
95
- iter.value() = i++;
96
- }
97
- }
98
-
99
- bool SmokeDataFile::isClassUsed(const Class* klass)
100
- {
101
- for (QSet<Type*>::const_iterator it = usedTypes.constBegin(); it != usedTypes.constEnd(); it++) {
102
- if ((*it)->getClass() == klass)
103
- return true;
104
- }
105
- return false;
106
- }
107
-
108
- QString SmokeDataFile::getTypeFlags(const Type *t, int *classIdx)
109
- {
110
- if (t->getTypedef()) {
111
- Type resolved = t->getTypedef()->resolve();
112
- return getTypeFlags(&resolved, classIdx);
113
- }
114
-
115
- QString flags = "0";
116
- if (Options::voidpTypes.contains(t->name())) {
117
- // support some of the weird quirks the kalyptus code has
118
- flags += "|Smoke::t_voidp";
119
- } else if (t->getClass()) {
120
- if (t->getClass()->isTemplate()) {
121
- if (Options::qtMode && t->getClass()->name() == "QFlags" && !t->isRef() && t->pointerDepth() == 0) {
122
- flags += "|Smoke::t_uint";
123
- } else {
124
- flags += "|Smoke::t_voidp";
125
- }
126
- } else {
127
- flags += "|Smoke::t_class";
128
- *classIdx = classIndex.value(t->getClass()->toString(), 0);
129
- }
130
- } else if (t->isIntegral() && t->name() != "void" && t->pointerDepth() == 0 && !t->isRef()) {
131
- flags += "|Smoke::t_";
132
- QString typeName = t->name();
133
-
134
- // replace the unsigned stuff, look the type up in Util::typeMap and if
135
- // necessary, add a 'u' for unsigned types at the beginning again
136
- bool _unsigned = false;
137
- if (typeName.startsWith("unsigned ")) {
138
- typeName.replace("unsigned ", "");
139
- _unsigned = true;
140
- }
141
- typeName.replace("signed ", "");
142
- typeName = Util::typeMap.value(typeName, typeName);
143
- if (_unsigned)
144
- typeName.prepend('u');
145
-
146
- flags += typeName;
147
- } else if (t->getEnum()) {
148
- flags += "|Smoke::t_enum";
149
- if (t->getEnum()->parent()) {
150
- *classIdx = classIndex.value(t->getEnum()->parent()->toString(), 0);
151
- } else if (!t->getEnum()->nameSpace().isEmpty()) {
152
- *classIdx = classIndex.value(t->getEnum()->nameSpace(), 0);
153
- } else {
154
- *classIdx = classIndex.value("QGlobalSpace", 0);
155
- }
156
- } else {
157
- flags += "|Smoke::t_voidp";
158
- }
159
-
160
- if (t->isRef())
161
- flags += "|Smoke::tf_ref";
162
- if (t->pointerDepth() > 0)
163
- flags += "|Smoke::tf_ptr";
164
- if (!t->isRef() && t->pointerDepth() == 0)
165
- flags += "|Smoke::tf_stack";
166
- if (t->isConst())
167
- flags += "|Smoke::tf_const";
168
- flags.replace("0|", "");
169
-
170
- return flags;
171
- }
172
-
173
- void SmokeDataFile::write()
174
- {
175
- qDebug("writing out smokedata.cpp [%s]", qPrintable(Options::module));
176
- QFile smokedata(Options::outputDir.filePath("smokedata.cpp"));
177
- smokedata.open(QFile::ReadWrite | QFile::Truncate);
178
- QTextStream out(&smokedata);
179
- QFile argNames(Options::outputDir.filePath(QString("%1.argnames.txt").arg(Options::module)));
180
- argNames.open(QFile::ReadWrite | QFile::Truncate);
181
- QTextStream outArgNames(&argNames);
182
- foreach (const QFileInfo& file, Options::headerList)
183
- out << "#include <" << file.fileName() << ">\n";
184
- out << "\n#include <smoke.h>\n";
185
- out << "#include <" << Options::module << "_smoke.h>\n\n";
186
-
187
- QString smokeNamespaceName = "__smoke" + Options::module;
188
-
189
- out << "namespace " << smokeNamespaceName << " {\n\n";
190
-
191
- // write out Options::module_cast() function
192
- out << "static void *cast(void *xptr, Smoke::Index from, Smoke::Index to) {\n";
193
- out << " switch(from) {\n";
194
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
195
- const Class& klass = classes[iter.key()];
196
- if (klass.isNameSpace())
197
- continue;
198
-
199
- QSet<int> indices; // avoid duplicate case values (diamond-shaped inheritance)
200
-
201
- out << " case " << iter.value() << ": //" << iter.key() << "\n";
202
- out << " switch(to) {\n";
203
- foreach (const Class* base, Util::superClassList(&klass)) {
204
- QString className = base->toString();
205
-
206
- if (includedClasses.contains(className) || externalClasses.contains((Class *) base)) {
207
- int index = classIndex[className];
208
- if (indices.contains(index))
209
- continue;
210
- indices << index;
211
-
212
- out << QString(" case %1: return (void*)(%2*)(%3*)xptr;\n")
213
- .arg(index).arg(className).arg(klass.toString());
214
- }
215
- }
216
- out << QString(" case %1: return (void*)(%2*)xptr;\n").arg(iter.value()).arg(klass.toString());
217
- foreach (const Class* desc, Util::descendantsList(&klass)) {
218
- QString className = desc->toString();
219
-
220
- if (includedClasses.contains(className)) {
221
- int index = classIndex[className];
222
- if (indices.contains(index))
223
- continue;
224
- indices << index;
225
-
226
- if (Util::isVirtualInheritancePath(desc, &klass)) {
227
- out << QString(" case %1: return (void*)dynamic_cast<%2*>((%3*)xptr);\n")
228
- .arg(index).arg(className).arg(klass.toString());
229
- } else {
230
- out << QString(" case %1: return (void*)(%2*)(%3*)xptr;\n")
231
- .arg(index).arg(className).arg(klass.toString());
232
- }
233
- }
234
- }
235
- out << " default: return xptr;\n";
236
- out << " }\n";
237
- }
238
- out << " default: return xptr;\n";
239
- out << " }\n";
240
- out << "}\n\n";
241
-
242
- // write out the inheritance list
243
- QHash<QVector<int>, int> inheritanceList;
244
- QHash<const Class*, int> inheritanceIndex;
245
- out << "// Group of Indexes (0 separated) used as super class lists.\n";
246
- out << "// Classes with super classes have an index into this array.\n";
247
- out << "static Smoke::Index inheritanceList[] = {\n";
248
- out << " 0,\t// 0: (no super class)\n";
249
-
250
- int currentIdx = 1;
251
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
252
- Class& klass = classes[iter.key()];
253
- if (!klass.baseClasses().count() || externalClasses.contains(&klass))
254
- continue;
255
- QVector<int> indices;
256
- QStringList comment;
257
- foreach (const Class::BaseClassSpecifier& base, klass.baseClasses()) {
258
- if (base.access == Access_private)
259
- continue;
260
- QString className = base.baseClass->toString();
261
- indices << classIndex[className];
262
- comment << className;
263
- }
264
- if (indices.count() == 0)
265
- continue;
266
- int idx = 0;
267
-
268
- if (!inheritanceList.contains(indices)) {
269
- idx = currentIdx;
270
- inheritanceList[indices] = idx;
271
- out << " ";
272
- for (int i = 0; i < indices.count(); i++) {
273
- if (i > 0) out << ", ";
274
- out << indices[i];
275
- currentIdx++;
276
- }
277
- currentIdx++;
278
- out << ", 0,\t// " << idx << ": " << comment.join(", ") << "\n";
279
- } else {
280
- idx = inheritanceList[indices];
281
- }
282
-
283
- // store the index into inheritanceList for the class
284
- inheritanceIndex[&klass] = idx;
285
- }
286
- out << "};\n\n";
287
-
288
- // xenum functions
289
- out << "// These are the xenum functions for manipulating enum pointers\n";
290
- QSet<QString> enumClassesHandled;
291
- for (QHash<QString, Enum>::const_iterator it = enums.constBegin(); it != enums.constEnd(); it++) {
292
- if (!it.value().isValid())
293
- continue;
294
-
295
- QString smokeClassName;
296
- if (it.value().parent()) {
297
- smokeClassName = it.value().parent()->toString();
298
- } else {
299
- smokeClassName = it.value().nameSpace();
300
- }
301
-
302
- if (!smokeClassName.isEmpty() && includedClasses.contains(smokeClassName) && it.value().access() != Access_private) {
303
- if (enumClassesHandled.contains(smokeClassName) || Options::voidpTypes.contains(smokeClassName))
304
- continue;
305
- enumClassesHandled << smokeClassName;
306
- smokeClassName.replace("::", "__");
307
- out << "void xenum_" << smokeClassName << "(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n";
308
- } else if (smokeClassName.isEmpty() && it.value().access() != Access_private) {
309
- if (enumClassesHandled.contains("QGlobalSpace"))
310
- continue;
311
- out << "void xenum_QGlobalSpace(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n";
312
- enumClassesHandled << "QGlobalSpace";
313
- }
314
- }
315
-
316
- // xcall functions
317
- out << "\n// Those are the xcall functions defined in each x_*.cpp file, for dispatching method calls\n";
318
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
319
- Class& klass = classes[iter.key()];
320
- if (externalClasses.contains(&klass) || klass.isTemplate())
321
- continue;
322
- QString smokeClassName = QString(klass.toString()).replace("::", "__");
323
- out << "void xcall_" << smokeClassName << "(Smoke::Index, void*, Smoke::Stack);\n";
324
- }
325
-
326
- // classes table
327
- out << "\n// List of all classes\n";
328
- out << "// Name, external, index into inheritanceList, method dispatcher, enum dispatcher, class flags, size\n";
329
- out << "static Smoke::Class classes[] = {\n";
330
- out << " { 0L, false, 0, 0, 0, 0, 0 },\t// 0 (no class)\n";
331
- int classCount = 0;
332
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
333
- if (!iter.value())
334
- continue;
335
-
336
- Class* klass = &classes[iter.key()];
337
-
338
- if (externalClasses.contains(klass)) {
339
- out << " { \"" << iter.key() << "\", true, 0, 0, 0, 0, 0 },\t//" << iter.value() << "\n";
340
- } else {
341
- QString smokeClassName = QString(iter.key()).replace("::", "__");
342
- out << " { \"" << iter.key() << "\", false" << ", "
343
- << inheritanceIndex.value(klass, 0) << ", xcall_" << smokeClassName << ", "
344
- << (enumClassesHandled.contains(iter.key()) ? QString("xenum_").append(smokeClassName) : "0") << ", ";
345
- QString flags = "0";
346
- if (!klass->isNameSpace()) {
347
- if (Util::canClassBeInstanciated(klass)) flags += "|Smoke::cf_constructor";
348
- if (Util::canClassBeCopied(klass)) flags += "|Smoke::cf_deepcopy";
349
- if (Util::hasClassVirtualDestructor(klass)) flags += "|Smoke::cf_virtual";
350
- flags.replace("0|", ""); // beautify
351
- } else {
352
- flags = "Smoke::cf_namespace";
353
- }
354
- out << flags << ", ";
355
- if (!klass->isNameSpace())
356
- out << "sizeof(" << iter.key() << ")";
357
- else
358
- out << '0';
359
- out << " },\t//" << iter.value() << "\n";
360
- }
361
- classCount = iter.value();
362
- }
363
- out << "};\n\n";
364
-
365
- out << "// List of all types needed by the methods (arguments and return values)\n"
366
- << "// Name, class ID if arg is a class, and TypeId\n";
367
- out << "static Smoke::Type types[] = {\n";
368
- out << " { 0, 0, 0 },\t//0 (no type)\n";
369
- QMap<QString, Type*> sortedTypes;
370
- for (QSet<Type*>::const_iterator it = usedTypes.constBegin(); it != usedTypes.constEnd(); it++) {
371
- QString typeString = (*it)->toString();
372
- if (!typeString.isEmpty()) {
373
- sortedTypes.insert(typeString, *it);
374
- }
375
- }
376
-
377
- int i = 1;
378
- for (QMap<QString, Type*>::const_iterator it = sortedTypes.constBegin(); it != sortedTypes.constEnd(); it++) {
379
- Type* t = it.value();
380
- // don't include void as a type
381
- if (t == Type::Void)
382
- continue;
383
- int classIdx = 0;
384
- QString flags = getTypeFlags(t, &classIdx);
385
- typeIndex[t] = i;
386
- out << " { \"" << it.key() << "\", " << classIdx << ", " << flags << " },\t//" << i++ << "\n";
387
- }
388
- out << "};\n\n";
389
-
390
- out << "static Smoke::Index argumentList[] = {\n";
391
- out << " 0,\t//0 (void)\n";
392
-
393
- QHash<QVector<int>, int> parameterList;
394
- QHash<const Method*, int> parameterIndices;
395
-
396
- // munged name => index
397
- QMap<QString, int> methodNames;
398
- // class => list of munged names with possible methods or enum members
399
- QHash<const Class*, QMap<QString, QList<const Member*> > > classMungedNames;
400
-
401
- currentIdx = 1;
402
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
403
- Class* klass = &classes[iter.key()];
404
- bool isExternal = externalClasses.contains(klass);
405
- bool isDeclaredVirtual = declaredVirtualMethods.contains(klass);
406
- if (isExternal && !isDeclaredVirtual)
407
- continue;
408
- QMap<QString, QList<const Member*> >& map = classMungedNames[klass];
409
- foreach (const Method& meth, klass->methods()) {
410
- if (meth.access() == Access_private)
411
- continue;
412
- if (isExternal && !declaredVirtualMethods[klass].contains(&meth))
413
- continue;
414
-
415
- methodNames[meth.name()] = 1;
416
- if (!isExternal) {
417
- QString mungedName = Util::mungedName(meth);
418
- methodNames[mungedName] = 1;
419
- map[mungedName].append(&meth);
420
- }
421
-
422
- if (!meth.parameters().count()) {
423
- parameterIndices[&meth] = 0;
424
- continue;
425
- }
426
- QVector<int> indices(meth.parameters().count());
427
- QStringList comment;
428
- if (meth.parameters().size() > 0) {
429
- outArgNames << klass->name() << "," << meth.name();
430
- }
431
- for (int i = 0; i < indices.size(); i++) {
432
- Type* t = meth.parameters()[i].type();
433
- if (!typeIndex.contains(t)) {
434
- qFatal("missing type: %s in method %s (while building munged names map)", qPrintable(t->toString()), qPrintable(meth.toString(false, true)));
435
- }
436
- outArgNames << ",";
437
- outArgNames << (indices[i] = typeIndex[t]);
438
- comment << t->toString();
439
- }
440
- if (meth.parameters().size() > 0) {
441
- outArgNames << ";";
442
- for (int i = 0; i < meth.parameters().size(); i++) {
443
- QString paramName = meth.parameters()[i].name();
444
- if (paramName == "") {
445
- paramName = "arg" + QString::number(i + 1);
446
- }
447
- outArgNames << paramName;
448
- if (i < meth.parameters().size() - 1) {
449
- outArgNames << ",";
450
- }
451
- }
452
- outArgNames << "\n";
453
- }
454
- int idx = 0;
455
- if ((idx = parameterList.value(indices, -1)) == -1) {
456
- idx = currentIdx;
457
- parameterList[indices] = idx;
458
- out << " ";
459
- for (int i = 0; i < indices.count(); i++) {
460
- if (i > 0) out << ", ";
461
- out << indices[i];
462
- }
463
- out << ", 0,\t//" << idx << " " << comment.join(", ") << "\n";
464
- currentIdx += indices.count() + 1;
465
- }
466
- parameterIndices[&meth] = idx;
467
- }
468
- foreach (BasicTypeDeclaration* decl, klass->children()) {
469
- const Enum* e = 0;
470
- if ((e = dynamic_cast<Enum*>(decl))) {
471
- if (e->access() == Access_private)
472
- continue;
473
- foreach (const EnumMember& member, e->members()) {
474
- methodNames[member.name()] = 1;
475
- map[member.name()].append(&member);
476
- }
477
- }
478
- }
479
- }
480
-
481
- out << "};\n\n";
482
-
483
- out << "// Raw list of all methods, using munged names\n";
484
- out << "static const char *methodNames[] = {\n";
485
- out << " \"\",\t//0\n";
486
- i = 1;
487
- for (QMap<QString, int>::iterator it = methodNames.begin(); it != methodNames.end(); it++, i++) {
488
- it.value() = i;
489
- out << " \"" << it.key() << "\",\t//" << i << "\n";
490
- }
491
- out << "};\n\n";
492
-
493
- out << "// (classId, name (index in methodNames), argumentList index, number of args, method flags, "
494
- << "return type (index in types), xcall() index)\n";
495
- out << "static Smoke::Method methods[] = {\n";
496
- out << " { 0, 0, 0, 0, 0, 0, 0 },\t// (no method)\n";
497
-
498
- i = 1;
499
- int methodCount = 1;
500
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
501
- Class* klass = &classes[iter.key()];
502
- const Method* destructor = 0;
503
- bool isExternal = false;
504
- if (externalClasses.contains(klass))
505
- isExternal = true;
506
- if (isExternal && !declaredVirtualMethods.contains(klass))
507
- continue;
508
-
509
- QList<const Method*> virtualMethods = Util::virtualMethodsForClass(klass);
510
-
511
- int xcall_index = 1;
512
- foreach (const Method& meth, klass->methods()) {
513
- if (isExternal && !declaredVirtualMethods[klass].contains(&meth))
514
- continue;
515
- if (meth.access() == Access_private)
516
- continue;
517
- if (meth.isDestructor()) {
518
- destructor = &meth;
519
- continue;
520
- }
521
- out << " {" << iter.value() << ", " << methodNames[meth.name()] << ", ";
522
- int numArgs = meth.parameters().count();
523
- if (numArgs) {
524
- out << parameterIndices[&meth] << ", " << numArgs << ", ";
525
- } else {
526
- out << "0, 0, ";
527
- }
528
- QString flags = "0";
529
- if (meth.isConst())
530
- flags += "|Smoke::mf_const";
531
- if (meth.flags() & Method::Static)
532
- flags += "|Smoke::mf_static";
533
- if (meth.isConstructor())
534
- flags += "|Smoke::mf_ctor";
535
- if (meth.flags() & Method::Explicit)
536
- flags += "|Smoke::mf_explicit";
537
- if (meth.access() == Access_protected)
538
- flags += "|Smoke::mf_protected";
539
- if (meth.isConstructor() &&
540
- meth.parameters().count() == 1 &&
541
- meth.parameters()[0].type()->isConst() &&
542
- meth.parameters()[0].type()->getClass() == klass)
543
- flags += "|Smoke::mf_copyctor";
544
- if (Util::fieldAccessors.contains(&meth))
545
- flags += "|Smoke::mf_attribute";
546
- if (meth.isQPropertyAccessor())
547
- flags += "|Smoke::mf_property";
548
-
549
- // Simply checking for flags() & Method::Virtual won't be enough, because methods can override virtuals without being
550
- // declared 'virtual' themselves (and they're still virtual, then).
551
- if (virtualMethods.contains(&meth))
552
- flags += "|Smoke::mf_virtual";
553
- if (meth.flags() & Method::PureVirtual)
554
- flags += "|Smoke::mf_purevirtual";
555
- if (meth.isSignal())
556
- flags += "|Smoke::mf_signal";
557
- else if (meth.isSlot())
558
- flags += "|Smoke::mf_slot";
559
-
560
- flags.replace("0|", "");
561
- out << flags;
562
- if (meth.type() == Type::Void) {
563
- out << ", 0";
564
- } else if (!typeIndex.contains(meth.type())) {
565
- qFatal("missing type: %s in method %s (while writing out methods table)", qPrintable(meth.type()->toString()), qPrintable(meth.toString(false, true)));
566
- } else {
567
- out << ", " << typeIndex[meth.type()];
568
- }
569
- out << ", " << (isExternal ? 0 : xcall_index) << "},";
570
-
571
- // comment
572
- out << "\t//" << i << " " << klass->toString() << "::";
573
- out << meth.name() << '(';
574
- for (int j = 0; j < meth.parameters().count(); j++) {
575
- if (j > 0) out << ", ";
576
- out << meth.parameters()[j].toString();
577
- }
578
- out << ')';
579
- if (meth.isConst())
580
- out << " const";
581
- if (meth.flags() & Method::PureVirtual)
582
- out << " [pure virtual]";
583
- out << "\n";
584
- methodIdx[&meth] = i;
585
- xcall_index++;
586
- i++;
587
- methodCount++;
588
- }
589
- // enums
590
- foreach (BasicTypeDeclaration* decl, klass->children()) {
591
- const Enum* e = 0;
592
- if ((e = dynamic_cast<Enum*>(decl))) {
593
- if (e->access() == Access_private)
594
- continue;
595
-
596
- Type *enumType;
597
- if (e->name().isEmpty()) {
598
- // unnamed enum
599
- enumType = &types["long"];
600
- } else {
601
- enumType = &types[e->toString()];
602
- }
603
-
604
- int index = 0;
605
- QHash<Type*, int>::const_iterator typeIt;
606
- if ((typeIt = typeIndex.find(enumType)) == typeIndex.end()) {
607
- // this enum doesn't have an index, so we don't want it here
608
- continue;
609
- } else {
610
- index = *typeIt;
611
- }
612
-
613
- foreach (const EnumMember& member, e->members()) {
614
- out << " {" << iter.value() << ", " << methodNames[member.name()]
615
- << ", 0, 0, Smoke::mf_static|Smoke::mf_enum, " << index
616
- << ", " << xcall_index << "},";
617
-
618
- // comment
619
- out << "\t//" << i << " " << klass->toString() << "::" << member.name() << " (enum)";
620
- out << "\n";
621
- methodIdx[&member] = i;
622
- xcall_index++;
623
- i++;
624
- methodCount++;
625
- }
626
- }
627
- }
628
- if (destructor) {
629
- out << " {" << iter.value() << ", " << methodNames[destructor->name()] << ", 0, 0, Smoke::mf_dtor";
630
- if (destructor->access() == Access_private)
631
- out << "|Smoke::mf_protected";
632
- out << ", 0, " << xcall_index << " },\t//" << i << " " << klass->toString()
633
- << "::" << destructor->name() << "()\n";
634
- methodIdx[destructor] = i;
635
- xcall_index++;
636
- i++;
637
- methodCount++;
638
- }
639
- }
640
-
641
- out << "};\n\n";
642
-
643
- out << "static Smoke::Index ambiguousMethodList[] = {\n";
644
- out << " 0,\n";
645
-
646
- QHash<const Class*, QHash<QString, int> > ambigiousIds;
647
- i = 1;
648
- // ambigious method list
649
- for (QHash<const Class*, QMap<QString, QList<const Member*> > >::const_iterator iter = classMungedNames.constBegin();
650
- iter != classMungedNames.constEnd(); iter++)
651
- {
652
- const Class* klass = iter.key();
653
- const QMap<QString, QList<const Member*> >& map = iter.value();
654
-
655
- for (QMap<QString, QList<const Member*> >::const_iterator munged_it = map.constBegin();
656
- munged_it != map.constEnd(); munged_it++)
657
- {
658
- if (munged_it.value().size() < 2)
659
- continue;
660
- foreach (const Member* member, munged_it.value()) {
661
- out << " " << methodIdx[member] << ',';
662
-
663
- // comment
664
- out << " // " << klass->toString() << "::" << member->name();
665
- const Method* meth = 0;
666
- if ((meth = dynamic_cast<const Method*>(member))) {
667
- out << '(';
668
- for (int j = 0; j < meth->parameters().count(); j++) {
669
- if (j > 0) out << ", ";
670
- out << meth->parameters()[j].type()->toString();
671
- }
672
- out << ')';
673
- if (meth->isConst()) out << " const";
674
- }
675
- out << "\n";
676
- }
677
- out << " 0,\n";
678
- ambigiousIds[klass][munged_it.key()] = i;
679
- i += munged_it.value().size() + 1;
680
- }
681
- }
682
-
683
- out << "};\n\n";
684
-
685
- int methodMapCount = 1;
686
- out << "// Class ID, munged name ID (index into methodNames), method def (see methods) if >0 or number of overloads if <0\n";
687
- out << "static Smoke::MethodMap methodMaps[] = {\n";
688
- out << " {0, 0, 0},\t//0 (no method)\n";
689
-
690
- for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
691
- Class* klass = &classes[iter.key()];
692
- if (externalClasses.contains(klass))
693
- continue;
694
-
695
- QMap<QString, QList<const Member*> >& map = classMungedNames[klass];
696
- for (QMap<QString, QList<const Member*> >::const_iterator munged_it = map.constBegin(); munged_it != map.constEnd(); munged_it++) {
697
-
698
- // class index, munged name index
699
- out << " {" << classIndex[iter.key()] << ", " << methodNames[munged_it.key()] << ", ";
700
-
701
- // if there's only one matching method for this class and the munged name, insert the index into methodss
702
- if (munged_it.value().size() == 1) {
703
- out << methodIdx[munged_it.value().first()];
704
- } else {
705
- // negative index into ambigious methods list
706
- out << '-' << ambigiousIds[klass][munged_it.key()];
707
- }
708
- out << "},";
709
- // comment
710
- out << "\t// " << klass->toString() << "::" << munged_it.key();
711
- out << "\n";
712
- methodMapCount++;
713
- }
714
- }
715
-
716
- out << "};\n\n";
717
-
718
- out << "}\n\n";
719
-
720
- out << "extern \"C\" {\n\n";
721
-
722
- for (int j = 0; j < Options::parentModules.count(); j++) {
723
- out << "SMOKE_IMPORT void init_" << Options::parentModules[j] << "_Smoke();\n";
724
- if (j == Options::parentModules.count() - 1)
725
- out << "\n";
726
- }
727
-
728
- out << "static bool initialized = false;\n";
729
- out << "Smoke *" << Options::module << "_Smoke = 0;\n\n";
730
- out << "// Create the Smoke instance encapsulating all the above.\n";
731
- out << "void init_" << Options::module << "_Smoke() {\n";
732
- foreach (const QString& str, Options::parentModules) {
733
- out << " init_" << str << "_Smoke();\n";
734
- }
735
- out << " if (initialized) return;\n";
736
- out << " " << Options::module << "_Smoke = new Smoke(\n";
737
- out << " \"" << Options::module << "\",\n";
738
- out << " " << smokeNamespaceName << "::classes, " << classCount << ",\n";
739
- out << " " << smokeNamespaceName << "::methods, " << methodCount << ",\n";
740
- out << " " << smokeNamespaceName << "::methodMaps, " << methodMapCount << ",\n";
741
- out << " " << smokeNamespaceName << "::methodNames, " << methodNames.count() << ",\n";
742
- out << " " << smokeNamespaceName << "::types, " << typeIndex.count() << ",\n";
743
- out << " " << smokeNamespaceName << "::inheritanceList,\n";
744
- out << " " << smokeNamespaceName << "::argumentList,\n";
745
- out << " " << smokeNamespaceName << "::ambiguousMethodList,\n";
746
- out << " " << smokeNamespaceName << "::cast );\n";
747
- out << " initialized = true;\n";
748
- out << "}\n\n";
749
- out << "void delete_" << Options::module << "_Smoke() { delete " << Options::module << "_Smoke; }\n\n";
750
- out << "}\n";
751
-
752
- smokedata.close();
753
- argNames.close();
754
- }
1
+ /*
2
+ Generator for the SMOKE sources
3
+ Copyright (C) 2009 Arno Rehn <arno@arnorehn.de>
4
+
5
+ This program is free software; you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along
16
+ with this program; if not, write to the Free Software Foundation, Inc.,
17
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+ #include <QDir>
21
+ #include <QFile>
22
+ #include <QFileInfo>
23
+ #include <QMap>
24
+ #include <QTextStream>
25
+
26
+ #include <type.h>
27
+
28
+ #include "globals.h"
29
+ #include "../../options.h"
30
+
31
+ uint qHash(const QVector<int> intList)
32
+ {
33
+ const char *byteArray = (const char*) intList.constData();
34
+ int length = sizeof(int) * intList.count();
35
+ return qHash(QByteArray::fromRawData(byteArray, length));
36
+ }
37
+
38
+ SmokeDataFile::SmokeDataFile()
39
+ {
40
+ qDebug("preparing SMOKE data [%s]", qPrintable(Options::module));
41
+
42
+ for (QHash<QString, Class>::const_iterator iter = ::classes.constBegin(); iter != ::classes.constEnd(); iter++) {
43
+ if (Options::classList.contains(iter.key()) && !iter.value().isForwardDecl()) {
44
+ classIndex[iter.key()] = 1;
45
+ }
46
+ }
47
+
48
+ // superclasses might be in different modules, still they need to be indexed for inheritanceList to work properly
49
+ QSet<const Class*> superClasses;
50
+ includedClasses = classIndex.keys();
51
+ Util::preparse(&usedTypes, &superClasses, includedClasses); // collect all used types, add c'tors.. etc.
52
+
53
+ // Collect the classes that are inherited by classes in this smoke module and provide virtual methods.
54
+ // These classes need to be indexed as well.
55
+ foreach (const QString& className, includedClasses) {
56
+ const Class* klass = &classes[className];
57
+ QList<const Method*> list = Util::virtualMethodsForClass(klass);
58
+ foreach (const Method* meth, list) {
59
+ usedTypes << meth->type();
60
+ foreach (const Parameter& param, meth->parameters()) {
61
+ usedTypes << param.type();
62
+ if (meth->isSlot() || meth->isSignal() || meth->isQPropertyAccessor()) {
63
+ usedTypes << Util::normalizeType(param.type());
64
+ }
65
+ }
66
+ declaredVirtualMethods[meth->getClass()] << meth;
67
+ }
68
+ }
69
+
70
+ // if a class is used somewhere but not listed in the class list, mark it external
71
+ for (QHash<QString, Class>::iterator iter = ::classes.begin(); iter != ::classes.end(); iter++) {
72
+ if (iter.value().isTemplate() || Options::voidpTypes.contains(iter.key()))
73
+ continue;
74
+
75
+ if ( (isClassUsed(&iter.value()) && iter.value().access() != Access_private)
76
+ || superClasses.contains(&iter.value())
77
+ || declaredVirtualMethods.contains(&iter.value()))
78
+ {
79
+ classIndex[iter.key()] = 1;
80
+
81
+ if (!Options::classList.contains(iter.key()) || iter.value().isForwardDecl())
82
+ externalClasses << &iter.value();
83
+ else if (!includedClasses.contains(iter.key()))
84
+ includedClasses << iter.key();
85
+ } else if (iter.value().isNameSpace() && (Options::classList.contains(iter.key()) || iter.key() == "QGlobalSpace")) {
86
+ // wanted namespace or QGlobalSpace
87
+ classIndex[iter.key()] = 1;
88
+ includedClasses << iter.key();
89
+ }
90
+ }
91
+
92
+ // build class index here because the list needs to be sorted
93
+ int i = 1;
94
+ for (QMap<QString, int>::iterator iter = classIndex.begin(); iter != classIndex.end(); iter++) {
95
+ iter.value() = i++;
96
+ }
97
+ }
98
+
99
+ bool SmokeDataFile::isClassUsed(const Class* klass)
100
+ {
101
+ for (QSet<Type*>::const_iterator it = usedTypes.constBegin(); it != usedTypes.constEnd(); it++) {
102
+ if ((*it)->getClass() == klass)
103
+ return true;
104
+ }
105
+ return false;
106
+ }
107
+
108
+ QString SmokeDataFile::getTypeFlags(const Type *t, int *classIdx)
109
+ {
110
+ if (t->getTypedef()) {
111
+ Type resolved = t->getTypedef()->resolve();
112
+ return getTypeFlags(&resolved, classIdx);
113
+ }
114
+
115
+ QString flags = "0";
116
+ if (Options::voidpTypes.contains(t->name())) {
117
+ // support some of the weird quirks the kalyptus code has
118
+ flags += "|Smoke::t_voidp";
119
+ } else if (t->getClass()) {
120
+ if (t->getClass()->isTemplate()) {
121
+ if (Options::qtMode && t->getClass()->name() == "QFlags" && !t->isRef() && t->pointerDepth() == 0) {
122
+ flags += "|Smoke::t_uint";
123
+ } else {
124
+ flags += "|Smoke::t_voidp";
125
+ }
126
+ } else {
127
+ flags += "|Smoke::t_class";
128
+ *classIdx = classIndex.value(t->getClass()->toString(), 0);
129
+ }
130
+ } else if (t->isIntegral() && t->name() != "void" && t->pointerDepth() == 0 && !t->isRef()) {
131
+ flags += "|Smoke::t_";
132
+ QString typeName = t->name();
133
+
134
+ // replace the unsigned stuff, look the type up in Util::typeMap and if
135
+ // necessary, add a 'u' for unsigned types at the beginning again
136
+ bool _unsigned = false;
137
+ if (typeName.startsWith("unsigned ")) {
138
+ typeName.replace("unsigned ", "");
139
+ _unsigned = true;
140
+ }
141
+ typeName.replace("signed ", "");
142
+ typeName = Util::typeMap.value(typeName, typeName);
143
+ if (_unsigned)
144
+ typeName.prepend('u');
145
+
146
+ flags += typeName;
147
+ } else if (t->getEnum()) {
148
+ flags += "|Smoke::t_enum";
149
+ if (t->getEnum()->parent()) {
150
+ *classIdx = classIndex.value(t->getEnum()->parent()->toString(), 0);
151
+ } else if (!t->getEnum()->nameSpace().isEmpty()) {
152
+ *classIdx = classIndex.value(t->getEnum()->nameSpace(), 0);
153
+ } else {
154
+ *classIdx = classIndex.value("QGlobalSpace", 0);
155
+ }
156
+ } else {
157
+ flags += "|Smoke::t_voidp";
158
+ }
159
+
160
+ if (t->isRef())
161
+ flags += "|Smoke::tf_ref";
162
+ if (t->pointerDepth() > 0)
163
+ flags += "|Smoke::tf_ptr";
164
+ if (!t->isRef() && t->pointerDepth() == 0)
165
+ flags += "|Smoke::tf_stack";
166
+ if (t->isConst())
167
+ flags += "|Smoke::tf_const";
168
+ flags.replace("0|", "");
169
+
170
+ return flags;
171
+ }
172
+
173
+ void SmokeDataFile::write()
174
+ {
175
+ qDebug("writing out smokedata.cpp [%s]", qPrintable(Options::module));
176
+ QFile smokedata(Options::outputDir.filePath("smokedata.cpp"));
177
+ smokedata.open(QFile::ReadWrite | QFile::Truncate);
178
+ QTextStream out(&smokedata);
179
+ QFile argNames(Options::outputDir.filePath(QString("%1.argnames.txt").arg(Options::module)));
180
+ argNames.open(QFile::ReadWrite | QFile::Truncate);
181
+ QTextStream outArgNames(&argNames);
182
+ foreach (const QFileInfo& file, Options::headerList)
183
+ out << "#include <" << file.fileName() << ">\n";
184
+ out << "\n#include <smoke.h>\n";
185
+ out << "#include <" << Options::module << "_smoke.h>\n\n";
186
+
187
+ QString smokeNamespaceName = "__smoke" + Options::module;
188
+
189
+ out << "namespace " << smokeNamespaceName << " {\n\n";
190
+
191
+ // write out Options::module_cast() function
192
+ out << "static void *cast(void *xptr, Smoke::Index from, Smoke::Index to) {\n";
193
+ out << " switch(from) {\n";
194
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
195
+ const Class& klass = classes[iter.key()];
196
+ if (klass.isNameSpace())
197
+ continue;
198
+
199
+ QSet<int> indices; // avoid duplicate case values (diamond-shaped inheritance)
200
+
201
+ out << " case " << iter.value() << ": //" << iter.key() << "\n";
202
+ out << " switch(to) {\n";
203
+ foreach (const Class* base, Util::superClassList(&klass)) {
204
+ QString className = base->toString();
205
+
206
+ if (includedClasses.contains(className) || externalClasses.contains((Class *) base)) {
207
+ int index = classIndex[className];
208
+ if (indices.contains(index))
209
+ continue;
210
+ indices << index;
211
+
212
+ out << QString(" case %1: return (void*)(%2*)(%3*)xptr;\n")
213
+ .arg(index).arg(className).arg(klass.toString());
214
+ }
215
+ }
216
+ out << QString(" case %1: return (void*)(%2*)xptr;\n").arg(iter.value()).arg(klass.toString());
217
+ foreach (const Class* desc, Util::descendantsList(&klass)) {
218
+ QString className = desc->toString();
219
+
220
+ if (includedClasses.contains(className)) {
221
+ int index = classIndex[className];
222
+ if (indices.contains(index))
223
+ continue;
224
+ indices << index;
225
+
226
+ if (Util::isVirtualInheritancePath(desc, &klass)) {
227
+ out << QString(" case %1: return (void*)dynamic_cast<%2*>((%3*)xptr);\n")
228
+ .arg(index).arg(className).arg(klass.toString());
229
+ } else {
230
+ out << QString(" case %1: return (void*)(%2*)(%3*)xptr;\n")
231
+ .arg(index).arg(className).arg(klass.toString());
232
+ }
233
+ }
234
+ }
235
+ out << " default: return xptr;\n";
236
+ out << " }\n";
237
+ }
238
+ out << " default: return xptr;\n";
239
+ out << " }\n";
240
+ out << "}\n\n";
241
+
242
+ // write out the inheritance list
243
+ QHash<QVector<int>, int> inheritanceList;
244
+ QHash<const Class*, int> inheritanceIndex;
245
+ out << "// Group of Indexes (0 separated) used as super class lists.\n";
246
+ out << "// Classes with super classes have an index into this array.\n";
247
+ out << "static Smoke::Index inheritanceList[] = {\n";
248
+ out << " 0,\t// 0: (no super class)\n";
249
+
250
+ int currentIdx = 1;
251
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
252
+ Class& klass = classes[iter.key()];
253
+ if (!klass.baseClasses().count() || externalClasses.contains(&klass))
254
+ continue;
255
+ QVector<int> indices;
256
+ QStringList comment;
257
+ foreach (const Class::BaseClassSpecifier& base, klass.baseClasses()) {
258
+ if (base.access == Access_private)
259
+ continue;
260
+ QString className = base.baseClass->toString();
261
+ indices << classIndex[className];
262
+ comment << className;
263
+ }
264
+ if (indices.count() == 0)
265
+ continue;
266
+ int idx = 0;
267
+
268
+ if (!inheritanceList.contains(indices)) {
269
+ idx = currentIdx;
270
+ inheritanceList[indices] = idx;
271
+ out << " ";
272
+ for (int i = 0; i < indices.count(); i++) {
273
+ if (i > 0) out << ", ";
274
+ out << indices[i];
275
+ currentIdx++;
276
+ }
277
+ currentIdx++;
278
+ out << ", 0,\t// " << idx << ": " << comment.join(", ") << "\n";
279
+ } else {
280
+ idx = inheritanceList[indices];
281
+ }
282
+
283
+ // store the index into inheritanceList for the class
284
+ inheritanceIndex[&klass] = idx;
285
+ }
286
+ out << "};\n\n";
287
+
288
+ // xenum functions
289
+ out << "// These are the xenum functions for manipulating enum pointers\n";
290
+ QSet<QString> enumClassesHandled;
291
+ for (QHash<QString, Enum>::const_iterator it = enums.constBegin(); it != enums.constEnd(); it++) {
292
+ if (!it.value().isValid())
293
+ continue;
294
+
295
+ QString smokeClassName;
296
+ if (it.value().parent()) {
297
+ smokeClassName = it.value().parent()->toString();
298
+ } else {
299
+ smokeClassName = it.value().nameSpace();
300
+ }
301
+
302
+ if (!smokeClassName.isEmpty() && includedClasses.contains(smokeClassName) && it.value().access() != Access_private) {
303
+ if (enumClassesHandled.contains(smokeClassName) || Options::voidpTypes.contains(smokeClassName))
304
+ continue;
305
+ enumClassesHandled << smokeClassName;
306
+ smokeClassName.replace("::", "__");
307
+ out << "void xenum_" << smokeClassName << "(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n";
308
+ } else if (smokeClassName.isEmpty() && it.value().access() != Access_private) {
309
+ if (enumClassesHandled.contains("QGlobalSpace"))
310
+ continue;
311
+ out << "void xenum_QGlobalSpace(Smoke::EnumOperation, Smoke::Index, void*&, long&);\n";
312
+ enumClassesHandled << "QGlobalSpace";
313
+ }
314
+ }
315
+
316
+ // xcall functions
317
+ out << "\n// Those are the xcall functions defined in each x_*.cpp file, for dispatching method calls\n";
318
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
319
+ Class& klass = classes[iter.key()];
320
+ if (externalClasses.contains(&klass) || klass.isTemplate())
321
+ continue;
322
+ QString smokeClassName = QString(klass.toString()).replace("::", "__");
323
+ out << "void xcall_" << smokeClassName << "(Smoke::Index, void*, Smoke::Stack);\n";
324
+ }
325
+
326
+ // classes table
327
+ out << "\n// List of all classes\n";
328
+ out << "// Name, external, index into inheritanceList, method dispatcher, enum dispatcher, class flags, size\n";
329
+ out << "static Smoke::Class classes[] = {\n";
330
+ out << " { 0L, false, 0, 0, 0, 0, 0 },\t// 0 (no class)\n";
331
+ int classCount = 0;
332
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
333
+ if (!iter.value())
334
+ continue;
335
+
336
+ Class* klass = &classes[iter.key()];
337
+
338
+ if (externalClasses.contains(klass)) {
339
+ out << " { \"" << iter.key() << "\", true, 0, 0, 0, 0, 0 },\t//" << iter.value() << "\n";
340
+ } else {
341
+ QString smokeClassName = QString(iter.key()).replace("::", "__");
342
+ out << " { \"" << iter.key() << "\", false" << ", "
343
+ << inheritanceIndex.value(klass, 0) << ", xcall_" << smokeClassName << ", "
344
+ << (enumClassesHandled.contains(iter.key()) ? QString("xenum_").append(smokeClassName) : "0") << ", ";
345
+ QString flags = "0";
346
+ if (!klass->isNameSpace()) {
347
+ if (Util::canClassBeInstanciated(klass)) flags += "|Smoke::cf_constructor";
348
+ if (Util::canClassBeCopied(klass)) flags += "|Smoke::cf_deepcopy";
349
+ if (Util::hasClassVirtualDestructor(klass)) flags += "|Smoke::cf_virtual";
350
+ flags.replace("0|", ""); // beautify
351
+ } else {
352
+ flags = "Smoke::cf_namespace";
353
+ }
354
+ out << flags << ", ";
355
+ if (!klass->isNameSpace())
356
+ out << "sizeof(" << iter.key() << ")";
357
+ else
358
+ out << '0';
359
+ out << " },\t//" << iter.value() << "\n";
360
+ }
361
+ classCount = iter.value();
362
+ }
363
+ out << "};\n\n";
364
+
365
+ out << "// List of all types needed by the methods (arguments and return values)\n"
366
+ << "// Name, class ID if arg is a class, and TypeId\n";
367
+ out << "static Smoke::Type types[] = {\n";
368
+ out << " { 0, 0, 0 },\t//0 (no type)\n";
369
+ QMap<QString, Type*> sortedTypes;
370
+ for (QSet<Type*>::const_iterator it = usedTypes.constBegin(); it != usedTypes.constEnd(); it++) {
371
+ QString typeString = (*it)->toString();
372
+ if (!typeString.isEmpty()) {
373
+ sortedTypes.insert(typeString, *it);
374
+ }
375
+ }
376
+
377
+ int i = 1;
378
+ for (QMap<QString, Type*>::const_iterator it = sortedTypes.constBegin(); it != sortedTypes.constEnd(); it++) {
379
+ Type* t = it.value();
380
+ // don't include void as a type
381
+ if (t == Type::Void)
382
+ continue;
383
+ int classIdx = 0;
384
+ QString flags = getTypeFlags(t, &classIdx);
385
+ typeIndex[t] = i;
386
+ out << " { \"" << it.key() << "\", " << classIdx << ", " << flags << " },\t//" << i++ << "\n";
387
+ }
388
+ out << "};\n\n";
389
+
390
+ out << "static Smoke::Index argumentList[] = {\n";
391
+ out << " 0,\t//0 (void)\n";
392
+
393
+ QHash<QVector<int>, int> parameterList;
394
+ QHash<const Method*, int> parameterIndices;
395
+
396
+ // munged name => index
397
+ QMap<QString, int> methodNames;
398
+ // class => list of munged names with possible methods or enum members
399
+ QHash<const Class*, QMap<QString, QList<const Member*> > > classMungedNames;
400
+
401
+ currentIdx = 1;
402
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
403
+ Class* klass = &classes[iter.key()];
404
+ bool isExternal = externalClasses.contains(klass);
405
+ bool isDeclaredVirtual = declaredVirtualMethods.contains(klass);
406
+ if (isExternal && !isDeclaredVirtual)
407
+ continue;
408
+ QMap<QString, QList<const Member*> >& map = classMungedNames[klass];
409
+ foreach (const Method& meth, klass->methods()) {
410
+ if (meth.access() == Access_private)
411
+ continue;
412
+ if (isExternal && !declaredVirtualMethods[klass].contains(&meth))
413
+ continue;
414
+
415
+ methodNames[meth.name()] = 1;
416
+ if (!isExternal) {
417
+ QString mungedName = Util::mungedName(meth);
418
+ methodNames[mungedName] = 1;
419
+ map[mungedName].append(&meth);
420
+ }
421
+
422
+ if (!meth.parameters().count()) {
423
+ parameterIndices[&meth] = 0;
424
+ continue;
425
+ }
426
+ QVector<int> indices(meth.parameters().count());
427
+ QStringList comment;
428
+ if (meth.parameters().size() > 0) {
429
+ outArgNames << klass->name() << "," << meth.name();
430
+ }
431
+ for (int i = 0; i < indices.size(); i++) {
432
+ Type* t = meth.parameters()[i].type();
433
+ if (!typeIndex.contains(t)) {
434
+ qFatal("missing type: %s in method %s (while building munged names map)", qPrintable(t->toString()), qPrintable(meth.toString(false, true)));
435
+ }
436
+ outArgNames << ",";
437
+ outArgNames << (indices[i] = typeIndex[t]);
438
+ comment << t->toString();
439
+ }
440
+ if (meth.parameters().size() > 0) {
441
+ outArgNames << ";";
442
+ for (int i = 0; i < meth.parameters().size(); i++) {
443
+ QString paramName = meth.parameters()[i].name();
444
+ if (paramName == "") {
445
+ paramName = "arg" + QString::number(i + 1);
446
+ }
447
+ outArgNames << paramName;
448
+ if (i < meth.parameters().size() - 1) {
449
+ outArgNames << ",";
450
+ }
451
+ }
452
+ outArgNames << "\n";
453
+ }
454
+ int idx = 0;
455
+ if ((idx = parameterList.value(indices, -1)) == -1) {
456
+ idx = currentIdx;
457
+ parameterList[indices] = idx;
458
+ out << " ";
459
+ for (int i = 0; i < indices.count(); i++) {
460
+ if (i > 0) out << ", ";
461
+ out << indices[i];
462
+ }
463
+ out << ", 0,\t//" << idx << " " << comment.join(", ") << "\n";
464
+ currentIdx += indices.count() + 1;
465
+ }
466
+ parameterIndices[&meth] = idx;
467
+ }
468
+ foreach (BasicTypeDeclaration* decl, klass->children()) {
469
+ const Enum* e = 0;
470
+ if ((e = dynamic_cast<Enum*>(decl))) {
471
+ if (e->access() == Access_private)
472
+ continue;
473
+ foreach (const EnumMember& member, e->members()) {
474
+ methodNames[member.name()] = 1;
475
+ map[member.name()].append(&member);
476
+ }
477
+ }
478
+ }
479
+ }
480
+
481
+ out << "};\n\n";
482
+
483
+ out << "// Raw list of all methods, using munged names\n";
484
+ out << "static const char *methodNames[] = {\n";
485
+ out << " \"\",\t//0\n";
486
+ i = 1;
487
+ for (QMap<QString, int>::iterator it = methodNames.begin(); it != methodNames.end(); it++, i++) {
488
+ it.value() = i;
489
+ out << " \"" << it.key() << "\",\t//" << i << "\n";
490
+ }
491
+ out << "};\n\n";
492
+
493
+ out << "// (classId, name (index in methodNames), argumentList index, number of args, method flags, "
494
+ << "return type (index in types), xcall() index)\n";
495
+ out << "static Smoke::Method methods[] = {\n";
496
+ out << " { 0, 0, 0, 0, 0, 0, 0 },\t// (no method)\n";
497
+
498
+ i = 1;
499
+ int methodCount = 1;
500
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
501
+ Class* klass = &classes[iter.key()];
502
+ const Method* destructor = 0;
503
+ bool isExternal = false;
504
+ if (externalClasses.contains(klass))
505
+ isExternal = true;
506
+ if (isExternal && !declaredVirtualMethods.contains(klass))
507
+ continue;
508
+
509
+ QList<const Method*> virtualMethods = Util::virtualMethodsForClass(klass);
510
+
511
+ int xcall_index = 1;
512
+ foreach (const Method& meth, klass->methods()) {
513
+ if (isExternal && !declaredVirtualMethods[klass].contains(&meth))
514
+ continue;
515
+ if (meth.access() == Access_private)
516
+ continue;
517
+ if (meth.isDestructor()) {
518
+ destructor = &meth;
519
+ continue;
520
+ }
521
+ out << " {" << iter.value() << ", " << methodNames[meth.name()] << ", ";
522
+ int numArgs = meth.parameters().count();
523
+ if (numArgs) {
524
+ out << parameterIndices[&meth] << ", " << numArgs << ", ";
525
+ } else {
526
+ out << "0, 0, ";
527
+ }
528
+ QString flags = "0";
529
+ if (meth.isConst())
530
+ flags += "|Smoke::mf_const";
531
+ if (meth.flags() & Method::Static)
532
+ flags += "|Smoke::mf_static";
533
+ if (meth.isConstructor())
534
+ flags += "|Smoke::mf_ctor";
535
+ if (meth.flags() & Method::Explicit)
536
+ flags += "|Smoke::mf_explicit";
537
+ if (meth.access() == Access_protected)
538
+ flags += "|Smoke::mf_protected";
539
+ if (meth.isConstructor() &&
540
+ meth.parameters().count() == 1 &&
541
+ meth.parameters()[0].type()->isConst() &&
542
+ meth.parameters()[0].type()->getClass() == klass)
543
+ flags += "|Smoke::mf_copyctor";
544
+ if (Util::fieldAccessors.contains(&meth))
545
+ flags += "|Smoke::mf_attribute";
546
+ if (meth.isQPropertyAccessor())
547
+ flags += "|Smoke::mf_property";
548
+
549
+ // Simply checking for flags() & Method::Virtual won't be enough, because methods can override virtuals without being
550
+ // declared 'virtual' themselves (and they're still virtual, then).
551
+ if (virtualMethods.contains(&meth))
552
+ flags += "|Smoke::mf_virtual";
553
+ if (meth.flags() & Method::PureVirtual)
554
+ flags += "|Smoke::mf_purevirtual";
555
+ if (meth.isSignal())
556
+ flags += "|Smoke::mf_signal";
557
+ else if (meth.isSlot())
558
+ flags += "|Smoke::mf_slot";
559
+
560
+ flags.replace("0|", "");
561
+ out << flags;
562
+ if (meth.type() == Type::Void) {
563
+ out << ", 0";
564
+ } else if (!typeIndex.contains(meth.type())) {
565
+ qFatal("missing type: %s in method %s (while writing out methods table)", qPrintable(meth.type()->toString()), qPrintable(meth.toString(false, true)));
566
+ } else {
567
+ out << ", " << typeIndex[meth.type()];
568
+ }
569
+ out << ", " << (isExternal ? 0 : xcall_index) << "},";
570
+
571
+ // comment
572
+ out << "\t//" << i << " " << klass->toString() << "::";
573
+ out << meth.name() << '(';
574
+ for (int j = 0; j < meth.parameters().count(); j++) {
575
+ if (j > 0) out << ", ";
576
+ out << meth.parameters()[j].toString();
577
+ }
578
+ out << ')';
579
+ if (meth.isConst())
580
+ out << " const";
581
+ if (meth.flags() & Method::PureVirtual)
582
+ out << " [pure virtual]";
583
+ out << "\n";
584
+ methodIdx[&meth] = i;
585
+ xcall_index++;
586
+ i++;
587
+ methodCount++;
588
+ }
589
+ // enums
590
+ foreach (BasicTypeDeclaration* decl, klass->children()) {
591
+ const Enum* e = 0;
592
+ if ((e = dynamic_cast<Enum*>(decl))) {
593
+ if (e->access() == Access_private)
594
+ continue;
595
+
596
+ Type *enumType;
597
+ if (e->name().isEmpty()) {
598
+ // unnamed enum
599
+ enumType = &types["long"];
600
+ } else {
601
+ enumType = &types[e->toString()];
602
+ }
603
+
604
+ int index = 0;
605
+ QHash<Type*, int>::const_iterator typeIt;
606
+ if ((typeIt = typeIndex.find(enumType)) == typeIndex.end()) {
607
+ // this enum doesn't have an index, so we don't want it here
608
+ continue;
609
+ } else {
610
+ index = *typeIt;
611
+ }
612
+
613
+ foreach (const EnumMember& member, e->members()) {
614
+ out << " {" << iter.value() << ", " << methodNames[member.name()]
615
+ << ", 0, 0, Smoke::mf_static|Smoke::mf_enum, " << index
616
+ << ", " << xcall_index << "},";
617
+
618
+ // comment
619
+ out << "\t//" << i << " " << klass->toString() << "::" << member.name() << " (enum)";
620
+ out << "\n";
621
+ methodIdx[&member] = i;
622
+ xcall_index++;
623
+ i++;
624
+ methodCount++;
625
+ }
626
+ }
627
+ }
628
+ if (destructor) {
629
+ out << " {" << iter.value() << ", " << methodNames[destructor->name()] << ", 0, 0, Smoke::mf_dtor";
630
+ if (destructor->access() == Access_private)
631
+ out << "|Smoke::mf_protected";
632
+ out << ", 0, " << xcall_index << " },\t//" << i << " " << klass->toString()
633
+ << "::" << destructor->name() << "()\n";
634
+ methodIdx[destructor] = i;
635
+ xcall_index++;
636
+ i++;
637
+ methodCount++;
638
+ }
639
+ }
640
+
641
+ out << "};\n\n";
642
+
643
+ out << "static Smoke::Index ambiguousMethodList[] = {\n";
644
+ out << " 0,\n";
645
+
646
+ QHash<const Class*, QHash<QString, int> > ambigiousIds;
647
+ i = 1;
648
+ // ambigious method list
649
+ for (QHash<const Class*, QMap<QString, QList<const Member*> > >::const_iterator iter = classMungedNames.constBegin();
650
+ iter != classMungedNames.constEnd(); iter++)
651
+ {
652
+ const Class* klass = iter.key();
653
+ const QMap<QString, QList<const Member*> >& map = iter.value();
654
+
655
+ for (QMap<QString, QList<const Member*> >::const_iterator munged_it = map.constBegin();
656
+ munged_it != map.constEnd(); munged_it++)
657
+ {
658
+ if (munged_it.value().size() < 2)
659
+ continue;
660
+ foreach (const Member* member, munged_it.value()) {
661
+ out << " " << methodIdx[member] << ',';
662
+
663
+ // comment
664
+ out << " // " << klass->toString() << "::" << member->name();
665
+ const Method* meth = 0;
666
+ if ((meth = dynamic_cast<const Method*>(member))) {
667
+ out << '(';
668
+ for (int j = 0; j < meth->parameters().count(); j++) {
669
+ if (j > 0) out << ", ";
670
+ out << meth->parameters()[j].type()->toString();
671
+ }
672
+ out << ')';
673
+ if (meth->isConst()) out << " const";
674
+ }
675
+ out << "\n";
676
+ }
677
+ out << " 0,\n";
678
+ ambigiousIds[klass][munged_it.key()] = i;
679
+ i += munged_it.value().size() + 1;
680
+ }
681
+ }
682
+
683
+ out << "};\n\n";
684
+
685
+ int methodMapCount = 1;
686
+ out << "// Class ID, munged name ID (index into methodNames), method def (see methods) if >0 or number of overloads if <0\n";
687
+ out << "static Smoke::MethodMap methodMaps[] = {\n";
688
+ out << " {0, 0, 0},\t//0 (no method)\n";
689
+
690
+ for (QMap<QString, int>::const_iterator iter = classIndex.constBegin(); iter != classIndex.constEnd(); iter++) {
691
+ Class* klass = &classes[iter.key()];
692
+ if (externalClasses.contains(klass))
693
+ continue;
694
+
695
+ QMap<QString, QList<const Member*> >& map = classMungedNames[klass];
696
+ for (QMap<QString, QList<const Member*> >::const_iterator munged_it = map.constBegin(); munged_it != map.constEnd(); munged_it++) {
697
+
698
+ // class index, munged name index
699
+ out << " {" << classIndex[iter.key()] << ", " << methodNames[munged_it.key()] << ", ";
700
+
701
+ // if there's only one matching method for this class and the munged name, insert the index into methodss
702
+ if (munged_it.value().size() == 1) {
703
+ out << methodIdx[munged_it.value().first()];
704
+ } else {
705
+ // negative index into ambigious methods list
706
+ out << '-' << ambigiousIds[klass][munged_it.key()];
707
+ }
708
+ out << "},";
709
+ // comment
710
+ out << "\t// " << klass->toString() << "::" << munged_it.key();
711
+ out << "\n";
712
+ methodMapCount++;
713
+ }
714
+ }
715
+
716
+ out << "};\n\n";
717
+
718
+ out << "}\n\n";
719
+
720
+ out << "extern \"C\" {\n\n";
721
+
722
+ for (int j = 0; j < Options::parentModules.count(); j++) {
723
+ out << "SMOKE_IMPORT void init_" << Options::parentModules[j] << "_Smoke();\n";
724
+ if (j == Options::parentModules.count() - 1)
725
+ out << "\n";
726
+ }
727
+
728
+ out << "static bool initialized = false;\n";
729
+ out << "Smoke *" << Options::module << "_Smoke = 0;\n\n";
730
+ out << "// Create the Smoke instance encapsulating all the above.\n";
731
+ out << "void init_" << Options::module << "_Smoke() {\n";
732
+ foreach (const QString& str, Options::parentModules) {
733
+ out << " init_" << str << "_Smoke();\n";
734
+ }
735
+ out << " if (initialized) return;\n";
736
+ out << " " << Options::module << "_Smoke = new Smoke(\n";
737
+ out << " \"" << Options::module << "\",\n";
738
+ out << " " << smokeNamespaceName << "::classes, " << classCount << ",\n";
739
+ out << " " << smokeNamespaceName << "::methods, " << methodCount << ",\n";
740
+ out << " " << smokeNamespaceName << "::methodMaps, " << methodMapCount << ",\n";
741
+ out << " " << smokeNamespaceName << "::methodNames, " << methodNames.count() << ",\n";
742
+ out << " " << smokeNamespaceName << "::types, " << typeIndex.count() << ",\n";
743
+ out << " " << smokeNamespaceName << "::inheritanceList,\n";
744
+ out << " " << smokeNamespaceName << "::argumentList,\n";
745
+ out << " " << smokeNamespaceName << "::ambiguousMethodList,\n";
746
+ out << " " << smokeNamespaceName << "::cast );\n";
747
+ out << " initialized = true;\n";
748
+ out << "}\n\n";
749
+ out << "void delete_" << Options::module << "_Smoke() { delete " << Options::module << "_Smoke; }\n\n";
750
+ out << "}\n";
751
+
752
+ smokedata.close();
753
+ argNames.close();
754
+ }