qtbindings 4.8.6.3 → 4.8.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (659) hide show
  1. checksums.yaml +5 -5
  2. data/COPYING.LIB.txt +510 -510
  3. data/COPYING.txt +286 -286
  4. data/KNOWN_ISSUES.txt +17 -17
  5. data/bin/rbqtapi +0 -0
  6. data/bin/rbrcc +0 -0
  7. data/bin/rbuic4 +0 -0
  8. data/bin/smokeapi +0 -0
  9. data/bin/smokedeptool +0 -0
  10. data/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -5
  11. data/examples/designer/calculatorbuilder/calculatorform.rb +60 -60
  12. data/examples/designer/calculatorbuilder/calculatorform.ui +299 -299
  13. data/examples/designer/calculatorbuilder/main.rb +34 -34
  14. data/examples/designer/calculatorbuilder/makefile +2 -2
  15. data/examples/designer/calculatorform/calculatorform.rb +46 -46
  16. data/examples/designer/calculatorform/calculatorform.ui +277 -277
  17. data/examples/designer/calculatorform/main.rb +32 -32
  18. data/examples/designer/calculatorform/makefile +3 -3
  19. data/examples/desktop/screenshot/main.rb +32 -32
  20. data/examples/desktop/screenshot/screenshot.rb +157 -157
  21. data/examples/desktop/systray/images/bad.svg +64 -64
  22. data/examples/desktop/systray/images/heart.svg +55 -55
  23. data/examples/desktop/systray/images/trash.svg +58 -58
  24. data/examples/desktop/systray/main.rb +41 -41
  25. data/examples/desktop/systray/makefile +2 -2
  26. data/examples/desktop/systray/systray.qrc +7 -7
  27. data/examples/desktop/systray/window.rb +219 -219
  28. data/examples/dialogs/complexwizard/complexwizard.rb +140 -140
  29. data/examples/dialogs/complexwizard/licensewizard.rb +294 -294
  30. data/examples/dialogs/complexwizard/main.rb +31 -31
  31. data/examples/dialogs/configdialog/configdialog.rb +109 -109
  32. data/examples/dialogs/configdialog/main.rb +31 -31
  33. data/examples/dialogs/configdialog/pages.rb +140 -140
  34. data/examples/dialogs/extension/finddialog.rb +89 -89
  35. data/examples/dialogs/extension/main.rb +31 -31
  36. data/examples/dialogs/findfiles/main.rb +32 -32
  37. data/examples/dialogs/findfiles/window.rb +177 -177
  38. data/examples/dialogs/simplewizard/classwizard.rb +374 -374
  39. data/examples/dialogs/simplewizard/main.rb +31 -31
  40. data/examples/dialogs/simplewizard/simplewizard.rb +110 -110
  41. data/examples/dialogs/standarddialogs/dialog.rb +340 -340
  42. data/examples/dialogs/standarddialogs/main.rb +31 -31
  43. data/examples/dialogs/tabdialog/main.rb +38 -38
  44. data/examples/dialogs/tabdialog/tabdialog.rb +178 -178
  45. data/examples/draganddrop/draggableicons/dragwidget.rb +125 -125
  46. data/examples/draganddrop/draggableicons/main.rb +41 -41
  47. data/examples/draganddrop/draggabletext/draglabel.rb +51 -51
  48. data/examples/draganddrop/draggabletext/dragwidget.rb +94 -94
  49. data/examples/draganddrop/draggabletext/main.rb +33 -33
  50. data/examples/draganddrop/draggabletext/words.txt +41 -41
  51. data/examples/draganddrop/dropsite/dropsitewidget.rb +99 -99
  52. data/examples/draganddrop/dropsite/dropsitewindow.rb +114 -114
  53. data/examples/draganddrop/dropsite/main.rb +33 -33
  54. data/examples/draganddrop/fridgemagnets/draglabel.rb +78 -78
  55. data/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -130
  56. data/examples/draganddrop/fridgemagnets/main.rb +33 -33
  57. data/examples/draganddrop/fridgemagnets/words.txt +48 -48
  58. data/examples/draganddrop/puzzle/main.rb +33 -33
  59. data/examples/draganddrop/puzzle/mainwindow.rb +136 -136
  60. data/examples/draganddrop/puzzle/pieceslist.rb +95 -95
  61. data/examples/draganddrop/puzzle/puzzlewidget.rb +190 -190
  62. data/examples/graphicsview/collidingmice/main.rb +53 -53
  63. data/examples/graphicsview/collidingmice/makefile +2 -2
  64. data/examples/graphicsview/collidingmice/mice.qrc +5 -5
  65. data/examples/graphicsview/collidingmice/mouse.rb +176 -176
  66. data/examples/graphicsview/dragdroprobot/coloritem.rb +86 -86
  67. data/examples/graphicsview/dragdroprobot/main.rb +57 -57
  68. data/examples/graphicsview/dragdroprobot/makefile +2 -2
  69. data/examples/graphicsview/dragdroprobot/robot.qrc +5 -5
  70. data/examples/graphicsview/dragdroprobot/robot.rb +246 -246
  71. data/examples/itemviews/chart/chart.qrc +5 -5
  72. data/examples/itemviews/chart/main.rb +33 -33
  73. data/examples/itemviews/chart/mainwindow.rb +151 -151
  74. data/examples/itemviews/chart/makefile +2 -2
  75. data/examples/itemviews/chart/mydata.cht +8 -8
  76. data/examples/itemviews/chart/pieview.rb +516 -516
  77. data/examples/itemviews/chart/qtdata.cht +14 -14
  78. data/examples/itemviews/dirview/main.rb +39 -39
  79. data/examples/itemviews/pixelator/imagemodel.rb +51 -51
  80. data/examples/itemviews/pixelator/images.qrc +5 -5
  81. data/examples/itemviews/pixelator/main.rb +34 -34
  82. data/examples/itemviews/pixelator/mainwindow.rb +218 -218
  83. data/examples/itemviews/pixelator/makefile +3 -3
  84. data/examples/itemviews/pixelator/pixeldelegate.rb +67 -67
  85. data/examples/itemviews/puzzle/main.rb +36 -36
  86. data/examples/itemviews/puzzle/mainwindow.rb +143 -143
  87. data/examples/itemviews/puzzle/piecesmodel.rb +174 -174
  88. data/examples/itemviews/puzzle/puzzlewidget.rb +192 -192
  89. data/examples/itemviews/simpledommodel/domitem.rb +62 -62
  90. data/examples/itemviews/simpledommodel/dommodel.rb +139 -139
  91. data/examples/itemviews/simpledommodel/main.rb +33 -33
  92. data/examples/itemviews/simpledommodel/mainwindow.rb +66 -66
  93. data/examples/itemviews/simpletreemodel/default.txt +40 -40
  94. data/examples/itemviews/simpletreemodel/main.rb +41 -41
  95. data/examples/itemviews/simpletreemodel/makefile +2 -2
  96. data/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -5
  97. data/examples/itemviews/simpletreemodel/treeitem.rb +67 -67
  98. data/examples/itemviews/simpletreemodel/treemodel.rb +164 -164
  99. data/examples/itemviews/sortingmodel/default.txt +40 -40
  100. data/examples/itemviews/sortingmodel/main.rb +53 -53
  101. data/examples/itemviews/sortingmodel/treeitem.rb +73 -73
  102. data/examples/itemviews/sortingmodel/treemodel.rb +166 -166
  103. data/examples/itemviews/spinboxdelegate/main.rb +47 -47
  104. data/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -62
  105. data/examples/killerfilter/killerfilter.rb +55 -55
  106. data/examples/layouts/basiclayouts/dialog.rb +110 -110
  107. data/examples/layouts/basiclayouts/main.rb +31 -31
  108. data/examples/layouts/borderlayout/borderlayout.rb +190 -190
  109. data/examples/layouts/borderlayout/main.rb +32 -32
  110. data/examples/layouts/borderlayout/window.rb +52 -52
  111. data/examples/layouts/flowlayouts/flowlayout.rb +108 -108
  112. data/examples/layouts/flowlayouts/main.rb +32 -32
  113. data/examples/layouts/flowlayouts/window.rb +43 -43
  114. data/examples/mainwindows/application/main.rb +32 -32
  115. data/examples/mainwindows/application/mainwindow.rb +285 -285
  116. data/examples/mainwindows/dockwidgets/main.rb +32 -32
  117. data/examples/mainwindows/dockwidgets/mainwindow.rb +302 -302
  118. data/examples/mainwindows/mdi/main.rb +32 -32
  119. data/examples/mainwindows/mdi/mainwindow.rb +363 -363
  120. data/examples/mainwindows/mdi/mdichild.rb +152 -152
  121. data/examples/mainwindows/menus/main.rb +32 -32
  122. data/examples/mainwindows/menus/mainwindow.rb +327 -327
  123. data/examples/mainwindows/recentfiles/main.rb +32 -32
  124. data/examples/mainwindows/recentfiles/mainwindow.rb +258 -258
  125. data/examples/mainwindows/sdi/main.rb +32 -32
  126. data/examples/mainwindows/sdi/mainwindow.rb +335 -335
  127. data/examples/network/broadcastreceiver/main.rb +32 -32
  128. data/examples/network/broadcastreceiver/receiver.rb +64 -64
  129. data/examples/network/broadcastsender/main.rb +32 -32
  130. data/examples/network/broadcastsender/sender.rb +72 -72
  131. data/examples/network/fortuneclient/client.rb +149 -149
  132. data/examples/network/fortuneclient/main.rb +32 -32
  133. data/examples/network/fortuneserver/main.rb +32 -32
  134. data/examples/network/fortuneserver/server.rb +88 -88
  135. data/examples/network/ftp/ftpwindow.rb +259 -259
  136. data/examples/network/ftp/main.rb +32 -32
  137. data/examples/network/http/httpwindow.rb +187 -187
  138. data/examples/network/http/main.rb +32 -32
  139. data/examples/network/loopback/dialog.rb +163 -163
  140. data/examples/network/loopback/main.rb +32 -32
  141. data/examples/opengl/grabber/glwidget.rb +265 -265
  142. data/examples/opengl/grabber/main.rb +32 -32
  143. data/examples/opengl/grabber/mainwindow.rb +189 -189
  144. data/examples/opengl/hellogl/glwidget.rb +226 -226
  145. data/examples/opengl/hellogl/main.rb +32 -32
  146. data/examples/opengl/hellogl/window.rb +66 -66
  147. data/examples/opengl/textures/glwidget.rb +151 -151
  148. data/examples/opengl/textures/main.rb +32 -32
  149. data/examples/opengl/textures/window.rb +77 -77
  150. data/examples/painting/basicdrawing/main.rb +32 -32
  151. data/examples/painting/basicdrawing/renderarea.rb +166 -166
  152. data/examples/painting/basicdrawing/window.rb +215 -215
  153. data/examples/painting/concentriccircles/circlewidget.rb +88 -88
  154. data/examples/painting/concentriccircles/main.rb +32 -32
  155. data/examples/painting/concentriccircles/window.rb +72 -72
  156. data/examples/painting/fontsampler/main.rb +32 -32
  157. data/examples/painting/fontsampler/mainwindow.rb +369 -369
  158. data/examples/painting/fontsampler/mainwindowbase.ui +136 -136
  159. data/examples/painting/fontsampler/makefile +8 -8
  160. data/examples/painting/fontsampler/previewdialog.rb +257 -257
  161. data/examples/painting/fontsampler/previewdialogbase.ui +224 -224
  162. data/examples/painting/fontsampler/previewlabel.rb +43 -43
  163. data/examples/painting/imagecomposition/imagecomposer.rb +152 -152
  164. data/examples/painting/imagecomposition/imagecomposition.qrc +6 -6
  165. data/examples/painting/imagecomposition/main.rb +33 -33
  166. data/examples/painting/imagecomposition/makefile +2 -2
  167. data/examples/painting/painterpaths/main.rb +32 -32
  168. data/examples/painting/painterpaths/renderarea.rb +97 -97
  169. data/examples/painting/painterpaths/window.rb +247 -247
  170. data/examples/painting/svgviewer/files/bubbles.svg +212 -212
  171. data/examples/painting/svgviewer/files/cubic.svg +77 -77
  172. data/examples/painting/svgviewer/files/spheres.svg +79 -79
  173. data/examples/painting/svgviewer/main.rb +38 -38
  174. data/examples/painting/svgviewer/mainwindow.rb +99 -99
  175. data/examples/painting/svgviewer/makefile +2 -2
  176. data/examples/painting/svgviewer/svgview.rb +156 -156
  177. data/examples/painting/svgviewer/svgviewer.qrc +6 -6
  178. data/examples/painting/svgviewer/svgwindow.rb +87 -87
  179. data/examples/painting/transformations/main.rb +32 -32
  180. data/examples/painting/transformations/renderarea.rb +127 -127
  181. data/examples/painting/transformations/window.rb +153 -153
  182. data/examples/passivepopup/passivepopup.rb +38 -38
  183. data/examples/qdbus/chat/chat.rb +146 -146
  184. data/examples/qdbus/chat/chat_adaptor.rb +12 -12
  185. data/examples/qdbus/chat/chat_interface.rb +13 -13
  186. data/examples/qdbus/chat/chatmainwindow.ui +184 -184
  187. data/examples/qdbus/chat/chatsetnickname.ui +145 -145
  188. data/examples/qdbus/chat/makefile +8 -8
  189. data/examples/qdbus/complexpingpong/complexping.rb +92 -92
  190. data/examples/qdbus/complexpingpong/complexpong.rb +83 -83
  191. data/examples/qdbus/complexpingpong/ping-common.rb +1 -1
  192. data/examples/qdbus/listnames/listnames.rb +69 -69
  193. data/examples/qdbus/pingpong/ping-common.rb +1 -1
  194. data/examples/qdbus/pingpong/ping.rb +52 -52
  195. data/examples/qdbus/pingpong/pong.rb +55 -55
  196. data/examples/qdbus/remotecontrolledcar/car/car.rb +151 -151
  197. data/examples/qdbus/remotecontrolledcar/car/main.rb +50 -50
  198. data/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -66
  199. data/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -61
  200. data/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -32
  201. data/examples/qdbus/remotecontrolledcar/controller/makefile +2 -2
  202. data/examples/qtscribble/scribble.rb +270 -270
  203. data/examples/richtext/calendar/main.rb +33 -33
  204. data/examples/richtext/calendar/mainwindow.rb +173 -173
  205. data/examples/richtext/orderform/detailsdialog.rb +130 -130
  206. data/examples/richtext/orderform/main.rb +34 -34
  207. data/examples/richtext/orderform/mainwindow.rb +194 -194
  208. data/examples/richtext/syntaxhighlighter/examples/example +79 -79
  209. data/examples/richtext/syntaxhighlighter/highlighter.rb +90 -90
  210. data/examples/richtext/syntaxhighlighter/main.rb +34 -34
  211. data/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -105
  212. data/examples/ruboids/LICENSE.txt +58 -58
  213. data/examples/ruboids/Manifest +26 -26
  214. data/examples/ruboids/README +53 -53
  215. data/examples/ruboids/TODO +29 -29
  216. data/examples/ruboids/boids.properties +33 -33
  217. data/examples/ruboids/generateManifest.rb +42 -42
  218. data/examples/ruboids/release.rb +152 -152
  219. data/examples/ruboids/ruboids/Boid.rb +141 -141
  220. data/examples/ruboids/ruboids/BoidView.rb +159 -159
  221. data/examples/ruboids/ruboids/Camera.rb +24 -24
  222. data/examples/ruboids/ruboids/CameraDialog.rb +218 -218
  223. data/examples/ruboids/ruboids/Canvas.rb +143 -143
  224. data/examples/ruboids/ruboids/Cloud.rb +61 -61
  225. data/examples/ruboids/ruboids/CloudView.rb +54 -54
  226. data/examples/ruboids/ruboids/Flock.rb +47 -47
  227. data/examples/ruboids/ruboids/Graphics.rb +278 -278
  228. data/examples/ruboids/ruboids/Params.rb +87 -87
  229. data/examples/ruboids/ruboids/Point.rb +153 -153
  230. data/examples/ruboids/ruboids/Thing.rb +34 -34
  231. data/examples/ruboids/ruboids/Triangle.rb +21 -21
  232. data/examples/ruboids/ruboids/View.rb +88 -88
  233. data/examples/ruboids/ruboids/World.rb +82 -82
  234. data/examples/ruboids/ruboids/WorldWindow.rb +52 -52
  235. data/examples/ruboids/ruboids/info.rb +12 -12
  236. data/examples/ruboids/ruboids/ruboids.rb +29 -29
  237. data/examples/threading/main_thread.rb +19 -19
  238. data/examples/tutorial/t1/t1.rb +10 -10
  239. data/examples/tutorial/t10/cannon.rb +72 -72
  240. data/examples/tutorial/t10/lcdrange.rb +45 -45
  241. data/examples/tutorial/t10/t10.rb +55 -55
  242. data/examples/tutorial/t11/cannon.rb +123 -124
  243. data/examples/tutorial/t11/lcdrange.rb +45 -45
  244. data/examples/tutorial/t11/t11.rb +65 -65
  245. data/examples/tutorial/t12/cannon.rb +157 -158
  246. data/examples/tutorial/t12/lcdrange.rb +58 -59
  247. data/examples/tutorial/t12/t12.rb +65 -66
  248. data/examples/tutorial/t13/cannon.rb +206 -208
  249. data/examples/tutorial/t13/gamebrd.rb +112 -113
  250. data/examples/tutorial/t13/lcdrange.rb +59 -60
  251. data/examples/tutorial/t13/t13.rb +11 -11
  252. data/examples/tutorial/t14/cannon.rb +262 -263
  253. data/examples/tutorial/t14/gamebrd.rb +122 -123
  254. data/examples/tutorial/t14/lcdrange.rb +61 -63
  255. data/examples/tutorial/t14/t14.rb +11 -11
  256. data/examples/tutorial/t2/t2.rb +16 -16
  257. data/examples/tutorial/t3/t3.rb +17 -18
  258. data/examples/tutorial/t4/t4.rb +23 -25
  259. data/examples/tutorial/t5/t5.rb +35 -37
  260. data/examples/tutorial/t6/t6.rb +48 -52
  261. data/examples/tutorial/t7/lcdrange.rb +32 -32
  262. data/examples/tutorial/t7/t7.rb +40 -42
  263. data/examples/tutorial/t8/cannon.rb +37 -38
  264. data/examples/tutorial/t8/lcdrange.rb +45 -45
  265. data/examples/tutorial/t8/t8.rb +43 -43
  266. data/examples/tutorial/t9/cannon.rb +44 -45
  267. data/examples/tutorial/t9/lcdrange.rb +46 -46
  268. data/examples/tutorial/t9/t9.rb +43 -43
  269. data/examples/widgets/analogclock/analogclock.rb +94 -94
  270. data/examples/widgets/analogclock/main.rb +9 -9
  271. data/examples/widgets/calculator/button.rb +45 -45
  272. data/examples/widgets/calculator/calculator.rb +382 -382
  273. data/examples/widgets/calculator/main.rb +32 -32
  274. data/examples/widgets/charactermap/characterwidget.rb +109 -109
  275. data/examples/widgets/charactermap/main.rb +32 -32
  276. data/examples/widgets/charactermap/mainwindow.rb +118 -118
  277. data/examples/widgets/digitalclock/digitalclock.rb +30 -30
  278. data/examples/widgets/digitalclock/main.rb +9 -9
  279. data/examples/widgets/groupbox/main.rb +32 -32
  280. data/examples/widgets/groupbox/window.rb +134 -134
  281. data/examples/widgets/icons/iconpreviewarea.rb +110 -110
  282. data/examples/widgets/icons/iconsizespinbox.rb +39 -39
  283. data/examples/widgets/icons/imagedelegate.rb +73 -73
  284. data/examples/widgets/icons/main.rb +32 -32
  285. data/examples/widgets/icons/mainwindow.rb +351 -351
  286. data/examples/widgets/imageviewer/imageviewer.rb +219 -219
  287. data/examples/widgets/imageviewer/main.rb +32 -32
  288. data/examples/widgets/lineedits/main.rb +32 -32
  289. data/examples/widgets/lineedits/window.rb +199 -199
  290. data/examples/widgets/movie/main.rb +32 -32
  291. data/examples/widgets/movie/movieplayer.rb +201 -201
  292. data/examples/widgets/screenshot/main.rb +32 -32
  293. data/examples/widgets/screenshot/screenshot.rb +154 -154
  294. data/examples/widgets/scribble/main.rb +32 -32
  295. data/examples/widgets/scribble/mainwindow.rb +202 -202
  296. data/examples/widgets/scribble/scribblearea.rb +154 -154
  297. data/examples/widgets/sliders/main.rb +32 -32
  298. data/examples/widgets/sliders/slidersgroup.rb +97 -97
  299. data/examples/widgets/sliders/window.rb +124 -124
  300. data/examples/widgets/spinboxes/main.rb +32 -32
  301. data/examples/widgets/spinboxes/window.rb +213 -213
  302. data/examples/widgets/tetrix/main.rb +33 -33
  303. data/examples/widgets/tetrix/tetrixboard.rb +346 -346
  304. data/examples/widgets/tetrix/tetrixpiece.rb +135 -135
  305. data/examples/widgets/tetrix/tetrixwindow.rb +88 -88
  306. data/examples/widgets/tooltips/main.rb +32 -32
  307. data/examples/widgets/tooltips/shapeitem.rb +31 -31
  308. data/examples/widgets/tooltips/sortingbox.rb +222 -222
  309. data/examples/widgets/wiggly/dialog.rb +48 -48
  310. data/examples/widgets/wiggly/main.rb +9 -9
  311. data/examples/widgets/wiggly/wigglywidget.rb +75 -75
  312. data/examples/widgets/windowflags/controllerwindow.rb +195 -195
  313. data/examples/widgets/windowflags/main.rb +32 -32
  314. data/examples/widgets/windowflags/previewwindow.rb +103 -103
  315. data/examples/xml/dombookmarks/frank.xbel +230 -230
  316. data/examples/xml/dombookmarks/jennifer.xbel +93 -93
  317. data/examples/xml/dombookmarks/main.rb +34 -34
  318. data/examples/xml/dombookmarks/mainwindow.rb +129 -129
  319. data/examples/xml/dombookmarks/xbeltree.rb +172 -172
  320. data/examples/xml/saxbookmarks/frank.xbel +230 -230
  321. data/examples/xml/saxbookmarks/jennifer.xbel +93 -93
  322. data/examples/xml/saxbookmarks/main.rb +34 -34
  323. data/examples/xml/saxbookmarks/mainwindow.rb +144 -144
  324. data/examples/xml/saxbookmarks/xbelgenerator.rb +95 -95
  325. data/examples/xml/saxbookmarks/xbelhandler.rb +122 -122
  326. data/ext/cmake/modules/BasicFindPackageVersion.cmake.in +30 -30
  327. data/ext/cmake/modules/CMakeCSharpCompiler.cmake.in +7 -7
  328. data/ext/cmake/modules/CMakeCSharpInformation.cmake +366 -366
  329. data/ext/cmake/modules/CMakeDetermineCSharpCompiler.cmake +85 -85
  330. data/ext/cmake/modules/CMakeTestCSharpCompiler.cmake +1 -1
  331. data/ext/cmake/modules/FindLibraryWithDebug.cmake +113 -113
  332. data/ext/cmake/modules/FindMono.cmake +36 -36
  333. data/ext/cmake/modules/FindPHP5.cmake +179 -179
  334. data/ext/cmake/modules/FindPerlMore.cmake +78 -78
  335. data/ext/cmake/modules/FindPhonon.cmake +71 -71
  336. data/ext/cmake/modules/FindQImageBlitz.cmake +51 -51
  337. data/ext/cmake/modules/FindQScintilla.cmake +57 -57
  338. data/ext/cmake/modules/FindQwt5.cmake +104 -104
  339. data/ext/cmake/modules/FindRuby.cmake +279 -279
  340. data/ext/cmake/modules/FindSmoke.cmake +78 -78
  341. data/ext/cmake/modules/MacroLogFeature.cmake +146 -146
  342. data/ext/cmake/modules/MacroOptionalAddBindings.cmake +47 -47
  343. data/ext/cmake/modules/MacroOptionalFindPackage.cmake +28 -28
  344. data/ext/cmake/modules/MacroPushRequiredVars.cmake +47 -47
  345. data/ext/cmake/modules/MacroWriteBasicCMakeVersionFile.cmake +22 -22
  346. data/ext/cmake/modules/SmokeConfig.cmake.in +109 -109
  347. data/ext/generator/CMakeLists.txt +38 -38
  348. data/ext/generator/cmake/BasicFindPackageVersion.cmake.in +30 -30
  349. data/ext/generator/cmake/CMakeLists.txt +24 -24
  350. data/ext/generator/cmake/FindLibraryWithDebug.cmake +113 -113
  351. data/ext/generator/cmake/FindPhonon.cmake +71 -71
  352. data/ext/generator/cmake/FindQImageBlitz.cmake +51 -51
  353. data/ext/generator/cmake/FindQScintilla.cmake +57 -57
  354. data/ext/generator/cmake/FindQwt5.cmake +104 -104
  355. data/ext/generator/cmake/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -85
  356. data/ext/generator/cmake/MacroLogFeature.cmake +146 -146
  357. data/ext/generator/cmake/MacroOptionalAddBindings.cmake +47 -47
  358. data/ext/generator/cmake/MacroOptionalFindPackage.cmake +28 -28
  359. data/ext/generator/cmake/MacroWriteBasicCMakeVersionFile.cmake +22 -22
  360. data/ext/generator/cmake/SmokeConfig.cmake.in +109 -109
  361. data/ext/generator/config.h +25 -25
  362. data/ext/generator/generator_export.h +31 -31
  363. data/ext/generator/generatorenvironment.cpp +52 -52
  364. data/ext/generator/generatorenvironment.h +35 -35
  365. data/ext/generator/generatorpreprocessor.cpp +303 -303
  366. data/ext/generator/generatorpreprocessor.h +83 -83
  367. data/ext/generator/generators/CMakeLists.txt +4 -4
  368. data/ext/generator/generators/dump/CMakeLists.txt +15 -15
  369. data/ext/generator/generators/dump/generator_dump.cpp +36 -36
  370. data/ext/generator/generators/smoke/CMakeLists.txt +18 -18
  371. data/ext/generator/generators/smoke/generator_smoke.cpp +240 -240
  372. data/ext/generator/generators/smoke/globals.h +140 -140
  373. data/ext/generator/generators/smoke/helpers.cpp +793 -793
  374. data/ext/generator/generators/smoke/writeClasses.cpp +502 -502
  375. data/ext/generator/generators/smoke/writeSmokeDataFile.cpp +754 -754
  376. data/ext/generator/generatorvisitor.cpp +922 -922
  377. data/ext/generator/generatorvisitor.h +119 -119
  378. data/ext/generator/name_compiler.cpp +205 -205
  379. data/ext/generator/name_compiler.h +76 -76
  380. data/ext/generator/options.cpp +33 -33
  381. data/ext/generator/options.h +46 -46
  382. data/ext/generator/parser/CMakeLists.txt +50 -50
  383. data/ext/generator/parser/ast.cpp +21 -21
  384. data/ext/generator/parser/ast.h +923 -923
  385. data/ext/generator/parser/astutilities.h +65 -65
  386. data/ext/generator/parser/codegenerator.cpp +867 -867
  387. data/ext/generator/parser/codegenerator.h +180 -180
  388. data/ext/generator/parser/codemodel_fwd.h +76 -76
  389. data/ext/generator/parser/commentformatter.cpp +54 -54
  390. data/ext/generator/parser/commentformatter.h +45 -45
  391. data/ext/generator/parser/commentparser.cpp +109 -109
  392. data/ext/generator/parser/commentparser.h +84 -84
  393. data/ext/generator/parser/control.cpp +40 -40
  394. data/ext/generator/parser/control.h +51 -51
  395. data/ext/generator/parser/cppparser_export.h +33 -33
  396. data/ext/generator/parser/default_visitor.cpp +470 -470
  397. data/ext/generator/parser/default_visitor.h +116 -116
  398. data/ext/generator/parser/dumptree.cpp +146 -146
  399. data/ext/generator/parser/dumptree.h +50 -50
  400. data/ext/generator/parser/indexedstring.cpp +213 -213
  401. data/ext/generator/parser/indexedstring.h +147 -147
  402. data/ext/generator/parser/kdevelop-parser-rev +1 -1
  403. data/ext/generator/parser/kdevvarlengtharray.h +346 -346
  404. data/ext/generator/parser/lexer.cpp +964 -964
  405. data/ext/generator/parser/lexer.h +308 -308
  406. data/ext/generator/parser/listnode.cpp +20 -20
  407. data/ext/generator/parser/listnode.h +97 -97
  408. data/ext/generator/parser/memorypool.cpp +20 -20
  409. data/ext/generator/parser/memorypool.h +41 -41
  410. data/ext/generator/parser/name_compiler.cpp +190 -190
  411. data/ext/generator/parser/name_compiler.h +77 -77
  412. data/ext/generator/parser/parser.cpp +4708 -4708
  413. data/ext/generator/parser/parser.h +290 -290
  414. data/ext/generator/parser/parsesession.cpp +106 -106
  415. data/ext/generator/parser/parsesession.h +87 -87
  416. data/ext/generator/parser/problem.h +21 -21
  417. data/ext/generator/parser/rpp/CMakeLists.txt +45 -45
  418. data/ext/generator/parser/rpp/Makefile.am +13 -13
  419. data/ext/generator/parser/rpp/anchor.h +51 -51
  420. data/ext/generator/parser/rpp/appendedlist.h +363 -363
  421. data/ext/generator/parser/rpp/chartools.cpp +146 -146
  422. data/ext/generator/parser/rpp/chartools.h +99 -99
  423. data/ext/generator/parser/rpp/macrorepository.cpp +44 -44
  424. data/ext/generator/parser/rpp/macrorepository.h +59 -59
  425. data/ext/generator/parser/rpp/pp-configuration +86 -86
  426. data/ext/generator/parser/rpp/pp-engine.h +267 -267
  427. data/ext/generator/parser/rpp/pp-environment.cpp +271 -271
  428. data/ext/generator/parser/rpp/pp-environment.h +119 -119
  429. data/ext/generator/parser/rpp/pp-internal.cpp +38 -38
  430. data/ext/generator/parser/rpp/pp-internal.h +37 -37
  431. data/ext/generator/parser/rpp/pp-location.cpp +191 -191
  432. data/ext/generator/parser/rpp/pp-location.h +89 -89
  433. data/ext/generator/parser/rpp/pp-macro-expander.cpp +568 -568
  434. data/ext/generator/parser/rpp/pp-macro-expander.cpp.orig +558 -558
  435. data/ext/generator/parser/rpp/pp-macro-expander.h +130 -130
  436. data/ext/generator/parser/rpp/pp-macro.cpp +153 -153
  437. data/ext/generator/parser/rpp/pp-macro.h +176 -176
  438. data/ext/generator/parser/rpp/pp-scanner.cpp +311 -311
  439. data/ext/generator/parser/rpp/pp-scanner.h +97 -97
  440. data/ext/generator/parser/rpp/pp-stream.cpp +425 -425
  441. data/ext/generator/parser/rpp/pp-stream.h +183 -183
  442. data/ext/generator/parser/rpp/preprocessor.cpp +65 -65
  443. data/ext/generator/parser/rpp/preprocessor.h +80 -80
  444. data/ext/generator/parser/rpp/rpp.pri +2 -2
  445. data/ext/generator/parser/rpp/test/t001.cpp +23 -23
  446. data/ext/generator/parser/rpp/test/t002.cpp +15 -15
  447. data/ext/generator/parser/rpp/test/t003.cpp +10 -10
  448. data/ext/generator/parser/rpp/test/t004.cpp +9 -9
  449. data/ext/generator/parser/rpp/test/t005.cpp +10 -10
  450. data/ext/generator/parser/rpp/test/t006.cpp +10 -10
  451. data/ext/generator/parser/rpp/test/t007.cpp +6 -6
  452. data/ext/generator/parser/rpp/test/t008.cpp +6 -6
  453. data/ext/generator/parser/rpp/test/t009.cpp +5 -5
  454. data/ext/generator/parser/rpp/test/t010.cpp +15 -15
  455. data/ext/generator/parser/rpp/test/t011.cpp +9 -9
  456. data/ext/generator/parser/rpp/tests/CMakeLists.txt +17 -17
  457. data/ext/generator/parser/rpp/tests/main.cpp +69 -69
  458. data/ext/generator/parser/rxx.pri +50 -50
  459. data/ext/generator/parser/rxx_allocator.h +128 -128
  460. data/ext/generator/parser/safetycounter.h +57 -57
  461. data/ext/generator/parser/simplecursor.h +74 -74
  462. data/ext/generator/parser/stringhelpers.cpp +577 -577
  463. data/ext/generator/parser/stringhelpers.h +118 -118
  464. data/ext/generator/parser/symbol.h +140 -140
  465. data/ext/generator/parser/tests/CMakeLists.txt +46 -46
  466. data/ext/generator/parser/tests/test_generator.cpp +259 -259
  467. data/ext/generator/parser/tests/test_parser.cpp +474 -474
  468. data/ext/generator/parser/tests/test_pool.cpp +109 -109
  469. data/ext/generator/parser/tests/test_pool.h +35 -35
  470. data/ext/generator/parser/tests/testconfig.h.cmake +4 -4
  471. data/ext/generator/parser/tokens.cpp +367 -367
  472. data/ext/generator/parser/tokens.h +148 -148
  473. data/ext/generator/parser/type_compiler.cpp +135 -135
  474. data/ext/generator/parser/type_compiler.h +68 -68
  475. data/ext/generator/parser/visitor.cpp +115 -115
  476. data/ext/generator/parser/visitor.h +138 -138
  477. data/ext/generator/smoke.h +557 -557
  478. data/ext/generator/smokegen_string.h +43 -43
  479. data/ext/generator/type.cpp +204 -204
  480. data/ext/generator/type.h +497 -497
  481. data/ext/generator/type_compiler.cpp +277 -277
  482. data/ext/generator/type_compiler.h +80 -80
  483. data/ext/ruby/CMakeLists.txt +64 -64
  484. data/ext/ruby/qtdeclarative/CMakeLists.txt +17 -17
  485. data/ext/ruby/qtdeclarative/qtdeclarative.cpp +67 -67
  486. data/ext/ruby/qtdeclarative/qtdeclarative.rb +17 -17
  487. data/ext/ruby/qtdeclarative/qtdeclarativehandlers.cpp +36 -36
  488. data/ext/ruby/qtruby/AUTHORS +54 -54
  489. data/ext/ruby/qtruby/COPYING +355 -355
  490. data/ext/ruby/qtruby/COPYING.LIB +510 -510
  491. data/ext/ruby/qtruby/ChangeLog +3732 -3732
  492. data/ext/ruby/qtruby/INSTALL +79 -79
  493. data/ext/ruby/qtruby/README +264 -264
  494. data/ext/ruby/qtruby/TODO +8 -8
  495. data/ext/ruby/qtruby/bin/rbqtapi +152 -152
  496. data/ext/ruby/qtruby/rails_support/CMakeLists.txt +1 -1
  497. data/ext/ruby/qtruby/rails_support/active_item_model.rb +234 -234
  498. data/ext/ruby/qtruby/rails_support/active_table_model.rb +122 -122
  499. data/ext/ruby/qtruby/src/marshall_basetypes.h +208 -208
  500. data/ext/ruby/qtruby/src/marshall_complex.h +175 -175
  501. data/ext/ruby/qtruby/src/marshall_macros.h +647 -647
  502. data/ext/ruby/qtruby/src/marshall_types.cpp +815 -815
  503. data/ext/ruby/qtruby/src/marshall_types.h +240 -240
  504. data/ext/ruby/qtruby/src/qtruby.cpp +1 -1
  505. data/ext/ruby/qtruby/test/opoverloading.rb +46 -46
  506. data/ext/ruby/qtruby/test/unittests.rb +151 -151
  507. data/ext/ruby/qtruby/tools/rbrcc/main.cpp +173 -173
  508. data/ext/ruby/qtruby/tools/rbrcc/rbrcc.pro +14 -14
  509. data/ext/ruby/qtruby/tools/rbrcc/rcc.cpp +648 -648
  510. data/ext/ruby/qtruby/tools/rbrcc/rcc.h +165 -165
  511. data/ext/ruby/qtruby/tools/rbuic/LICENSE.GPL +280 -280
  512. data/ext/ruby/qtruby/tools/rbuic/TODO +4 -4
  513. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.cpp +106 -106
  514. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.h +95 -95
  515. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.cpp +102 -102
  516. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.h +85 -85
  517. data/ext/ruby/qtruby/tools/rbuic/driver.cpp +384 -384
  518. data/ext/ruby/qtruby/tools/rbuic/driver.h +141 -141
  519. data/ext/ruby/qtruby/tools/rbuic/rbuic.pri +23 -23
  520. data/ext/ruby/qtruby/tools/rbuic/rbuic4.pro +43 -43
  521. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.cpp +150 -150
  522. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.h +83 -83
  523. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.cpp +217 -217
  524. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.h +85 -85
  525. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.cpp +185 -185
  526. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.h +86 -86
  527. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.cpp +88 -88
  528. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.h +83 -83
  529. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.cpp +126 -126
  530. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.h +87 -87
  531. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.cpp +2478 -2478
  532. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.h +314 -314
  533. data/ext/ruby/qtruby/tools/rbuic/ruby/ruby.pri +18 -18
  534. data/ext/ruby/qtruby/tools/rbuic/treewalker.cpp +318 -318
  535. data/ext/ruby/qtruby/tools/rbuic/treewalker.h +139 -139
  536. data/ext/ruby/qtruby/tools/rbuic/ui4.cpp +7623 -7623
  537. data/ext/ruby/qtruby/tools/rbuic/ui4.h +3180 -3180
  538. data/ext/ruby/qtruby/tools/rbuic/utils.h +125 -125
  539. data/ext/ruby/qtruby/tools/rbuic/validator.cpp +100 -100
  540. data/ext/ruby/qtruby/tools/rbuic/validator.h +80 -80
  541. data/ext/ruby/qtscript/CMakeLists.txt +19 -19
  542. data/ext/ruby/qtscript/qtscript.cpp +83 -83
  543. data/ext/ruby/qtscript/qtscript.rb +40 -40
  544. data/ext/ruby/qtscript/qtscripthandlers.cpp +37 -37
  545. data/ext/ruby/qtscript/smokedata.cpp +1403 -1403
  546. data/ext/ruby/qttest/CMakeLists.txt +18 -18
  547. data/ext/ruby/qttest/ChangeLog +9 -9
  548. data/ext/ruby/qttest/examples/myfirsttest.rb +30 -30
  549. data/ext/ruby/qttest/qttest.cpp +83 -83
  550. data/ext/ruby/qttest/qttest.rb +166 -166
  551. data/ext/ruby/qttest/qttesthandlers.cpp +37 -37
  552. data/ext/ruby/qtuitools/CMakeLists.txt +16 -16
  553. data/ext/ruby/qtuitools/qtuitools.cpp +83 -83
  554. data/ext/ruby/qtuitools/qtuitools.rb +17 -17
  555. data/ext/ruby/qtuitools/qtuitoolshandlers.cpp +32 -32
  556. data/ext/ruby/qtwebkit/CMakeLists.txt +17 -17
  557. data/ext/ruby/qtwebkit/qtwebkit.cpp +67 -67
  558. data/ext/ruby/qtwebkit/qtwebkit.rb +17 -17
  559. data/ext/ruby/qtwebkit/qtwebkithandlers.cpp +40 -40
  560. data/ext/smoke/deptool/CMakeLists.txt +7 -7
  561. data/ext/smoke/deptool/main.cpp +128 -128
  562. data/ext/smoke/qtcore/CMakeLists.txt +88 -88
  563. data/ext/smoke/qtcore/QtGuess.txt +180 -180
  564. data/ext/smoke/qtcore/config.xml.cmake +10 -10
  565. data/ext/smoke/qtcore/qt-config.xml.cmake +21 -21
  566. data/ext/smoke/qtcore/qtcore_includes.h +1 -1
  567. data/ext/smoke/qtcore/smokeconfig.xml +193 -193
  568. data/ext/smoke/qtcore/tests/CMakeLists.txt +13 -13
  569. data/ext/smoke/qtcore/tests/test.cpp +846 -846
  570. data/ext/smoke/qtcore_smoke.h +16 -16
  571. data/ext/smoke/qtdbus/CMakeLists.txt +38 -38
  572. data/ext/smoke/qtdbus/config.xml.cmake +11 -11
  573. data/ext/smoke/qtdbus/qtdbus_includes.h +2 -2
  574. data/ext/smoke/qtdbus/smokeconfig.xml +65 -65
  575. data/ext/smoke/qtdbus_smoke.h +16 -16
  576. data/ext/smoke/qtdeclarative/CMakeLists.txt +45 -45
  577. data/ext/smoke/qtdeclarative/config.xml.cmake +12 -12
  578. data/ext/smoke/qtdeclarative/qtdeclarative_includes.h +3 -3
  579. data/ext/smoke/qtdeclarative/smokeconfig.xml +59 -59
  580. data/ext/smoke/qtdeclarative_smoke.h +16 -16
  581. data/ext/smoke/qtgui/CMakeLists.txt +76 -76
  582. data/ext/smoke/qtgui/config.xml.cmake +11 -11
  583. data/ext/smoke/qtgui/qtgui_includes.h +7 -7
  584. data/ext/smoke/qtgui/smokeconfig.xml +500 -500
  585. data/ext/smoke/qtgui_smoke.h +16 -16
  586. data/ext/smoke/qthelp/CMakeLists.txt +45 -45
  587. data/ext/smoke/qthelp/config.xml.cmake +13 -13
  588. data/ext/smoke/qthelp/qthelp_includes.h +3 -3
  589. data/ext/smoke/qthelp/smokeconfig.xml +54 -54
  590. data/ext/smoke/qthelp_smoke.h +16 -16
  591. data/ext/smoke/qtmultimedia/CMakeLists.txt +42 -42
  592. data/ext/smoke/qtmultimedia/config.xml.cmake +12 -12
  593. data/ext/smoke/qtmultimedia/qtmultimedia_includes.h +3 -3
  594. data/ext/smoke/qtmultimedia/smokeconfig.xml +51 -51
  595. data/ext/smoke/qtmultimedia_smoke.h +16 -16
  596. data/ext/smoke/qtnetwork/CMakeLists.txt +38 -38
  597. data/ext/smoke/qtnetwork/config.xml.cmake +11 -11
  598. data/ext/smoke/qtnetwork/qtnetwork_includes.h +2 -2
  599. data/ext/smoke/qtnetwork/smokeconfig.xml +81 -81
  600. data/ext/smoke/qtnetwork_smoke.h +16 -16
  601. data/ext/smoke/qtopengl/CMakeLists.txt +43 -43
  602. data/ext/smoke/qtopengl/config.xml.cmake +13 -13
  603. data/ext/smoke/qtopengl/qtopengl_includes.h +3 -3
  604. data/ext/smoke/qtopengl/smokeconfig.xml +58 -58
  605. data/ext/smoke/qtopengl_smoke.h +16 -16
  606. data/ext/smoke/qtscript/CMakeLists.txt +31 -31
  607. data/ext/smoke/qtscript/config.xml.cmake +11 -11
  608. data/ext/smoke/qtscript/qtscript_includes.h +14 -14
  609. data/ext/smoke/qtscript/smokeconfig.xml +39 -39
  610. data/ext/smoke/qtscript_smoke.h +16 -16
  611. data/ext/smoke/qtsql/CMakeLists.txt +45 -45
  612. data/ext/smoke/qtsql/config.xml.cmake +11 -11
  613. data/ext/smoke/qtsql/qtsql_includes.h +3 -3
  614. data/ext/smoke/qtsql/smokeconfig.xml +60 -60
  615. data/ext/smoke/qtsql_smoke.h +16 -16
  616. data/ext/smoke/qtsvg/CMakeLists.txt +43 -43
  617. data/ext/smoke/qtsvg/config.xml.cmake +12 -12
  618. data/ext/smoke/qtsvg/qtsvg_includes.h +3 -3
  619. data/ext/smoke/qtsvg/smokeconfig.xml +46 -46
  620. data/ext/smoke/qtsvg_smoke.h +16 -16
  621. data/ext/smoke/qttest/CMakeLists.txt +35 -35
  622. data/ext/smoke/qttest/config.xml.cmake +12 -12
  623. data/ext/smoke/qttest/qttest_includes.h +14 -14
  624. data/ext/smoke/qttest/smokeconfig.xml +36 -36
  625. data/ext/smoke/qttest_smoke.h +16 -16
  626. data/ext/smoke/qtuitools/CMakeLists.txt +30 -30
  627. data/ext/smoke/qtuitools/config.xml.cmake +12 -12
  628. data/ext/smoke/qtuitools/qtuitools_includes.h +1 -1
  629. data/ext/smoke/qtuitools/smokeconfig.xml +20 -20
  630. data/ext/smoke/qtuitools_smoke.h +16 -16
  631. data/ext/smoke/qtwebkit/CMakeLists.txt +36 -36
  632. data/ext/smoke/qtwebkit/config.xml.cmake +11 -11
  633. data/ext/smoke/qtwebkit/qtwebkit_includes.h +1 -1
  634. data/ext/smoke/qtwebkit/smokeconfig.xml +48 -48
  635. data/ext/smoke/qtwebkit_smoke.h +16 -16
  636. data/ext/smoke/qtxml/CMakeLists.txt +41 -41
  637. data/ext/smoke/qtxml/config.xml.cmake +11 -11
  638. data/ext/smoke/qtxml/qtxml_includes.h +2 -2
  639. data/ext/smoke/qtxml/smokeconfig.xml +70 -70
  640. data/ext/smoke/qtxml_smoke.h +16 -16
  641. data/ext/smoke/qtxmlpatterns/CMakeLists.txt +42 -42
  642. data/ext/smoke/qtxmlpatterns/config.xml.cmake +12 -12
  643. data/ext/smoke/qtxmlpatterns/qtxmlpatterns_includes.h +3 -3
  644. data/ext/smoke/qtxmlpatterns/smokeconfig.xml +80 -80
  645. data/ext/smoke/qtxmlpatterns_smoke.h +16 -16
  646. data/ext/smoke/smokeapi/CMakeLists.txt +9 -9
  647. data/ext/smoke/smokeapi/main.cpp +309 -309
  648. data/ext/smoke/smokebase/CMakeLists.txt +11 -11
  649. data/ext/smoke/smokebase/smokebase.cpp +6 -6
  650. data/ext/smoke/solid_smoke.h +16 -16
  651. data/lib/Qt.rb +1 -1
  652. data/lib/Qt4.rb +119 -111
  653. data/lib/qtbindings_version.rb +2 -2
  654. data/lib/qtdeclarative/qtdeclarative.rb +17 -17
  655. data/lib/qtscript/qtscript.rb +40 -40
  656. data/lib/qttest/qttest.rb +166 -166
  657. data/lib/qtuitools/qtuitools.rb +17 -17
  658. data/lib/qtwebkit/qtwebkit.rb +17 -17
  659. metadata +6 -7
@@ -1,140 +1,140 @@
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
- #ifndef GLOBALS_H
21
- #define GLOBALS_H
22
-
23
- #include <QMap>
24
- #include <QSet>
25
- #include <QString>
26
- #include <QStringList>
27
-
28
- template<typename T>
29
- class QStack;
30
-
31
- class QDir;
32
- class QFileInfo;
33
- class QString;
34
- class QStringList;
35
- class QTextStream;
36
-
37
- class Class;
38
- class Function;
39
- class Member;
40
- class Method;
41
- class Field;
42
- class Type;
43
-
44
- struct Options
45
- {
46
- static QDir outputDir;
47
- static int parts;
48
- static QString module;
49
- static QStringList parentModules;
50
- static QStringList scalarTypes;
51
- static QStringList voidpTypes;
52
- static QList<QFileInfo> headerList;
53
- static QStringList classList;
54
- static bool qtMode;
55
-
56
- static QList<QRegExp> excludeExpressions;
57
- static QList<QRegExp> includeFunctionNames;
58
- static QList<QRegExp> includeFunctionSignatures;
59
-
60
- static bool typeExcluded(const QString& typeName);
61
- static bool functionNameIncluded(const QString& fnName);
62
- static bool functionSignatureIncluded(const QString& sig);
63
- };
64
-
65
- struct SmokeDataFile
66
- {
67
- SmokeDataFile();
68
-
69
- void write();
70
- bool isClassUsed(const Class* klass);
71
- QString getTypeFlags(const Type *type, int *classIdx);
72
-
73
- QMap<QString, int> classIndex;
74
- QHash<const Member*, int> methodIdx;
75
- QHash<Type*, int> typeIndex;
76
- QSet<Class*> externalClasses;
77
- QSet<Type*> usedTypes;
78
- QStringList includedClasses;
79
- QHash<const Class*, QSet<const Method*> > declaredVirtualMethods;
80
- };
81
-
82
- struct SmokeClassFiles
83
- {
84
- SmokeClassFiles(SmokeDataFile *data);
85
- void write();
86
- void write(const QList<QString>& keys);
87
-
88
- private:
89
- QString generateMethodBody(const QString& indent, const QString& className, const QString& smokeClassName, const Method& meth, int index, bool dynamicDispatch, QSet< QString >& includes);
90
- void generateMethod(QTextStream& out, const QString& className, const QString& smokeClassName, const Method& meth, int index, QSet<QString>& includes);
91
- void generateGetAccessor(QTextStream& out, const QString& className, const Field& field, const Type* type, int index);
92
- void generateSetAccessor(QTextStream& out, const QString& className, const Field& field, const Type* type, int index);
93
- void generateEnumMemberCall(QTextStream& out, const QString& className, const QString& member, int index);
94
- void generateVirtualMethod(QTextStream& out, const Method& meth, QSet<QString>& includes);
95
-
96
- void writeClass(QTextStream& out, const Class* klass, const QString& className, QSet<QString>& includes);
97
-
98
- SmokeDataFile *m_smokeData;
99
- };
100
-
101
- struct Util
102
- {
103
- static QHash<QString, QString> typeMap;
104
- static QHash<const Method*, const Function*> globalFunctionMap;
105
- static QHash<const Method*, const Field*> fieldAccessors;
106
-
107
- static bool isVirtualInheritancePath(const Class* desc, const Class* super);
108
- static QList<const Class*> superClassList(const Class* klass);
109
- static QList<const Class*> descendantsList(const Class* klass);
110
-
111
- static void preparse(QSet<Type*> *usedTypes, QSet<const Class*> *superClasses, const QList<QString>& keys);
112
-
113
- static bool canClassBeInstanciated(const Class* klass);
114
- static bool canClassBeCopied(const Class* klass);
115
- static bool hasClassVirtualDestructor(const Class* klass);
116
- static bool hasClassPublicDestructor(const Class* klass);
117
- static const Method* findDestructor(const Class* klass);
118
-
119
- static bool derivesFromInvalid(const Class* klass);
120
-
121
- static void checkForAbstractClass(Class* klass);
122
- static void addDefaultConstructor(Class* klass);
123
- static void addCopyConstructor(Class* klass);
124
- static void addDestructor(Class* klass);
125
- static void addOverloads(const Method& meth);
126
- static void addAccessorMethods(const Field& field, QSet<Type*> *usedTypes);
127
-
128
- static QChar munge(const Type *type);
129
- static QString mungedName(const Method&);
130
-
131
- static Type* normalizeType(const Type* type);
132
-
133
- static QString stackItemField(const Type* type);
134
- static QString assignmentString(const Type* type, const QString& var);
135
- static QList<const Method*> collectVirtualMethods(const Class* klass);
136
- static const Method* isVirtualOverriden(const Method& meth, const Class* klass);
137
- static QList<const Method*> virtualMethodsForClass(const Class* klass);
138
- };
139
-
140
- #endif
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
+ #ifndef GLOBALS_H
21
+ #define GLOBALS_H
22
+
23
+ #include <QMap>
24
+ #include <QSet>
25
+ #include <QString>
26
+ #include <QStringList>
27
+
28
+ template<typename T>
29
+ class QStack;
30
+
31
+ class QDir;
32
+ class QFileInfo;
33
+ class QString;
34
+ class QStringList;
35
+ class QTextStream;
36
+
37
+ class Class;
38
+ class Function;
39
+ class Member;
40
+ class Method;
41
+ class Field;
42
+ class Type;
43
+
44
+ struct Options
45
+ {
46
+ static QDir outputDir;
47
+ static int parts;
48
+ static QString module;
49
+ static QStringList parentModules;
50
+ static QStringList scalarTypes;
51
+ static QStringList voidpTypes;
52
+ static QList<QFileInfo> headerList;
53
+ static QStringList classList;
54
+ static bool qtMode;
55
+
56
+ static QList<QRegExp> excludeExpressions;
57
+ static QList<QRegExp> includeFunctionNames;
58
+ static QList<QRegExp> includeFunctionSignatures;
59
+
60
+ static bool typeExcluded(const QString& typeName);
61
+ static bool functionNameIncluded(const QString& fnName);
62
+ static bool functionSignatureIncluded(const QString& sig);
63
+ };
64
+
65
+ struct SmokeDataFile
66
+ {
67
+ SmokeDataFile();
68
+
69
+ void write();
70
+ bool isClassUsed(const Class* klass);
71
+ QString getTypeFlags(const Type *type, int *classIdx);
72
+
73
+ QMap<QString, int> classIndex;
74
+ QHash<const Member*, int> methodIdx;
75
+ QHash<Type*, int> typeIndex;
76
+ QSet<Class*> externalClasses;
77
+ QSet<Type*> usedTypes;
78
+ QStringList includedClasses;
79
+ QHash<const Class*, QSet<const Method*> > declaredVirtualMethods;
80
+ };
81
+
82
+ struct SmokeClassFiles
83
+ {
84
+ SmokeClassFiles(SmokeDataFile *data);
85
+ void write();
86
+ void write(const QList<QString>& keys);
87
+
88
+ private:
89
+ QString generateMethodBody(const QString& indent, const QString& className, const QString& smokeClassName, const Method& meth, int index, bool dynamicDispatch, QSet< QString >& includes);
90
+ void generateMethod(QTextStream& out, const QString& className, const QString& smokeClassName, const Method& meth, int index, QSet<QString>& includes);
91
+ void generateGetAccessor(QTextStream& out, const QString& className, const Field& field, const Type* type, int index);
92
+ void generateSetAccessor(QTextStream& out, const QString& className, const Field& field, const Type* type, int index);
93
+ void generateEnumMemberCall(QTextStream& out, const QString& className, const QString& member, int index);
94
+ void generateVirtualMethod(QTextStream& out, const Method& meth, QSet<QString>& includes);
95
+
96
+ void writeClass(QTextStream& out, const Class* klass, const QString& className, QSet<QString>& includes);
97
+
98
+ SmokeDataFile *m_smokeData;
99
+ };
100
+
101
+ struct Util
102
+ {
103
+ static QHash<QString, QString> typeMap;
104
+ static QHash<const Method*, const Function*> globalFunctionMap;
105
+ static QHash<const Method*, const Field*> fieldAccessors;
106
+
107
+ static bool isVirtualInheritancePath(const Class* desc, const Class* super);
108
+ static QList<const Class*> superClassList(const Class* klass);
109
+ static QList<const Class*> descendantsList(const Class* klass);
110
+
111
+ static void preparse(QSet<Type*> *usedTypes, QSet<const Class*> *superClasses, const QList<QString>& keys);
112
+
113
+ static bool canClassBeInstanciated(const Class* klass);
114
+ static bool canClassBeCopied(const Class* klass);
115
+ static bool hasClassVirtualDestructor(const Class* klass);
116
+ static bool hasClassPublicDestructor(const Class* klass);
117
+ static const Method* findDestructor(const Class* klass);
118
+
119
+ static bool derivesFromInvalid(const Class* klass);
120
+
121
+ static void checkForAbstractClass(Class* klass);
122
+ static void addDefaultConstructor(Class* klass);
123
+ static void addCopyConstructor(Class* klass);
124
+ static void addDestructor(Class* klass);
125
+ static void addOverloads(const Method& meth);
126
+ static void addAccessorMethods(const Field& field, QSet<Type*> *usedTypes);
127
+
128
+ static QChar munge(const Type *type);
129
+ static QString mungedName(const Method&);
130
+
131
+ static Type* normalizeType(const Type* type);
132
+
133
+ static QString stackItemField(const Type* type);
134
+ static QString assignmentString(const Type* type, const QString& var);
135
+ static QList<const Method*> collectVirtualMethods(const Class* klass);
136
+ static const Method* isVirtualOverriden(const Method& meth, const Class* klass);
137
+ static QList<const Method*> virtualMethodsForClass(const Class* klass);
138
+ };
139
+
140
+ #endif
@@ -1,793 +1,793 @@
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 <QHash>
21
- #include <QList>
22
- #include <QStack>
23
-
24
- #include <type.h>
25
-
26
- #include "globals.h"
27
- #include "../../options.h"
28
-
29
- QHash<QString, QString> Util::typeMap;
30
- QHash<const Method*, const Function*> Util::globalFunctionMap;
31
- QHash<const Method*, const Field*> Util::fieldAccessors;
32
-
33
- // looks up the inheritance path from desc to super and sets 'virt' to true if it encounters a virtual base
34
- static bool isVirtualInheritancePathPrivate(const Class* desc, const Class* super, bool *virt)
35
- {
36
- foreach (const Class::BaseClassSpecifier bspec, desc->baseClasses()) {
37
- if (bspec.baseClass == super || isVirtualInheritancePathPrivate(bspec.baseClass, super, virt)) {
38
- if (bspec.isVirtual)
39
- *virt = true;
40
- return true;
41
- }
42
- }
43
- return false;
44
- }
45
-
46
- bool Util::isVirtualInheritancePath(const Class* desc, const Class* super)
47
- {
48
- bool isVirtual = false;
49
- isVirtualInheritancePathPrivate(desc, super, &isVirtual);
50
- return isVirtual;
51
- }
52
-
53
- QList<const Class*> Util::superClassList(const Class* klass)
54
- {
55
- static QHash<const Class*, QList<const Class*> > superClassCache;
56
-
57
- QList<const Class*> ret;
58
- if (superClassCache.contains(klass))
59
- return superClassCache[klass];
60
- foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
61
- ret << base.baseClass;
62
- ret += superClassList(base.baseClass);
63
- }
64
- // cache
65
- superClassCache[klass] = ret;
66
- return ret;
67
- }
68
-
69
- QList<const Class*> Util::descendantsList(const Class* klass)
70
- {
71
- static QHash<const Class*, QList<const Class*> > descendantsClassCache;
72
-
73
- QList<const Class*> ret;
74
- if (descendantsClassCache.contains(klass))
75
- return descendantsClassCache[klass];
76
- for (QHash<QString, Class>::const_iterator iter = classes.constBegin(); iter != classes.constEnd(); iter++) {
77
- if (superClassList(&iter.value()).contains(klass))
78
- ret << &iter.value();
79
- }
80
- // cache
81
- descendantsClassCache[klass] = ret;
82
- return ret;
83
- }
84
-
85
- bool operator==(const Field& lhs, const Field& rhs)
86
- {
87
- return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
88
- }
89
-
90
- bool operator==(const EnumMember& lhs, const EnumMember& rhs)
91
- {
92
- return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
93
- }
94
-
95
- void Util::preparse(QSet<Type*> *usedTypes, QSet<const Class*> *superClasses, const QList<QString>& keys)
96
- {
97
- Class& globalSpace = classes["QGlobalSpace"];
98
- globalSpace.setName("QGlobalSpace");
99
- globalSpace.setKind(Class::Kind_Class);
100
- globalSpace.setIsNameSpace(true);
101
-
102
- // add all functions as methods to a class called 'QGlobalSpace' or a class that represents a namespace
103
- for (QHash<QString, Function>::const_iterator it = functions.constBegin(); it != functions.constEnd(); it++) {
104
- const Function& fn = it.value();
105
-
106
- QString fnString = fn.toString();
107
-
108
- // gcc doesn't like this function... for whatever reason
109
- if (fn.name() == "_IO_ftrylockfile"
110
- // functions in named namespaces are covered by the class list - only check for top-level functions here
111
- || (fn.nameSpace().isEmpty() && !Options::functionNameIncluded(fn.qualifiedName()) && !Options::functionSignatureIncluded(fnString))
112
- || Options::typeExcluded(fnString))
113
- {
114
- // we don't want that function...
115
- continue;
116
- }
117
-
118
- Class* parent = &globalSpace;
119
- if (!fn.nameSpace().isEmpty()) {
120
- parent = &classes[fn.nameSpace()];
121
- if (parent->name().isEmpty()) {
122
- parent->setName(fn.nameSpace());
123
- parent->setKind(Class::Kind_Class);
124
- parent->setIsNameSpace(true);
125
- }
126
- }
127
-
128
- Method meth = Method(parent, fn.name(), fn.type(), Access_public, fn.parameters());
129
- meth.setFlag(Method::Static);
130
- parent->appendMethod(meth);
131
- // map this method to the function, so we can later retrieve the header it was defined in
132
- globalFunctionMap[&parent->methods().last()] = &fn;
133
-
134
- int methIndex = parent->methods().size() - 1;
135
- addOverloads(meth);
136
- // handle the methods appended by addOverloads()
137
- for (int i = parent->methods().size() - 1; i > methIndex; --i)
138
- globalFunctionMap[&parent->methods()[i]] = &fn;
139
-
140
- (*usedTypes) << meth.type();
141
- foreach (const Parameter& param, meth.parameters())
142
- (*usedTypes) << param.type();
143
- }
144
-
145
- // all enums that don't have a parent are put under QGlobalSpace, too
146
- for (QHash<QString, Enum>::iterator it = enums.begin(); it != enums.end(); it++) {
147
- Enum& e = it.value();
148
- if (!e.parent()) {
149
- Class* parent = &globalSpace;
150
- if (!e.nameSpace().isEmpty()) {
151
- parent = &classes[e.nameSpace()];
152
- if (parent->name().isEmpty()) {
153
- parent->setName(e.nameSpace());
154
- parent->setKind(Class::Kind_Class);
155
- parent->setIsNameSpace(true);
156
- }
157
- }
158
-
159
- Type *t = 0;
160
- if (e.name().isEmpty()) {
161
- // unnamed enum
162
- Type longType = Type("long");
163
- longType.setIsIntegral(true);
164
- t = Type::registerType(longType);
165
- } else {
166
- t = Type::registerType(Type(&e));
167
- }
168
- (*usedTypes) << t;
169
- parent->appendChild(&e);
170
- }
171
- }
172
-
173
- foreach (const QString& key, keys) {
174
- Class& klass = classes[key];
175
- foreach (const Class::BaseClassSpecifier base, klass.baseClasses()) {
176
- superClasses->insert(base.baseClass);
177
- }
178
- if (!klass.isNameSpace()) {
179
- addDefaultConstructor(&klass);
180
- addCopyConstructor(&klass);
181
- addDestructor(&klass);
182
- checkForAbstractClass(&klass);
183
- foreach (const Method& m, klass.methods()) {
184
- if (m.access() == Access_private)
185
- continue;
186
- if ((m.type()->getClass() && m.type()->getClass()->access() == Access_private)
187
- || Options::typeExcluded(m.toString(false, true)))
188
- {
189
- klass.methodsRef().removeOne(m);
190
- continue;
191
- }
192
- addOverloads(m);
193
- (*usedTypes) << m.type();
194
- foreach (const Parameter& param, m.parameters()) {
195
- (*usedTypes) << param.type();
196
-
197
- if (m.isSlot() || m.isSignal() || m.isQPropertyAccessor()) {
198
- (*usedTypes) << Util::normalizeType(param.type());
199
- }
200
- }
201
- }
202
- foreach (const Field& f, klass.fields()) {
203
- if (f.access() == Access_private)
204
- continue;
205
- if (Options::typeExcluded(f.toString(false, true))) {
206
- klass.fieldsRef().removeOne(f);
207
- continue;
208
- }
209
- }
210
- foreach (const Field& f, klass.fields()) {
211
- if (f.access() == Access_private)
212
- continue;
213
- addAccessorMethods(f, usedTypes);
214
- }
215
- }
216
- foreach (BasicTypeDeclaration* decl, klass.children()) {
217
- Enum* e = 0;
218
- if ((e = dynamic_cast<Enum*>(decl))) {
219
- Type *t = 0;
220
- if (e->name().isEmpty()) {
221
- // unnamed enum
222
- Type longType = Type("long");
223
- longType.setIsIntegral(true);
224
- t = Type::registerType(longType);
225
- } else {
226
- t = Type::registerType(Type(e));
227
- }
228
- (*usedTypes) << t;
229
- foreach (const EnumMember& member, e->members()) {
230
- if (Options::typeExcluded(member.toString())) {
231
- e->membersRef().removeOne(member);
232
- }
233
- }
234
- }
235
-
236
- }
237
-
238
- }
239
- }
240
-
241
- bool Util::canClassBeInstanciated(const Class* klass)
242
- {
243
- static QHash<const Class*, bool> cache;
244
- if (cache.contains(klass))
245
- return cache[klass];
246
-
247
- bool ctorFound = false, publicCtorFound = false, privatePureVirtualsFound = false;
248
- foreach (const Method& meth, klass->methods()) {
249
- if (meth.isConstructor()) {
250
- ctorFound = true;
251
- if (meth.access() != Access_private) {
252
- // this class can be instanstiated
253
- publicCtorFound = true;
254
- }
255
- } else if ((meth.flags() & Method::PureVirtual) && meth.access() == Access_private) {
256
- privatePureVirtualsFound = true;
257
- }
258
- }
259
-
260
- // The class can be instanstiated if it has a public constructor or no constructor at all
261
- // because then it has a default one generated by the compiler.
262
- // If it has private pure virtuals, then it can't be instanstiated either.
263
- bool ret = ((publicCtorFound || !ctorFound) && !privatePureVirtualsFound);
264
- cache[klass] = ret;
265
- return ret;
266
- }
267
-
268
- bool Util::canClassBeCopied(const Class* klass)
269
- {
270
- static QHash<const Class*, bool> cache;
271
- if (cache.contains(klass))
272
- return cache[klass];
273
-
274
- bool privateCopyCtorFound = false;
275
- foreach (const Method& meth, klass->methods()) {
276
- if (meth.access() != Access_private)
277
- continue;
278
- if (meth.isConstructor() && meth.parameters().count() == 1) {
279
- const Type* type = meth.parameters()[0].type();
280
- // c'tor should be Foo(const Foo& copy)
281
- if (type->isConst() && type->isRef() && type->getClass() == klass) {
282
- privateCopyCtorFound = true;
283
- break;
284
- }
285
- }
286
- }
287
-
288
- bool parentCanBeCopied = true;
289
- foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
290
- if (!canClassBeCopied(base.baseClass)) {
291
- parentCanBeCopied = false;
292
- break;
293
- }
294
- }
295
-
296
- // if the parent can be copied and we didn't find a private copy c'tor, the class is copiable
297
- bool ret = (parentCanBeCopied && !privateCopyCtorFound);
298
- cache[klass] = ret;
299
- return ret;
300
- }
301
-
302
- bool Util::hasClassVirtualDestructor(const Class* klass)
303
- {
304
- static QHash<const Class*, bool> cache;
305
- if (cache.contains(klass))
306
- return cache[klass];
307
-
308
- bool virtualDtorFound = false;
309
- foreach (const Method& meth, klass->methods()) {
310
- if (meth.isDestructor() && meth.flags() & Method::Virtual) {
311
- virtualDtorFound = true;
312
- break;
313
- }
314
- }
315
-
316
- bool superClassHasVirtualDtor = false;
317
- foreach (const Class::BaseClassSpecifier& bspec, klass->baseClasses()) {
318
- if (hasClassVirtualDestructor(bspec.baseClass)) {
319
- superClassHasVirtualDtor = true;
320
- break;
321
- }
322
- }
323
-
324
- // if the superclass has a virtual d'tor, then the descendants have one automatically, too
325
- bool ret = (virtualDtorFound || superClassHasVirtualDtor);
326
- cache[klass] = ret;
327
- return ret;
328
- }
329
-
330
- bool Util::hasClassPublicDestructor(const Class* klass)
331
- {
332
- static QHash<const Class*, bool> cache;
333
- if (cache.contains(klass))
334
- return cache[klass];
335
-
336
- if (klass->isNameSpace()) {
337
- cache[klass] = false;
338
- return false;
339
- }
340
-
341
- bool publicDtorFound = true;
342
- foreach (const Method& meth, klass->methods()) {
343
- if (meth.isDestructor()) {
344
- if (meth.access() != Access_public)
345
- publicDtorFound = false;
346
- // a class has only one destructor, so break here
347
- break;
348
- }
349
- }
350
-
351
- cache[klass] = publicDtorFound;
352
- return publicDtorFound;
353
- }
354
-
355
- const Method* Util::findDestructor(const Class* klass)
356
- {
357
- foreach (const Method& meth, klass->methods()) {
358
- if (meth.isDestructor()) {
359
- return &meth;
360
- }
361
- }
362
- const Method* dtor = 0;
363
- foreach (const Class::BaseClassSpecifier& bspec, klass->baseClasses()) {
364
- if ((dtor = findDestructor(bspec.baseClass))) {
365
- return dtor;
366
- }
367
- }
368
- return 0;
369
- }
370
-
371
- void Util::checkForAbstractClass(Class* klass)
372
- {
373
- QList<const Method*> list;
374
-
375
- bool hasPrivatePureVirtuals = false;
376
- foreach (const Method& meth, klass->methods()) {
377
- if ((meth.flags() & Method::PureVirtual) && meth.access() == Access_private)
378
- hasPrivatePureVirtuals = true;
379
- if (meth.isConstructor())
380
- list << &meth;
381
- }
382
-
383
- // abstract classes can't be instanstiated - remove the constructors
384
- if (hasPrivatePureVirtuals) {
385
- foreach (const Method* ctor, list) {
386
- klass->methodsRef().removeOne(*ctor);
387
- }
388
- }
389
- }
390
-
391
- void Util::addDefaultConstructor(Class* klass)
392
- {
393
- foreach (const Method& meth, klass->methods()) {
394
- // if the class already has a constructor or if it has pure virtuals, there's nothing to do for us
395
- if (meth.isConstructor())
396
- return;
397
- else if (meth.isDestructor() && meth.access() == Access_private)
398
- return;
399
- }
400
-
401
- Type t = Type(klass);
402
- t.setPointerDepth(1);
403
- Method meth = Method(klass, klass->name(), Type::registerType(t));
404
- meth.setIsConstructor(true);
405
- klass->appendMethod(meth);
406
- }
407
-
408
- void Util::addCopyConstructor(Class* klass)
409
- {
410
- foreach (const Method& meth, klass->methods()) {
411
- if (meth.isConstructor() && meth.parameters().count() == 1) {
412
- const Type* type = meth.parameters()[0].type();
413
- // found a copy c'tor? then there's nothing to do
414
- if (type->isRef() && type->getClass() == klass)
415
- return;
416
- } else if (meth.isDestructor() && meth.access() == Access_private) {
417
- // private destructor, so we can't create instances of that class
418
- return;
419
- }
420
- }
421
-
422
- // if the parent can't be copied, a copy c'tor is of no use
423
- foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
424
- if (!canClassBeCopied(base.baseClass))
425
- return;
426
- }
427
-
428
- Type t = Type(klass);
429
- t.setPointerDepth(1);
430
- Method meth = Method(klass, klass->name(), Type::registerType(t));
431
- meth.setIsConstructor(true);
432
- // parameter is a constant reference to another object of the same types
433
- Type paramType = Type(klass, true); paramType.setIsRef(true);
434
- meth.appendParameter(Parameter("copy", Type::registerType(paramType)));
435
- klass->appendMethod(meth);
436
- }
437
-
438
- void Util::addDestructor(Class* klass)
439
- {
440
- foreach (const Method& meth, klass->methods()) {
441
- // we already have a destructor
442
- if (meth.isDestructor())
443
- return;
444
- }
445
-
446
- Method meth = Method(klass, "~" + klass->name(), const_cast<Type*>(Type::Void));
447
- meth.setIsDestructor(true);
448
-
449
- const Method* dtor = findDestructor(klass);
450
- if (dtor && dtor->hasExceptionSpec()) {
451
- meth.setHasExceptionSpec(true);
452
- foreach (const Type& t, dtor->exceptionTypes()) {
453
- meth.appendExceptionType(t);
454
- }
455
- }
456
-
457
- klass->appendMethod(meth);
458
- }
459
-
460
- QChar Util::munge(const Type *type) {
461
- if (type->getTypedef()) {
462
- Type resolved = type->getTypedef()->resolve();
463
- return munge(&resolved);
464
- }
465
-
466
- if (type->pointerDepth() > 1 || (type->getClass() && type->getClass()->isTemplate() && (!Options::qtMode || (Options::qtMode && type->getClass()->name() != "QFlags"))) ||
467
- (Options::voidpTypes.contains(type->name()) && !Options::scalarTypes.contains(type->name())) )
468
- {
469
- // QString and QStringList are both mapped to Smoke::t_voidp, but QString is a scalar as well
470
- // TODO: fix this - neither QStringList nor QString should be mapped to Smoke::t_voidp or munged as ? or $
471
-
472
- // reference to array or hash or unknown
473
- return '?';
474
- } else if (type->isIntegral() || type->getEnum() || Options::scalarTypes.contains(type->name()) ||
475
- (Options::qtMode && !type->isRef() && type->pointerDepth() == 0 &&
476
- (type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")))
477
- {
478
- // plain scalar
479
- return '$';
480
- } else if (type->getClass()) {
481
- // object
482
- return '#';
483
- } else {
484
- // unknown
485
- return '?';
486
- }
487
- }
488
-
489
- QString Util::mungedName(const Method& meth) {
490
- QString ret = meth.name();
491
- foreach (const Parameter& param, meth.parameters()) {
492
- const Type* type = param.type();
493
- ret += munge(type);
494
- }
495
- return ret;
496
- }
497
-
498
- Type* Util::normalizeType(const Type* type) {
499
- Type normalizedType = *type;
500
- if (normalizedType.isConst() && normalizedType.isRef()) {
501
- normalizedType.setIsConst(false);
502
- normalizedType.setIsRef(false);
503
- }
504
-
505
- if (normalizedType.pointerDepth() == 0) {
506
- normalizedType.setIsConst(false);
507
- }
508
-
509
- return Type::registerType(normalizedType);
510
- }
511
-
512
- QString Util::stackItemField(const Type* type)
513
- {
514
- if (type->getTypedef()) {
515
- Type resolved = type->getTypedef()->resolve();
516
- return stackItemField(&resolved);
517
- }
518
-
519
- if (Options::qtMode && !type->isRef() && type->pointerDepth() == 0 &&
520
- type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")
521
- {
522
- return "s_uint";
523
- }
524
-
525
- if (type->pointerDepth() > 0 || type->isRef() || type->isFunctionPointer() || type->isArray() || Options::voidpTypes.contains(type->name())
526
- || (!type->isIntegral() && !type->getEnum()))
527
- {
528
- return "s_class";
529
- }
530
-
531
- if (type->getEnum())
532
- return "s_enum";
533
-
534
- QString typeName = type->name();
535
- // replace the unsigned stuff, look the type up in Util::typeMap and if
536
- // necessary, add a 'u' for unsigned types at the beginning again
537
- bool _unsigned = false;
538
- if (typeName.startsWith("unsigned ")) {
539
- typeName.replace("unsigned ", "");
540
- _unsigned = true;
541
- }
542
- typeName.replace("signed ", "");
543
- typeName = Util::typeMap.value(typeName, typeName);
544
- if (_unsigned)
545
- typeName.prepend('u');
546
- return "s_" + typeName;
547
- }
548
-
549
- QString Util::assignmentString(const Type* type, const QString& var)
550
- {
551
- if (type->getTypedef()) {
552
- Type resolved = type->getTypedef()->resolve();
553
- return assignmentString(&resolved, var);
554
- }
555
-
556
- if (type->pointerDepth() > 0 || type->isFunctionPointer()) {
557
- return "(void*)" + var;
558
- } else if (type->isRef()) {
559
- return "(void*)&" + var;
560
- } else if (type->isIntegral() && !Options::voidpTypes.contains(type->name())) {
561
- return var;
562
- } else if (type->getEnum()) {
563
- return var;
564
- } else if (Options::qtMode && type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")
565
- {
566
- return "(uint)" + var;
567
- } else {
568
- QString ret = "(void*)new " + type->toString();
569
- ret += '(' + var + ')';
570
- return ret;
571
- }
572
- return QString();
573
- }
574
-
575
- QList<const Method*> Util::collectVirtualMethods(const Class* klass)
576
- {
577
- QList<const Method*> methods;
578
- foreach (const Method& meth, klass->methods()) {
579
- if ((meth.flags() & Method::Virtual || meth.flags() & Method::PureVirtual)
580
- && !meth.isDestructor() && meth.access() != Access_private)
581
- {
582
- methods << &meth;
583
- }
584
- }
585
- foreach (const Class::BaseClassSpecifier& baseClass, klass->baseClasses()) {
586
- methods += collectVirtualMethods(baseClass.baseClass);
587
- }
588
- return methods;
589
- }
590
-
591
- // don't make this public - it's just a utility function for the next method and probably not what you would expect it to be
592
- static bool operator==(const Method& rhs, const Method& lhs)
593
- {
594
- // These have to be equal for methods to be the same. Return types don't have an effect, ignore them.
595
- bool ok = (rhs.name() == lhs.name() && rhs.isConst() == lhs.isConst() && rhs.parameters().count() == lhs.parameters().count());
596
- if (!ok)
597
- return false;
598
-
599
- // now check the parameter types for equality
600
- for (int i = 0; i < rhs.parameters().count(); i++) {
601
- if (rhs.parameters()[i].type() != lhs.parameters()[i].type())
602
- return false;
603
- }
604
-
605
- return true;
606
- }
607
-
608
- void Util::addAccessorMethods(const Field& field, QSet<Type*> *usedTypes)
609
- {
610
- Class* klass = field.getClass();
611
- Type* type = field.type();
612
- if (type->getClass() && type->pointerDepth() == 0 && !(ParserOptions::qtMode && type->getClass()->name() == "QFlags")) {
613
- Type newType = *type;
614
- newType.setIsRef(true);
615
- type = Type::registerType(newType);
616
- }
617
- (*usedTypes) << type;
618
- Method getter = Method(klass, field.name(), type, field.access());
619
- getter.setIsConst(true);
620
- if (field.flags() & Field::Static)
621
- getter.setFlag(Method::Static);
622
- klass->appendMethod(getter);
623
- fieldAccessors[&klass->methods().last()] = &field;
624
-
625
- // constant field? (i.e. no setter method)
626
- if (field.type()->isConst() && field.type()->pointerDepth() == 0)
627
- return;
628
-
629
- // foo => setFoo
630
- QString newName = field.name();
631
- newName[0] = newName[0].toUpper();
632
- Method setter = Method(klass, "set" + newName, const_cast<Type*>(Type::Void), field.access());
633
- if (field.flags() & Field::Static)
634
- setter.setFlag(Method::Static);
635
-
636
- // reset
637
- type = field.type();
638
- // to avoid copying around more stuff than necessary, convert setFoo(Bar) to setFoo(const Bar&)
639
- if (type->pointerDepth() == 0 && type->getClass() && !(ParserOptions::qtMode && type->getClass()->name() == "QFlags")) {
640
- Type newType = *type;
641
- newType.setIsRef(true);
642
- newType.setIsConst(true);
643
- type = Type::registerType(newType);
644
- }
645
-
646
- (*usedTypes) << type;
647
- setter.appendParameter(Parameter(QString(), type));
648
- if (klass->methods().contains(setter))
649
- return;
650
- klass->appendMethod(setter);
651
- fieldAccessors[&klass->methods().last()] = &field;
652
- }
653
-
654
- void Util::addOverloads(const Method& meth)
655
- {
656
- ParameterList params;
657
- Class* klass = meth.getClass();
658
-
659
- for (int i = 0; i < meth.parameters().count(); i++) {
660
- const Parameter& param = meth.parameters()[i];
661
- if (!param.isDefault()) {
662
- params << param;
663
- continue;
664
- }
665
- Method overload = meth;
666
- if (meth.flags() & Method::PureVirtual) {
667
- overload.setFlag(Method::DynamicDispatch);
668
- }
669
- overload.removeFlag(Method::Virtual);
670
- overload.removeFlag(Method::PureVirtual);
671
- overload.setParameterList(params);
672
- if (klass->methods().contains(overload)) {
673
- // we already have that, skip it
674
- params << param;
675
- continue;
676
- }
677
-
678
- QStringList remainingDefaultValues;
679
- for (int j = i; j < meth.parameters().count(); j++) {
680
- const Parameter defParam = meth.parameters()[j];
681
- QString cast = "(";
682
- cast += defParam.type()->toString() + ')';
683
- cast += defParam.defaultValue();
684
- remainingDefaultValues << cast;
685
- }
686
- overload.setRemainingDefaultValues(remainingDefaultValues);
687
- klass->appendMethod(overload);
688
-
689
- params << param;
690
- }
691
- }
692
-
693
- // checks if method meth is overriden in class klass or any of its superclasses
694
- const Method* Util::isVirtualOverriden(const Method& meth, const Class* klass)
695
- {
696
- // is the method virtual at all?
697
- if (!(meth.flags() & Method::Virtual) && !(meth.flags() & Method::PureVirtual))
698
- return 0;
699
-
700
- // if the method is defined in klass, it can't be overriden there or in any parent class
701
- if (meth.getClass() == klass)
702
- return 0;
703
-
704
- foreach (const Method& m, klass->methods()) {
705
- if (!(m.flags() & Method::Static) && m == meth)
706
- // the method m overrides meth
707
- return &m;
708
- }
709
-
710
- foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
711
- // we reached the class in which meth was defined and we still didn't find any overrides => return
712
- if (base.baseClass == meth.getClass())
713
- return 0;
714
-
715
- // recurse into the base classes
716
- const Method* m = 0;
717
- if ((m = isVirtualOverriden(meth, base.baseClass)))
718
- return m;
719
- }
720
-
721
- return 0;
722
- }
723
-
724
- static bool qListContainsMethodPointer(const QList<const Method*> list, const Method* ptr) {
725
- foreach (const Method* meth, list) {
726
- if (*meth == *ptr)
727
- return true;
728
- }
729
- return false;
730
- }
731
-
732
- QList<const Method*> Util::virtualMethodsForClass(const Class* klass)
733
- {
734
- static QHash<const Class*, QList<const Method*> > cache;
735
-
736
- // virtual method callbacks for classes that can't be instanstiated aren't useful
737
- if (!Util::canClassBeInstanciated(klass))
738
- return QList<const Method*>();
739
-
740
- if (cache.contains(klass))
741
- return cache[klass];
742
-
743
- QList<const Method*> ret;
744
-
745
- foreach (const Method* meth, Util::collectVirtualMethods(klass)) {
746
- // this is a synthesized overload, skip it.
747
- if (!meth->remainingDefaultValues().isEmpty())
748
- continue;
749
- if (meth->getClass() == klass) {
750
- // this method can't be overriden, because it's defined in the class for which this method was called
751
- ret << meth;
752
- continue;
753
- }
754
- // Check if the method is overriden, so the callback will always point to the latest definition of the virtual method.
755
- const Method* override = 0;
756
- if ((override = Util::isVirtualOverriden(*meth, klass))) {
757
- // If the method was overriden and put under private access, skip it. If we already have the method, skip it as well.
758
- if (override->access() == Access_private || qListContainsMethodPointer(ret, override))
759
- continue;
760
- ret << override;
761
- } else if (!qListContainsMethodPointer(ret, meth)) {
762
- ret << meth;
763
- }
764
- }
765
-
766
- cache[klass] = ret;
767
- return ret;
768
- }
769
-
770
- bool Options::typeExcluded(const QString& typeName)
771
- {
772
- foreach (const QRegExp& exp, Options::excludeExpressions) {
773
- if (exp.exactMatch(typeName))
774
- return true;
775
- }
776
- return false;
777
- }
778
-
779
- bool Options::functionNameIncluded(const QString& fnName) {
780
- foreach (const QRegExp& exp, Options::includeFunctionNames) {
781
- if (exp.exactMatch(fnName))
782
- return true;
783
- }
784
- return false;
785
- }
786
-
787
- bool Options::functionSignatureIncluded(const QString& sig) {
788
- foreach (const QRegExp& exp, Options::includeFunctionNames) {
789
- if (exp.exactMatch(sig))
790
- return true;
791
- }
792
- return false;
793
- }
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 <QHash>
21
+ #include <QList>
22
+ #include <QStack>
23
+
24
+ #include <type.h>
25
+
26
+ #include "globals.h"
27
+ #include "../../options.h"
28
+
29
+ QHash<QString, QString> Util::typeMap;
30
+ QHash<const Method*, const Function*> Util::globalFunctionMap;
31
+ QHash<const Method*, const Field*> Util::fieldAccessors;
32
+
33
+ // looks up the inheritance path from desc to super and sets 'virt' to true if it encounters a virtual base
34
+ static bool isVirtualInheritancePathPrivate(const Class* desc, const Class* super, bool *virt)
35
+ {
36
+ foreach (const Class::BaseClassSpecifier bspec, desc->baseClasses()) {
37
+ if (bspec.baseClass == super || isVirtualInheritancePathPrivate(bspec.baseClass, super, virt)) {
38
+ if (bspec.isVirtual)
39
+ *virt = true;
40
+ return true;
41
+ }
42
+ }
43
+ return false;
44
+ }
45
+
46
+ bool Util::isVirtualInheritancePath(const Class* desc, const Class* super)
47
+ {
48
+ bool isVirtual = false;
49
+ isVirtualInheritancePathPrivate(desc, super, &isVirtual);
50
+ return isVirtual;
51
+ }
52
+
53
+ QList<const Class*> Util::superClassList(const Class* klass)
54
+ {
55
+ static QHash<const Class*, QList<const Class*> > superClassCache;
56
+
57
+ QList<const Class*> ret;
58
+ if (superClassCache.contains(klass))
59
+ return superClassCache[klass];
60
+ foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
61
+ ret << base.baseClass;
62
+ ret += superClassList(base.baseClass);
63
+ }
64
+ // cache
65
+ superClassCache[klass] = ret;
66
+ return ret;
67
+ }
68
+
69
+ QList<const Class*> Util::descendantsList(const Class* klass)
70
+ {
71
+ static QHash<const Class*, QList<const Class*> > descendantsClassCache;
72
+
73
+ QList<const Class*> ret;
74
+ if (descendantsClassCache.contains(klass))
75
+ return descendantsClassCache[klass];
76
+ for (QHash<QString, Class>::const_iterator iter = classes.constBegin(); iter != classes.constEnd(); iter++) {
77
+ if (superClassList(&iter.value()).contains(klass))
78
+ ret << &iter.value();
79
+ }
80
+ // cache
81
+ descendantsClassCache[klass] = ret;
82
+ return ret;
83
+ }
84
+
85
+ bool operator==(const Field& lhs, const Field& rhs)
86
+ {
87
+ return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
88
+ }
89
+
90
+ bool operator==(const EnumMember& lhs, const EnumMember& rhs)
91
+ {
92
+ return (lhs.name() == rhs.name() && lhs.declaringType() == rhs.declaringType() && lhs.type() == rhs.type());
93
+ }
94
+
95
+ void Util::preparse(QSet<Type*> *usedTypes, QSet<const Class*> *superClasses, const QList<QString>& keys)
96
+ {
97
+ Class& globalSpace = classes["QGlobalSpace"];
98
+ globalSpace.setName("QGlobalSpace");
99
+ globalSpace.setKind(Class::Kind_Class);
100
+ globalSpace.setIsNameSpace(true);
101
+
102
+ // add all functions as methods to a class called 'QGlobalSpace' or a class that represents a namespace
103
+ for (QHash<QString, Function>::const_iterator it = functions.constBegin(); it != functions.constEnd(); it++) {
104
+ const Function& fn = it.value();
105
+
106
+ QString fnString = fn.toString();
107
+
108
+ // gcc doesn't like this function... for whatever reason
109
+ if (fn.name() == "_IO_ftrylockfile"
110
+ // functions in named namespaces are covered by the class list - only check for top-level functions here
111
+ || (fn.nameSpace().isEmpty() && !Options::functionNameIncluded(fn.qualifiedName()) && !Options::functionSignatureIncluded(fnString))
112
+ || Options::typeExcluded(fnString))
113
+ {
114
+ // we don't want that function...
115
+ continue;
116
+ }
117
+
118
+ Class* parent = &globalSpace;
119
+ if (!fn.nameSpace().isEmpty()) {
120
+ parent = &classes[fn.nameSpace()];
121
+ if (parent->name().isEmpty()) {
122
+ parent->setName(fn.nameSpace());
123
+ parent->setKind(Class::Kind_Class);
124
+ parent->setIsNameSpace(true);
125
+ }
126
+ }
127
+
128
+ Method meth = Method(parent, fn.name(), fn.type(), Access_public, fn.parameters());
129
+ meth.setFlag(Method::Static);
130
+ parent->appendMethod(meth);
131
+ // map this method to the function, so we can later retrieve the header it was defined in
132
+ globalFunctionMap[&parent->methods().last()] = &fn;
133
+
134
+ int methIndex = parent->methods().size() - 1;
135
+ addOverloads(meth);
136
+ // handle the methods appended by addOverloads()
137
+ for (int i = parent->methods().size() - 1; i > methIndex; --i)
138
+ globalFunctionMap[&parent->methods()[i]] = &fn;
139
+
140
+ (*usedTypes) << meth.type();
141
+ foreach (const Parameter& param, meth.parameters())
142
+ (*usedTypes) << param.type();
143
+ }
144
+
145
+ // all enums that don't have a parent are put under QGlobalSpace, too
146
+ for (QHash<QString, Enum>::iterator it = enums.begin(); it != enums.end(); it++) {
147
+ Enum& e = it.value();
148
+ if (!e.parent()) {
149
+ Class* parent = &globalSpace;
150
+ if (!e.nameSpace().isEmpty()) {
151
+ parent = &classes[e.nameSpace()];
152
+ if (parent->name().isEmpty()) {
153
+ parent->setName(e.nameSpace());
154
+ parent->setKind(Class::Kind_Class);
155
+ parent->setIsNameSpace(true);
156
+ }
157
+ }
158
+
159
+ Type *t = 0;
160
+ if (e.name().isEmpty()) {
161
+ // unnamed enum
162
+ Type longType = Type("long");
163
+ longType.setIsIntegral(true);
164
+ t = Type::registerType(longType);
165
+ } else {
166
+ t = Type::registerType(Type(&e));
167
+ }
168
+ (*usedTypes) << t;
169
+ parent->appendChild(&e);
170
+ }
171
+ }
172
+
173
+ foreach (const QString& key, keys) {
174
+ Class& klass = classes[key];
175
+ foreach (const Class::BaseClassSpecifier base, klass.baseClasses()) {
176
+ superClasses->insert(base.baseClass);
177
+ }
178
+ if (!klass.isNameSpace()) {
179
+ addDefaultConstructor(&klass);
180
+ addCopyConstructor(&klass);
181
+ addDestructor(&klass);
182
+ checkForAbstractClass(&klass);
183
+ foreach (const Method& m, klass.methods()) {
184
+ if (m.access() == Access_private)
185
+ continue;
186
+ if ((m.type()->getClass() && m.type()->getClass()->access() == Access_private)
187
+ || Options::typeExcluded(m.toString(false, true)))
188
+ {
189
+ klass.methodsRef().removeOne(m);
190
+ continue;
191
+ }
192
+ addOverloads(m);
193
+ (*usedTypes) << m.type();
194
+ foreach (const Parameter& param, m.parameters()) {
195
+ (*usedTypes) << param.type();
196
+
197
+ if (m.isSlot() || m.isSignal() || m.isQPropertyAccessor()) {
198
+ (*usedTypes) << Util::normalizeType(param.type());
199
+ }
200
+ }
201
+ }
202
+ foreach (const Field& f, klass.fields()) {
203
+ if (f.access() == Access_private)
204
+ continue;
205
+ if (Options::typeExcluded(f.toString(false, true))) {
206
+ klass.fieldsRef().removeOne(f);
207
+ continue;
208
+ }
209
+ }
210
+ foreach (const Field& f, klass.fields()) {
211
+ if (f.access() == Access_private)
212
+ continue;
213
+ addAccessorMethods(f, usedTypes);
214
+ }
215
+ }
216
+ foreach (BasicTypeDeclaration* decl, klass.children()) {
217
+ Enum* e = 0;
218
+ if ((e = dynamic_cast<Enum*>(decl))) {
219
+ Type *t = 0;
220
+ if (e->name().isEmpty()) {
221
+ // unnamed enum
222
+ Type longType = Type("long");
223
+ longType.setIsIntegral(true);
224
+ t = Type::registerType(longType);
225
+ } else {
226
+ t = Type::registerType(Type(e));
227
+ }
228
+ (*usedTypes) << t;
229
+ foreach (const EnumMember& member, e->members()) {
230
+ if (Options::typeExcluded(member.toString())) {
231
+ e->membersRef().removeOne(member);
232
+ }
233
+ }
234
+ }
235
+
236
+ }
237
+
238
+ }
239
+ }
240
+
241
+ bool Util::canClassBeInstanciated(const Class* klass)
242
+ {
243
+ static QHash<const Class*, bool> cache;
244
+ if (cache.contains(klass))
245
+ return cache[klass];
246
+
247
+ bool ctorFound = false, publicCtorFound = false, privatePureVirtualsFound = false;
248
+ foreach (const Method& meth, klass->methods()) {
249
+ if (meth.isConstructor()) {
250
+ ctorFound = true;
251
+ if (meth.access() != Access_private) {
252
+ // this class can be instanstiated
253
+ publicCtorFound = true;
254
+ }
255
+ } else if ((meth.flags() & Method::PureVirtual) && meth.access() == Access_private) {
256
+ privatePureVirtualsFound = true;
257
+ }
258
+ }
259
+
260
+ // The class can be instanstiated if it has a public constructor or no constructor at all
261
+ // because then it has a default one generated by the compiler.
262
+ // If it has private pure virtuals, then it can't be instanstiated either.
263
+ bool ret = ((publicCtorFound || !ctorFound) && !privatePureVirtualsFound);
264
+ cache[klass] = ret;
265
+ return ret;
266
+ }
267
+
268
+ bool Util::canClassBeCopied(const Class* klass)
269
+ {
270
+ static QHash<const Class*, bool> cache;
271
+ if (cache.contains(klass))
272
+ return cache[klass];
273
+
274
+ bool privateCopyCtorFound = false;
275
+ foreach (const Method& meth, klass->methods()) {
276
+ if (meth.access() != Access_private)
277
+ continue;
278
+ if (meth.isConstructor() && meth.parameters().count() == 1) {
279
+ const Type* type = meth.parameters()[0].type();
280
+ // c'tor should be Foo(const Foo& copy)
281
+ if (type->isConst() && type->isRef() && type->getClass() == klass) {
282
+ privateCopyCtorFound = true;
283
+ break;
284
+ }
285
+ }
286
+ }
287
+
288
+ bool parentCanBeCopied = true;
289
+ foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
290
+ if (!canClassBeCopied(base.baseClass)) {
291
+ parentCanBeCopied = false;
292
+ break;
293
+ }
294
+ }
295
+
296
+ // if the parent can be copied and we didn't find a private copy c'tor, the class is copiable
297
+ bool ret = (parentCanBeCopied && !privateCopyCtorFound);
298
+ cache[klass] = ret;
299
+ return ret;
300
+ }
301
+
302
+ bool Util::hasClassVirtualDestructor(const Class* klass)
303
+ {
304
+ static QHash<const Class*, bool> cache;
305
+ if (cache.contains(klass))
306
+ return cache[klass];
307
+
308
+ bool virtualDtorFound = false;
309
+ foreach (const Method& meth, klass->methods()) {
310
+ if (meth.isDestructor() && meth.flags() & Method::Virtual) {
311
+ virtualDtorFound = true;
312
+ break;
313
+ }
314
+ }
315
+
316
+ bool superClassHasVirtualDtor = false;
317
+ foreach (const Class::BaseClassSpecifier& bspec, klass->baseClasses()) {
318
+ if (hasClassVirtualDestructor(bspec.baseClass)) {
319
+ superClassHasVirtualDtor = true;
320
+ break;
321
+ }
322
+ }
323
+
324
+ // if the superclass has a virtual d'tor, then the descendants have one automatically, too
325
+ bool ret = (virtualDtorFound || superClassHasVirtualDtor);
326
+ cache[klass] = ret;
327
+ return ret;
328
+ }
329
+
330
+ bool Util::hasClassPublicDestructor(const Class* klass)
331
+ {
332
+ static QHash<const Class*, bool> cache;
333
+ if (cache.contains(klass))
334
+ return cache[klass];
335
+
336
+ if (klass->isNameSpace()) {
337
+ cache[klass] = false;
338
+ return false;
339
+ }
340
+
341
+ bool publicDtorFound = true;
342
+ foreach (const Method& meth, klass->methods()) {
343
+ if (meth.isDestructor()) {
344
+ if (meth.access() != Access_public)
345
+ publicDtorFound = false;
346
+ // a class has only one destructor, so break here
347
+ break;
348
+ }
349
+ }
350
+
351
+ cache[klass] = publicDtorFound;
352
+ return publicDtorFound;
353
+ }
354
+
355
+ const Method* Util::findDestructor(const Class* klass)
356
+ {
357
+ foreach (const Method& meth, klass->methods()) {
358
+ if (meth.isDestructor()) {
359
+ return &meth;
360
+ }
361
+ }
362
+ const Method* dtor = 0;
363
+ foreach (const Class::BaseClassSpecifier& bspec, klass->baseClasses()) {
364
+ if ((dtor = findDestructor(bspec.baseClass))) {
365
+ return dtor;
366
+ }
367
+ }
368
+ return 0;
369
+ }
370
+
371
+ void Util::checkForAbstractClass(Class* klass)
372
+ {
373
+ QList<const Method*> list;
374
+
375
+ bool hasPrivatePureVirtuals = false;
376
+ foreach (const Method& meth, klass->methods()) {
377
+ if ((meth.flags() & Method::PureVirtual) && meth.access() == Access_private)
378
+ hasPrivatePureVirtuals = true;
379
+ if (meth.isConstructor())
380
+ list << &meth;
381
+ }
382
+
383
+ // abstract classes can't be instanstiated - remove the constructors
384
+ if (hasPrivatePureVirtuals) {
385
+ foreach (const Method* ctor, list) {
386
+ klass->methodsRef().removeOne(*ctor);
387
+ }
388
+ }
389
+ }
390
+
391
+ void Util::addDefaultConstructor(Class* klass)
392
+ {
393
+ foreach (const Method& meth, klass->methods()) {
394
+ // if the class already has a constructor or if it has pure virtuals, there's nothing to do for us
395
+ if (meth.isConstructor())
396
+ return;
397
+ else if (meth.isDestructor() && meth.access() == Access_private)
398
+ return;
399
+ }
400
+
401
+ Type t = Type(klass);
402
+ t.setPointerDepth(1);
403
+ Method meth = Method(klass, klass->name(), Type::registerType(t));
404
+ meth.setIsConstructor(true);
405
+ klass->appendMethod(meth);
406
+ }
407
+
408
+ void Util::addCopyConstructor(Class* klass)
409
+ {
410
+ foreach (const Method& meth, klass->methods()) {
411
+ if (meth.isConstructor() && meth.parameters().count() == 1) {
412
+ const Type* type = meth.parameters()[0].type();
413
+ // found a copy c'tor? then there's nothing to do
414
+ if (type->isRef() && type->getClass() == klass)
415
+ return;
416
+ } else if (meth.isDestructor() && meth.access() == Access_private) {
417
+ // private destructor, so we can't create instances of that class
418
+ return;
419
+ }
420
+ }
421
+
422
+ // if the parent can't be copied, a copy c'tor is of no use
423
+ foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
424
+ if (!canClassBeCopied(base.baseClass))
425
+ return;
426
+ }
427
+
428
+ Type t = Type(klass);
429
+ t.setPointerDepth(1);
430
+ Method meth = Method(klass, klass->name(), Type::registerType(t));
431
+ meth.setIsConstructor(true);
432
+ // parameter is a constant reference to another object of the same types
433
+ Type paramType = Type(klass, true); paramType.setIsRef(true);
434
+ meth.appendParameter(Parameter("copy", Type::registerType(paramType)));
435
+ klass->appendMethod(meth);
436
+ }
437
+
438
+ void Util::addDestructor(Class* klass)
439
+ {
440
+ foreach (const Method& meth, klass->methods()) {
441
+ // we already have a destructor
442
+ if (meth.isDestructor())
443
+ return;
444
+ }
445
+
446
+ Method meth = Method(klass, "~" + klass->name(), const_cast<Type*>(Type::Void));
447
+ meth.setIsDestructor(true);
448
+
449
+ const Method* dtor = findDestructor(klass);
450
+ if (dtor && dtor->hasExceptionSpec()) {
451
+ meth.setHasExceptionSpec(true);
452
+ foreach (const Type& t, dtor->exceptionTypes()) {
453
+ meth.appendExceptionType(t);
454
+ }
455
+ }
456
+
457
+ klass->appendMethod(meth);
458
+ }
459
+
460
+ QChar Util::munge(const Type *type) {
461
+ if (type->getTypedef()) {
462
+ Type resolved = type->getTypedef()->resolve();
463
+ return munge(&resolved);
464
+ }
465
+
466
+ if (type->pointerDepth() > 1 || (type->getClass() && type->getClass()->isTemplate() && (!Options::qtMode || (Options::qtMode && type->getClass()->name() != "QFlags"))) ||
467
+ (Options::voidpTypes.contains(type->name()) && !Options::scalarTypes.contains(type->name())) )
468
+ {
469
+ // QString and QStringList are both mapped to Smoke::t_voidp, but QString is a scalar as well
470
+ // TODO: fix this - neither QStringList nor QString should be mapped to Smoke::t_voidp or munged as ? or $
471
+
472
+ // reference to array or hash or unknown
473
+ return '?';
474
+ } else if (type->isIntegral() || type->getEnum() || Options::scalarTypes.contains(type->name()) ||
475
+ (Options::qtMode && !type->isRef() && type->pointerDepth() == 0 &&
476
+ (type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")))
477
+ {
478
+ // plain scalar
479
+ return '$';
480
+ } else if (type->getClass()) {
481
+ // object
482
+ return '#';
483
+ } else {
484
+ // unknown
485
+ return '?';
486
+ }
487
+ }
488
+
489
+ QString Util::mungedName(const Method& meth) {
490
+ QString ret = meth.name();
491
+ foreach (const Parameter& param, meth.parameters()) {
492
+ const Type* type = param.type();
493
+ ret += munge(type);
494
+ }
495
+ return ret;
496
+ }
497
+
498
+ Type* Util::normalizeType(const Type* type) {
499
+ Type normalizedType = *type;
500
+ if (normalizedType.isConst() && normalizedType.isRef()) {
501
+ normalizedType.setIsConst(false);
502
+ normalizedType.setIsRef(false);
503
+ }
504
+
505
+ if (normalizedType.pointerDepth() == 0) {
506
+ normalizedType.setIsConst(false);
507
+ }
508
+
509
+ return Type::registerType(normalizedType);
510
+ }
511
+
512
+ QString Util::stackItemField(const Type* type)
513
+ {
514
+ if (type->getTypedef()) {
515
+ Type resolved = type->getTypedef()->resolve();
516
+ return stackItemField(&resolved);
517
+ }
518
+
519
+ if (Options::qtMode && !type->isRef() && type->pointerDepth() == 0 &&
520
+ type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")
521
+ {
522
+ return "s_uint";
523
+ }
524
+
525
+ if (type->pointerDepth() > 0 || type->isRef() || type->isFunctionPointer() || type->isArray() || Options::voidpTypes.contains(type->name())
526
+ || (!type->isIntegral() && !type->getEnum()))
527
+ {
528
+ return "s_class";
529
+ }
530
+
531
+ if (type->getEnum())
532
+ return "s_enum";
533
+
534
+ QString typeName = type->name();
535
+ // replace the unsigned stuff, look the type up in Util::typeMap and if
536
+ // necessary, add a 'u' for unsigned types at the beginning again
537
+ bool _unsigned = false;
538
+ if (typeName.startsWith("unsigned ")) {
539
+ typeName.replace("unsigned ", "");
540
+ _unsigned = true;
541
+ }
542
+ typeName.replace("signed ", "");
543
+ typeName = Util::typeMap.value(typeName, typeName);
544
+ if (_unsigned)
545
+ typeName.prepend('u');
546
+ return "s_" + typeName;
547
+ }
548
+
549
+ QString Util::assignmentString(const Type* type, const QString& var)
550
+ {
551
+ if (type->getTypedef()) {
552
+ Type resolved = type->getTypedef()->resolve();
553
+ return assignmentString(&resolved, var);
554
+ }
555
+
556
+ if (type->pointerDepth() > 0 || type->isFunctionPointer()) {
557
+ return "(void*)" + var;
558
+ } else if (type->isRef()) {
559
+ return "(void*)&" + var;
560
+ } else if (type->isIntegral() && !Options::voidpTypes.contains(type->name())) {
561
+ return var;
562
+ } else if (type->getEnum()) {
563
+ return var;
564
+ } else if (Options::qtMode && type->getClass() && type->getClass()->isTemplate() && type->getClass()->name() == "QFlags")
565
+ {
566
+ return "(uint)" + var;
567
+ } else {
568
+ QString ret = "(void*)new " + type->toString();
569
+ ret += '(' + var + ')';
570
+ return ret;
571
+ }
572
+ return QString();
573
+ }
574
+
575
+ QList<const Method*> Util::collectVirtualMethods(const Class* klass)
576
+ {
577
+ QList<const Method*> methods;
578
+ foreach (const Method& meth, klass->methods()) {
579
+ if ((meth.flags() & Method::Virtual || meth.flags() & Method::PureVirtual)
580
+ && !meth.isDestructor() && meth.access() != Access_private)
581
+ {
582
+ methods << &meth;
583
+ }
584
+ }
585
+ foreach (const Class::BaseClassSpecifier& baseClass, klass->baseClasses()) {
586
+ methods += collectVirtualMethods(baseClass.baseClass);
587
+ }
588
+ return methods;
589
+ }
590
+
591
+ // don't make this public - it's just a utility function for the next method and probably not what you would expect it to be
592
+ static bool operator==(const Method& rhs, const Method& lhs)
593
+ {
594
+ // These have to be equal for methods to be the same. Return types don't have an effect, ignore them.
595
+ bool ok = (rhs.name() == lhs.name() && rhs.isConst() == lhs.isConst() && rhs.parameters().count() == lhs.parameters().count());
596
+ if (!ok)
597
+ return false;
598
+
599
+ // now check the parameter types for equality
600
+ for (int i = 0; i < rhs.parameters().count(); i++) {
601
+ if (rhs.parameters()[i].type() != lhs.parameters()[i].type())
602
+ return false;
603
+ }
604
+
605
+ return true;
606
+ }
607
+
608
+ void Util::addAccessorMethods(const Field& field, QSet<Type*> *usedTypes)
609
+ {
610
+ Class* klass = field.getClass();
611
+ Type* type = field.type();
612
+ if (type->getClass() && type->pointerDepth() == 0 && !(ParserOptions::qtMode && type->getClass()->name() == "QFlags")) {
613
+ Type newType = *type;
614
+ newType.setIsRef(true);
615
+ type = Type::registerType(newType);
616
+ }
617
+ (*usedTypes) << type;
618
+ Method getter = Method(klass, field.name(), type, field.access());
619
+ getter.setIsConst(true);
620
+ if (field.flags() & Field::Static)
621
+ getter.setFlag(Method::Static);
622
+ klass->appendMethod(getter);
623
+ fieldAccessors[&klass->methods().last()] = &field;
624
+
625
+ // constant field? (i.e. no setter method)
626
+ if (field.type()->isConst() && field.type()->pointerDepth() == 0)
627
+ return;
628
+
629
+ // foo => setFoo
630
+ QString newName = field.name();
631
+ newName[0] = newName[0].toUpper();
632
+ Method setter = Method(klass, "set" + newName, const_cast<Type*>(Type::Void), field.access());
633
+ if (field.flags() & Field::Static)
634
+ setter.setFlag(Method::Static);
635
+
636
+ // reset
637
+ type = field.type();
638
+ // to avoid copying around more stuff than necessary, convert setFoo(Bar) to setFoo(const Bar&)
639
+ if (type->pointerDepth() == 0 && type->getClass() && !(ParserOptions::qtMode && type->getClass()->name() == "QFlags")) {
640
+ Type newType = *type;
641
+ newType.setIsRef(true);
642
+ newType.setIsConst(true);
643
+ type = Type::registerType(newType);
644
+ }
645
+
646
+ (*usedTypes) << type;
647
+ setter.appendParameter(Parameter(QString(), type));
648
+ if (klass->methods().contains(setter))
649
+ return;
650
+ klass->appendMethod(setter);
651
+ fieldAccessors[&klass->methods().last()] = &field;
652
+ }
653
+
654
+ void Util::addOverloads(const Method& meth)
655
+ {
656
+ ParameterList params;
657
+ Class* klass = meth.getClass();
658
+
659
+ for (int i = 0; i < meth.parameters().count(); i++) {
660
+ const Parameter& param = meth.parameters()[i];
661
+ if (!param.isDefault()) {
662
+ params << param;
663
+ continue;
664
+ }
665
+ Method overload = meth;
666
+ if (meth.flags() & Method::PureVirtual) {
667
+ overload.setFlag(Method::DynamicDispatch);
668
+ }
669
+ overload.removeFlag(Method::Virtual);
670
+ overload.removeFlag(Method::PureVirtual);
671
+ overload.setParameterList(params);
672
+ if (klass->methods().contains(overload)) {
673
+ // we already have that, skip it
674
+ params << param;
675
+ continue;
676
+ }
677
+
678
+ QStringList remainingDefaultValues;
679
+ for (int j = i; j < meth.parameters().count(); j++) {
680
+ const Parameter defParam = meth.parameters()[j];
681
+ QString cast = "(";
682
+ cast += defParam.type()->toString() + ')';
683
+ cast += defParam.defaultValue();
684
+ remainingDefaultValues << cast;
685
+ }
686
+ overload.setRemainingDefaultValues(remainingDefaultValues);
687
+ klass->appendMethod(overload);
688
+
689
+ params << param;
690
+ }
691
+ }
692
+
693
+ // checks if method meth is overriden in class klass or any of its superclasses
694
+ const Method* Util::isVirtualOverriden(const Method& meth, const Class* klass)
695
+ {
696
+ // is the method virtual at all?
697
+ if (!(meth.flags() & Method::Virtual) && !(meth.flags() & Method::PureVirtual))
698
+ return 0;
699
+
700
+ // if the method is defined in klass, it can't be overriden there or in any parent class
701
+ if (meth.getClass() == klass)
702
+ return 0;
703
+
704
+ foreach (const Method& m, klass->methods()) {
705
+ if (!(m.flags() & Method::Static) && m == meth)
706
+ // the method m overrides meth
707
+ return &m;
708
+ }
709
+
710
+ foreach (const Class::BaseClassSpecifier& base, klass->baseClasses()) {
711
+ // we reached the class in which meth was defined and we still didn't find any overrides => return
712
+ if (base.baseClass == meth.getClass())
713
+ return 0;
714
+
715
+ // recurse into the base classes
716
+ const Method* m = 0;
717
+ if ((m = isVirtualOverriden(meth, base.baseClass)))
718
+ return m;
719
+ }
720
+
721
+ return 0;
722
+ }
723
+
724
+ static bool qListContainsMethodPointer(const QList<const Method*> list, const Method* ptr) {
725
+ foreach (const Method* meth, list) {
726
+ if (*meth == *ptr)
727
+ return true;
728
+ }
729
+ return false;
730
+ }
731
+
732
+ QList<const Method*> Util::virtualMethodsForClass(const Class* klass)
733
+ {
734
+ static QHash<const Class*, QList<const Method*> > cache;
735
+
736
+ // virtual method callbacks for classes that can't be instanstiated aren't useful
737
+ if (!Util::canClassBeInstanciated(klass))
738
+ return QList<const Method*>();
739
+
740
+ if (cache.contains(klass))
741
+ return cache[klass];
742
+
743
+ QList<const Method*> ret;
744
+
745
+ foreach (const Method* meth, Util::collectVirtualMethods(klass)) {
746
+ // this is a synthesized overload, skip it.
747
+ if (!meth->remainingDefaultValues().isEmpty())
748
+ continue;
749
+ if (meth->getClass() == klass) {
750
+ // this method can't be overriden, because it's defined in the class for which this method was called
751
+ ret << meth;
752
+ continue;
753
+ }
754
+ // Check if the method is overriden, so the callback will always point to the latest definition of the virtual method.
755
+ const Method* override = 0;
756
+ if ((override = Util::isVirtualOverriden(*meth, klass))) {
757
+ // If the method was overriden and put under private access, skip it. If we already have the method, skip it as well.
758
+ if (override->access() == Access_private || qListContainsMethodPointer(ret, override))
759
+ continue;
760
+ ret << override;
761
+ } else if (!qListContainsMethodPointer(ret, meth)) {
762
+ ret << meth;
763
+ }
764
+ }
765
+
766
+ cache[klass] = ret;
767
+ return ret;
768
+ }
769
+
770
+ bool Options::typeExcluded(const QString& typeName)
771
+ {
772
+ foreach (const QRegExp& exp, Options::excludeExpressions) {
773
+ if (exp.exactMatch(typeName))
774
+ return true;
775
+ }
776
+ return false;
777
+ }
778
+
779
+ bool Options::functionNameIncluded(const QString& fnName) {
780
+ foreach (const QRegExp& exp, Options::includeFunctionNames) {
781
+ if (exp.exactMatch(fnName))
782
+ return true;
783
+ }
784
+ return false;
785
+ }
786
+
787
+ bool Options::functionSignatureIncluded(const QString& sig) {
788
+ foreach (const QRegExp& exp, Options::includeFunctionNames) {
789
+ if (exp.exactMatch(sig))
790
+ return true;
791
+ }
792
+ return false;
793
+ }