qtbindings 4.6.3.0-x86-mingw32

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 (1225) hide show
  1. data/CHANGELOG.txt +9 -0
  2. data/CMakeLists.txt +22 -0
  3. data/COPYING.LIB.txt +510 -0
  4. data/COPYING.txt +286 -0
  5. data/KNOWN_ISSUES.txt +20 -0
  6. data/README.txt +92 -0
  7. data/Rakefile +96 -0
  8. data/TODO.txt +2 -0
  9. data/bin/1.8/rbrcc.exe +0 -0
  10. data/bin/1.8/rbuic4.exe +0 -0
  11. data/bin/1.8/smokeapi.exe +0 -0
  12. data/bin/1.8/smokedeptool.exe +0 -0
  13. data/bin/1.9/rbrcc.exe +0 -0
  14. data/bin/1.9/rbuic4.exe +0 -0
  15. data/bin/1.9/smokeapi.exe +0 -0
  16. data/bin/1.9/smokedeptool.exe +0 -0
  17. data/bin/Qt3Support4.dll +0 -0
  18. data/bin/QtAssistantClient4.dll +0 -0
  19. data/bin/QtCLucene4.dll +0 -0
  20. data/bin/QtCore4.dll +0 -0
  21. data/bin/QtDesigner4.dll +0 -0
  22. data/bin/QtDesignerComponents4.dll +0 -0
  23. data/bin/QtGui4.dll +0 -0
  24. data/bin/QtHelp4.dll +0 -0
  25. data/bin/QtMultimedia4.dll +0 -0
  26. data/bin/QtNetwork4.dll +0 -0
  27. data/bin/QtOpenGL4.dll +0 -0
  28. data/bin/QtScript4.dll +0 -0
  29. data/bin/QtScriptTools4.dll +0 -0
  30. data/bin/QtSql4.dll +0 -0
  31. data/bin/QtSvg4.dll +0 -0
  32. data/bin/QtTest4.dll +0 -0
  33. data/bin/QtWebKit4.dll +0 -0
  34. data/bin/QtXml4.dll +0 -0
  35. data/bin/QtXmlPatterns4.dll +0 -0
  36. data/bin/libgcc_s_dw2-1.dll +0 -0
  37. data/bin/mingwm10.dll +0 -0
  38. data/bin/phonon4.dll +0 -0
  39. data/bin/plugins/arthurplugin.dll +0 -0
  40. data/bin/plugins/containerextension.dll +0 -0
  41. data/bin/plugins/customwidgetplugin.dll +0 -0
  42. data/bin/plugins/phononwidgets.dll +0 -0
  43. data/bin/plugins/qcncodecs4.dll +0 -0
  44. data/bin/plugins/qgif4.dll +0 -0
  45. data/bin/plugins/qglgraphicssystem4.dll +0 -0
  46. data/bin/plugins/qico4.dll +0 -0
  47. data/bin/plugins/qjpcodecs4.dll +0 -0
  48. data/bin/plugins/qjpeg4.dll +0 -0
  49. data/bin/plugins/qkrcodecs4.dll +0 -0
  50. data/bin/plugins/qmng4.dll +0 -0
  51. data/bin/plugins/qsqlite4.dll +0 -0
  52. data/bin/plugins/qsqlodbc4.dll +0 -0
  53. data/bin/plugins/qsvg4.dll +0 -0
  54. data/bin/plugins/qsvgicon4.dll +0 -0
  55. data/bin/plugins/qt3supportwidgets.dll +0 -0
  56. data/bin/plugins/qtaccessiblecompatwidgets4.dll +0 -0
  57. data/bin/plugins/qtaccessiblewidgets4.dll +0 -0
  58. data/bin/plugins/qtiff4.dll +0 -0
  59. data/bin/plugins/qtracegraphicssystem4.dll +0 -0
  60. data/bin/plugins/qtwcodecs4.dll +0 -0
  61. data/bin/plugins/qwebview.dll +0 -0
  62. data/bin/plugins/taskmenuextension.dll +0 -0
  63. data/bin/plugins/worldtimeclockplugin.dll +0 -0
  64. data/bin/rbqtapi +152 -0
  65. data/bin/rbrcc +18 -0
  66. data/bin/rbuic4 +18 -0
  67. data/bin/smokeapi +18 -0
  68. data/bin/smokedeptool +18 -0
  69. data/examples/base/kicons.rb +54 -0
  70. data/examples/base/rui.rb +21 -0
  71. data/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -0
  72. data/examples/designer/calculatorbuilder/calculatorform.rb +60 -0
  73. data/examples/designer/calculatorbuilder/calculatorform.ui +299 -0
  74. data/examples/designer/calculatorbuilder/main.rb +34 -0
  75. data/examples/designer/calculatorbuilder/makefile +2 -0
  76. data/examples/designer/calculatorform/calculatorform.rb +46 -0
  77. data/examples/designer/calculatorform/calculatorform.ui +277 -0
  78. data/examples/designer/calculatorform/main.rb +32 -0
  79. data/examples/designer/calculatorform/makefile +3 -0
  80. data/examples/desktop/screenshot/main.rb +32 -0
  81. data/examples/desktop/screenshot/screenshot.rb +156 -0
  82. data/examples/desktop/systray/images/bad.svg +64 -0
  83. data/examples/desktop/systray/images/heart.svg +55 -0
  84. data/examples/desktop/systray/images/trash.svg +58 -0
  85. data/examples/desktop/systray/main.rb +41 -0
  86. data/examples/desktop/systray/makefile +2 -0
  87. data/examples/desktop/systray/systray.qrc +7 -0
  88. data/examples/desktop/systray/window.rb +223 -0
  89. data/examples/dialogs/complexwizard/complexwizard.rb +140 -0
  90. data/examples/dialogs/complexwizard/licensewizard.rb +294 -0
  91. data/examples/dialogs/complexwizard/main.rb +31 -0
  92. data/examples/dialogs/configdialog/configdialog.rb +109 -0
  93. data/examples/dialogs/configdialog/images/config.png +0 -0
  94. data/examples/dialogs/configdialog/images/query.png +0 -0
  95. data/examples/dialogs/configdialog/images/update.png +0 -0
  96. data/examples/dialogs/configdialog/main.rb +31 -0
  97. data/examples/dialogs/configdialog/pages.rb +140 -0
  98. data/examples/dialogs/extension/finddialog.rb +89 -0
  99. data/examples/dialogs/extension/main.rb +31 -0
  100. data/examples/dialogs/findfiles/main.rb +32 -0
  101. data/examples/dialogs/findfiles/window.rb +177 -0
  102. data/examples/dialogs/simplewizard/classwizard.rb +374 -0
  103. data/examples/dialogs/simplewizard/main.rb +31 -0
  104. data/examples/dialogs/simplewizard/simplewizard.rb +110 -0
  105. data/examples/dialogs/standarddialogs/dialog.rb +340 -0
  106. data/examples/dialogs/standarddialogs/main.rb +31 -0
  107. data/examples/dialogs/tabdialog/main.rb +38 -0
  108. data/examples/dialogs/tabdialog/tabdialog.rb +178 -0
  109. data/examples/draganddrop/draggableicons/dragwidget.rb +125 -0
  110. data/examples/draganddrop/draggableicons/images/boat.png +0 -0
  111. data/examples/draganddrop/draggableicons/images/car.png +0 -0
  112. data/examples/draganddrop/draggableicons/images/house.png +0 -0
  113. data/examples/draganddrop/draggableicons/main.rb +41 -0
  114. data/examples/draganddrop/draggabletext/draglabel.rb +51 -0
  115. data/examples/draganddrop/draggabletext/dragwidget.rb +94 -0
  116. data/examples/draganddrop/draggabletext/main.rb +33 -0
  117. data/examples/draganddrop/draggabletext/words.txt +41 -0
  118. data/examples/draganddrop/dropsite/dropsitewidget.rb +98 -0
  119. data/examples/draganddrop/dropsite/dropsitewindow.rb +114 -0
  120. data/examples/draganddrop/dropsite/main.rb +33 -0
  121. data/examples/draganddrop/fridgemagnets/draglabel.rb +78 -0
  122. data/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -0
  123. data/examples/draganddrop/fridgemagnets/main.rb +33 -0
  124. data/examples/draganddrop/fridgemagnets/words.txt +48 -0
  125. data/examples/draganddrop/puzzle/example.jpg +0 -0
  126. data/examples/draganddrop/puzzle/main.rb +33 -0
  127. data/examples/draganddrop/puzzle/mainwindow.rb +136 -0
  128. data/examples/draganddrop/puzzle/pieceslist.rb +95 -0
  129. data/examples/draganddrop/puzzle/puzzlewidget.rb +190 -0
  130. data/examples/graphicsview/collidingmice/images/cheese.jpg +0 -0
  131. data/examples/graphicsview/collidingmice/main.rb +53 -0
  132. data/examples/graphicsview/collidingmice/makefile +2 -0
  133. data/examples/graphicsview/collidingmice/mice.qrc +5 -0
  134. data/examples/graphicsview/collidingmice/mouse.rb +176 -0
  135. data/examples/graphicsview/dragdroprobot/coloritem.rb +86 -0
  136. data/examples/graphicsview/dragdroprobot/images/head.png +0 -0
  137. data/examples/graphicsview/dragdroprobot/main.rb +57 -0
  138. data/examples/graphicsview/dragdroprobot/makefile +2 -0
  139. data/examples/graphicsview/dragdroprobot/robot.qrc +5 -0
  140. data/examples/graphicsview/dragdroprobot/robot.rb +246 -0
  141. data/examples/itemviews/chart/chart.qrc +5 -0
  142. data/examples/itemviews/chart/main.rb +33 -0
  143. data/examples/itemviews/chart/mainwindow.rb +151 -0
  144. data/examples/itemviews/chart/makefile +2 -0
  145. data/examples/itemviews/chart/mydata.cht +8 -0
  146. data/examples/itemviews/chart/pieview.rb +516 -0
  147. data/examples/itemviews/chart/qtdata.cht +14 -0
  148. data/examples/itemviews/dirview/main.rb +39 -0
  149. data/examples/itemviews/pixelator/imagemodel.rb +51 -0
  150. data/examples/itemviews/pixelator/images.qrc +5 -0
  151. data/examples/itemviews/pixelator/images/qt.png +0 -0
  152. data/examples/itemviews/pixelator/main.rb +34 -0
  153. data/examples/itemviews/pixelator/mainwindow.rb +218 -0
  154. data/examples/itemviews/pixelator/makefile +3 -0
  155. data/examples/itemviews/pixelator/pixeldelegate.rb +67 -0
  156. data/examples/itemviews/puzzle/example.jpg +0 -0
  157. data/examples/itemviews/puzzle/main.rb +36 -0
  158. data/examples/itemviews/puzzle/mainwindow.rb +143 -0
  159. data/examples/itemviews/puzzle/piecesmodel.rb +174 -0
  160. data/examples/itemviews/puzzle/puzzlewidget.rb +192 -0
  161. data/examples/itemviews/simpledommodel/domitem.rb +62 -0
  162. data/examples/itemviews/simpledommodel/dommodel.rb +139 -0
  163. data/examples/itemviews/simpledommodel/main.rb +33 -0
  164. data/examples/itemviews/simpledommodel/mainwindow.rb +66 -0
  165. data/examples/itemviews/simpletreemodel/default.txt +40 -0
  166. data/examples/itemviews/simpletreemodel/main.rb +41 -0
  167. data/examples/itemviews/simpletreemodel/makefile +2 -0
  168. data/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -0
  169. data/examples/itemviews/simpletreemodel/treeitem.rb +67 -0
  170. data/examples/itemviews/simpletreemodel/treemodel.rb +164 -0
  171. data/examples/itemviews/sortingmodel/default.txt +40 -0
  172. data/examples/itemviews/sortingmodel/main.rb +53 -0
  173. data/examples/itemviews/sortingmodel/treeitem.rb +73 -0
  174. data/examples/itemviews/sortingmodel/treemodel.rb +166 -0
  175. data/examples/itemviews/spinboxdelegate/main.rb +47 -0
  176. data/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -0
  177. data/examples/killerfilter/killerfilter.rb +55 -0
  178. data/examples/layouts/basiclayouts/dialog.rb +110 -0
  179. data/examples/layouts/basiclayouts/main.rb +31 -0
  180. data/examples/layouts/borderlayout/borderlayout.rb +190 -0
  181. data/examples/layouts/borderlayout/main.rb +32 -0
  182. data/examples/layouts/borderlayout/window.rb +52 -0
  183. data/examples/layouts/flowlayouts/flowlayout.rb +108 -0
  184. data/examples/layouts/flowlayouts/main.rb +32 -0
  185. data/examples/layouts/flowlayouts/window.rb +43 -0
  186. data/examples/mainwindows/application/images/copy.png +0 -0
  187. data/examples/mainwindows/application/images/cut.png +0 -0
  188. data/examples/mainwindows/application/images/new.png +0 -0
  189. data/examples/mainwindows/application/images/open.png +0 -0
  190. data/examples/mainwindows/application/images/paste.png +0 -0
  191. data/examples/mainwindows/application/images/save.png +0 -0
  192. data/examples/mainwindows/application/main.rb +32 -0
  193. data/examples/mainwindows/application/mainwindow.rb +285 -0
  194. data/examples/mainwindows/dockwidgets/images/new.png +0 -0
  195. data/examples/mainwindows/dockwidgets/images/print.png +0 -0
  196. data/examples/mainwindows/dockwidgets/images/save.png +0 -0
  197. data/examples/mainwindows/dockwidgets/images/undo.png +0 -0
  198. data/examples/mainwindows/dockwidgets/main.rb +32 -0
  199. data/examples/mainwindows/dockwidgets/mainwindow.rb +302 -0
  200. data/examples/mainwindows/mdi/images/copy.png +0 -0
  201. data/examples/mainwindows/mdi/images/cut.png +0 -0
  202. data/examples/mainwindows/mdi/images/new.png +0 -0
  203. data/examples/mainwindows/mdi/images/open.png +0 -0
  204. data/examples/mainwindows/mdi/images/paste.png +0 -0
  205. data/examples/mainwindows/mdi/images/save.png +0 -0
  206. data/examples/mainwindows/mdi/main.rb +32 -0
  207. data/examples/mainwindows/mdi/mainwindow.rb +363 -0
  208. data/examples/mainwindows/mdi/mdichild.rb +152 -0
  209. data/examples/mainwindows/menus/main.rb +32 -0
  210. data/examples/mainwindows/menus/mainwindow.rb +327 -0
  211. data/examples/mainwindows/recentfiles/main.rb +32 -0
  212. data/examples/mainwindows/recentfiles/mainwindow.rb +258 -0
  213. data/examples/mainwindows/sdi/images/copy.png +0 -0
  214. data/examples/mainwindows/sdi/images/cut.png +0 -0
  215. data/examples/mainwindows/sdi/images/new.png +0 -0
  216. data/examples/mainwindows/sdi/images/open.png +0 -0
  217. data/examples/mainwindows/sdi/images/paste.png +0 -0
  218. data/examples/mainwindows/sdi/images/save.png +0 -0
  219. data/examples/mainwindows/sdi/main.rb +32 -0
  220. data/examples/mainwindows/sdi/mainwindow.rb +335 -0
  221. data/examples/network/broadcastreceiver/main.rb +32 -0
  222. data/examples/network/broadcastreceiver/receiver.rb +64 -0
  223. data/examples/network/broadcastsender/main.rb +32 -0
  224. data/examples/network/broadcastsender/sender.rb +70 -0
  225. data/examples/network/fortuneclient/client.rb +150 -0
  226. data/examples/network/fortuneclient/main.rb +32 -0
  227. data/examples/network/fortuneserver/main.rb +32 -0
  228. data/examples/network/fortuneserver/server.rb +88 -0
  229. data/examples/network/ftp/ftpwindow.rb +254 -0
  230. data/examples/network/ftp/images/cdtoparent.png +0 -0
  231. data/examples/network/ftp/images/dir.png +0 -0
  232. data/examples/network/ftp/images/file.png +0 -0
  233. data/examples/network/ftp/main.rb +32 -0
  234. data/examples/network/http/httpwindow.rb +187 -0
  235. data/examples/network/http/main.rb +32 -0
  236. data/examples/network/loopback/dialog.rb +163 -0
  237. data/examples/network/loopback/main.rb +32 -0
  238. data/examples/opengl/grabber/glwidget.rb +265 -0
  239. data/examples/opengl/grabber/main.rb +32 -0
  240. data/examples/opengl/grabber/mainwindow.rb +189 -0
  241. data/examples/opengl/hellogl/glwidget.rb +226 -0
  242. data/examples/opengl/hellogl/main.rb +32 -0
  243. data/examples/opengl/hellogl/window.rb +66 -0
  244. data/examples/opengl/textures/glwidget.rb +151 -0
  245. data/examples/opengl/textures/images/side1.png +0 -0
  246. data/examples/opengl/textures/images/side2.png +0 -0
  247. data/examples/opengl/textures/images/side3.png +0 -0
  248. data/examples/opengl/textures/images/side4.png +0 -0
  249. data/examples/opengl/textures/images/side5.png +0 -0
  250. data/examples/opengl/textures/images/side6.png +0 -0
  251. data/examples/opengl/textures/main.rb +32 -0
  252. data/examples/opengl/textures/window.rb +77 -0
  253. data/examples/painting/basicdrawing/images/brick.png +0 -0
  254. data/examples/painting/basicdrawing/images/qt-logo.png +0 -0
  255. data/examples/painting/basicdrawing/main.rb +32 -0
  256. data/examples/painting/basicdrawing/renderarea.rb +166 -0
  257. data/examples/painting/basicdrawing/window.rb +215 -0
  258. data/examples/painting/concentriccircles/circlewidget.rb +88 -0
  259. data/examples/painting/concentriccircles/main.rb +32 -0
  260. data/examples/painting/concentriccircles/window.rb +72 -0
  261. data/examples/painting/fontsampler/main.rb +32 -0
  262. data/examples/painting/fontsampler/mainwindow.rb +368 -0
  263. data/examples/painting/fontsampler/mainwindowbase.ui +136 -0
  264. data/examples/painting/fontsampler/makefile +8 -0
  265. data/examples/painting/fontsampler/previewdialog.rb +256 -0
  266. data/examples/painting/fontsampler/previewdialogbase.ui +224 -0
  267. data/examples/painting/fontsampler/previewlabel.rb +43 -0
  268. data/examples/painting/imagecomposition/imagecomposer.rb +152 -0
  269. data/examples/painting/imagecomposition/imagecomposition.qrc +6 -0
  270. data/examples/painting/imagecomposition/images/background.png +0 -0
  271. data/examples/painting/imagecomposition/images/blackrectangle.png +0 -0
  272. data/examples/painting/imagecomposition/images/butterfly.png +0 -0
  273. data/examples/painting/imagecomposition/images/checker.png +0 -0
  274. data/examples/painting/imagecomposition/main.rb +33 -0
  275. data/examples/painting/imagecomposition/makefile +2 -0
  276. data/examples/painting/painterpaths/main.rb +32 -0
  277. data/examples/painting/painterpaths/renderarea.rb +97 -0
  278. data/examples/painting/painterpaths/window.rb +247 -0
  279. data/examples/painting/svgviewer/files/bubbles.svg +212 -0
  280. data/examples/painting/svgviewer/files/cubic.svg +77 -0
  281. data/examples/painting/svgviewer/files/spheres.svg +79 -0
  282. data/examples/painting/svgviewer/main.rb +38 -0
  283. data/examples/painting/svgviewer/mainwindow.rb +99 -0
  284. data/examples/painting/svgviewer/makefile +2 -0
  285. data/examples/painting/svgviewer/svgview.rb +156 -0
  286. data/examples/painting/svgviewer/svgviewer.qrc +6 -0
  287. data/examples/painting/svgviewer/svgwindow.rb +87 -0
  288. data/examples/painting/transformations/main.rb +32 -0
  289. data/examples/painting/transformations/renderarea.rb +127 -0
  290. data/examples/painting/transformations/window.rb +153 -0
  291. data/examples/passivepopup/passivepopup.rb +38 -0
  292. data/examples/qdbus/chat/chat.rb +146 -0
  293. data/examples/qdbus/chat/chat_adaptor.rb +12 -0
  294. data/examples/qdbus/chat/chat_interface.rb +13 -0
  295. data/examples/qdbus/chat/chatmainwindow.ui +184 -0
  296. data/examples/qdbus/chat/chatsetnickname.ui +145 -0
  297. data/examples/qdbus/chat/makefile +8 -0
  298. data/examples/qdbus/complexpingpong/complexping.rb +92 -0
  299. data/examples/qdbus/complexpingpong/complexpong.rb +83 -0
  300. data/examples/qdbus/complexpingpong/ping-common.rb +1 -0
  301. data/examples/qdbus/listnames/listnames.rb +69 -0
  302. data/examples/qdbus/pingpong/ping-common.rb +1 -0
  303. data/examples/qdbus/pingpong/ping.rb +52 -0
  304. data/examples/qdbus/pingpong/pong.rb +55 -0
  305. data/examples/qdbus/remotecontrolledcar/car/car.rb +151 -0
  306. data/examples/qdbus/remotecontrolledcar/car/main.rb +50 -0
  307. data/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -0
  308. data/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -0
  309. data/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -0
  310. data/examples/qdbus/remotecontrolledcar/controller/makefile +2 -0
  311. data/examples/qtscribble/scribble.rb +270 -0
  312. data/examples/richtext/calendar/main.rb +33 -0
  313. data/examples/richtext/calendar/mainwindow.rb +173 -0
  314. data/examples/richtext/orderform/detailsdialog.rb +130 -0
  315. data/examples/richtext/orderform/main.rb +34 -0
  316. data/examples/richtext/orderform/mainwindow.rb +194 -0
  317. data/examples/richtext/syntaxhighlighter/examples/example +79 -0
  318. data/examples/richtext/syntaxhighlighter/highlighter.rb +90 -0
  319. data/examples/richtext/syntaxhighlighter/main.rb +34 -0
  320. data/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -0
  321. data/examples/ruboids/Manifest +26 -0
  322. data/examples/ruboids/README +53 -0
  323. data/examples/ruboids/TODO +29 -0
  324. data/examples/ruboids/boids.properties +33 -0
  325. data/examples/ruboids/generateManifest.rb +42 -0
  326. data/examples/ruboids/index.html +147 -0
  327. data/examples/ruboids/release.rb +152 -0
  328. data/examples/ruboids/ruboids/Boid.rb +141 -0
  329. data/examples/ruboids/ruboids/BoidView.rb +159 -0
  330. data/examples/ruboids/ruboids/Camera.rb +24 -0
  331. data/examples/ruboids/ruboids/CameraDialog.rb +218 -0
  332. data/examples/ruboids/ruboids/Canvas.rb +143 -0
  333. data/examples/ruboids/ruboids/Cloud.rb +61 -0
  334. data/examples/ruboids/ruboids/CloudView.rb +54 -0
  335. data/examples/ruboids/ruboids/Flock.rb +47 -0
  336. data/examples/ruboids/ruboids/Graphics.rb +278 -0
  337. data/examples/ruboids/ruboids/Params.rb +87 -0
  338. data/examples/ruboids/ruboids/Point.rb +153 -0
  339. data/examples/ruboids/ruboids/Thing.rb +34 -0
  340. data/examples/ruboids/ruboids/Triangle.rb +21 -0
  341. data/examples/ruboids/ruboids/View.rb +88 -0
  342. data/examples/ruboids/ruboids/World.rb +82 -0
  343. data/examples/ruboids/ruboids/WorldWindow.rb +52 -0
  344. data/examples/ruboids/ruboids/info.rb +12 -0
  345. data/examples/ruboids/ruboids/ruboids.rb +29 -0
  346. data/examples/run_all.rb +14 -0
  347. data/examples/textedit/textedit.rb +150 -0
  348. data/examples/tutorial/t1/t1.rb +10 -0
  349. data/examples/tutorial/t10/cannon.rb +72 -0
  350. data/examples/tutorial/t10/lcdrange.rb +45 -0
  351. data/examples/tutorial/t10/t10.rb +55 -0
  352. data/examples/tutorial/t11/cannon.rb +124 -0
  353. data/examples/tutorial/t11/lcdrange.rb +45 -0
  354. data/examples/tutorial/t11/t11.rb +65 -0
  355. data/examples/tutorial/t12/cannon.rb +158 -0
  356. data/examples/tutorial/t12/lcdrange.rb +59 -0
  357. data/examples/tutorial/t12/t12.rb +66 -0
  358. data/examples/tutorial/t13/cannon.rb +208 -0
  359. data/examples/tutorial/t13/gamebrd.rb +113 -0
  360. data/examples/tutorial/t13/lcdrange.rb +60 -0
  361. data/examples/tutorial/t13/t13.rb +11 -0
  362. data/examples/tutorial/t14/cannon.rb +263 -0
  363. data/examples/tutorial/t14/gamebrd.rb +123 -0
  364. data/examples/tutorial/t14/lcdrange.rb +63 -0
  365. data/examples/tutorial/t14/t14.rb +11 -0
  366. data/examples/tutorial/t2/t2.rb +16 -0
  367. data/examples/tutorial/t3/t3.rb +18 -0
  368. data/examples/tutorial/t4/t4.rb +25 -0
  369. data/examples/tutorial/t5/t5.rb +37 -0
  370. data/examples/tutorial/t6/t6.rb +52 -0
  371. data/examples/tutorial/t7/lcdrange.rb +32 -0
  372. data/examples/tutorial/t7/t7.rb +42 -0
  373. data/examples/tutorial/t8/cannon.rb +38 -0
  374. data/examples/tutorial/t8/lcdrange.rb +45 -0
  375. data/examples/tutorial/t8/t8.rb +43 -0
  376. data/examples/tutorial/t9/cannon.rb +45 -0
  377. data/examples/tutorial/t9/lcdrange.rb +46 -0
  378. data/examples/tutorial/t9/t9.rb +43 -0
  379. data/examples/widgets/analogclock/analogclock.rb +94 -0
  380. data/examples/widgets/analogclock/main.rb +9 -0
  381. data/examples/widgets/calculator/button.rb +45 -0
  382. data/examples/widgets/calculator/calculator.rb +382 -0
  383. data/examples/widgets/calculator/main.rb +32 -0
  384. data/examples/widgets/charactermap/characterwidget.rb +110 -0
  385. data/examples/widgets/charactermap/main.rb +32 -0
  386. data/examples/widgets/charactermap/mainwindow.rb +118 -0
  387. data/examples/widgets/digitalclock/digitalclock.rb +30 -0
  388. data/examples/widgets/digitalclock/main.rb +9 -0
  389. data/examples/widgets/groupbox/main.rb +32 -0
  390. data/examples/widgets/groupbox/window.rb +134 -0
  391. data/examples/widgets/icons/iconpreviewarea.rb +111 -0
  392. data/examples/widgets/icons/iconsizespinbox.rb +39 -0
  393. data/examples/widgets/icons/imagedelegate.rb +73 -0
  394. data/examples/widgets/icons/images/designer.png +0 -0
  395. data/examples/widgets/icons/images/find_disabled.png +0 -0
  396. data/examples/widgets/icons/images/find_normal.png +0 -0
  397. data/examples/widgets/icons/images/monkey_off_128x128.png +0 -0
  398. data/examples/widgets/icons/images/monkey_off_16x16.png +0 -0
  399. data/examples/widgets/icons/images/monkey_off_32x32.png +0 -0
  400. data/examples/widgets/icons/images/monkey_off_64x64.png +0 -0
  401. data/examples/widgets/icons/images/monkey_on_128x128.png +0 -0
  402. data/examples/widgets/icons/images/monkey_on_16x16.png +0 -0
  403. data/examples/widgets/icons/images/monkey_on_32x32.png +0 -0
  404. data/examples/widgets/icons/images/monkey_on_64x64.png +0 -0
  405. data/examples/widgets/icons/images/qtopia_16x16.png +0 -0
  406. data/examples/widgets/icons/images/qtopia_32x32.png +0 -0
  407. data/examples/widgets/icons/images/qtopia_48x48.png +0 -0
  408. data/examples/widgets/icons/main.rb +32 -0
  409. data/examples/widgets/icons/mainwindow.rb +351 -0
  410. data/examples/widgets/imageviewer/imageviewer.rb +219 -0
  411. data/examples/widgets/imageviewer/main.rb +32 -0
  412. data/examples/widgets/lineedits/main.rb +32 -0
  413. data/examples/widgets/lineedits/window.rb +199 -0
  414. data/examples/widgets/movie/images/open.png +0 -0
  415. data/examples/widgets/movie/images/pause.png +0 -0
  416. data/examples/widgets/movie/images/play.png +0 -0
  417. data/examples/widgets/movie/images/quit.png +0 -0
  418. data/examples/widgets/movie/images/stop.png +0 -0
  419. data/examples/widgets/movie/main.rb +32 -0
  420. data/examples/widgets/movie/movieplayer.rb +201 -0
  421. data/examples/widgets/movie/movies/fire.mng +0 -0
  422. data/examples/widgets/screenshot/main.rb +32 -0
  423. data/examples/widgets/screenshot/screenshot.rb +155 -0
  424. data/examples/widgets/scribble/main.rb +32 -0
  425. data/examples/widgets/scribble/mainwindow.rb +202 -0
  426. data/examples/widgets/scribble/scribblearea.rb +154 -0
  427. data/examples/widgets/sliders/main.rb +32 -0
  428. data/examples/widgets/sliders/slidersgroup.rb +97 -0
  429. data/examples/widgets/sliders/window.rb +124 -0
  430. data/examples/widgets/spinboxes/main.rb +32 -0
  431. data/examples/widgets/spinboxes/window.rb +213 -0
  432. data/examples/widgets/tetrix/main.rb +33 -0
  433. data/examples/widgets/tetrix/tetrixboard.rb +346 -0
  434. data/examples/widgets/tetrix/tetrixpiece.rb +135 -0
  435. data/examples/widgets/tetrix/tetrixwindow.rb +88 -0
  436. data/examples/widgets/tooltips/images/circle.png +0 -0
  437. data/examples/widgets/tooltips/images/square.png +0 -0
  438. data/examples/widgets/tooltips/images/triangle.png +0 -0
  439. data/examples/widgets/tooltips/main.rb +32 -0
  440. data/examples/widgets/tooltips/shapeitem.rb +31 -0
  441. data/examples/widgets/tooltips/sortingbox.rb +222 -0
  442. data/examples/widgets/wiggly/dialog.rb +48 -0
  443. data/examples/widgets/wiggly/main.rb +9 -0
  444. data/examples/widgets/wiggly/wigglywidget.rb +76 -0
  445. data/examples/widgets/windowflags/controllerwindow.rb +195 -0
  446. data/examples/widgets/windowflags/main.rb +32 -0
  447. data/examples/widgets/windowflags/previewwindow.rb +103 -0
  448. data/examples/xml/dombookmarks/frank.xbel +230 -0
  449. data/examples/xml/dombookmarks/jennifer.xbel +93 -0
  450. data/examples/xml/dombookmarks/main.rb +34 -0
  451. data/examples/xml/dombookmarks/mainwindow.rb +129 -0
  452. data/examples/xml/dombookmarks/xbeltree.rb +172 -0
  453. data/examples/xml/saxbookmarks/frank.xbel +230 -0
  454. data/examples/xml/saxbookmarks/jennifer.xbel +93 -0
  455. data/examples/xml/saxbookmarks/main.rb +34 -0
  456. data/examples/xml/saxbookmarks/mainwindow.rb +144 -0
  457. data/examples/xml/saxbookmarks/xbelgenerator.rb +95 -0
  458. data/examples/xml/saxbookmarks/xbelhandler.rb +122 -0
  459. data/ext/CMakeLists.txt +22 -0
  460. data/ext/cmake/modules/CMakeCSharpCompiler.cmake.in +7 -0
  461. data/ext/cmake/modules/CMakeCSharpInformation.cmake +366 -0
  462. data/ext/cmake/modules/CMakeDetermineCSharpCompiler.cmake +85 -0
  463. data/ext/cmake/modules/CMakeTestCSharpCompiler.cmake +1 -0
  464. data/ext/cmake/modules/CheckCXXSourceCompiles.cmake +68 -0
  465. data/ext/cmake/modules/FindMono.cmake +36 -0
  466. data/ext/cmake/modules/FindPHP5.cmake +179 -0
  467. data/ext/cmake/modules/FindPerlMore.cmake +78 -0
  468. data/ext/cmake/modules/FindQScintilla.cmake +57 -0
  469. data/ext/cmake/modules/FindQt4.cmake +1271 -0
  470. data/ext/cmake/modules/FindQwt5.cmake +104 -0
  471. data/ext/cmake/modules/FindRuby.cmake +261 -0
  472. data/ext/cmake/modules/FindSmoke.cmake +78 -0
  473. data/ext/cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -0
  474. data/ext/cmake/modules/MacroLogFeature.cmake +146 -0
  475. data/ext/cmake/modules/MacroOptionalAddBindings.cmake +47 -0
  476. data/ext/cmake/modules/MacroOptionalFindPackage.cmake +48 -0
  477. data/ext/cmake/modules/MacroPushRequiredVars.cmake +47 -0
  478. data/ext/cmake/modules/Qt4ConfigDependentSettings.cmake +384 -0
  479. data/ext/cmake/modules/Qt4Macros.cmake +414 -0
  480. data/ext/generator/CMakeLists.txt +38 -0
  481. data/ext/generator/generator_export.h +31 -0
  482. data/ext/generator/generatorenvironment.cpp +52 -0
  483. data/ext/generator/generatorenvironment.h +35 -0
  484. data/ext/generator/generatorpreprocessor.cpp +242 -0
  485. data/ext/generator/generatorpreprocessor.h +83 -0
  486. data/ext/generator/generators/CMakeLists.txt +4 -0
  487. data/ext/generator/generators/dump/CMakeLists.txt +10 -0
  488. data/ext/generator/generators/dump/generator_dump.cpp +36 -0
  489. data/ext/generator/generators/smoke/CMakeLists.txt +13 -0
  490. data/ext/generator/generators/smoke/generator_smoke.cpp +233 -0
  491. data/ext/generator/generators/smoke/globals.h +138 -0
  492. data/ext/generator/generators/smoke/helpers.cpp +773 -0
  493. data/ext/generator/generators/smoke/writeClasses.cpp +502 -0
  494. data/ext/generator/generators/smoke/writeSmokeDataFile.cpp +729 -0
  495. data/ext/generator/generatorvisitor.cpp +922 -0
  496. data/ext/generator/generatorvisitor.h +119 -0
  497. data/ext/generator/main.cpp +239 -0
  498. data/ext/generator/name_compiler.cpp +205 -0
  499. data/ext/generator/name_compiler.h +76 -0
  500. data/ext/generator/options.cpp +32 -0
  501. data/ext/generator/options.h +45 -0
  502. data/ext/generator/parser/CMakeLists.txt +41 -0
  503. data/ext/generator/parser/ast.cpp +21 -0
  504. data/ext/generator/parser/ast.h +923 -0
  505. data/ext/generator/parser/astutilities.h +65 -0
  506. data/ext/generator/parser/codegenerator.cpp +867 -0
  507. data/ext/generator/parser/codegenerator.h +180 -0
  508. data/ext/generator/parser/codemodel_fwd.h +76 -0
  509. data/ext/generator/parser/commentformatter.cpp +54 -0
  510. data/ext/generator/parser/commentformatter.h +45 -0
  511. data/ext/generator/parser/commentparser.cpp +109 -0
  512. data/ext/generator/parser/commentparser.h +84 -0
  513. data/ext/generator/parser/control.cpp +40 -0
  514. data/ext/generator/parser/control.h +51 -0
  515. data/ext/generator/parser/cppparser_export.h +33 -0
  516. data/ext/generator/parser/default_visitor.cpp +470 -0
  517. data/ext/generator/parser/default_visitor.h +116 -0
  518. data/ext/generator/parser/dumptree.cpp +146 -0
  519. data/ext/generator/parser/dumptree.h +50 -0
  520. data/ext/generator/parser/indexedstring.cpp +213 -0
  521. data/ext/generator/parser/indexedstring.h +147 -0
  522. data/ext/generator/parser/kdevelop-parser-rev +1 -0
  523. data/ext/generator/parser/kdevvarlengtharray.h +346 -0
  524. data/ext/generator/parser/lexer.cpp +963 -0
  525. data/ext/generator/parser/lexer.h +308 -0
  526. data/ext/generator/parser/listnode.cpp +20 -0
  527. data/ext/generator/parser/listnode.h +97 -0
  528. data/ext/generator/parser/memorypool.cpp +20 -0
  529. data/ext/generator/parser/memorypool.h +41 -0
  530. data/ext/generator/parser/name_compiler.cpp +190 -0
  531. data/ext/generator/parser/name_compiler.h +77 -0
  532. data/ext/generator/parser/parser.cpp +4706 -0
  533. data/ext/generator/parser/parser.h +300 -0
  534. data/ext/generator/parser/parsesession.cpp +105 -0
  535. data/ext/generator/parser/parsesession.h +87 -0
  536. data/ext/generator/parser/problem.h +21 -0
  537. data/ext/generator/parser/rpp/CMakeLists.txt +39 -0
  538. data/ext/generator/parser/rpp/Makefile.am +13 -0
  539. data/ext/generator/parser/rpp/anchor.h +51 -0
  540. data/ext/generator/parser/rpp/appendedlist.h +363 -0
  541. data/ext/generator/parser/rpp/chartools.cpp +126 -0
  542. data/ext/generator/parser/rpp/chartools.h +90 -0
  543. data/ext/generator/parser/rpp/macrorepository.cpp +44 -0
  544. data/ext/generator/parser/rpp/macrorepository.h +59 -0
  545. data/ext/generator/parser/rpp/pp-configuration +86 -0
  546. data/ext/generator/parser/rpp/pp-engine.cpp +1216 -0
  547. data/ext/generator/parser/rpp/pp-engine.h +267 -0
  548. data/ext/generator/parser/rpp/pp-environment.cpp +271 -0
  549. data/ext/generator/parser/rpp/pp-environment.h +119 -0
  550. data/ext/generator/parser/rpp/pp-internal.cpp +38 -0
  551. data/ext/generator/parser/rpp/pp-internal.h +37 -0
  552. data/ext/generator/parser/rpp/pp-location.cpp +191 -0
  553. data/ext/generator/parser/rpp/pp-location.h +89 -0
  554. data/ext/generator/parser/rpp/pp-macro-expander.cpp +568 -0
  555. data/ext/generator/parser/rpp/pp-macro-expander.cpp.orig +558 -0
  556. data/ext/generator/parser/rpp/pp-macro-expander.h +130 -0
  557. data/ext/generator/parser/rpp/pp-macro.cpp +153 -0
  558. data/ext/generator/parser/rpp/pp-macro.h +176 -0
  559. data/ext/generator/parser/rpp/pp-scanner.cpp +310 -0
  560. data/ext/generator/parser/rpp/pp-scanner.h +97 -0
  561. data/ext/generator/parser/rpp/pp-stream.cpp +425 -0
  562. data/ext/generator/parser/rpp/pp-stream.h +183 -0
  563. data/ext/generator/parser/rpp/preprocessor.cpp +65 -0
  564. data/ext/generator/parser/rpp/preprocessor.h +80 -0
  565. data/ext/generator/parser/rpp/rpp.pri +2 -0
  566. data/ext/generator/parser/rpp/test/t001.cpp +23 -0
  567. data/ext/generator/parser/rpp/test/t002.cpp +15 -0
  568. data/ext/generator/parser/rpp/test/t003.cpp +10 -0
  569. data/ext/generator/parser/rpp/test/t004.cpp +9 -0
  570. data/ext/generator/parser/rpp/test/t005.cpp +10 -0
  571. data/ext/generator/parser/rpp/test/t006.cpp +10 -0
  572. data/ext/generator/parser/rpp/test/t007.cpp +6 -0
  573. data/ext/generator/parser/rpp/test/t008.cpp +6 -0
  574. data/ext/generator/parser/rpp/test/t009.cpp +5 -0
  575. data/ext/generator/parser/rpp/test/t010.cpp +15 -0
  576. data/ext/generator/parser/rpp/test/t011.cpp +9 -0
  577. data/ext/generator/parser/rpp/tests/CMakeLists.txt +13 -0
  578. data/ext/generator/parser/rpp/tests/main.cpp +69 -0
  579. data/ext/generator/parser/rxx.pri +50 -0
  580. data/ext/generator/parser/rxx_allocator.h +128 -0
  581. data/ext/generator/parser/safetycounter.h +57 -0
  582. data/ext/generator/parser/simplecursor.h +74 -0
  583. data/ext/generator/parser/stringhelpers.cpp +577 -0
  584. data/ext/generator/parser/stringhelpers.h +118 -0
  585. data/ext/generator/parser/symbol.h +140 -0
  586. data/ext/generator/parser/tests/CMakeLists.txt +30 -0
  587. data/ext/generator/parser/tests/test_generator.cpp +259 -0
  588. data/ext/generator/parser/tests/test_parser.cpp +474 -0
  589. data/ext/generator/parser/tests/test_pool.cpp +109 -0
  590. data/ext/generator/parser/tests/test_pool.h +35 -0
  591. data/ext/generator/parser/tests/testconfig.h.cmake +4 -0
  592. data/ext/generator/parser/tokens.cpp +364 -0
  593. data/ext/generator/parser/tokens.h +147 -0
  594. data/ext/generator/parser/type_compiler.cpp +135 -0
  595. data/ext/generator/parser/type_compiler.h +68 -0
  596. data/ext/generator/parser/visitor.cpp +115 -0
  597. data/ext/generator/parser/visitor.h +138 -0
  598. data/ext/generator/type.cpp +195 -0
  599. data/ext/generator/type.h +497 -0
  600. data/ext/generator/type_compiler.cpp +275 -0
  601. data/ext/generator/type_compiler.h +80 -0
  602. data/ext/ruby/CMakeLists.txt +63 -0
  603. data/ext/ruby/qtruby/AUTHORS +54 -0
  604. data/ext/ruby/qtruby/CMakeLists.txt +4 -0
  605. data/ext/ruby/qtruby/COPYING +355 -0
  606. data/ext/ruby/qtruby/COPYING.LIB +510 -0
  607. data/ext/ruby/qtruby/ChangeLog +3732 -0
  608. data/ext/ruby/qtruby/INSTALL +79 -0
  609. data/ext/ruby/qtruby/README +264 -0
  610. data/ext/ruby/qtruby/TODO +8 -0
  611. data/ext/ruby/qtruby/bin/CMakeLists.txt +1 -0
  612. data/ext/ruby/qtruby/bin/rbqtapi +152 -0
  613. data/ext/ruby/qtruby/examples/base/kicons.rb +54 -0
  614. data/ext/ruby/qtruby/examples/base/rui.rb +21 -0
  615. data/ext/ruby/qtruby/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -0
  616. data/ext/ruby/qtruby/examples/designer/calculatorbuilder/calculatorform.rb +60 -0
  617. data/ext/ruby/qtruby/examples/designer/calculatorbuilder/calculatorform.ui +299 -0
  618. data/ext/ruby/qtruby/examples/designer/calculatorbuilder/main.rb +33 -0
  619. data/ext/ruby/qtruby/examples/designer/calculatorbuilder/makefile +2 -0
  620. data/ext/ruby/qtruby/examples/designer/calculatorform/calculatorform.rb +46 -0
  621. data/ext/ruby/qtruby/examples/designer/calculatorform/calculatorform.ui +277 -0
  622. data/ext/ruby/qtruby/examples/designer/calculatorform/main.rb +32 -0
  623. data/ext/ruby/qtruby/examples/designer/calculatorform/makefile +3 -0
  624. data/ext/ruby/qtruby/examples/desktop/screenshot/main.rb +32 -0
  625. data/ext/ruby/qtruby/examples/desktop/screenshot/screenshot.rb +156 -0
  626. data/ext/ruby/qtruby/examples/desktop/systray/images/bad.svg +64 -0
  627. data/ext/ruby/qtruby/examples/desktop/systray/images/heart.svg +55 -0
  628. data/ext/ruby/qtruby/examples/desktop/systray/images/trash.svg +58 -0
  629. data/ext/ruby/qtruby/examples/desktop/systray/main.rb +41 -0
  630. data/ext/ruby/qtruby/examples/desktop/systray/makefile +2 -0
  631. data/ext/ruby/qtruby/examples/desktop/systray/systray.qrc +7 -0
  632. data/ext/ruby/qtruby/examples/desktop/systray/window.rb +223 -0
  633. data/ext/ruby/qtruby/examples/dialogs/complexwizard/complexwizard.rb +140 -0
  634. data/ext/ruby/qtruby/examples/dialogs/complexwizard/licensewizard.rb +294 -0
  635. data/ext/ruby/qtruby/examples/dialogs/complexwizard/main.rb +31 -0
  636. data/ext/ruby/qtruby/examples/dialogs/configdialog/configdialog.rb +109 -0
  637. data/ext/ruby/qtruby/examples/dialogs/configdialog/images/config.png +0 -0
  638. data/ext/ruby/qtruby/examples/dialogs/configdialog/images/query.png +0 -0
  639. data/ext/ruby/qtruby/examples/dialogs/configdialog/images/update.png +0 -0
  640. data/ext/ruby/qtruby/examples/dialogs/configdialog/main.rb +31 -0
  641. data/ext/ruby/qtruby/examples/dialogs/configdialog/pages.rb +140 -0
  642. data/ext/ruby/qtruby/examples/dialogs/extension/finddialog.rb +89 -0
  643. data/ext/ruby/qtruby/examples/dialogs/extension/main.rb +31 -0
  644. data/ext/ruby/qtruby/examples/dialogs/findfiles/main.rb +32 -0
  645. data/ext/ruby/qtruby/examples/dialogs/findfiles/window.rb +177 -0
  646. data/ext/ruby/qtruby/examples/dialogs/simplewizard/classwizard.rb +374 -0
  647. data/ext/ruby/qtruby/examples/dialogs/simplewizard/main.rb +31 -0
  648. data/ext/ruby/qtruby/examples/dialogs/simplewizard/simplewizard.rb +110 -0
  649. data/ext/ruby/qtruby/examples/dialogs/standarddialogs/dialog.rb +340 -0
  650. data/ext/ruby/qtruby/examples/dialogs/standarddialogs/main.rb +31 -0
  651. data/ext/ruby/qtruby/examples/dialogs/tabdialog/main.rb +38 -0
  652. data/ext/ruby/qtruby/examples/dialogs/tabdialog/tabdialog.rb +178 -0
  653. data/ext/ruby/qtruby/examples/draganddrop/draggableicons/dragwidget.rb +125 -0
  654. data/ext/ruby/qtruby/examples/draganddrop/draggableicons/images/boat.png +0 -0
  655. data/ext/ruby/qtruby/examples/draganddrop/draggableicons/images/car.png +0 -0
  656. data/ext/ruby/qtruby/examples/draganddrop/draggableicons/images/house.png +0 -0
  657. data/ext/ruby/qtruby/examples/draganddrop/draggableicons/main.rb +41 -0
  658. data/ext/ruby/qtruby/examples/draganddrop/draggabletext/draglabel.rb +51 -0
  659. data/ext/ruby/qtruby/examples/draganddrop/draggabletext/dragwidget.rb +94 -0
  660. data/ext/ruby/qtruby/examples/draganddrop/draggabletext/main.rb +33 -0
  661. data/ext/ruby/qtruby/examples/draganddrop/draggabletext/words.txt +41 -0
  662. data/ext/ruby/qtruby/examples/draganddrop/dropsite/dropsitewidget.rb +98 -0
  663. data/ext/ruby/qtruby/examples/draganddrop/dropsite/dropsitewindow.rb +114 -0
  664. data/ext/ruby/qtruby/examples/draganddrop/dropsite/main.rb +33 -0
  665. data/ext/ruby/qtruby/examples/draganddrop/fridgemagnets/draglabel.rb +78 -0
  666. data/ext/ruby/qtruby/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -0
  667. data/ext/ruby/qtruby/examples/draganddrop/fridgemagnets/main.rb +33 -0
  668. data/ext/ruby/qtruby/examples/draganddrop/fridgemagnets/words.txt +48 -0
  669. data/ext/ruby/qtruby/examples/draganddrop/puzzle/example.jpg +0 -0
  670. data/ext/ruby/qtruby/examples/draganddrop/puzzle/main.rb +33 -0
  671. data/ext/ruby/qtruby/examples/draganddrop/puzzle/mainwindow.rb +136 -0
  672. data/ext/ruby/qtruby/examples/draganddrop/puzzle/pieceslist.rb +95 -0
  673. data/ext/ruby/qtruby/examples/draganddrop/puzzle/puzzlewidget.rb +190 -0
  674. data/ext/ruby/qtruby/examples/graphicsview/collidingmice/images/cheese.jpg +0 -0
  675. data/ext/ruby/qtruby/examples/graphicsview/collidingmice/main.rb +53 -0
  676. data/ext/ruby/qtruby/examples/graphicsview/collidingmice/makefile +2 -0
  677. data/ext/ruby/qtruby/examples/graphicsview/collidingmice/mice.qrc +5 -0
  678. data/ext/ruby/qtruby/examples/graphicsview/collidingmice/mouse.rb +176 -0
  679. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/coloritem.rb +86 -0
  680. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/images/head.png +0 -0
  681. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/main.rb +57 -0
  682. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/makefile +2 -0
  683. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/robot.qrc +5 -0
  684. data/ext/ruby/qtruby/examples/graphicsview/dragdroprobot/robot.rb +246 -0
  685. data/ext/ruby/qtruby/examples/itemviews/chart/chart.qrc +5 -0
  686. data/ext/ruby/qtruby/examples/itemviews/chart/main.rb +33 -0
  687. data/ext/ruby/qtruby/examples/itemviews/chart/mainwindow.rb +151 -0
  688. data/ext/ruby/qtruby/examples/itemviews/chart/makefile +2 -0
  689. data/ext/ruby/qtruby/examples/itemviews/chart/mydata.cht +8 -0
  690. data/ext/ruby/qtruby/examples/itemviews/chart/pieview.rb +516 -0
  691. data/ext/ruby/qtruby/examples/itemviews/chart/qtdata.cht +14 -0
  692. data/ext/ruby/qtruby/examples/itemviews/dirview/main.rb +39 -0
  693. data/ext/ruby/qtruby/examples/itemviews/pixelator/imagemodel.rb +51 -0
  694. data/ext/ruby/qtruby/examples/itemviews/pixelator/images.qrc +5 -0
  695. data/ext/ruby/qtruby/examples/itemviews/pixelator/images/qt.png +0 -0
  696. data/ext/ruby/qtruby/examples/itemviews/pixelator/main.rb +34 -0
  697. data/ext/ruby/qtruby/examples/itemviews/pixelator/mainwindow.rb +218 -0
  698. data/ext/ruby/qtruby/examples/itemviews/pixelator/makefile +3 -0
  699. data/ext/ruby/qtruby/examples/itemviews/pixelator/pixeldelegate.rb +67 -0
  700. data/ext/ruby/qtruby/examples/itemviews/puzzle/example.jpg +0 -0
  701. data/ext/ruby/qtruby/examples/itemviews/puzzle/main.rb +36 -0
  702. data/ext/ruby/qtruby/examples/itemviews/puzzle/mainwindow.rb +143 -0
  703. data/ext/ruby/qtruby/examples/itemviews/puzzle/piecesmodel.rb +174 -0
  704. data/ext/ruby/qtruby/examples/itemviews/puzzle/puzzlewidget.rb +192 -0
  705. data/ext/ruby/qtruby/examples/itemviews/simpledommodel/domitem.rb +62 -0
  706. data/ext/ruby/qtruby/examples/itemviews/simpledommodel/dommodel.rb +139 -0
  707. data/ext/ruby/qtruby/examples/itemviews/simpledommodel/main.rb +33 -0
  708. data/ext/ruby/qtruby/examples/itemviews/simpledommodel/mainwindow.rb +66 -0
  709. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/default.txt +40 -0
  710. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/main.rb +41 -0
  711. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/makefile +2 -0
  712. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -0
  713. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/treeitem.rb +67 -0
  714. data/ext/ruby/qtruby/examples/itemviews/simpletreemodel/treemodel.rb +164 -0
  715. data/ext/ruby/qtruby/examples/itemviews/sortingmodel/default.txt +40 -0
  716. data/ext/ruby/qtruby/examples/itemviews/sortingmodel/main.rb +53 -0
  717. data/ext/ruby/qtruby/examples/itemviews/sortingmodel/treeitem.rb +73 -0
  718. data/ext/ruby/qtruby/examples/itemviews/sortingmodel/treemodel.rb +166 -0
  719. data/ext/ruby/qtruby/examples/itemviews/spinboxdelegate/main.rb +47 -0
  720. data/ext/ruby/qtruby/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -0
  721. data/ext/ruby/qtruby/examples/killerfilter/killerfilter.rb +55 -0
  722. data/ext/ruby/qtruby/examples/layouts/basiclayouts/dialog.rb +110 -0
  723. data/ext/ruby/qtruby/examples/layouts/basiclayouts/main.rb +31 -0
  724. data/ext/ruby/qtruby/examples/layouts/borderlayout/borderlayout.rb +190 -0
  725. data/ext/ruby/qtruby/examples/layouts/borderlayout/main.rb +32 -0
  726. data/ext/ruby/qtruby/examples/layouts/borderlayout/window.rb +52 -0
  727. data/ext/ruby/qtruby/examples/layouts/flowlayouts/flowlayout.rb +108 -0
  728. data/ext/ruby/qtruby/examples/layouts/flowlayouts/main.rb +32 -0
  729. data/ext/ruby/qtruby/examples/layouts/flowlayouts/window.rb +43 -0
  730. data/ext/ruby/qtruby/examples/mainwindows/application/images/copy.png +0 -0
  731. data/ext/ruby/qtruby/examples/mainwindows/application/images/cut.png +0 -0
  732. data/ext/ruby/qtruby/examples/mainwindows/application/images/new.png +0 -0
  733. data/ext/ruby/qtruby/examples/mainwindows/application/images/open.png +0 -0
  734. data/ext/ruby/qtruby/examples/mainwindows/application/images/paste.png +0 -0
  735. data/ext/ruby/qtruby/examples/mainwindows/application/images/save.png +0 -0
  736. data/ext/ruby/qtruby/examples/mainwindows/application/main.rb +32 -0
  737. data/ext/ruby/qtruby/examples/mainwindows/application/mainwindow.rb +285 -0
  738. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/images/new.png +0 -0
  739. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/images/print.png +0 -0
  740. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/images/save.png +0 -0
  741. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/images/undo.png +0 -0
  742. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/main.rb +32 -0
  743. data/ext/ruby/qtruby/examples/mainwindows/dockwidgets/mainwindow.rb +302 -0
  744. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/copy.png +0 -0
  745. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/cut.png +0 -0
  746. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/new.png +0 -0
  747. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/open.png +0 -0
  748. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/paste.png +0 -0
  749. data/ext/ruby/qtruby/examples/mainwindows/mdi/images/save.png +0 -0
  750. data/ext/ruby/qtruby/examples/mainwindows/mdi/main.rb +32 -0
  751. data/ext/ruby/qtruby/examples/mainwindows/mdi/mainwindow.rb +363 -0
  752. data/ext/ruby/qtruby/examples/mainwindows/mdi/mdichild.rb +152 -0
  753. data/ext/ruby/qtruby/examples/mainwindows/menus/main.rb +32 -0
  754. data/ext/ruby/qtruby/examples/mainwindows/menus/mainwindow.rb +327 -0
  755. data/ext/ruby/qtruby/examples/mainwindows/recentfiles/main.rb +32 -0
  756. data/ext/ruby/qtruby/examples/mainwindows/recentfiles/mainwindow.rb +258 -0
  757. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/copy.png +0 -0
  758. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/cut.png +0 -0
  759. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/new.png +0 -0
  760. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/open.png +0 -0
  761. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/paste.png +0 -0
  762. data/ext/ruby/qtruby/examples/mainwindows/sdi/images/save.png +0 -0
  763. data/ext/ruby/qtruby/examples/mainwindows/sdi/main.rb +32 -0
  764. data/ext/ruby/qtruby/examples/mainwindows/sdi/mainwindow.rb +335 -0
  765. data/ext/ruby/qtruby/examples/network/broadcastreceiver/main.rb +32 -0
  766. data/ext/ruby/qtruby/examples/network/broadcastreceiver/receiver.rb +64 -0
  767. data/ext/ruby/qtruby/examples/network/broadcastsender/main.rb +32 -0
  768. data/ext/ruby/qtruby/examples/network/broadcastsender/sender.rb +70 -0
  769. data/ext/ruby/qtruby/examples/network/fortuneclient/client.rb +150 -0
  770. data/ext/ruby/qtruby/examples/network/fortuneclient/main.rb +32 -0
  771. data/ext/ruby/qtruby/examples/network/fortuneserver/main.rb +32 -0
  772. data/ext/ruby/qtruby/examples/network/fortuneserver/server.rb +88 -0
  773. data/ext/ruby/qtruby/examples/network/ftp/ftpwindow.rb +254 -0
  774. data/ext/ruby/qtruby/examples/network/ftp/images/cdtoparent.png +0 -0
  775. data/ext/ruby/qtruby/examples/network/ftp/images/dir.png +0 -0
  776. data/ext/ruby/qtruby/examples/network/ftp/images/file.png +0 -0
  777. data/ext/ruby/qtruby/examples/network/ftp/main.rb +32 -0
  778. data/ext/ruby/qtruby/examples/network/http/httpwindow.rb +187 -0
  779. data/ext/ruby/qtruby/examples/network/http/main.rb +32 -0
  780. data/ext/ruby/qtruby/examples/network/loopback/dialog.rb +163 -0
  781. data/ext/ruby/qtruby/examples/network/loopback/main.rb +32 -0
  782. data/ext/ruby/qtruby/examples/opengl/grabber/glwidget.rb +265 -0
  783. data/ext/ruby/qtruby/examples/opengl/grabber/main.rb +32 -0
  784. data/ext/ruby/qtruby/examples/opengl/grabber/mainwindow.rb +189 -0
  785. data/ext/ruby/qtruby/examples/opengl/hellogl/glwidget.rb +226 -0
  786. data/ext/ruby/qtruby/examples/opengl/hellogl/main.rb +32 -0
  787. data/ext/ruby/qtruby/examples/opengl/hellogl/window.rb +66 -0
  788. data/ext/ruby/qtruby/examples/opengl/textures/glwidget.rb +151 -0
  789. data/ext/ruby/qtruby/examples/opengl/textures/images/side1.png +0 -0
  790. data/ext/ruby/qtruby/examples/opengl/textures/images/side2.png +0 -0
  791. data/ext/ruby/qtruby/examples/opengl/textures/images/side3.png +0 -0
  792. data/ext/ruby/qtruby/examples/opengl/textures/images/side4.png +0 -0
  793. data/ext/ruby/qtruby/examples/opengl/textures/images/side5.png +0 -0
  794. data/ext/ruby/qtruby/examples/opengl/textures/images/side6.png +0 -0
  795. data/ext/ruby/qtruby/examples/opengl/textures/main.rb +32 -0
  796. data/ext/ruby/qtruby/examples/opengl/textures/window.rb +77 -0
  797. data/ext/ruby/qtruby/examples/painting/basicdrawing/images/brick.png +0 -0
  798. data/ext/ruby/qtruby/examples/painting/basicdrawing/images/qt-logo.png +0 -0
  799. data/ext/ruby/qtruby/examples/painting/basicdrawing/main.rb +32 -0
  800. data/ext/ruby/qtruby/examples/painting/basicdrawing/renderarea.rb +166 -0
  801. data/ext/ruby/qtruby/examples/painting/basicdrawing/window.rb +215 -0
  802. data/ext/ruby/qtruby/examples/painting/concentriccircles/circlewidget.rb +88 -0
  803. data/ext/ruby/qtruby/examples/painting/concentriccircles/main.rb +32 -0
  804. data/ext/ruby/qtruby/examples/painting/concentriccircles/window.rb +72 -0
  805. data/ext/ruby/qtruby/examples/painting/fontsampler/main.rb +32 -0
  806. data/ext/ruby/qtruby/examples/painting/fontsampler/mainwindow.rb +368 -0
  807. data/ext/ruby/qtruby/examples/painting/fontsampler/mainwindowbase.ui +136 -0
  808. data/ext/ruby/qtruby/examples/painting/fontsampler/makefile +8 -0
  809. data/ext/ruby/qtruby/examples/painting/fontsampler/previewdialog.rb +256 -0
  810. data/ext/ruby/qtruby/examples/painting/fontsampler/previewdialogbase.ui +224 -0
  811. data/ext/ruby/qtruby/examples/painting/fontsampler/previewlabel.rb +43 -0
  812. data/ext/ruby/qtruby/examples/painting/imagecomposition/imagecomposer.rb +152 -0
  813. data/ext/ruby/qtruby/examples/painting/imagecomposition/imagecomposition.qrc +6 -0
  814. data/ext/ruby/qtruby/examples/painting/imagecomposition/images/background.png +0 -0
  815. data/ext/ruby/qtruby/examples/painting/imagecomposition/images/blackrectangle.png +0 -0
  816. data/ext/ruby/qtruby/examples/painting/imagecomposition/images/butterfly.png +0 -0
  817. data/ext/ruby/qtruby/examples/painting/imagecomposition/images/checker.png +0 -0
  818. data/ext/ruby/qtruby/examples/painting/imagecomposition/main.rb +33 -0
  819. data/ext/ruby/qtruby/examples/painting/imagecomposition/makefile +2 -0
  820. data/ext/ruby/qtruby/examples/painting/painterpaths/main.rb +32 -0
  821. data/ext/ruby/qtruby/examples/painting/painterpaths/renderarea.rb +97 -0
  822. data/ext/ruby/qtruby/examples/painting/painterpaths/window.rb +247 -0
  823. data/ext/ruby/qtruby/examples/painting/svgviewer/files/bubbles.svg +212 -0
  824. data/ext/ruby/qtruby/examples/painting/svgviewer/files/cubic.svg +77 -0
  825. data/ext/ruby/qtruby/examples/painting/svgviewer/files/spheres.svg +79 -0
  826. data/ext/ruby/qtruby/examples/painting/svgviewer/main.rb +38 -0
  827. data/ext/ruby/qtruby/examples/painting/svgviewer/mainwindow.rb +99 -0
  828. data/ext/ruby/qtruby/examples/painting/svgviewer/makefile +2 -0
  829. data/ext/ruby/qtruby/examples/painting/svgviewer/svgview.rb +156 -0
  830. data/ext/ruby/qtruby/examples/painting/svgviewer/svgviewer.qrc +6 -0
  831. data/ext/ruby/qtruby/examples/painting/svgviewer/svgwindow.rb +87 -0
  832. data/ext/ruby/qtruby/examples/painting/transformations/main.rb +32 -0
  833. data/ext/ruby/qtruby/examples/painting/transformations/renderarea.rb +127 -0
  834. data/ext/ruby/qtruby/examples/painting/transformations/window.rb +153 -0
  835. data/ext/ruby/qtruby/examples/passivepopup/passivepopup.rb +38 -0
  836. data/ext/ruby/qtruby/examples/qdbus/chat/chat.rb +146 -0
  837. data/ext/ruby/qtruby/examples/qdbus/chat/chat_adaptor.rb +12 -0
  838. data/ext/ruby/qtruby/examples/qdbus/chat/chat_interface.rb +13 -0
  839. data/ext/ruby/qtruby/examples/qdbus/chat/chatmainwindow.ui +184 -0
  840. data/ext/ruby/qtruby/examples/qdbus/chat/chatsetnickname.ui +145 -0
  841. data/ext/ruby/qtruby/examples/qdbus/chat/makefile +8 -0
  842. data/ext/ruby/qtruby/examples/qdbus/complexpingpong/complexping.rb +92 -0
  843. data/ext/ruby/qtruby/examples/qdbus/complexpingpong/complexpong.rb +83 -0
  844. data/ext/ruby/qtruby/examples/qdbus/complexpingpong/ping-common.rb +1 -0
  845. data/ext/ruby/qtruby/examples/qdbus/listnames/listnames.rb +69 -0
  846. data/ext/ruby/qtruby/examples/qdbus/pingpong/ping-common.rb +1 -0
  847. data/ext/ruby/qtruby/examples/qdbus/pingpong/ping.rb +52 -0
  848. data/ext/ruby/qtruby/examples/qdbus/pingpong/pong.rb +55 -0
  849. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/car/car.rb +151 -0
  850. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/car/main.rb +50 -0
  851. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -0
  852. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -0
  853. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -0
  854. data/ext/ruby/qtruby/examples/qdbus/remotecontrolledcar/controller/makefile +2 -0
  855. data/ext/ruby/qtruby/examples/qtscribble/scribble.rb +270 -0
  856. data/ext/ruby/qtruby/examples/richtext/calendar/main.rb +33 -0
  857. data/ext/ruby/qtruby/examples/richtext/calendar/mainwindow.rb +173 -0
  858. data/ext/ruby/qtruby/examples/richtext/orderform/detailsdialog.rb +130 -0
  859. data/ext/ruby/qtruby/examples/richtext/orderform/main.rb +34 -0
  860. data/ext/ruby/qtruby/examples/richtext/orderform/mainwindow.rb +194 -0
  861. data/ext/ruby/qtruby/examples/richtext/syntaxhighlighter/examples/example +79 -0
  862. data/ext/ruby/qtruby/examples/richtext/syntaxhighlighter/highlighter.rb +90 -0
  863. data/ext/ruby/qtruby/examples/richtext/syntaxhighlighter/main.rb +34 -0
  864. data/ext/ruby/qtruby/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -0
  865. data/ext/ruby/qtruby/examples/ruboids/Manifest +26 -0
  866. data/ext/ruby/qtruby/examples/ruboids/README +53 -0
  867. data/ext/ruby/qtruby/examples/ruboids/TODO +29 -0
  868. data/ext/ruby/qtruby/examples/ruboids/boids.properties +33 -0
  869. data/ext/ruby/qtruby/examples/ruboids/generateManifest.rb +42 -0
  870. data/ext/ruby/qtruby/examples/ruboids/index.html +147 -0
  871. data/ext/ruby/qtruby/examples/ruboids/release.rb +152 -0
  872. data/ext/ruby/qtruby/examples/ruboids/ruboids/Boid.rb +141 -0
  873. data/ext/ruby/qtruby/examples/ruboids/ruboids/BoidView.rb +159 -0
  874. data/ext/ruby/qtruby/examples/ruboids/ruboids/Camera.rb +24 -0
  875. data/ext/ruby/qtruby/examples/ruboids/ruboids/CameraDialog.rb +218 -0
  876. data/ext/ruby/qtruby/examples/ruboids/ruboids/Canvas.rb +143 -0
  877. data/ext/ruby/qtruby/examples/ruboids/ruboids/Cloud.rb +61 -0
  878. data/ext/ruby/qtruby/examples/ruboids/ruboids/CloudView.rb +54 -0
  879. data/ext/ruby/qtruby/examples/ruboids/ruboids/Flock.rb +47 -0
  880. data/ext/ruby/qtruby/examples/ruboids/ruboids/Graphics.rb +278 -0
  881. data/ext/ruby/qtruby/examples/ruboids/ruboids/Params.rb +87 -0
  882. data/ext/ruby/qtruby/examples/ruboids/ruboids/Point.rb +153 -0
  883. data/ext/ruby/qtruby/examples/ruboids/ruboids/Thing.rb +34 -0
  884. data/ext/ruby/qtruby/examples/ruboids/ruboids/Triangle.rb +21 -0
  885. data/ext/ruby/qtruby/examples/ruboids/ruboids/View.rb +88 -0
  886. data/ext/ruby/qtruby/examples/ruboids/ruboids/World.rb +82 -0
  887. data/ext/ruby/qtruby/examples/ruboids/ruboids/WorldWindow.rb +52 -0
  888. data/ext/ruby/qtruby/examples/ruboids/ruboids/info.rb +12 -0
  889. data/ext/ruby/qtruby/examples/ruboids/ruboids/ruboids.rb +29 -0
  890. data/ext/ruby/qtruby/examples/textedit/textedit.rb +150 -0
  891. data/ext/ruby/qtruby/examples/tutorial/t1/t1.rb +10 -0
  892. data/ext/ruby/qtruby/examples/tutorial/t10/cannon.rb +72 -0
  893. data/ext/ruby/qtruby/examples/tutorial/t10/lcdrange.rb +45 -0
  894. data/ext/ruby/qtruby/examples/tutorial/t10/t10.rb +55 -0
  895. data/ext/ruby/qtruby/examples/tutorial/t11/cannon.rb +124 -0
  896. data/ext/ruby/qtruby/examples/tutorial/t11/lcdrange.rb +45 -0
  897. data/ext/ruby/qtruby/examples/tutorial/t11/t11.rb +65 -0
  898. data/ext/ruby/qtruby/examples/tutorial/t12/cannon.rb +158 -0
  899. data/ext/ruby/qtruby/examples/tutorial/t12/lcdrange.rb +59 -0
  900. data/ext/ruby/qtruby/examples/tutorial/t12/t12.rb +66 -0
  901. data/ext/ruby/qtruby/examples/tutorial/t13/cannon.rb +208 -0
  902. data/ext/ruby/qtruby/examples/tutorial/t13/gamebrd.rb +113 -0
  903. data/ext/ruby/qtruby/examples/tutorial/t13/lcdrange.rb +60 -0
  904. data/ext/ruby/qtruby/examples/tutorial/t13/t13.rb +11 -0
  905. data/ext/ruby/qtruby/examples/tutorial/t14/cannon.rb +263 -0
  906. data/ext/ruby/qtruby/examples/tutorial/t14/gamebrd.rb +123 -0
  907. data/ext/ruby/qtruby/examples/tutorial/t14/lcdrange.rb +63 -0
  908. data/ext/ruby/qtruby/examples/tutorial/t14/t14.rb +11 -0
  909. data/ext/ruby/qtruby/examples/tutorial/t2/t2.rb +16 -0
  910. data/ext/ruby/qtruby/examples/tutorial/t3/t3.rb +18 -0
  911. data/ext/ruby/qtruby/examples/tutorial/t4/t4.rb +25 -0
  912. data/ext/ruby/qtruby/examples/tutorial/t5/t5.rb +37 -0
  913. data/ext/ruby/qtruby/examples/tutorial/t6/t6.rb +52 -0
  914. data/ext/ruby/qtruby/examples/tutorial/t7/lcdrange.rb +32 -0
  915. data/ext/ruby/qtruby/examples/tutorial/t7/t7.rb +42 -0
  916. data/ext/ruby/qtruby/examples/tutorial/t8/cannon.rb +38 -0
  917. data/ext/ruby/qtruby/examples/tutorial/t8/lcdrange.rb +45 -0
  918. data/ext/ruby/qtruby/examples/tutorial/t8/t8.rb +43 -0
  919. data/ext/ruby/qtruby/examples/tutorial/t9/cannon.rb +45 -0
  920. data/ext/ruby/qtruby/examples/tutorial/t9/lcdrange.rb +46 -0
  921. data/ext/ruby/qtruby/examples/tutorial/t9/t9.rb +43 -0
  922. data/ext/ruby/qtruby/examples/widgets/analogclock/analogclock.rb +94 -0
  923. data/ext/ruby/qtruby/examples/widgets/analogclock/main.rb +9 -0
  924. data/ext/ruby/qtruby/examples/widgets/calculator/button.rb +45 -0
  925. data/ext/ruby/qtruby/examples/widgets/calculator/calculator.rb +382 -0
  926. data/ext/ruby/qtruby/examples/widgets/calculator/main.rb +32 -0
  927. data/ext/ruby/qtruby/examples/widgets/charactermap/characterwidget.rb +110 -0
  928. data/ext/ruby/qtruby/examples/widgets/charactermap/main.rb +32 -0
  929. data/ext/ruby/qtruby/examples/widgets/charactermap/mainwindow.rb +118 -0
  930. data/ext/ruby/qtruby/examples/widgets/digitalclock/digitalclock.rb +30 -0
  931. data/ext/ruby/qtruby/examples/widgets/digitalclock/main.rb +9 -0
  932. data/ext/ruby/qtruby/examples/widgets/groupbox/main.rb +32 -0
  933. data/ext/ruby/qtruby/examples/widgets/groupbox/window.rb +134 -0
  934. data/ext/ruby/qtruby/examples/widgets/icons/iconpreviewarea.rb +111 -0
  935. data/ext/ruby/qtruby/examples/widgets/icons/iconsizespinbox.rb +39 -0
  936. data/ext/ruby/qtruby/examples/widgets/icons/imagedelegate.rb +73 -0
  937. data/ext/ruby/qtruby/examples/widgets/icons/images/designer.png +0 -0
  938. data/ext/ruby/qtruby/examples/widgets/icons/images/find_disabled.png +0 -0
  939. data/ext/ruby/qtruby/examples/widgets/icons/images/find_normal.png +0 -0
  940. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_off_128x128.png +0 -0
  941. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_off_16x16.png +0 -0
  942. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_off_32x32.png +0 -0
  943. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_off_64x64.png +0 -0
  944. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_on_128x128.png +0 -0
  945. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_on_16x16.png +0 -0
  946. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_on_32x32.png +0 -0
  947. data/ext/ruby/qtruby/examples/widgets/icons/images/monkey_on_64x64.png +0 -0
  948. data/ext/ruby/qtruby/examples/widgets/icons/images/qtopia_16x16.png +0 -0
  949. data/ext/ruby/qtruby/examples/widgets/icons/images/qtopia_32x32.png +0 -0
  950. data/ext/ruby/qtruby/examples/widgets/icons/images/qtopia_48x48.png +0 -0
  951. data/ext/ruby/qtruby/examples/widgets/icons/main.rb +32 -0
  952. data/ext/ruby/qtruby/examples/widgets/icons/mainwindow.rb +351 -0
  953. data/ext/ruby/qtruby/examples/widgets/imageviewer/imageviewer.rb +219 -0
  954. data/ext/ruby/qtruby/examples/widgets/imageviewer/main.rb +32 -0
  955. data/ext/ruby/qtruby/examples/widgets/lineedits/main.rb +32 -0
  956. data/ext/ruby/qtruby/examples/widgets/lineedits/window.rb +199 -0
  957. data/ext/ruby/qtruby/examples/widgets/movie/images/open.png +0 -0
  958. data/ext/ruby/qtruby/examples/widgets/movie/images/pause.png +0 -0
  959. data/ext/ruby/qtruby/examples/widgets/movie/images/play.png +0 -0
  960. data/ext/ruby/qtruby/examples/widgets/movie/images/quit.png +0 -0
  961. data/ext/ruby/qtruby/examples/widgets/movie/images/stop.png +0 -0
  962. data/ext/ruby/qtruby/examples/widgets/movie/main.rb +32 -0
  963. data/ext/ruby/qtruby/examples/widgets/movie/movieplayer.rb +201 -0
  964. data/ext/ruby/qtruby/examples/widgets/movie/movies/fire.mng +0 -0
  965. data/ext/ruby/qtruby/examples/widgets/screenshot/main.rb +32 -0
  966. data/ext/ruby/qtruby/examples/widgets/screenshot/screenshot.rb +155 -0
  967. data/ext/ruby/qtruby/examples/widgets/scribble/main.rb +32 -0
  968. data/ext/ruby/qtruby/examples/widgets/scribble/mainwindow.rb +202 -0
  969. data/ext/ruby/qtruby/examples/widgets/scribble/scribblearea.rb +154 -0
  970. data/ext/ruby/qtruby/examples/widgets/sliders/main.rb +32 -0
  971. data/ext/ruby/qtruby/examples/widgets/sliders/slidersgroup.rb +97 -0
  972. data/ext/ruby/qtruby/examples/widgets/sliders/window.rb +124 -0
  973. data/ext/ruby/qtruby/examples/widgets/spinboxes/main.rb +32 -0
  974. data/ext/ruby/qtruby/examples/widgets/spinboxes/window.rb +213 -0
  975. data/ext/ruby/qtruby/examples/widgets/tetrix/main.rb +33 -0
  976. data/ext/ruby/qtruby/examples/widgets/tetrix/tetrixboard.rb +346 -0
  977. data/ext/ruby/qtruby/examples/widgets/tetrix/tetrixpiece.rb +135 -0
  978. data/ext/ruby/qtruby/examples/widgets/tetrix/tetrixwindow.rb +88 -0
  979. data/ext/ruby/qtruby/examples/widgets/tooltips/images/circle.png +0 -0
  980. data/ext/ruby/qtruby/examples/widgets/tooltips/images/square.png +0 -0
  981. data/ext/ruby/qtruby/examples/widgets/tooltips/images/triangle.png +0 -0
  982. data/ext/ruby/qtruby/examples/widgets/tooltips/main.rb +32 -0
  983. data/ext/ruby/qtruby/examples/widgets/tooltips/shapeitem.rb +31 -0
  984. data/ext/ruby/qtruby/examples/widgets/tooltips/sortingbox.rb +222 -0
  985. data/ext/ruby/qtruby/examples/widgets/wiggly/dialog.rb +48 -0
  986. data/ext/ruby/qtruby/examples/widgets/wiggly/main.rb +9 -0
  987. data/ext/ruby/qtruby/examples/widgets/wiggly/wigglywidget.rb +76 -0
  988. data/ext/ruby/qtruby/examples/widgets/windowflags/controllerwindow.rb +195 -0
  989. data/ext/ruby/qtruby/examples/widgets/windowflags/main.rb +32 -0
  990. data/ext/ruby/qtruby/examples/widgets/windowflags/previewwindow.rb +103 -0
  991. data/ext/ruby/qtruby/examples/xml/dombookmarks/frank.xbel +230 -0
  992. data/ext/ruby/qtruby/examples/xml/dombookmarks/jennifer.xbel +93 -0
  993. data/ext/ruby/qtruby/examples/xml/dombookmarks/main.rb +34 -0
  994. data/ext/ruby/qtruby/examples/xml/dombookmarks/mainwindow.rb +129 -0
  995. data/ext/ruby/qtruby/examples/xml/dombookmarks/xbeltree.rb +172 -0
  996. data/ext/ruby/qtruby/examples/xml/saxbookmarks/frank.xbel +230 -0
  997. data/ext/ruby/qtruby/examples/xml/saxbookmarks/jennifer.xbel +93 -0
  998. data/ext/ruby/qtruby/examples/xml/saxbookmarks/main.rb +34 -0
  999. data/ext/ruby/qtruby/examples/xml/saxbookmarks/mainwindow.rb +144 -0
  1000. data/ext/ruby/qtruby/examples/xml/saxbookmarks/xbelgenerator.rb +95 -0
  1001. data/ext/ruby/qtruby/examples/xml/saxbookmarks/xbelhandler.rb +122 -0
  1002. data/ext/ruby/qtruby/rails_support/CMakeLists.txt +1 -0
  1003. data/ext/ruby/qtruby/rails_support/active_item_model.rb +234 -0
  1004. data/ext/ruby/qtruby/rails_support/active_table_model.rb +122 -0
  1005. data/ext/ruby/qtruby/src/CMakeLists.txt +103 -0
  1006. data/ext/ruby/qtruby/src/Qt.cpp +1279 -0
  1007. data/ext/ruby/qtruby/src/extconf.rb +11 -0
  1008. data/ext/ruby/qtruby/src/handlers.cpp +2622 -0
  1009. data/ext/ruby/qtruby/src/lib/CMakeLists.txt +16 -0
  1010. data/ext/ruby/qtruby/src/lib/Qt.rb +1 -0
  1011. data/ext/ruby/qtruby/src/lib/Qt/CMakeLists.txt +9 -0
  1012. data/ext/ruby/qtruby/src/lib/Qt/qtruby4.rb +3177 -0
  1013. data/ext/ruby/qtruby/src/lib/Qt3.rb +6 -0
  1014. data/ext/ruby/qtruby/src/lib/Qt4.rb +6 -0
  1015. data/ext/ruby/qtruby/src/marshall.h +66 -0
  1016. data/ext/ruby/qtruby/src/marshall_basetypes.h +208 -0
  1017. data/ext/ruby/qtruby/src/marshall_complex.h +175 -0
  1018. data/ext/ruby/qtruby/src/marshall_macros.h +647 -0
  1019. data/ext/ruby/qtruby/src/marshall_primitives.h +290 -0
  1020. data/ext/ruby/qtruby/src/marshall_types.cpp +815 -0
  1021. data/ext/ruby/qtruby/src/marshall_types.h +240 -0
  1022. data/ext/ruby/qtruby/src/qtruby.cpp +2483 -0
  1023. data/ext/ruby/qtruby/src/qtruby.h +185 -0
  1024. data/ext/ruby/qtruby/src/smokeruby.h +164 -0
  1025. data/ext/ruby/qtruby/test/opoverloading.rb +46 -0
  1026. data/ext/ruby/qtruby/test/unittests.rb +151 -0
  1027. data/ext/ruby/qtruby/tools/CMakeLists.txt +2 -0
  1028. data/ext/ruby/qtruby/tools/rbrcc/CMakeLists.txt +6 -0
  1029. data/ext/ruby/qtruby/tools/rbrcc/Messages.sh +7 -0
  1030. data/ext/ruby/qtruby/tools/rbrcc/main.cpp +173 -0
  1031. data/ext/ruby/qtruby/tools/rbrcc/rbrcc.pro +14 -0
  1032. data/ext/ruby/qtruby/tools/rbrcc/rcc.cpp +648 -0
  1033. data/ext/ruby/qtruby/tools/rbrcc/rcc.h +165 -0
  1034. data/ext/ruby/qtruby/tools/rbuic/CMakeLists.txt +35 -0
  1035. data/ext/ruby/qtruby/tools/rbuic/LICENSE.GPL +280 -0
  1036. data/ext/ruby/qtruby/tools/rbuic/Messages.sh +7 -0
  1037. data/ext/ruby/qtruby/tools/rbuic/TODO +4 -0
  1038. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.cpp +106 -0
  1039. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.h +95 -0
  1040. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.cpp +102 -0
  1041. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.h +85 -0
  1042. data/ext/ruby/qtruby/tools/rbuic/driver.cpp +384 -0
  1043. data/ext/ruby/qtruby/tools/rbuic/driver.h +141 -0
  1044. data/ext/ruby/qtruby/tools/rbuic/globaldefs.h +60 -0
  1045. data/ext/ruby/qtruby/tools/rbuic/main.cpp +201 -0
  1046. data/ext/ruby/qtruby/tools/rbuic/option.h +107 -0
  1047. data/ext/ruby/qtruby/tools/rbuic/rbuic.pri +23 -0
  1048. data/ext/ruby/qtruby/tools/rbuic/rbuic4.pro +43 -0
  1049. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.cpp +150 -0
  1050. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.h +83 -0
  1051. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.cpp +217 -0
  1052. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.h +85 -0
  1053. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.cpp +185 -0
  1054. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.h +86 -0
  1055. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.cpp +88 -0
  1056. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.h +83 -0
  1057. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.cpp +126 -0
  1058. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.h +87 -0
  1059. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.cpp +2478 -0
  1060. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.h +314 -0
  1061. data/ext/ruby/qtruby/tools/rbuic/ruby/ruby.pri +18 -0
  1062. data/ext/ruby/qtruby/tools/rbuic/treewalker.cpp +318 -0
  1063. data/ext/ruby/qtruby/tools/rbuic/treewalker.h +139 -0
  1064. data/ext/ruby/qtruby/tools/rbuic/ui4.cpp +7623 -0
  1065. data/ext/ruby/qtruby/tools/rbuic/ui4.h +3180 -0
  1066. data/ext/ruby/qtruby/tools/rbuic/uic.cpp +438 -0
  1067. data/ext/ruby/qtruby/tools/rbuic/uic.h +154 -0
  1068. data/ext/ruby/qtruby/tools/rbuic/utils.h +125 -0
  1069. data/ext/ruby/qtruby/tools/rbuic/validator.cpp +100 -0
  1070. data/ext/ruby/qtruby/tools/rbuic/validator.h +80 -0
  1071. data/ext/ruby/qtscript/CMakeLists.txt +19 -0
  1072. data/ext/ruby/qtscript/qtscript.cpp +82 -0
  1073. data/ext/ruby/qtscript/qtscript.rb +40 -0
  1074. data/ext/ruby/qtscript/qtscripthandlers.cpp +36 -0
  1075. data/ext/ruby/qtscript/smokedata.cpp +1403 -0
  1076. data/ext/ruby/qttest/CMakeLists.txt +18 -0
  1077. data/ext/ruby/qttest/ChangeLog +9 -0
  1078. data/ext/ruby/qttest/examples/myfirsttest.rb +30 -0
  1079. data/ext/ruby/qttest/qttest.cpp +82 -0
  1080. data/ext/ruby/qttest/qttest.rb +166 -0
  1081. data/ext/ruby/qttest/qttesthandlers.cpp +35 -0
  1082. data/ext/ruby/qtuitools/CMakeLists.txt +16 -0
  1083. data/ext/ruby/qtuitools/qtuitools.cpp +82 -0
  1084. data/ext/ruby/qtuitools/qtuitools.rb +17 -0
  1085. data/ext/ruby/qtuitools/qtuitoolshandlers.cpp +31 -0
  1086. data/ext/ruby/qtwebkit/CMakeLists.txt +17 -0
  1087. data/ext/ruby/qtwebkit/qtwebkit.cpp +66 -0
  1088. data/ext/ruby/qtwebkit/qtwebkit.rb +17 -0
  1089. data/ext/ruby/qtwebkit/qtwebkithandlers.cpp +39 -0
  1090. data/ext/smoke/CMakeLists.txt +35 -0
  1091. data/ext/smoke/deptool/CMakeLists.txt +7 -0
  1092. data/ext/smoke/deptool/main.cpp +128 -0
  1093. data/ext/smoke/qt_smoke.h +16 -0
  1094. data/ext/smoke/qtcore/CMakeLists.txt +88 -0
  1095. data/ext/smoke/qtcore/QtGuess.txt +181 -0
  1096. data/ext/smoke/qtcore/config.xml.cmake +10 -0
  1097. data/ext/smoke/qtcore/qt-config.xml.cmake +21 -0
  1098. data/ext/smoke/qtcore/qtcore_includes.h +1 -0
  1099. data/ext/smoke/qtcore/smokeconfig.xml +189 -0
  1100. data/ext/smoke/qtcore/tests/CMakeLists.txt +13 -0
  1101. data/ext/smoke/qtcore/tests/test.cpp +846 -0
  1102. data/ext/smoke/qtcore_smoke.h +16 -0
  1103. data/ext/smoke/qtdbus/CMakeLists.txt +38 -0
  1104. data/ext/smoke/qtdbus/config.xml.cmake +11 -0
  1105. data/ext/smoke/qtdbus/qtdbus_includes.h +2 -0
  1106. data/ext/smoke/qtdbus/smokeconfig.xml +63 -0
  1107. data/ext/smoke/qtdbus_smoke.h +16 -0
  1108. data/ext/smoke/qtgui/CMakeLists.txt +76 -0
  1109. data/ext/smoke/qtgui/config.xml.cmake +11 -0
  1110. data/ext/smoke/qtgui/qtgui_includes.h +7 -0
  1111. data/ext/smoke/qtgui/smokeconfig.xml +490 -0
  1112. data/ext/smoke/qtgui_smoke.h +16 -0
  1113. data/ext/smoke/qtmultimedia/CMakeLists.txt +42 -0
  1114. data/ext/smoke/qtmultimedia/config.xml.cmake +12 -0
  1115. data/ext/smoke/qtmultimedia/qtmultimedia_includes.h +3 -0
  1116. data/ext/smoke/qtmultimedia/smokeconfig.xml +50 -0
  1117. data/ext/smoke/qtmultimedia_smoke.h +16 -0
  1118. data/ext/smoke/qtnetwork/CMakeLists.txt +38 -0
  1119. data/ext/smoke/qtnetwork/config.xml.cmake +11 -0
  1120. data/ext/smoke/qtnetwork/qtnetwork_includes.h +2 -0
  1121. data/ext/smoke/qtnetwork/smokeconfig.xml +76 -0
  1122. data/ext/smoke/qtnetwork_smoke.h +16 -0
  1123. data/ext/smoke/qtopengl/CMakeLists.txt +43 -0
  1124. data/ext/smoke/qtopengl/config.xml.cmake +12 -0
  1125. data/ext/smoke/qtopengl/qtopengl_includes.h +3 -0
  1126. data/ext/smoke/qtopengl/smokeconfig.xml +56 -0
  1127. data/ext/smoke/qtopengl_smoke.h +16 -0
  1128. data/ext/smoke/qtscript/CMakeLists.txt +31 -0
  1129. data/ext/smoke/qtscript/config.xml.cmake +11 -0
  1130. data/ext/smoke/qtscript/qtscript_includes.h +14 -0
  1131. data/ext/smoke/qtscript/smokeconfig.xml +39 -0
  1132. data/ext/smoke/qtscript_smoke.h +16 -0
  1133. data/ext/smoke/qtsql/CMakeLists.txt +41 -0
  1134. data/ext/smoke/qtsql/config.xml.cmake +11 -0
  1135. data/ext/smoke/qtsql/qtsql_includes.h +2 -0
  1136. data/ext/smoke/qtsql/smokeconfig.xml +56 -0
  1137. data/ext/smoke/qtsql_smoke.h +16 -0
  1138. data/ext/smoke/qtsvg/CMakeLists.txt +43 -0
  1139. data/ext/smoke/qtsvg/config.xml.cmake +12 -0
  1140. data/ext/smoke/qtsvg/qtsvg_includes.h +3 -0
  1141. data/ext/smoke/qtsvg/smokeconfig.xml +45 -0
  1142. data/ext/smoke/qtsvg_smoke.h +16 -0
  1143. data/ext/smoke/qttest/CMakeLists.txt +35 -0
  1144. data/ext/smoke/qttest/config.xml.cmake +12 -0
  1145. data/ext/smoke/qttest/qttest_includes.h +14 -0
  1146. data/ext/smoke/qttest/smokeconfig.xml +36 -0
  1147. data/ext/smoke/qttest_smoke.h +16 -0
  1148. data/ext/smoke/qtuitools/CMakeLists.txt +30 -0
  1149. data/ext/smoke/qtuitools/config.xml.cmake +12 -0
  1150. data/ext/smoke/qtuitools/qtuitools_includes.h +1 -0
  1151. data/ext/smoke/qtuitools/smokeconfig.xml +20 -0
  1152. data/ext/smoke/qtuitools_smoke.h +16 -0
  1153. data/ext/smoke/qtwebkit/CMakeLists.txt +36 -0
  1154. data/ext/smoke/qtwebkit/config.xml.cmake +11 -0
  1155. data/ext/smoke/qtwebkit/qtwebkit_includes.h +1 -0
  1156. data/ext/smoke/qtwebkit/smokeconfig.xml +45 -0
  1157. data/ext/smoke/qtwebkit_smoke.h +16 -0
  1158. data/ext/smoke/qtxml/CMakeLists.txt +41 -0
  1159. data/ext/smoke/qtxml/config.xml.cmake +11 -0
  1160. data/ext/smoke/qtxml/qtxml_includes.h +2 -0
  1161. data/ext/smoke/qtxml/smokeconfig.xml +70 -0
  1162. data/ext/smoke/qtxml_smoke.h +16 -0
  1163. data/ext/smoke/qtxmlpatterns/CMakeLists.txt +42 -0
  1164. data/ext/smoke/qtxmlpatterns/config.xml.cmake +12 -0
  1165. data/ext/smoke/qtxmlpatterns/qtxmlpatterns_includes.h +3 -0
  1166. data/ext/smoke/qtxmlpatterns/smokeconfig.xml +80 -0
  1167. data/ext/smoke/qtxmlpatterns_smoke.h +16 -0
  1168. data/ext/smoke/smoke.h +557 -0
  1169. data/ext/smoke/smokeapi/CMakeLists.txt +9 -0
  1170. data/ext/smoke/smokeapi/main.cpp +309 -0
  1171. data/ext/smoke/smokebase/CMakeLists.txt +11 -0
  1172. data/ext/smoke/smokebase/smokebase.cpp +6 -0
  1173. data/ext/smoke/solid_smoke.h +16 -0
  1174. data/extconf.rb +231 -0
  1175. data/lib/1.8/libqtruby4shared.dll +0 -0
  1176. data/lib/1.8/libsmokebase.dll +0 -0
  1177. data/lib/1.8/libsmokeqtcore.dll +0 -0
  1178. data/lib/1.8/libsmokeqtgui.dll +0 -0
  1179. data/lib/1.8/libsmokeqtmultimedia.dll +0 -0
  1180. data/lib/1.8/libsmokeqtnetwork.dll +0 -0
  1181. data/lib/1.8/libsmokeqtopengl.dll +0 -0
  1182. data/lib/1.8/libsmokeqtscript.dll +0 -0
  1183. data/lib/1.8/libsmokeqtsql.dll +0 -0
  1184. data/lib/1.8/libsmokeqtsvg.dll +0 -0
  1185. data/lib/1.8/libsmokeqttest.dll +0 -0
  1186. data/lib/1.8/libsmokeqtuitools.dll +0 -0
  1187. data/lib/1.8/libsmokeqtwebkit.dll +0 -0
  1188. data/lib/1.8/libsmokeqtxml.dll +0 -0
  1189. data/lib/1.8/libsmokeqtxmlpatterns.dll +0 -0
  1190. data/lib/1.8/qtruby4.so +0 -0
  1191. data/lib/1.8/qtscript.so +0 -0
  1192. data/lib/1.8/qttest.so +0 -0
  1193. data/lib/1.8/qtuitools.so +0 -0
  1194. data/lib/1.8/qtwebkit.so +0 -0
  1195. data/lib/1.9/libqtruby4shared.dll +0 -0
  1196. data/lib/1.9/libsmokebase.dll +0 -0
  1197. data/lib/1.9/libsmokeqtcore.dll +0 -0
  1198. data/lib/1.9/libsmokeqtgui.dll +0 -0
  1199. data/lib/1.9/libsmokeqtmultimedia.dll +0 -0
  1200. data/lib/1.9/libsmokeqtnetwork.dll +0 -0
  1201. data/lib/1.9/libsmokeqtopengl.dll +0 -0
  1202. data/lib/1.9/libsmokeqtscript.dll +0 -0
  1203. data/lib/1.9/libsmokeqtsql.dll +0 -0
  1204. data/lib/1.9/libsmokeqtsvg.dll +0 -0
  1205. data/lib/1.9/libsmokeqttest.dll +0 -0
  1206. data/lib/1.9/libsmokeqtuitools.dll +0 -0
  1207. data/lib/1.9/libsmokeqtwebkit.dll +0 -0
  1208. data/lib/1.9/libsmokeqtxml.dll +0 -0
  1209. data/lib/1.9/libsmokeqtxmlpatterns.dll +0 -0
  1210. data/lib/1.9/qtruby4.so +0 -0
  1211. data/lib/1.9/qtscript.so +0 -0
  1212. data/lib/1.9/qttest.so +0 -0
  1213. data/lib/1.9/qtuitools.so +0 -0
  1214. data/lib/1.9/qtwebkit.so +0 -0
  1215. data/lib/Qt.rb +1 -0
  1216. data/lib/Qt/qtruby4.rb +3177 -0
  1217. data/lib/Qt4.rb +20 -0
  1218. data/lib/qtbindings_version.rb +2 -0
  1219. data/lib/qtscript/qtscript.rb +40 -0
  1220. data/lib/qttest/qttest.rb +166 -0
  1221. data/lib/qtuitools/qtuitools.rb +17 -0
  1222. data/lib/qtwebkit/qtwebkit.rb +17 -0
  1223. data/qtbindings.gemspec +18 -0
  1224. data/qtbindingsnative.gemspec +18 -0
  1225. metadata +1297 -0
@@ -0,0 +1,41 @@
1
+ /* This file is part of KDevelop
2
+ Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
3
+
4
+ This library is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU Library General Public
6
+ License version 2 as published by the Free Software Foundation.
7
+
8
+ This library is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ Library General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Library General Public License
14
+ along with this library; see the file COPYING.LIB. If not, write to
15
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
+ Boston, MA 02110-1301, USA.
17
+ */
18
+
19
+ #ifndef MEMORYPOOL_H
20
+ #define MEMORYPOOL_H
21
+
22
+ #include "rxx_allocator.h"
23
+ #include <cstring>
24
+
25
+ /**Memory pool for chars.*/
26
+ class pool
27
+ {
28
+ rxx_allocator<char> __alloc;
29
+
30
+ public:
31
+ /**Allocates the @p size bytes in the pool.*/
32
+ inline void *allocate(std::size_t __size);
33
+ };
34
+
35
+ inline void *pool::allocate(std::size_t __size)
36
+ {
37
+ return __alloc.allocate(__size);
38
+ }
39
+
40
+ #endif // MEMORYPOOL_H
41
+
@@ -0,0 +1,190 @@
1
+ /* This file is part of KDevelop
2
+ Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
3
+
4
+ This library is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU Library General Public
6
+ License version 2 as published by the Free Software Foundation.
7
+
8
+ This library is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ Library General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Library General Public License
14
+ along with this library; see the file COPYING.LIB. If not, write to
15
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
+ Boston, MA 02110-1301, USA.
17
+ */
18
+
19
+ //krazy:excludeall=cpp
20
+
21
+ #include "name_compiler.h"
22
+ #include "type_compiler.h"
23
+ #include "lexer.h"
24
+ #include "symbol.h"
25
+ #include "parsesession.h"
26
+ #include "tokens.h"
27
+
28
+ #include <QtCore/qdebug.h>
29
+
30
+ ///@todo this is very expensive
31
+ QString decode(ParseSession* session, AST* ast, bool without_spaces = false)
32
+ {
33
+ QString ret;
34
+ if( without_spaces ) {
35
+ //Decode operator-names without spaces for now, since we rely on it in other places.
36
+ ///@todo change this, here and in all the places that rely on it. Operators should then by written like "operator [ ]"(space between each token)
37
+ for( size_t a = ast->start_token; a < ast->end_token; a++ ) {
38
+ ret += session->token_stream->token(a).symbolString();
39
+ }
40
+ } else {
41
+ for( size_t a = ast->start_token; a < ast->end_token; a++ ) {
42
+ ret += session->token_stream->token(a).symbolString() + ' ';
43
+ }
44
+ }
45
+ return ret;
46
+ }
47
+
48
+ /*uint parseConstVolatile(ParseSession* session, const ListNode<std::size_t> *cv)
49
+ {
50
+ uint ret = AbstractType::NoModifiers;
51
+
52
+ if (cv) {
53
+ const ListNode<std::size_t> *it = cv->toFront();
54
+ const ListNode<std::size_t> *end = it;
55
+ do {
56
+ int kind = session->token_stream->kind(it->element);
57
+ if (kind == Token_const)
58
+ ret |= AbstractType::ConstModifier;
59
+ else if (kind == Token_volatile)
60
+ ret |= AbstractType::VolatileModifier;
61
+
62
+ it = it->next;
63
+ } while (it != end);
64
+ }
65
+
66
+ return ret;
67
+ }*/
68
+
69
+ /*IndexedTypeIdentifier typeIdentifierFromTemplateArgument(ParseSession* session, TemplateArgumentAST *node)
70
+ {
71
+ IndexedTypeIdentifier id;
72
+ if(node->expression) {
73
+ id = IndexedTypeIdentifier(decode(session, node), true);
74
+ }else if(node->type_id) {
75
+ //Parse the pointer operators
76
+ TypeCompiler tc(session);
77
+ tc.run(node->type_id->type_specifier);
78
+ id = IndexedTypeIdentifier(tc.identifier());
79
+ //node->type_id->type_specifier->cv
80
+
81
+ if(node->type_id->type_specifier)
82
+ id.setIsConstant(parseConstVolatile(session, node->type_id->type_specifier->cv) & AbstractType::ConstModifier);
83
+
84
+ if(node->type_id->declarator && node->type_id->declarator->ptr_ops)
85
+ {
86
+ const ListNode<PtrOperatorAST*> *it = node->type_id->declarator->ptr_ops->toFront();
87
+ const ListNode<PtrOperatorAST*> *end = it; ///@todo check ordering, eventually walk the list in reversed order
88
+ do
89
+ {
90
+ if(it->element && it->element->op) { ///@todo What about ptr-to-member?
91
+ static IndexedString ref('&');
92
+ if( session->token_stream->token(it->element->op).symbol() == ref) {
93
+ //We're handling a 'reference'
94
+ id.setIsReference(true);
95
+ } else {
96
+ //We're handling a real pointer
97
+ id.setPointerDepth(id.pointerDepth()+1);
98
+
99
+ if(it->element->cv) {
100
+ id.setIsConstPointer(id.pointerDepth()-1, parseConstVolatile(session, it->element->cv) & AbstractType::ConstModifier);
101
+ }
102
+ }
103
+ }
104
+ it = it->next;
105
+ }
106
+ while (it != end);
107
+ }
108
+ }
109
+ return id;
110
+ }*/
111
+
112
+ NameCompiler::NameCompiler(ParseSession* session)
113
+ : m_session(session)
114
+ {
115
+ }
116
+
117
+ void NameCompiler::internal_run(AST *node)
118
+ {
119
+ m_name.clear();
120
+ visit(node);
121
+ }
122
+
123
+ void NameCompiler::visitUnqualifiedName(UnqualifiedNameAST *node)
124
+ {
125
+ IndexedString tmp_name;
126
+
127
+ if (node->id)
128
+ tmp_name = m_session->token_stream->token(node->id).symbol();
129
+
130
+ if (node->tilde)
131
+ tmp_name = IndexedString('~' + tmp_name.byteArray());
132
+
133
+ if (OperatorFunctionIdAST *op_id = node->operator_id)
134
+ {
135
+ #if defined(__GNUC__)
136
+ #warning "NameCompiler::visitUnqualifiedName() -- implement me"
137
+ #endif
138
+ static QString operatorString("operator");
139
+ QString tmp = operatorString;
140
+
141
+ if (op_id->op && op_id->op->op)
142
+ tmp += decode(m_session, op_id->op, true);
143
+ else
144
+ tmp += QLatin1String("{...cast...}");
145
+
146
+ tmp_name = IndexedString(tmp);
147
+ m_typeSpecifier = op_id->type_specifier;
148
+ }
149
+
150
+ m_currentIdentifier = tmp_name.str();
151
+ m_name.push_back(m_currentIdentifier);
152
+ if (node->template_arguments)
153
+ {
154
+ visitNodes(this, node->template_arguments);
155
+ }/*else if(node->end_token == node->start_token + 3 && node->id == node->start_token && m_session->token_stream->token(node->id+1).symbol() == KDevelop::IndexedString('<')) {
156
+ ///@todo Represent this nicer in the AST
157
+ ///It's probably a type-specifier with instantiation of the default-parameter, like "Bla<>".
158
+ m_currentIdentifier.appendTemplateIdentifier( IndexedTypeIdentifier() );
159
+ }*/
160
+ }
161
+
162
+ TypeSpecifierAST* NameCompiler::lastTypeSpecifier() const {
163
+ return m_typeSpecifier;
164
+ }
165
+
166
+ void NameCompiler::visitTemplateArgument(TemplateArgumentAST *node)
167
+ {
168
+ TypeCompiler tc(m_session);
169
+ tc.run(node->type_id->type_specifier);
170
+ if (tc.isIntegral())
171
+ m_templateArgs << tc.qualifiedName().join(" ");
172
+ else
173
+ m_templateArgs << tc.qualifiedName().join("::");
174
+ // m_currentIdentifier.appendTemplateIdentifier( typeIdentifierFromTemplateArgument(m_session, node) );
175
+ }
176
+
177
+ /*const QualifiedIdentifier& NameCompiler::identifier() const
178
+ {
179
+ return *_M_name;
180
+ }*/
181
+
182
+ void NameCompiler::run(NameAST *node/*, QualifiedIdentifier* target*/)
183
+ {
184
+ // if(target)
185
+ // _M_name = target;
186
+ // else
187
+ // _M_name = &m_localName;
188
+
189
+ m_typeSpecifier = 0; internal_run(node); /*if(node && node->global) _M_name->setExplicitlyGlobal( node->global );*/
190
+ }
@@ -0,0 +1,77 @@
1
+ /* This file is part of KDevelop
2
+ Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
3
+
4
+ This library is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU Library General Public
6
+ License version 2 as published by the Free Software Foundation.
7
+
8
+ This library is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ Library General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Library General Public License
14
+ along with this library; see the file COPYING.LIB. If not, write to
15
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16
+ Boston, MA 02110-1301, USA.
17
+ */
18
+
19
+ #ifndef NAME_COMPILER_H
20
+ #define NAME_COMPILER_H
21
+
22
+ #include <QString>
23
+ #include <QStringList>
24
+
25
+ #include "cppparser_export.h"
26
+ #include "default_visitor.h"
27
+ // #include <language/duchain/identifier.h>
28
+ // #include <language/duchain/declaration.h>
29
+
30
+ class ParseSession;
31
+ class OperatorAST;
32
+
33
+ class CPPPARSER_EXPORT NameCompiler: protected DefaultVisitor
34
+ {
35
+ public:
36
+ NameCompiler(ParseSession* session);
37
+
38
+ ///@param target If this is nonzero, the identifier will be written to that place without any copying.
39
+ void run(NameAST *node/*, KDevelop::QualifiedIdentifier* target = 0*/);
40
+ void run(UnqualifiedNameAST *node) { m_typeSpecifier = 0; internal_run(node); }
41
+
42
+ QString name() const { return m_name.join("::"); }
43
+ const QStringList& qualifiedName() const { return m_name; }
44
+ const QStringList& templateArgs() const { return m_templateArgs; }
45
+
46
+ // const KDevelop::QualifiedIdentifier& identifier() const;
47
+
48
+ /**
49
+ * When the name contains one type-specifier, this should contain that specifier after the run.
50
+ * Especially this is the type-specifier of a conversion-operator like "operator int()"
51
+ * */
52
+ TypeSpecifierAST* lastTypeSpecifier() const;
53
+
54
+ protected:
55
+ virtual void visitUnqualifiedName(UnqualifiedNameAST *node);
56
+ virtual void visitTemplateArgument(TemplateArgumentAST *node);
57
+
58
+ void internal_run(AST *node);
59
+
60
+ private:
61
+ ParseSession* m_session;
62
+ TypeSpecifierAST* m_typeSpecifier;
63
+ QStringList m_name;
64
+ QStringList m_templateArgs;
65
+ QString m_currentIdentifier;
66
+ // KDevelop::QualifiedIdentifier m_base;
67
+ // KDevelop::Identifier m_currentIdentifier;
68
+ // KDevelop::QualifiedIdentifier* _M_name;
69
+ // KDevelop::QualifiedIdentifier m_localName;
70
+ };
71
+
72
+ //Extracts a type-identifier from a template argument
73
+ // KDevelop::IndexedTypeIdentifier Q_DECL_EXPORT typeIdentifierFromTemplateArgument(ParseSession* session, TemplateArgumentAST *node);
74
+ uint CPPPARSER_EXPORT parseConstVolatile(ParseSession* session, const ListNode<std::size_t> *cv);
75
+
76
+ #endif // NAME_COMPILER_H
77
+
@@ -0,0 +1,4706 @@
1
+ /* This file is part of KDevelop
2
+ Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
3
+ Copyright 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
4
+
5
+ This library is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU Library General Public
7
+ License version 2 as published by the Free Software Foundation.
8
+
9
+ This library is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ Library General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Library General Public License
15
+ along with this library; see the file COPYING.LIB. If not, write to
16
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
+ Boston, MA 02110-1301, USA.
18
+ */
19
+
20
+ //krazy:excludeall=cpp
21
+
22
+ // c++ support
23
+ #include "parser.h"
24
+ #include "tokens.h"
25
+ #include "lexer.h"
26
+ #include "control.h"
27
+ #include "parsesession.h"
28
+
29
+ #include <cstdlib>
30
+ #include <iostream>
31
+ #include "rpp/chartools.h"
32
+
33
+ #define ADVANCE(tk, descr) \
34
+ { \
35
+ if (session->token_stream->lookAhead() != tk) { \
36
+ tokenRequiredError(tk); \
37
+ return false; \
38
+ } \
39
+ advance(); \
40
+ }
41
+
42
+ #define ADVANCE_NR(tk, descr) \
43
+ do { \
44
+ if (session->token_stream->lookAhead() != tk) { \
45
+ tokenRequiredError(tk); \
46
+ } \
47
+ else \
48
+ advance(); \
49
+ } while (0)
50
+
51
+ #define CHECK(tk) \
52
+ do { \
53
+ if (session->token_stream->lookAhead() != tk) { \
54
+ return false; \
55
+ } \
56
+ advance(); \
57
+ } while (0)
58
+
59
+ #define UPDATE_POS(_node, start, end) \
60
+ do { \
61
+ (_node)->start_token = start; \
62
+ (_node)->end_token = end; \
63
+ } while (0)
64
+
65
+ void Parser::addComment( CommentAST* ast, const Comment& comment ) {
66
+ if( comment ) {
67
+ /* kDebug() << "Adding but leaving comment" << session->token_stream->token(comment.token()).symbol();*/
68
+ ast->comments = snoc(ast->comments, comment.token(), session->mempool);
69
+ }
70
+ }
71
+
72
+ void Parser::moveComments( CommentAST* ast ) {
73
+ while( m_commentStore.hasComment() ) {
74
+ size_t token = m_commentStore.takeFirstComment().token();
75
+
76
+ /* kDebug() << "Moving comment" << session->token_stream->token(token).symbol();*/
77
+
78
+ ast->comments = snoc(ast->comments, token, session->mempool);
79
+ }
80
+ }
81
+
82
+ Parser::Parser(Control *c)
83
+ : control(c), lexer(control), session(0), _M_last_valid_token(0), _M_last_parsed_comment(0), _M_hadMismatchingCompoundTokens(false), m_primaryExpressionWithTemplateParamsNeedsFunctionCall(true)
84
+ {
85
+ _M_max_problem_count = 5;
86
+ _M_hold_errors = false;
87
+ }
88
+
89
+ Parser::~Parser()
90
+ {
91
+ }
92
+
93
+ void Parser::rewind(size_t position) {
94
+ session->token_stream->rewind(position);
95
+
96
+ //Search the previous valid token
97
+
98
+ _M_last_valid_token = position > 0 ? position-1 : position;
99
+
100
+ while( _M_last_valid_token > 0 && session->token_stream->kind(_M_last_valid_token) == Token_comment )
101
+ --_M_last_valid_token;
102
+ }
103
+
104
+ void Parser::advance( bool skipComment ) {
105
+ size_t t = session->token_stream->lookAhead();
106
+ if( t != Token_comment )
107
+ _M_last_valid_token = session->token_stream->cursor();
108
+
109
+ session->token_stream->nextToken();
110
+
111
+ if( session->token_stream->lookAhead() == Token_comment ) {
112
+ if( skipComment ) {
113
+ processComment();
114
+ advance();
115
+ }
116
+ }
117
+ }
118
+
119
+ Comment Parser::comment() {
120
+ return m_commentStore.latestComment();
121
+ }
122
+
123
+ void Parser::preparseLineComments( int tokenNumber ) {
124
+ const Token& token( (*session->token_stream)[tokenNumber] );
125
+ SimpleCursor tokenPosition = SimpleCursor::invalid();
126
+
127
+ for( int a = 0; a < 40; a++ ) {
128
+ if( !session->token_stream->lookAhead(a) ) break;
129
+ if( session->token_stream->lookAhead(a) == Token_comment ) {
130
+ //Make sure the token's line is before the searched token's line
131
+ const Token& commentToken( (*session->token_stream)[session->token_stream->cursor() + a] );
132
+
133
+ if( !tokenPosition.isValid() ) //Get the token line. Only on-demand, because it's not cheap.
134
+ tokenPosition = session->positionAt(token.position);
135
+
136
+ SimpleCursor commentPosition = session->positionAt( commentToken.position );
137
+
138
+ if( commentPosition.line < tokenPosition.line ) {
139
+ continue;
140
+ } else if( commentPosition.line == tokenPosition.line ) {
141
+ processComment( a );
142
+ } else {
143
+ //Too far
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ int Parser::lineFromTokenNumber( size_t tokenNumber ) const {
151
+ const Token& token( (*session->token_stream)[tokenNumber] );
152
+ return session->positionAt( token.position ).line;
153
+ }
154
+
155
+
156
+ void Parser::processComment( int offset, int line ) {
157
+ size_t tokenNumber = session->token_stream->cursor() + offset;
158
+
159
+ if(_M_last_parsed_comment >= tokenNumber)
160
+ return; //The comment was already parsed. May happen because of pre-parsing
161
+
162
+ _M_last_parsed_comment = tokenNumber;
163
+
164
+ const Token& commentToken( (*session->token_stream)[tokenNumber] );
165
+ Q_ASSERT(commentToken.kind == Token_comment);
166
+ if( line == -1 ) {
167
+ SimpleCursor position = session->positionAt( commentToken.position );
168
+ line = position.line;
169
+ }
170
+
171
+ /* kDebug() << "noticing comment" << commentToken.symbol();*/
172
+ m_commentStore.addComment( Comment( session->token_stream->cursor() + offset, line ) );
173
+
174
+ }
175
+
176
+ void Parser::clearComment( ) {
177
+ m_commentStore.clear();
178
+ }
179
+
180
+ TranslationUnitAST *Parser::parse(ParseSession* _session)
181
+ {
182
+ clear();
183
+ session = _session;
184
+
185
+ if (!session->token_stream)
186
+ session->token_stream = new TokenStream;
187
+
188
+ lexer.tokenize(session);
189
+ advance(); // skip the first token
190
+
191
+ TranslationUnitAST *ast = 0;
192
+ parseTranslationUnit(ast);
193
+ return ast;
194
+ }
195
+
196
+ StatementAST *Parser::parseStatement(ParseSession* _session)
197
+ {
198
+ clear();
199
+ session = _session;
200
+
201
+ if (!session->token_stream)
202
+ session->token_stream = new TokenStream;
203
+
204
+ lexer.tokenize(session);
205
+ advance(); // skip the first token
206
+
207
+ StatementAST *ast = 0;
208
+ parseCompoundStatement(ast);
209
+ return ast;
210
+ }
211
+
212
+ AST *Parser::parseTypeOrExpression(ParseSession* _session, bool forceExpression)
213
+ {
214
+ clear();
215
+ session = _session;
216
+
217
+ if (!session->token_stream)
218
+ session->token_stream = new TokenStream;
219
+
220
+ lexer.tokenize(session);
221
+ advance(); // skip the first token
222
+
223
+ TypeIdAST *ast = 0;
224
+ if (!forceExpression)
225
+ parseTypeId(ast);
226
+ if(!ast) {
227
+ m_primaryExpressionWithTemplateParamsNeedsFunctionCall = false;
228
+ ExpressionAST* ast = 0;
229
+ parseExpression(ast);
230
+ return ast;
231
+ }
232
+
233
+ return ast;
234
+ }
235
+
236
+ void Parser::clear()
237
+ {
238
+ _M_hold_errors = false;
239
+ m_tokenMarkers.clear();
240
+ }
241
+
242
+ void Parser::addTokenMarkers(size_t tokenNumber, Parser::TokenMarkers markers)
243
+ {
244
+ hash_map<size_t, TokenMarkers>::iterator it = m_tokenMarkers.find(tokenNumber);
245
+ if(it != m_tokenMarkers.end())
246
+ (*it).second = (TokenMarkers)((*it).second | markers);
247
+ else
248
+ m_tokenMarkers.insert(std::make_pair(tokenNumber, markers));
249
+ }
250
+
251
+ Parser::TokenMarkers Parser::tokenMarkers(size_t tokenNumber) const
252
+ {
253
+ hash_map<size_t, TokenMarkers>::const_iterator it = m_tokenMarkers.find(tokenNumber);
254
+ if(it != m_tokenMarkers.end())
255
+ return (*it).second;
256
+ else
257
+ return None;
258
+ }
259
+
260
+ IndexedString declSpecString("__declspec");
261
+
262
+ bool Parser::parseWinDeclSpec(WinDeclSpecAST *&node)
263
+ {
264
+ if (session->token_stream->lookAhead() != Token_identifier)
265
+ return false;
266
+
267
+ std::size_t start = session->token_stream->cursor();
268
+
269
+ IndexedString name = session->token_stream->token(session->token_stream->cursor()).symbol();
270
+ if (name != declSpecString)
271
+ return false;
272
+ std::size_t specifier = session->token_stream->cursor();
273
+
274
+ advance();
275
+ if (session->token_stream->lookAhead() != '(')
276
+ return false;
277
+
278
+ advance();
279
+ if (session->token_stream->lookAhead() != Token_identifier)
280
+ return false;
281
+ std::size_t modifier = session->token_stream->cursor();
282
+
283
+ advance();
284
+ if (session->token_stream->lookAhead() != ')')
285
+ return false;
286
+
287
+ advance();
288
+
289
+ node = CreateNode<WinDeclSpecAST>(session->mempool);
290
+ node->specifier = specifier;
291
+ node->modifier = modifier;
292
+
293
+ UPDATE_POS(node, start, _M_last_valid_token+1);
294
+
295
+ return true;
296
+ }
297
+
298
+ void Parser::tokenRequiredError(int token)
299
+ {
300
+ QString err;
301
+
302
+ err += "Expected token ";
303
+ err += '\'';
304
+ err += token_name(token);
305
+ err += "\' after \'";
306
+ err += token_name(session->token_stream->lookAhead(-1));
307
+ err += "\' found \'";
308
+ err += token_name(session->token_stream->lookAhead());
309
+ err += '\'';
310
+
311
+ if(token == '}' || token == '{')
312
+ _M_hadMismatchingCompoundTokens = true;
313
+
314
+ reportError(err);
315
+ }
316
+
317
+ void Parser::syntaxError()
318
+ {
319
+ std::size_t cursor = session->token_stream->cursor();
320
+ std::size_t kind = session->token_stream->lookAhead();
321
+
322
+ if (m_syntaxErrorTokens.contains(cursor))
323
+ return; // syntax error at this point has already been reported
324
+
325
+ m_syntaxErrorTokens.insert(cursor);
326
+
327
+ QString err;
328
+
329
+ if (kind == Token_EOF)
330
+ err += "Unexpected end of file";
331
+ else
332
+ {
333
+ err += "Unexpected token ";
334
+ err += '\'';
335
+ err += token_name(kind);
336
+ err += '\'';
337
+ }
338
+
339
+ reportError(err);
340
+ }
341
+
342
+ void Parser::reportPendingErrors()
343
+ {
344
+ bool hold = holdErrors(false);
345
+
346
+ std::size_t start = session->token_stream->cursor();
347
+ while (m_pendingErrors.count() > 0)
348
+ {
349
+ PendingError error = m_pendingErrors.dequeue();
350
+ session->token_stream->rewind(error.cursor);
351
+ reportError(error.message);
352
+ }
353
+ rewind(start);
354
+
355
+ holdErrors(hold);
356
+ }
357
+
358
+ void Parser::reportError(const QString& msg)
359
+ {
360
+ if (!_M_hold_errors && _M_problem_count < _M_max_problem_count)
361
+ {
362
+ ++_M_problem_count;
363
+
364
+ QString fileName;
365
+
366
+ std::size_t tok = session->token_stream->cursor();
367
+ SimpleCursor position = session->positionAt(session->token_stream->position(tok));
368
+
369
+ Problem *p = new Problem;
370
+ p->file = session->url().str();
371
+ p->position = position;
372
+ p->description = msg;
373
+ p->source = Problem::Source_Parser;
374
+
375
+ control->reportProblem(p);
376
+ }
377
+ else if (_M_hold_errors)
378
+ {
379
+ PendingError pending;
380
+ pending.message = msg;
381
+ pending.cursor = session->token_stream->cursor();
382
+ m_pendingErrors.enqueue(pending);
383
+ }
384
+ }
385
+
386
+ bool Parser::skipUntil(int token)
387
+ {
388
+ clearComment();
389
+
390
+ while (session->token_stream->lookAhead())
391
+ {
392
+ if (session->token_stream->lookAhead() == token)
393
+ return true;
394
+
395
+ advance();
396
+ }
397
+
398
+ return false;
399
+ }
400
+
401
+ bool Parser::skipUntilDeclaration()
402
+ {
403
+ while (session->token_stream->lookAhead())
404
+ {
405
+
406
+ switch(session->token_stream->lookAhead())
407
+ {
408
+ case ';':
409
+ case '~':
410
+ case Token_scope:
411
+ case Token_identifier:
412
+ case Token_operator:
413
+ case Token_char:
414
+ case Token_wchar_t:
415
+ case Token_bool:
416
+ case Token_short:
417
+ case Token_int:
418
+ case Token_long:
419
+ case Token_signed:
420
+ case Token_unsigned:
421
+ case Token_float:
422
+ case Token_double:
423
+ case Token_void:
424
+ case Token_extern:
425
+ case Token_namespace:
426
+ case Token_using:
427
+ case Token_typedef:
428
+ case Token_asm:
429
+ case Token_template:
430
+ case Token_export:
431
+
432
+ case Token_const: // cv
433
+ case Token_volatile: // cv
434
+
435
+ case Token_public:
436
+ case Token_protected:
437
+ case Token_private:
438
+ case Token_signals: // Qt
439
+ case Token_slots: // Qt
440
+ return true;
441
+ case '}':
442
+ return false;
443
+
444
+ default:
445
+ advance();
446
+ }
447
+ }
448
+
449
+ return false;
450
+ }
451
+
452
+ bool Parser::skipUntilStatement()
453
+ {
454
+ while (session->token_stream->lookAhead())
455
+ {
456
+ switch(session->token_stream->lookAhead())
457
+ {
458
+ case ';':
459
+ case '{':
460
+ case '}':
461
+ case Token_const:
462
+ case Token_volatile:
463
+ case Token_identifier:
464
+ case Token_case:
465
+ case Token_default:
466
+ case Token_if:
467
+ case Token_switch:
468
+ case Token_while:
469
+ case Token_do:
470
+ case Token_for:
471
+ case Token_break:
472
+ case Token_continue:
473
+ case Token_return:
474
+ case Token_goto:
475
+ case Token_try:
476
+ case Token_catch:
477
+ case Token_throw:
478
+ case Token_char:
479
+ case Token_wchar_t:
480
+ case Token_bool:
481
+ case Token_short:
482
+ case Token_int:
483
+ case Token_long:
484
+ case Token_signed:
485
+ case Token_unsigned:
486
+ case Token_float:
487
+ case Token_double:
488
+ case Token_void:
489
+ case Token_class:
490
+ case Token_struct:
491
+ case Token_union:
492
+ case Token_enum:
493
+ case Token_scope:
494
+ case Token_template:
495
+ case Token_using:
496
+ return true;
497
+
498
+ default:
499
+ advance();
500
+ }
501
+ }
502
+
503
+ return false;
504
+ }
505
+
506
+ bool Parser::skip(int l, int r)
507
+ {
508
+ int count = 0;
509
+ while (session->token_stream->lookAhead())
510
+ {
511
+ int tk = session->token_stream->lookAhead();
512
+
513
+ if (tk == l)
514
+ ++count;
515
+ else if (tk == r)
516
+ --count;
517
+ else if (l != '{' && (tk == '{' || tk == '}' || tk == ';'))
518
+ return false;
519
+
520
+ if (count == 0)
521
+ return true;
522
+
523
+ advance();
524
+ }
525
+
526
+ return false;
527
+ }
528
+
529
+ bool Parser::parseName(NameAST*& node, ParseNameAcceptTemplate acceptTemplateId)
530
+ {
531
+ std::size_t start = session->token_stream->cursor();
532
+
533
+ WinDeclSpecAST *winDeclSpec = 0;
534
+ parseWinDeclSpec(winDeclSpec);
535
+
536
+ NameAST *ast = CreateNode<NameAST>(session->mempool);
537
+
538
+ if (session->token_stream->lookAhead() == Token_scope)
539
+ {
540
+ ast->global = true;
541
+ advance();
542
+ }
543
+
544
+ std::size_t idx = session->token_stream->cursor();
545
+
546
+ while (true)
547
+ {
548
+ UnqualifiedNameAST *n = 0;
549
+ if (!parseUnqualifiedName(n)) {
550
+ return false;
551
+ }
552
+
553
+ if (session->token_stream->lookAhead() == Token_scope)
554
+ {
555
+ advance();
556
+
557
+ ast->qualified_names
558
+ = snoc(ast->qualified_names, n, session->mempool);
559
+
560
+ if (session->token_stream->lookAhead() == Token_template)
561
+ {
562
+ /// skip optional template #### @todo CHECK
563
+ advance();
564
+ }
565
+ }
566
+ else
567
+ {
568
+ Q_ASSERT(n != 0);
569
+
570
+ if (acceptTemplateId == DontAcceptTemplate ||
571
+ //Eventually only accept template parameters as primary expression if the expression is followed by a function call
572
+ (acceptTemplateId == EventuallyAcceptTemplate && n->template_arguments && session->token_stream->lookAhead() != '(' && m_primaryExpressionWithTemplateParamsNeedsFunctionCall))
573
+ {
574
+ rewind(n->start_token);
575
+ parseUnqualifiedName(n, false);
576
+ }
577
+
578
+ ast->unqualified_name = n;
579
+ break;
580
+ }
581
+ }
582
+
583
+ if (idx == session->token_stream->cursor())
584
+ return false;
585
+
586
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
587
+ node = ast;
588
+
589
+ return true;
590
+ }
591
+
592
+ bool Parser::parseTranslationUnit(TranslationUnitAST *&node)
593
+ {
594
+ _M_problem_count = 0;
595
+ _M_hadMismatchingCompoundTokens = false;
596
+
597
+ /* kDebug() << "tokens:";
598
+ for(size_t a = 0; a < session->token_stream->size(); ++a)
599
+ kDebug() << token_name(session->token_stream->token(a).kind) << session->token_stream->token(a).symbolString();*/
600
+
601
+ std::size_t start = session->token_stream->cursor();
602
+ TranslationUnitAST *ast = CreateNode<TranslationUnitAST>(session->mempool);
603
+
604
+ if( m_commentStore.hasComment() )
605
+ addComment(ast, m_commentStore.takeFirstComment());
606
+
607
+ while (session->token_stream->lookAhead())
608
+ {
609
+ std::size_t startDecl = session->token_stream->cursor();
610
+
611
+ DeclarationAST *declaration = 0;
612
+ if (parseDeclaration(declaration))
613
+ {
614
+ ast->declarations =
615
+ snoc(ast->declarations, declaration, session->mempool);
616
+ }
617
+ else
618
+ {
619
+ // error recovery
620
+ if (startDecl == session->token_stream->cursor())
621
+ {
622
+ // skip at least one token
623
+ advance();
624
+ }
625
+
626
+ skipUntilDeclaration();
627
+ }
628
+ }
629
+
630
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
631
+ node = ast;
632
+
633
+ ast->hadMissingCompoundTokens = _M_hadMismatchingCompoundTokens;
634
+
635
+ return true;
636
+ }
637
+
638
+ bool Parser::parseDeclaration(DeclarationAST *&node)
639
+ {
640
+ std::size_t start = session->token_stream->cursor();
641
+
642
+ switch(session->token_stream->lookAhead())
643
+ {
644
+ case ';':
645
+ advance();
646
+ return true;
647
+
648
+ case Token_extern:
649
+ return parseLinkageSpecification(node);
650
+
651
+ case Token_namespace:
652
+ return parseNamespace(node);
653
+
654
+ case Token_using:
655
+ return parseUsing(node);
656
+
657
+ case Token_typedef:
658
+ return parseTypedef(node);
659
+
660
+ case Token_asm:
661
+ return parseAsmDefinition(node);
662
+
663
+ case Token_template:
664
+ case Token_export:
665
+ return parseTemplateDeclaration(node);
666
+
667
+ default:
668
+ {
669
+ const ListNode<std::size_t> *cv = 0;
670
+ parseCvQualify(cv);
671
+
672
+ const ListNode<std::size_t> *storageSpec = 0;
673
+ parseStorageClassSpecifier(storageSpec);
674
+
675
+ parseCvQualify(cv);
676
+
677
+ Comment mcomment = comment();
678
+ clearComment();
679
+
680
+ TypeSpecifierAST *spec = 0;
681
+ if (parseEnumSpecifier(spec)
682
+ || parseClassSpecifier(spec))
683
+ {
684
+ parseCvQualify(cv);
685
+
686
+ spec->cv = cv;
687
+
688
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
689
+ parseInitDeclaratorList(declarators);
690
+ ADVANCE(';', ";");
691
+
692
+ SimpleDeclarationAST *ast =
693
+ CreateNode<SimpleDeclarationAST>(session->mempool);
694
+ ast->storage_specifiers = storageSpec;
695
+ ast->type_specifier = spec;
696
+ ast->init_declarators = declarators;
697
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
698
+ node = ast;
699
+
700
+ if( mcomment )
701
+ addComment(ast, mcomment);
702
+
703
+ preparseLineComments(ast->end_token-1);
704
+
705
+ if( m_commentStore.hasComment() )
706
+ addComment( ast, m_commentStore.takeCommentInRange( lineFromTokenNumber( --ast->end_token ) ) );
707
+
708
+ return true;
709
+ } else {
710
+ rewind(start);
711
+ if( parseDeclarationInternal(node) ) {
712
+ //Add the comments to the declaration
713
+ if( mcomment )
714
+ addComment(node, mcomment);
715
+
716
+ preparseLineComments(node->end_token-1);
717
+
718
+ if( m_commentStore.hasComment() )
719
+ addComment( node, m_commentStore.takeCommentInRange( lineFromTokenNumber( --node->end_token ) ) );
720
+
721
+ return true;
722
+ }
723
+ }
724
+ }
725
+ } // end switch
726
+
727
+ return false;
728
+ }
729
+
730
+ bool Parser::parseLinkageSpecification(DeclarationAST *&node)
731
+ {
732
+ std::size_t start = session->token_stream->cursor();
733
+
734
+ CHECK(Token_extern);
735
+
736
+ LinkageSpecificationAST *ast = CreateNode<LinkageSpecificationAST>(session->mempool);
737
+
738
+ if (session->token_stream->lookAhead() == Token_string_literal)
739
+ {
740
+ ast->extern_type = session->token_stream->cursor();
741
+ advance();
742
+ }
743
+
744
+ if (session->token_stream->lookAhead() == '{')
745
+ {
746
+ parseLinkageBody(ast->linkage_body);
747
+ }
748
+ else if (!parseDeclaration(ast->declaration))
749
+ {
750
+ reportError(("Declaration syntax error"));
751
+ }
752
+
753
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
754
+ node = ast;
755
+
756
+ return true;
757
+ }
758
+
759
+ bool Parser::parseLinkageBody(LinkageBodyAST *&node)
760
+ {
761
+ std::size_t start = session->token_stream->cursor();
762
+
763
+ CHECK('{');
764
+
765
+ LinkageBodyAST *ast = CreateNode<LinkageBodyAST>(session->mempool);
766
+
767
+ while (session->token_stream->lookAhead())
768
+ {
769
+ int tk = session->token_stream->lookAhead();
770
+
771
+ if (tk == '}')
772
+ break;
773
+
774
+ std::size_t startDecl = session->token_stream->cursor();
775
+
776
+ DeclarationAST *declaration = 0;
777
+ if (parseDeclaration(declaration))
778
+ {
779
+ ast->declarations = snoc(ast->declarations, declaration, session->mempool);
780
+ }
781
+ else
782
+ {
783
+ // error recovery
784
+ if (startDecl == session->token_stream->cursor())
785
+ {
786
+ // skip at least one token
787
+ advance();
788
+ }
789
+
790
+ skipUntilDeclaration();
791
+ }
792
+ }
793
+
794
+ clearComment();
795
+
796
+ if (session->token_stream->lookAhead() != '}') {
797
+ reportError(("} expected"));
798
+ _M_hadMismatchingCompoundTokens = true;
799
+ } else
800
+ advance();
801
+
802
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
803
+ node = ast;
804
+
805
+ return true;
806
+ }
807
+
808
+ bool Parser::parseNamespace(DeclarationAST *&node)
809
+ {
810
+ std::size_t start = session->token_stream->cursor();
811
+
812
+ CHECK(Token_namespace);
813
+
814
+ std::size_t namespace_name = 0;
815
+ if (session->token_stream->lookAhead() == Token_identifier)
816
+ {
817
+ namespace_name = session->token_stream->cursor();
818
+ advance();
819
+ }
820
+
821
+ if (session->token_stream->lookAhead() == '=')
822
+ {
823
+ // namespace alias
824
+ advance();
825
+
826
+ NameAST *name = 0;
827
+ if (parseName(name))
828
+ {
829
+ ADVANCE(';', ";");
830
+
831
+ NamespaceAliasDefinitionAST *ast
832
+ = CreateNode<NamespaceAliasDefinitionAST>(session->mempool);
833
+ ast->namespace_name = namespace_name;
834
+ ast->alias_name = name;
835
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
836
+
837
+ node = ast;
838
+ return true;
839
+ }
840
+ else
841
+ {
842
+ reportError(("Namespace expected"));
843
+ return false;
844
+ }
845
+ }
846
+ else if (session->token_stream->lookAhead() != '{')
847
+ {
848
+ reportError(("{ expected"));
849
+ _M_hadMismatchingCompoundTokens = true;
850
+ return false;
851
+ }
852
+
853
+ NamespaceAST *ast = CreateNode<NamespaceAST>(session->mempool);
854
+ ast->namespace_name = namespace_name;
855
+ parseLinkageBody(ast->linkage_body);
856
+
857
+ UPDATE_POS(ast, start, ast->linkage_body->end_token);
858
+ node = ast;
859
+
860
+ return true;
861
+ }
862
+
863
+ bool Parser::parseUsing(DeclarationAST *&node)
864
+ {
865
+ std::size_t start = session->token_stream->cursor();
866
+
867
+ CHECK(Token_using);
868
+
869
+ if (session->token_stream->lookAhead() == Token_namespace)
870
+ return parseUsingDirective(node);
871
+
872
+ UsingAST *ast = CreateNode<UsingAST>(session->mempool);
873
+
874
+ if (session->token_stream->lookAhead() == Token_typename)
875
+ {
876
+ ast->type_name = session->token_stream->cursor();
877
+ advance();
878
+ }
879
+
880
+ if (!parseName(ast->name))
881
+ return false;
882
+
883
+ ADVANCE(';', ";");
884
+
885
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
886
+ node = ast;
887
+
888
+ return true;
889
+ }
890
+
891
+ bool Parser::parseUsingDirective(DeclarationAST *&node)
892
+ {
893
+ std::size_t start = session->token_stream->cursor();
894
+
895
+ CHECK(Token_namespace);
896
+
897
+ NameAST *name = 0;
898
+ if (!parseName(name))
899
+ {
900
+ reportError(("Namespace name expected"));
901
+ return false;
902
+ }
903
+
904
+ ADVANCE(';', ";");
905
+
906
+ UsingDirectiveAST *ast = CreateNode<UsingDirectiveAST>(session->mempool);
907
+ ast->name = name;
908
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
909
+ node = ast;
910
+
911
+ return true;
912
+ }
913
+
914
+
915
+ bool Parser::parseOperatorFunctionId(OperatorFunctionIdAST *&node)
916
+ {
917
+ std::size_t start = session->token_stream->cursor();
918
+
919
+ CHECK(Token_operator);
920
+
921
+ OperatorFunctionIdAST *ast = CreateNode<OperatorFunctionIdAST>(session->mempool);
922
+ if (!parseOperator(ast->op))
923
+ {
924
+ ast->op = 0;
925
+
926
+ // parse cast operator
927
+ const ListNode<std::size_t> *cv = 0;
928
+ parseCvQualify(cv);
929
+
930
+ if (!parseSimpleTypeSpecifier(ast->type_specifier))
931
+ {
932
+ syntaxError();
933
+ return false;
934
+ }
935
+
936
+ parseCvQualify(cv);
937
+ ast->type_specifier->cv = cv;
938
+
939
+ PtrOperatorAST *ptr_op = 0;
940
+ while (parsePtrOperator(ptr_op))
941
+ ast->ptr_ops = snoc(ast->ptr_ops, ptr_op, session->mempool);
942
+ }
943
+
944
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
945
+ node = ast;
946
+ return true;
947
+ }
948
+
949
+ bool Parser::parseTemplateArgumentList(const ListNode<TemplateArgumentAST*> *&node,
950
+ bool reportError)
951
+ {
952
+ TemplateArgumentAST *templArg = 0;
953
+ if (!parseTemplateArgument(templArg))
954
+ return false;
955
+
956
+ node = snoc(node, templArg, session->mempool);
957
+
958
+ while (session->token_stream->lookAhead() == ',')
959
+ {
960
+ advance();
961
+
962
+ if (!parseTemplateArgument(templArg))
963
+ {
964
+ if (reportError)
965
+ {
966
+ syntaxError();
967
+ break;
968
+ }
969
+
970
+ node = 0;
971
+ return false;
972
+ }
973
+
974
+ node = snoc(node, templArg, session->mempool);
975
+ }
976
+
977
+ return true;
978
+ }
979
+
980
+ bool Parser::parseTypedef(DeclarationAST *&node)
981
+ {
982
+ std::size_t start = session->token_stream->cursor();
983
+
984
+ Comment mcomment = comment();
985
+
986
+ CHECK(Token_typedef);
987
+
988
+ TypeSpecifierAST *spec = 0;
989
+ if (!parseTypeSpecifierOrClassSpec(spec))
990
+ {
991
+ reportError(("Need a type specifier to declare"));
992
+ return false;
993
+ }
994
+
995
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
996
+ if (!parseInitDeclaratorList(declarators))
997
+ {
998
+ //reportError(("Need an identifier to declare"));
999
+ //return false;
1000
+ }
1001
+ clearComment();
1002
+
1003
+ TypedefAST *ast = CreateNode<TypedefAST>(session->mempool);
1004
+
1005
+ if( mcomment )
1006
+ addComment( ast, mcomment );
1007
+
1008
+ ADVANCE(';', ";");
1009
+
1010
+ ast->type_specifier = spec;
1011
+ ast->init_declarators = declarators;
1012
+
1013
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1014
+ node = ast;
1015
+
1016
+ preparseLineComments( ast->end_token-1 );
1017
+
1018
+ if( m_commentStore.hasComment() )
1019
+ addComment( ast, m_commentStore.takeCommentInRange( lineFromTokenNumber( --ast->end_token ) ) );
1020
+
1021
+ return true;
1022
+ }
1023
+
1024
+ bool Parser::parseAsmDefinition(DeclarationAST *&node)
1025
+ {
1026
+ std::size_t start = session->token_stream->cursor();
1027
+
1028
+ ADVANCE(Token_asm, "asm");
1029
+
1030
+ const ListNode<std::size_t> *cv = 0;
1031
+ parseCvQualify(cv);
1032
+
1033
+ #if defined(__GNUC__)
1034
+ #warning "implement me"
1035
+ #endif
1036
+ skip('(', ')');
1037
+ advance();
1038
+ ADVANCE(';', ";");
1039
+
1040
+ AsmDefinitionAST *ast = CreateNode<AsmDefinitionAST>(session->mempool);
1041
+ ast->cv = cv;
1042
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1043
+ node = ast;
1044
+
1045
+ return true;
1046
+ }
1047
+
1048
+ bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
1049
+ {
1050
+ std::size_t start = session->token_stream->cursor();
1051
+
1052
+ std::size_t exported = 0;
1053
+ if (session->token_stream->lookAhead() == Token_export)
1054
+ {
1055
+ exported = session->token_stream->cursor();
1056
+ advance();
1057
+ }
1058
+
1059
+ CHECK(Token_template);
1060
+
1061
+ const ListNode<TemplateParameterAST*> *params = 0;
1062
+ if (session->token_stream->lookAhead() == '<')
1063
+ {
1064
+ advance();
1065
+ parseTemplateParameterList(params);
1066
+
1067
+ ADVANCE('>', ">");
1068
+ }
1069
+
1070
+ DeclarationAST *declaration = 0;
1071
+ if (!parseDeclaration(declaration))
1072
+ {
1073
+ reportError(("Expected a declaration"));
1074
+ }
1075
+
1076
+ TemplateDeclarationAST *ast = CreateNode<TemplateDeclarationAST>(session->mempool);
1077
+ ast->exported = exported;
1078
+ ast->template_parameters = params;
1079
+ ast->declaration = declaration;
1080
+
1081
+ UPDATE_POS(ast, start, declaration ? declaration->end_token : _M_last_valid_token+1);
1082
+ node = ast;
1083
+
1084
+ return true;
1085
+ }
1086
+
1087
+ bool Parser::parseOperator(OperatorAST *&node)
1088
+ {
1089
+ std::size_t start = session->token_stream->cursor();
1090
+
1091
+ OperatorAST *ast = CreateNode<OperatorAST>(session->mempool);
1092
+
1093
+ switch(session->token_stream->lookAhead())
1094
+ {
1095
+ case Token_new:
1096
+ case Token_delete:
1097
+ {
1098
+ ast->op = session->token_stream->cursor();
1099
+ advance();
1100
+
1101
+ if (session->token_stream->lookAhead() == '['
1102
+ && session->token_stream->lookAhead(1) == ']')
1103
+ {
1104
+ ast->open = session->token_stream->cursor();
1105
+ advance();
1106
+
1107
+ ast->close = session->token_stream->cursor();
1108
+ advance();
1109
+ }
1110
+ }
1111
+ break;
1112
+
1113
+ case '+':
1114
+ case '-':
1115
+ case '*':
1116
+ case '/':
1117
+ case '%':
1118
+ case '^':
1119
+ case '&':
1120
+ case '|':
1121
+ case '~':
1122
+ case '!':
1123
+ case '=':
1124
+ case '<':
1125
+ case '>':
1126
+ case ',':
1127
+ case Token_assign:
1128
+ case Token_shift:
1129
+ case Token_eq:
1130
+ case Token_not:
1131
+ case Token_not_eq:
1132
+ case Token_leq:
1133
+ case Token_geq:
1134
+ case Token_and:
1135
+ case Token_or:
1136
+ case Token_incr:
1137
+ case Token_decr:
1138
+ case Token_ptrmem:
1139
+ case Token_arrow:
1140
+ ast->op = session->token_stream->cursor();
1141
+ advance();
1142
+ break;
1143
+
1144
+ default:
1145
+ if (session->token_stream->lookAhead() == '('
1146
+ && session->token_stream->lookAhead(1) == ')')
1147
+ {
1148
+ ast->op = ast->open = session->token_stream->cursor();
1149
+ advance();
1150
+ ast->close = session->token_stream->cursor();
1151
+ advance();
1152
+ }
1153
+ else if (session->token_stream->lookAhead() == '['
1154
+ && session->token_stream->lookAhead(1) == ']')
1155
+ {
1156
+ ast->op = ast->open = session->token_stream->cursor();
1157
+ advance();
1158
+ ast->close = session->token_stream->cursor();
1159
+ advance();
1160
+ }
1161
+ else
1162
+ {
1163
+ return false;
1164
+ }
1165
+ }
1166
+
1167
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1168
+ node = ast;
1169
+
1170
+ return true;
1171
+ }
1172
+
1173
+ bool Parser::parseCvQualify(const ListNode<std::size_t> *&node)
1174
+ {
1175
+ std::size_t start = session->token_stream->cursor();
1176
+
1177
+ int tk;
1178
+ while (0 != (tk = session->token_stream->lookAhead())
1179
+ && (tk == Token_const || tk == Token_volatile))
1180
+ {
1181
+ node = snoc(node, session->token_stream->cursor(), session->mempool);
1182
+ advance();
1183
+ }
1184
+
1185
+ return start != session->token_stream->cursor();
1186
+ }
1187
+
1188
+ bool Parser::parseSimpleTypeSpecifier(TypeSpecifierAST *&node,
1189
+ bool onlyIntegral)
1190
+ {
1191
+ std::size_t start = session->token_stream->cursor();
1192
+ bool isIntegral = false;
1193
+ bool done = false;
1194
+
1195
+ const ListNode<std::size_t> *integrals = 0;
1196
+
1197
+ while (!done)
1198
+ {
1199
+ switch(session->token_stream->lookAhead())
1200
+ {
1201
+ case Token_char:
1202
+ case Token_wchar_t:
1203
+ case Token_bool:
1204
+ case Token_short:
1205
+ case Token_int:
1206
+ case Token_long:
1207
+ case Token_signed:
1208
+ case Token_unsigned:
1209
+ case Token_float:
1210
+ case Token_double:
1211
+ case Token_void:
1212
+ integrals = snoc(integrals, session->token_stream->cursor(), session->mempool);
1213
+ isIntegral = true;
1214
+ advance();
1215
+ break;
1216
+
1217
+ default:
1218
+ done = true;
1219
+ }
1220
+ }
1221
+
1222
+ SimpleTypeSpecifierAST *ast = CreateNode<SimpleTypeSpecifierAST>(session->mempool);
1223
+
1224
+ if (isIntegral)
1225
+ {
1226
+ ast->integrals = integrals;
1227
+ }
1228
+ else if (session->token_stream->lookAhead() == Token___typeof)
1229
+ {
1230
+ ast->type_of = session->token_stream->cursor();
1231
+ advance();
1232
+
1233
+ if (session->token_stream->lookAhead() == '(')
1234
+ {
1235
+ advance();
1236
+
1237
+ std::size_t saved = session->token_stream->cursor();
1238
+ parseTypeId(ast->type_id);
1239
+ if (session->token_stream->lookAhead() != ')')
1240
+ {
1241
+ ast->type_id = 0;
1242
+ rewind(saved);
1243
+ parseUnaryExpression(ast->expression);
1244
+ }
1245
+ ADVANCE(')', ")");
1246
+ }
1247
+ else
1248
+ {
1249
+ parseUnaryExpression(ast->expression);
1250
+ }
1251
+ }
1252
+ else if (onlyIntegral)
1253
+ {
1254
+ rewind(start);
1255
+ return false;
1256
+ }
1257
+ else
1258
+ {
1259
+ if (!parseName(ast->name, AcceptTemplate))
1260
+ {
1261
+ ast->name = 0;
1262
+ rewind(start);
1263
+ return false;
1264
+ }
1265
+ }
1266
+
1267
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1268
+ node = ast;
1269
+
1270
+ return true;
1271
+ }
1272
+
1273
+ bool Parser::parsePtrOperator(PtrOperatorAST *&node)
1274
+ {
1275
+ int tk = session->token_stream->lookAhead();
1276
+
1277
+ if (tk != '&' && tk != '*'
1278
+ && tk != Token_scope && tk != Token_identifier)
1279
+ {
1280
+ return false;
1281
+ }
1282
+
1283
+ std::size_t start = session->token_stream->cursor();
1284
+
1285
+ PtrOperatorAST *ast = CreateNode<PtrOperatorAST>(session->mempool);
1286
+ switch (session->token_stream->lookAhead())
1287
+ {
1288
+ case '&':
1289
+ case '*':
1290
+ ast->op = session->token_stream->cursor();
1291
+ advance();
1292
+ break;
1293
+
1294
+ case Token_scope:
1295
+ case Token_identifier:
1296
+ {
1297
+ if (!parsePtrToMember(ast->mem_ptr))
1298
+ {
1299
+ rewind(start);
1300
+ return false;
1301
+ }
1302
+ }
1303
+ break;
1304
+
1305
+ default:
1306
+ Q_ASSERT(0);
1307
+ break;
1308
+ }
1309
+
1310
+ parseCvQualify(ast->cv);
1311
+
1312
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1313
+ node = ast;
1314
+
1315
+ return true;
1316
+ }
1317
+
1318
+ bool Parser::parseTemplateArgument(TemplateArgumentAST *&node)
1319
+ {
1320
+ std::size_t start = session->token_stream->cursor();
1321
+
1322
+ TypeIdAST *typeId = 0;
1323
+ ExpressionAST *expr = 0;
1324
+
1325
+ if (!parseTypeId(typeId) || (session->token_stream->lookAhead() != ','
1326
+ && session->token_stream->lookAhead() != '>' && session->token_stream->lookAhead() != ')'))
1327
+ {
1328
+ rewind(start);
1329
+
1330
+ if (!parseLogicalOrExpression(expr, true))
1331
+ return false;
1332
+ }
1333
+
1334
+ TemplateArgumentAST *ast = CreateNode<TemplateArgumentAST>(session->mempool);
1335
+ ast->type_id = typeId;
1336
+ ast->expression = expr;
1337
+
1338
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1339
+ node = ast;
1340
+
1341
+ return true;
1342
+ }
1343
+
1344
+ bool Parser::parseTypeSpecifier(TypeSpecifierAST *&node)
1345
+ {
1346
+ std::size_t start = session->token_stream->cursor();
1347
+
1348
+ const ListNode<std::size_t> *cv = 0;
1349
+ parseCvQualify(cv);
1350
+
1351
+ TypeSpecifierAST *ast = 0;
1352
+ if (!parseElaboratedTypeSpecifier(ast) && !parseSimpleTypeSpecifier(ast))
1353
+ {
1354
+ rewind(start);
1355
+ return false;
1356
+ }
1357
+
1358
+ parseCvQualify(cv);
1359
+ ast->cv = cv;
1360
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1361
+
1362
+ node = ast;
1363
+
1364
+ return true;
1365
+ }
1366
+
1367
+ bool Parser::parseDeclarator(DeclaratorAST *&node)
1368
+ {
1369
+ std::size_t start = session->token_stream->cursor();
1370
+
1371
+ DeclaratorAST *ast = CreateNode<DeclaratorAST>(session->mempool);
1372
+ DeclaratorAST *decl = 0;
1373
+ NameAST *declId = 0;
1374
+
1375
+ PtrOperatorAST *ptrOp = 0;
1376
+ while (parsePtrOperator(ptrOp))
1377
+ {
1378
+ ast->ptr_ops = snoc(ast->ptr_ops, ptrOp, session->mempool);
1379
+ }
1380
+
1381
+ if (session->token_stream->lookAhead() == '(')
1382
+ {
1383
+ advance();
1384
+
1385
+ if (!parseDeclarator(decl))
1386
+ return false;
1387
+
1388
+ ast->sub_declarator = decl;
1389
+
1390
+ CHECK(')');
1391
+ }
1392
+ else
1393
+ {
1394
+ if (session->token_stream->lookAhead() == ':')
1395
+ {
1396
+ // unnamed bitfield
1397
+ }
1398
+ else if (parseName(declId, AcceptTemplate))
1399
+ {
1400
+ ast->id = declId;
1401
+ }
1402
+ else
1403
+ {
1404
+ rewind(start);
1405
+ return false;
1406
+ }
1407
+
1408
+ if (session->token_stream->lookAhead() == ':')
1409
+ {
1410
+ advance();
1411
+
1412
+ if (!parseConstantExpression(ast->bit_expression))
1413
+ {
1414
+ reportError(("Constant expression expected"));
1415
+ }
1416
+ goto update_pos;
1417
+ }
1418
+ }
1419
+
1420
+ {
1421
+ bool isVector = false;
1422
+
1423
+ while (session->token_stream->lookAhead() == '[')
1424
+ {
1425
+ advance();
1426
+
1427
+ ExpressionAST *expr = 0;
1428
+ parseCommaExpression(expr);
1429
+
1430
+ ADVANCE(']', "]");
1431
+
1432
+ ast->array_dimensions = snoc(ast->array_dimensions, expr, session->mempool);
1433
+ isVector = true;
1434
+ }
1435
+
1436
+ bool skipParen = false;
1437
+ if (session->token_stream->lookAhead() == Token_identifier
1438
+ && session->token_stream->lookAhead(1) == '('
1439
+ && session->token_stream->lookAhead(2) == '(')
1440
+ {
1441
+ advance();
1442
+ advance();
1443
+ skipParen = true;
1444
+ }
1445
+
1446
+ int tok = session->token_stream->lookAhead();
1447
+ if (ast->sub_declarator
1448
+ && !(isVector || tok == '(' || tok == ','
1449
+ || tok == ';' || tok == '='))
1450
+ {
1451
+ rewind(start);
1452
+ return false;
1453
+ }
1454
+
1455
+ std::size_t index = session->token_stream->cursor();
1456
+ if (session->token_stream->lookAhead() == '(')
1457
+ {
1458
+ advance();
1459
+ ///@todo Sometimes something like (test()) is parsed as a parameter declaration clause, although it cannot be one.
1460
+ ParameterDeclarationClauseAST *params = 0;
1461
+ if (!parseParameterDeclarationClause(params))
1462
+ {
1463
+ rewind(index);
1464
+ goto update_pos;
1465
+ }
1466
+
1467
+ ast->parameter_declaration_clause = params;
1468
+
1469
+ if (session->token_stream->lookAhead() != ')')
1470
+ {
1471
+ rewind(index);
1472
+ goto update_pos;
1473
+ }
1474
+
1475
+ advance(); // skip ')'
1476
+
1477
+ parseCvQualify(ast->fun_cv);
1478
+ parseExceptionSpecification(ast->exception_spec);
1479
+
1480
+ if (session->token_stream->lookAhead() == Token___attribute__)
1481
+ {
1482
+ advance();
1483
+
1484
+ ADVANCE('(', "(");
1485
+
1486
+ ExpressionAST *expr = 0;
1487
+ parseExpression(expr);
1488
+
1489
+ if (session->token_stream->lookAhead() != ')')
1490
+ {
1491
+ reportError(("')' expected"));
1492
+ }
1493
+ else
1494
+ {
1495
+ advance();
1496
+ }
1497
+ }
1498
+ }
1499
+
1500
+ if (skipParen)
1501
+ {
1502
+ if (session->token_stream->lookAhead() != ')')
1503
+ {
1504
+ reportError(("')' expected"));
1505
+ }
1506
+ else
1507
+ advance();
1508
+ }
1509
+ }
1510
+
1511
+ update_pos:
1512
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1513
+ node = ast;
1514
+
1515
+ return true;
1516
+ }
1517
+
1518
+ bool Parser::parseAbstractDeclarator(DeclaratorAST *&node)
1519
+ {
1520
+ std::size_t start = session->token_stream->cursor();
1521
+
1522
+ DeclaratorAST *ast = CreateNode<DeclaratorAST>(session->mempool);
1523
+ DeclaratorAST *decl = 0;
1524
+
1525
+ PtrOperatorAST *ptrOp = 0;
1526
+ while (parsePtrOperator(ptrOp))
1527
+ {
1528
+ ast->ptr_ops = snoc(ast->ptr_ops, ptrOp, session->mempool);
1529
+ }
1530
+
1531
+ int index = session->token_stream->cursor();
1532
+ if (session->token_stream->lookAhead() == '(')
1533
+ {
1534
+ advance();
1535
+
1536
+ if (!parseAbstractDeclarator(decl))
1537
+ {
1538
+ rewind(index);
1539
+ goto label1;
1540
+ }
1541
+
1542
+ ast->sub_declarator = decl;
1543
+
1544
+ if (session->token_stream->lookAhead() != ')')
1545
+ {
1546
+ rewind(start);
1547
+ return false;
1548
+ }
1549
+ advance();
1550
+ }
1551
+ else if (session->token_stream->lookAhead() == ':')
1552
+ {
1553
+ advance();
1554
+ if (!parseConstantExpression(ast->bit_expression))
1555
+ {
1556
+ ast->bit_expression = 0;
1557
+ reportError(("Constant expression expected"));
1558
+ }
1559
+ goto update_pos;
1560
+ }
1561
+
1562
+ label1:
1563
+ {
1564
+ bool isVector = false;
1565
+
1566
+ while (session->token_stream->lookAhead() == '[')
1567
+ {
1568
+ advance();
1569
+
1570
+ ExpressionAST *expr = 0;
1571
+ parseCommaExpression(expr);
1572
+
1573
+ ADVANCE(']', "]");
1574
+
1575
+ ast->array_dimensions = snoc(ast->array_dimensions, expr, session->mempool);
1576
+ isVector = true;
1577
+ }
1578
+
1579
+ int tok = session->token_stream->lookAhead();
1580
+ if (ast->sub_declarator
1581
+ && !(isVector || tok == '(' || tok == ','
1582
+ || tok == ';' || tok == '='))
1583
+ {
1584
+ rewind(start);
1585
+ return false;
1586
+ }
1587
+
1588
+ int index = session->token_stream->cursor();
1589
+ if (session->token_stream->lookAhead() == '(')
1590
+ {
1591
+ advance();
1592
+
1593
+ ParameterDeclarationClauseAST *params = 0;
1594
+ if (!parseParameterDeclarationClause(params))
1595
+ {
1596
+ rewind(index);
1597
+ goto update_pos;
1598
+ }
1599
+
1600
+ ast->parameter_declaration_clause = params;
1601
+
1602
+ if (session->token_stream->lookAhead() != ')')
1603
+ {
1604
+ rewind(index);
1605
+ goto update_pos;
1606
+ }
1607
+
1608
+ advance(); // skip ')'
1609
+
1610
+ parseCvQualify(ast->fun_cv);
1611
+ parseExceptionSpecification(ast->exception_spec);
1612
+ }
1613
+ }
1614
+
1615
+ update_pos:
1616
+ if (session->token_stream->cursor() == start)
1617
+ return false;
1618
+
1619
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1620
+ node = ast;
1621
+
1622
+ return true;
1623
+ }
1624
+
1625
+ bool Parser::parseEnumSpecifier(TypeSpecifierAST *&node)
1626
+ {
1627
+ std::size_t start = session->token_stream->cursor();
1628
+
1629
+ CHECK(Token_enum);
1630
+
1631
+ NameAST *name = 0;
1632
+ parseName(name);
1633
+
1634
+ if (session->token_stream->lookAhead() != '{')
1635
+ {
1636
+ rewind(start);
1637
+ return false;
1638
+ }
1639
+ advance();
1640
+
1641
+ EnumSpecifierAST *ast = CreateNode<EnumSpecifierAST>(session->mempool);
1642
+ ast->name = name;
1643
+
1644
+ EnumeratorAST *enumerator = 0;
1645
+ if (parseEnumerator(enumerator))
1646
+ {
1647
+
1648
+ ast->enumerators = snoc(ast->enumerators, enumerator, session->mempool);
1649
+
1650
+ while (session->token_stream->lookAhead() == ',')
1651
+ {
1652
+ advance();
1653
+
1654
+ if (!parseEnumerator(enumerator))
1655
+ {
1656
+ //reportError(("Enumerator expected"));
1657
+ break;
1658
+ }
1659
+
1660
+ ast->enumerators = snoc(ast->enumerators, enumerator, session->mempool);
1661
+ }
1662
+ }
1663
+
1664
+ clearComment();
1665
+
1666
+ ADVANCE_NR('}', "}");
1667
+
1668
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1669
+ node = ast;
1670
+
1671
+ return true;
1672
+ }
1673
+
1674
+ bool Parser::parseTemplateParameterList(const ListNode<TemplateParameterAST*> *&node)
1675
+ {
1676
+ TemplateParameterAST *param = 0;
1677
+ if (!parseTemplateParameter(param))
1678
+ return false;
1679
+
1680
+ node = snoc(node, param, session->mempool);
1681
+
1682
+ while (session->token_stream->lookAhead() == ',')
1683
+ {
1684
+ advance();
1685
+
1686
+ if (!parseTemplateParameter(param))
1687
+ {
1688
+ syntaxError();
1689
+ break;
1690
+ }
1691
+ else
1692
+ {
1693
+ node = snoc(node, param, session->mempool);
1694
+ }
1695
+ }
1696
+
1697
+ return true;
1698
+ }
1699
+
1700
+ bool Parser::parseTemplateParameter(TemplateParameterAST *&node)
1701
+ {
1702
+ std::size_t start = session->token_stream->cursor();
1703
+ TemplateParameterAST *ast = CreateNode<TemplateParameterAST>(session->mempool);
1704
+
1705
+ int tk = session->token_stream->lookAhead();
1706
+
1707
+ if ((tk == Token_class || tk == Token_typename || tk == Token_template)
1708
+ && parseTypeParameter(ast->type_parameter))
1709
+ {
1710
+ // nothing to do
1711
+ }
1712
+ else if (!parseParameterDeclaration(ast->parameter_declaration))
1713
+ return false;
1714
+
1715
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1716
+ node = ast;
1717
+
1718
+ return true;
1719
+ }
1720
+
1721
+ bool Parser::parseTypeParameter(TypeParameterAST *&node)
1722
+ {
1723
+ std::size_t start = session->token_stream->cursor();
1724
+
1725
+ TypeParameterAST *ast = CreateNode<TypeParameterAST>(session->mempool);
1726
+ ast->type = start;
1727
+
1728
+ switch(session->token_stream->lookAhead())
1729
+ {
1730
+ case Token_class:
1731
+ case Token_typename:
1732
+ {
1733
+ advance(); // skip class
1734
+
1735
+ // parse optional name
1736
+ if(parseName(ast->name, AcceptTemplate))
1737
+ {
1738
+ if (session->token_stream->lookAhead() == '=')
1739
+ {
1740
+ advance();
1741
+
1742
+ if(!parseTypeId(ast->type_id))
1743
+ {
1744
+ //syntaxError();
1745
+ rewind(start);
1746
+ return false;
1747
+ }
1748
+ }
1749
+ else if (session->token_stream->lookAhead() != ','
1750
+ && session->token_stream->lookAhead() != '>')
1751
+ {
1752
+ rewind(start);
1753
+ return false;
1754
+ }
1755
+ }
1756
+ }
1757
+ break;
1758
+
1759
+ case Token_template:
1760
+ {
1761
+ advance(); // skip template
1762
+ ADVANCE('<', "<");
1763
+
1764
+ if (!parseTemplateParameterList(ast->template_parameters))
1765
+ return false;
1766
+
1767
+ ADVANCE('>', ">");
1768
+
1769
+ // TODO add to AST
1770
+ if (session->token_stream->lookAhead() == Token_class)
1771
+ advance();
1772
+
1773
+ // parse optional name
1774
+ if (parseName(ast->name, AcceptTemplate))
1775
+ {
1776
+ if (session->token_stream->lookAhead() == '=')
1777
+ {
1778
+ advance();
1779
+
1780
+ if (!parseTypeId(ast->type_id))
1781
+ {
1782
+ syntaxError();
1783
+ return false;
1784
+ }
1785
+ }
1786
+ }
1787
+
1788
+ if (session->token_stream->lookAhead() == '=')
1789
+ {
1790
+ advance();
1791
+
1792
+ parseName(ast->template_name, AcceptTemplate);
1793
+ }
1794
+ }
1795
+ break;
1796
+
1797
+ default:
1798
+ return false;
1799
+
1800
+ } // end switch
1801
+
1802
+
1803
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1804
+ node = ast;
1805
+ return true;
1806
+ }
1807
+
1808
+ bool Parser::parseStorageClassSpecifier(const ListNode<std::size_t> *&node)
1809
+ {
1810
+ std::size_t start = session->token_stream->cursor();
1811
+
1812
+ int tk;
1813
+ while (0 != (tk = session->token_stream->lookAhead())
1814
+ && (tk == Token_friend || tk == Token_auto
1815
+ || tk == Token_register || tk == Token_static
1816
+ || tk == Token_extern || tk == Token_mutable))
1817
+ {
1818
+ node = snoc(node, session->token_stream->cursor(), session->mempool);
1819
+ advance();
1820
+ }
1821
+
1822
+ return start != session->token_stream->cursor();
1823
+ }
1824
+
1825
+ bool Parser::parseFunctionSpecifier(const ListNode<std::size_t> *&node)
1826
+ {
1827
+ std::size_t start = session->token_stream->cursor();
1828
+
1829
+ int tk;
1830
+ while (0 != (tk = session->token_stream->lookAhead())
1831
+ && (tk == Token_inline || tk == Token_virtual
1832
+ || tk == Token_explicit))
1833
+ {
1834
+ node = snoc(node, session->token_stream->cursor(), session->mempool);
1835
+ advance();
1836
+ }
1837
+
1838
+ return start != session->token_stream->cursor();
1839
+ }
1840
+
1841
+ bool Parser::parseTypeId(TypeIdAST *&node)
1842
+ {
1843
+ /// @todo implement the AST for typeId
1844
+ std::size_t start = session->token_stream->cursor();
1845
+
1846
+ TypeSpecifierAST *spec = 0;
1847
+ if (!parseTypeSpecifier(spec))
1848
+ {
1849
+ rewind(start);
1850
+ return false;
1851
+ }
1852
+
1853
+ DeclaratorAST *decl = 0;
1854
+ parseAbstractDeclarator(decl);
1855
+
1856
+ TypeIdAST *ast = CreateNode<TypeIdAST>(session->mempool);
1857
+ ast->type_specifier = spec;
1858
+ ast->declarator = decl;
1859
+
1860
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1861
+ node = ast;
1862
+
1863
+ return true;
1864
+ }
1865
+
1866
+ bool Parser::parseInitDeclaratorList(const ListNode<InitDeclaratorAST*> *&node)
1867
+ {
1868
+ InitDeclaratorAST *decl = 0;
1869
+ if (!parseInitDeclarator(decl))
1870
+ return false;
1871
+
1872
+ node = snoc(node, decl, session->mempool);
1873
+
1874
+ while (session->token_stream->lookAhead() == ',')
1875
+ {
1876
+ advance();
1877
+
1878
+ if (!parseInitDeclarator(decl))
1879
+ {
1880
+ syntaxError();
1881
+ break;
1882
+ }
1883
+ node = snoc(node, decl, session->mempool);
1884
+ }
1885
+
1886
+ return true;
1887
+ }
1888
+
1889
+ bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node)
1890
+ {
1891
+ std::size_t start = session->token_stream->cursor();
1892
+
1893
+ ParameterDeclarationClauseAST *ast
1894
+ = CreateNode<ParameterDeclarationClauseAST>(session->mempool);
1895
+
1896
+ if (!parseParameterDeclarationList(ast->parameter_declarations))
1897
+ {
1898
+ if (session->token_stream->lookAhead() == ')')
1899
+ goto good;
1900
+
1901
+ if (session->token_stream->lookAhead() == Token_ellipsis
1902
+ && session->token_stream->lookAhead(1) == ')')
1903
+ {
1904
+ ast->ellipsis = session->token_stream->cursor();
1905
+ goto good;
1906
+ }
1907
+
1908
+ return false;
1909
+ }
1910
+
1911
+ good:
1912
+
1913
+ if (session->token_stream->lookAhead() == Token_ellipsis)
1914
+ {
1915
+ ast->ellipsis = session->token_stream->cursor();
1916
+ advance();
1917
+ }
1918
+
1919
+ /// @todo add ellipsis
1920
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
1921
+ node = ast;
1922
+
1923
+ return true;
1924
+ }
1925
+
1926
+ bool Parser::parseParameterDeclarationList(const ListNode<ParameterDeclarationAST*> *&node)
1927
+ {
1928
+ std::size_t start = session->token_stream->cursor();
1929
+
1930
+ ParameterDeclarationAST *param = 0;
1931
+ if (!parseParameterDeclaration(param))
1932
+ {
1933
+ rewind(start);
1934
+ return false;
1935
+ }
1936
+
1937
+ node = snoc(node, param, session->mempool);
1938
+
1939
+ while (session->token_stream->lookAhead() == ',')
1940
+ {
1941
+ advance();
1942
+
1943
+ if (session->token_stream->lookAhead() == Token_ellipsis)
1944
+ break;
1945
+
1946
+ if (!parseParameterDeclaration(param))
1947
+ {
1948
+ rewind(start);
1949
+ return false;
1950
+ }
1951
+ node = snoc(node, param, session->mempool);
1952
+ }
1953
+
1954
+ return true;
1955
+ }
1956
+
1957
+ bool Parser::parseParameterDeclaration(ParameterDeclarationAST *&node)
1958
+ {
1959
+ std::size_t start = session->token_stream->cursor();
1960
+
1961
+ const ListNode<std::size_t> *storage = 0;
1962
+ parseStorageClassSpecifier(storage);
1963
+
1964
+ // parse decl spec
1965
+ TypeSpecifierAST *spec = 0;
1966
+ if (!parseTypeSpecifier(spec))
1967
+ {
1968
+ rewind(start);
1969
+ return false;
1970
+ }
1971
+
1972
+ int index = session->token_stream->cursor();
1973
+
1974
+ DeclaratorAST *decl = 0;
1975
+ if (!parseDeclarator(decl))
1976
+ {
1977
+ rewind(index);
1978
+
1979
+ // try with abstract declarator
1980
+ parseAbstractDeclarator(decl);
1981
+ }
1982
+
1983
+ ExpressionAST *expr = 0;
1984
+ if (session->token_stream->lookAhead() == '=')
1985
+ {
1986
+ advance();
1987
+ if (!parseLogicalOrExpression(expr,true))
1988
+ {
1989
+ //reportError(("Expression expected"));
1990
+ }
1991
+ }
1992
+
1993
+ if( session->token_stream->lookAhead() != ',' && session->token_stream->lookAhead() != ')' && session->token_stream->lookAhead() != '>' )
1994
+ {
1995
+ //Not a valid parameter declaration
1996
+ rewind(start);
1997
+ return false;
1998
+ }
1999
+
2000
+ ParameterDeclarationAST *ast = CreateNode<ParameterDeclarationAST>(session->mempool);
2001
+ ast->type_specifier = spec;
2002
+ ast->declarator = decl;
2003
+ ast->expression = expr;
2004
+
2005
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2006
+ node = ast;
2007
+
2008
+ return true;
2009
+ }
2010
+
2011
+ bool Parser::parseClassSpecifier(TypeSpecifierAST *&node)
2012
+ {
2013
+ std::size_t start = session->token_stream->cursor();
2014
+
2015
+ int kind = session->token_stream->lookAhead();
2016
+ if (kind != Token_class && kind != Token_struct && kind != Token_union)
2017
+ return false;
2018
+
2019
+ std::size_t class_key = session->token_stream->cursor();
2020
+ advance();
2021
+
2022
+ WinDeclSpecAST *winDeclSpec = 0;
2023
+ parseWinDeclSpec(winDeclSpec);
2024
+
2025
+ while (session->token_stream->lookAhead() == Token_identifier
2026
+ && session->token_stream->lookAhead(1) == Token_identifier)
2027
+ {
2028
+ advance();
2029
+ }
2030
+
2031
+ NameAST *name = 0;
2032
+ parseName(name, AcceptTemplate);
2033
+
2034
+ BaseClauseAST *bases = 0;
2035
+ if (session->token_stream->lookAhead() == ':')
2036
+ {
2037
+ if (!parseBaseClause(bases))
2038
+ {
2039
+ skipUntil('{');
2040
+ }
2041
+ }
2042
+
2043
+ if (session->token_stream->lookAhead() != '{')
2044
+ {
2045
+ rewind(start);
2046
+ return false;
2047
+ }
2048
+
2049
+ ADVANCE('{', "{");
2050
+
2051
+ ClassSpecifierAST *ast = CreateNode<ClassSpecifierAST>(session->mempool);
2052
+ ast->win_decl_specifiers = winDeclSpec;
2053
+ ast->class_key = class_key;
2054
+ ast->name = name;
2055
+ ast->base_clause = bases;
2056
+
2057
+ while (session->token_stream->lookAhead())
2058
+ {
2059
+ if (session->token_stream->lookAhead() == '}')
2060
+ break;
2061
+
2062
+ std::size_t startDecl = session->token_stream->cursor();
2063
+
2064
+ DeclarationAST *memSpec = 0;
2065
+ if (!parseMemberSpecification(memSpec))
2066
+ {
2067
+ if (startDecl == session->token_stream->cursor())
2068
+ advance(); // skip at least one token
2069
+ skipUntilDeclaration();
2070
+ }
2071
+ else
2072
+ ast->member_specs = snoc(ast->member_specs, memSpec, session->mempool);
2073
+ }
2074
+
2075
+ clearComment();
2076
+
2077
+ ADVANCE_NR('}', "}");
2078
+
2079
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2080
+ node = ast;
2081
+
2082
+ return true;
2083
+ }
2084
+
2085
+ bool Parser::parseAccessSpecifier(DeclarationAST *&node)
2086
+ {
2087
+ std::size_t start = session->token_stream->cursor();
2088
+
2089
+ const ListNode<std::size_t> *specs = 0;
2090
+
2091
+ bool done = false;
2092
+ while (!done)
2093
+ {
2094
+ switch(session->token_stream->lookAhead())
2095
+ {
2096
+ case Token_signals:
2097
+ case Token_slots:
2098
+ case Token_k_dcop:
2099
+ case Token_k_dcop_signals:
2100
+ case Token_public:
2101
+ case Token_protected:
2102
+ case Token_private:
2103
+ specs = snoc(specs, session->token_stream->cursor(), session->mempool);
2104
+ advance();
2105
+ break;
2106
+
2107
+ default:
2108
+ done = true;
2109
+ break;
2110
+ }
2111
+ }
2112
+
2113
+ if (!specs)
2114
+ return false;
2115
+
2116
+ ADVANCE(':', ":");
2117
+
2118
+ AccessSpecifierAST *ast = CreateNode<AccessSpecifierAST>(session->mempool);
2119
+ ast->specs = specs;
2120
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2121
+ node = ast;
2122
+
2123
+ return true;
2124
+ }
2125
+
2126
+ bool Parser::parseMemberSpecification(DeclarationAST *&node)
2127
+ {
2128
+ std::size_t start = session->token_stream->cursor();
2129
+
2130
+ if (session->token_stream->lookAhead() == ';')
2131
+ {
2132
+ advance();
2133
+ return true;
2134
+ }
2135
+ else if (session->token_stream->lookAhead() == Token_Q_OBJECT || session->token_stream->lookAhead() == Token_K_DCOP)
2136
+ {
2137
+ advance();
2138
+ return true;
2139
+ }
2140
+ else if (parseTypedef(node))
2141
+ {
2142
+ return true;
2143
+ }
2144
+ else if (parseUsing(node))
2145
+ {
2146
+ return true;
2147
+ }
2148
+ else if (parseTemplateDeclaration(node))
2149
+ {
2150
+ return true;
2151
+ }
2152
+ else if (parseAccessSpecifier(node))
2153
+ {
2154
+ return true;
2155
+ }
2156
+
2157
+ rewind(start);
2158
+
2159
+ const ListNode<std::size_t> *cv = 0;
2160
+ parseCvQualify(cv);
2161
+
2162
+ const ListNode<std::size_t> *storageSpec = 0;
2163
+ parseStorageClassSpecifier(storageSpec);
2164
+
2165
+ parseCvQualify(cv);
2166
+
2167
+ Comment mcomment = comment();
2168
+ clearComment();
2169
+
2170
+ TypeSpecifierAST *spec = 0;
2171
+ if (parseEnumSpecifier(spec) || parseClassSpecifier(spec))
2172
+ {
2173
+ parseCvQualify(cv);
2174
+ spec->cv = cv;
2175
+
2176
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
2177
+ parseInitDeclaratorList(declarators);
2178
+ ADVANCE(';', ";");
2179
+
2180
+ SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(session->mempool);
2181
+ ast->storage_specifiers = storageSpec;
2182
+ ast->type_specifier = spec;
2183
+ ast->init_declarators = declarators;
2184
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2185
+
2186
+ if( mcomment )
2187
+ addComment(ast,mcomment);
2188
+
2189
+ preparseLineComments(ast->end_token-1);
2190
+
2191
+ if( m_commentStore.hasComment() )
2192
+ addComment( ast, m_commentStore.takeCommentInRange( lineFromTokenNumber( --ast->end_token ) ) );
2193
+
2194
+ node = ast;
2195
+
2196
+
2197
+ return true;
2198
+ } else {
2199
+ rewind(start);
2200
+
2201
+ if( parseDeclarationInternal(node) ) {
2202
+ //Add the comments to the declaration
2203
+ if( mcomment )
2204
+ addComment(node, mcomment);
2205
+
2206
+ preparseLineComments(node->end_token-1);
2207
+
2208
+ if( m_commentStore.hasComment() )
2209
+ addComment( node, m_commentStore.takeCommentInRange( lineFromTokenNumber( --node->end_token ) ) );
2210
+
2211
+ return true;
2212
+ }
2213
+ }
2214
+ return false;
2215
+ }
2216
+
2217
+ bool Parser::parseCtorInitializer(CtorInitializerAST *&node)
2218
+ {
2219
+ std::size_t start = session->token_stream->cursor();
2220
+
2221
+ CHECK(':');
2222
+
2223
+ CtorInitializerAST *ast = CreateNode<CtorInitializerAST>(session->mempool);
2224
+ ast->colon = start;
2225
+
2226
+ if (!parseMemInitializerList(ast->member_initializers))
2227
+ {
2228
+ reportError(("Member initializers expected"));
2229
+ }
2230
+
2231
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2232
+ node = ast;
2233
+
2234
+ return true;
2235
+ }
2236
+
2237
+ bool Parser::parseElaboratedTypeSpecifier(TypeSpecifierAST *&node)
2238
+ {
2239
+ std::size_t start = session->token_stream->cursor();
2240
+
2241
+ int tk = session->token_stream->lookAhead();
2242
+ if (tk == Token_class ||
2243
+ tk == Token_struct ||
2244
+ tk == Token_union ||
2245
+ tk == Token_enum ||
2246
+ tk == Token_typename)
2247
+ {
2248
+ std::size_t type = session->token_stream->cursor();
2249
+ advance();
2250
+
2251
+ NameAST *name = 0;
2252
+ if (parseName(name, AcceptTemplate))
2253
+ {
2254
+ ElaboratedTypeSpecifierAST *ast
2255
+ = CreateNode<ElaboratedTypeSpecifierAST>(session->mempool);
2256
+
2257
+ ast->type = type;
2258
+ ast->name = name;
2259
+
2260
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2261
+ node = ast;
2262
+
2263
+ return true;
2264
+ }
2265
+ }
2266
+
2267
+ rewind(start);
2268
+ return false;
2269
+ }
2270
+
2271
+ bool Parser::parseExceptionSpecification(ExceptionSpecificationAST *&node)
2272
+ {
2273
+ std::size_t start = session->token_stream->cursor();
2274
+
2275
+ CHECK(Token_throw);
2276
+ ADVANCE('(', "(");
2277
+
2278
+ ExceptionSpecificationAST *ast
2279
+ = CreateNode<ExceptionSpecificationAST>(session->mempool);
2280
+
2281
+ if (session->token_stream->lookAhead() == Token_ellipsis)
2282
+ {
2283
+ ast->ellipsis = session->token_stream->cursor();
2284
+ advance();
2285
+ }
2286
+ else
2287
+ {
2288
+ parseTypeIdList(ast->type_ids);
2289
+ }
2290
+
2291
+ ADVANCE(')', ")");
2292
+
2293
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2294
+ node = ast;
2295
+
2296
+ return true;
2297
+ }
2298
+
2299
+ bool Parser::parseEnumerator(EnumeratorAST *&node)
2300
+ {
2301
+ std::size_t start = session->token_stream->cursor();
2302
+
2303
+ CHECK(Token_identifier);
2304
+ std::size_t id = start;
2305
+
2306
+ EnumeratorAST *ast = CreateNode<EnumeratorAST>(session->mempool);
2307
+ ast->id = id;
2308
+
2309
+
2310
+ if (session->token_stream->lookAhead() == '=')
2311
+ {
2312
+ advance();
2313
+ if (!parseConstantExpression(ast->expression))
2314
+ {
2315
+ reportError(("Constant expression expected"));
2316
+ }
2317
+ }
2318
+
2319
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2320
+ node = ast;
2321
+
2322
+ moveComments(node);
2323
+
2324
+ preparseLineComments( ast->end_token-1 );
2325
+
2326
+ if( m_commentStore.hasComment() )
2327
+ addComment( node, m_commentStore.takeCommentInRange( lineFromTokenNumber(--ast->end_token) ) );
2328
+
2329
+ return true;
2330
+ }
2331
+
2332
+ bool Parser::parseInitDeclarator(InitDeclaratorAST *&node)
2333
+ {
2334
+ std::size_t start = session->token_stream->cursor();
2335
+
2336
+ DeclaratorAST *decl = 0;
2337
+ if (!parseDeclarator(decl))
2338
+ {
2339
+ return false;
2340
+ }
2341
+
2342
+ if (session->token_stream->lookAhead(0) == Token_asm)
2343
+ {
2344
+ advance();
2345
+ skip('(', ')');
2346
+ advance();
2347
+ }
2348
+
2349
+ InitializerAST *init = 0;
2350
+ parseInitializer(init);
2351
+
2352
+ InitDeclaratorAST *ast = CreateNode<InitDeclaratorAST>(session->mempool);
2353
+ ast->declarator = decl;
2354
+ ast->initializer = init;
2355
+
2356
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2357
+ node = ast;
2358
+
2359
+ return true;
2360
+ }
2361
+
2362
+ bool Parser::parseBaseClause(BaseClauseAST *&node)
2363
+ {
2364
+ std::size_t start = session->token_stream->cursor();
2365
+
2366
+ CHECK(':');
2367
+
2368
+ BaseSpecifierAST *baseSpec = 0;
2369
+ if (!parseBaseSpecifier(baseSpec))
2370
+ return false;
2371
+
2372
+ BaseClauseAST *ast = CreateNode<BaseClauseAST>(session->mempool);
2373
+ ast->base_specifiers = snoc(ast->base_specifiers, baseSpec, session->mempool);
2374
+
2375
+ while (session->token_stream->lookAhead() == ',')
2376
+ {
2377
+ advance();
2378
+
2379
+ if (!parseBaseSpecifier(baseSpec))
2380
+ {
2381
+ reportError(("Base class specifier expected"));
2382
+ break;
2383
+ }
2384
+ ast->base_specifiers = snoc(ast->base_specifiers, baseSpec, session->mempool);
2385
+ }
2386
+
2387
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2388
+ node = ast;
2389
+
2390
+ return true;
2391
+ }
2392
+
2393
+ bool Parser::parseInitializer(InitializerAST *&node)
2394
+ {
2395
+ std::size_t start = session->token_stream->cursor();
2396
+
2397
+ int tk = session->token_stream->lookAhead();
2398
+ if (tk != '=' && tk != '(')
2399
+ return false;
2400
+
2401
+ InitializerAST *ast = CreateNode<InitializerAST>(session->mempool);
2402
+
2403
+ if (tk == '=')
2404
+ {
2405
+ advance();
2406
+
2407
+ if (!parseInitializerClause(ast->initializer_clause))
2408
+ {
2409
+ reportError(("Initializer clause expected"));
2410
+ }
2411
+ }
2412
+ else if (tk == '(')
2413
+ {
2414
+ advance();
2415
+ parseCommaExpression(ast->expression);
2416
+ CHECK(')');
2417
+ }
2418
+
2419
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2420
+ node = ast;
2421
+
2422
+ return true;
2423
+ }
2424
+
2425
+ bool Parser::parseMemInitializerList(const ListNode<MemInitializerAST*> *&node)
2426
+ {
2427
+ MemInitializerAST *init = 0;
2428
+
2429
+ if (!parseMemInitializer(init))
2430
+ return false;
2431
+
2432
+ node = snoc(node, init, session->mempool);
2433
+
2434
+ while (session->token_stream->lookAhead() == ',')
2435
+ {
2436
+ advance();
2437
+
2438
+ if (!parseMemInitializer(init))
2439
+ break;
2440
+
2441
+ node = snoc(node, init, session->mempool);
2442
+ }
2443
+
2444
+ return true;
2445
+ }
2446
+
2447
+ bool Parser::parseMemInitializer(MemInitializerAST *&node)
2448
+ {
2449
+ std::size_t start = session->token_stream->cursor();
2450
+
2451
+ NameAST *initId = 0;
2452
+ if (!parseName(initId, AcceptTemplate))
2453
+ {
2454
+ reportError(("Identifier expected"));
2455
+ return false;
2456
+ }
2457
+
2458
+ ADVANCE('(', "(");
2459
+ ExpressionAST *expr = 0;
2460
+ parseCommaExpression(expr);
2461
+ ADVANCE(')', ")");
2462
+
2463
+ MemInitializerAST *ast = CreateNode<MemInitializerAST>(session->mempool);
2464
+ ast->initializer_id = initId;
2465
+ ast->expression = expr;
2466
+
2467
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2468
+ node = ast;
2469
+
2470
+ return true;
2471
+ }
2472
+
2473
+ bool Parser::parseTypeIdList(const ListNode<TypeIdAST*> *&node)
2474
+ {
2475
+ TypeIdAST *typeId = 0;
2476
+ if (!parseTypeId(typeId))
2477
+ return false;
2478
+
2479
+ node = snoc(node, typeId, session->mempool);
2480
+
2481
+ while (session->token_stream->lookAhead() == ',')
2482
+ {
2483
+ advance();
2484
+ if (parseTypeId(typeId))
2485
+ {
2486
+ node = snoc(node, typeId, session->mempool);
2487
+ }
2488
+ else
2489
+ {
2490
+ reportError(("Type id expected"));
2491
+ break;
2492
+ }
2493
+ }
2494
+
2495
+ return true;
2496
+ }
2497
+
2498
+ bool Parser::parseBaseSpecifier(BaseSpecifierAST *&node)
2499
+ {
2500
+ std::size_t start = session->token_stream->cursor();
2501
+
2502
+ BaseSpecifierAST *ast = CreateNode<BaseSpecifierAST>(session->mempool);
2503
+
2504
+ if (session->token_stream->lookAhead() == Token_virtual)
2505
+ {
2506
+ ast->virt = session->token_stream->cursor();
2507
+ advance();
2508
+
2509
+ int tk = session->token_stream->lookAhead();
2510
+ if (tk == Token_public || tk == Token_protected
2511
+ || tk == Token_private)
2512
+ {
2513
+ ast->access_specifier = session->token_stream->cursor();
2514
+ advance();
2515
+ }
2516
+ }
2517
+ else
2518
+ {
2519
+ int tk = session->token_stream->lookAhead();
2520
+ if (tk == Token_public || tk == Token_protected
2521
+ || tk == Token_private)
2522
+ {
2523
+ ast->access_specifier = session->token_stream->cursor();
2524
+ advance();
2525
+ }
2526
+
2527
+ if (session->token_stream->lookAhead() == Token_virtual)
2528
+ {
2529
+ ast->virt = session->token_stream->cursor();
2530
+ advance();
2531
+ }
2532
+ }
2533
+
2534
+ if (!parseName(ast->name, AcceptTemplate))
2535
+ reportError(("Class name expected"));
2536
+
2537
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2538
+ node = ast;
2539
+
2540
+ return true;
2541
+ }
2542
+
2543
+ bool Parser::parseInitializerList(const ListNode<InitializerClauseAST*> *&node)
2544
+ {
2545
+ const ListNode<InitializerClauseAST*> *list = 0;
2546
+ do
2547
+ {
2548
+ if (list)
2549
+ advance(); // skip ',' separator between clauses
2550
+
2551
+ InitializerClauseAST *init_clause = 0;
2552
+ if (!parseInitializerClause(init_clause))
2553
+ {
2554
+ return false;
2555
+ }
2556
+ list = snoc(list,init_clause,session->mempool);
2557
+ } while (session->token_stream->lookAhead() == ',');
2558
+
2559
+ node = list;
2560
+
2561
+ return true;
2562
+ }
2563
+
2564
+ bool Parser::parseInitializerClause(InitializerClauseAST *&node)
2565
+ {
2566
+ std::size_t start = session->token_stream->cursor();
2567
+
2568
+ InitializerClauseAST *ast = CreateNode<InitializerClauseAST>(session->mempool);
2569
+
2570
+ if (session->token_stream->lookAhead() == '{')
2571
+ {
2572
+ advance();
2573
+ const ListNode<InitializerClauseAST*> *initializer_list = 0;
2574
+ if (session->token_stream->lookAhead() != '}' &&
2575
+ !parseInitializerList(initializer_list))
2576
+ {
2577
+ return false;
2578
+ }
2579
+ ADVANCE('}',"}");
2580
+
2581
+ ast->initializer_list = initializer_list;
2582
+ }
2583
+ else
2584
+ {
2585
+ if (!parseAssignmentExpression(ast->expression))
2586
+ {
2587
+ reportError("Expression expected");
2588
+ return false;
2589
+ }
2590
+ }
2591
+
2592
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2593
+ node = ast;
2594
+
2595
+ return true;
2596
+ }
2597
+
2598
+ bool Parser::parsePtrToMember(PtrToMemberAST *&node)
2599
+ {
2600
+ #if defined(__GNUC__)
2601
+ #warning "implemente me (AST)"
2602
+ #endif
2603
+
2604
+ std::size_t start = session->token_stream->cursor();
2605
+
2606
+ std::size_t global_scope = 0;
2607
+ if (session->token_stream->lookAhead() == Token_scope)
2608
+ {
2609
+ global_scope = session->token_stream->cursor();
2610
+ advance();
2611
+ }
2612
+
2613
+ UnqualifiedNameAST *name = 0;
2614
+ while (session->token_stream->lookAhead() == Token_identifier)
2615
+ {
2616
+ if (!parseUnqualifiedName(name))
2617
+ break;
2618
+
2619
+ if (session->token_stream->lookAhead() == Token_scope
2620
+ && session->token_stream->lookAhead(1) == '*')
2621
+ {
2622
+ advance();
2623
+ advance();
2624
+
2625
+ PtrToMemberAST *ast = CreateNode<PtrToMemberAST>(session->mempool);
2626
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2627
+ node = ast;
2628
+
2629
+ return true;
2630
+ }
2631
+
2632
+ if (session->token_stream->lookAhead() == Token_scope)
2633
+ advance();
2634
+ }
2635
+
2636
+ rewind(start);
2637
+ return false;
2638
+ }
2639
+
2640
+ bool Parser::parseUnqualifiedName(UnqualifiedNameAST *&node,
2641
+ bool parseTemplateId)
2642
+ {
2643
+ std::size_t start = session->token_stream->cursor();
2644
+
2645
+ std::size_t tilde = 0;
2646
+ std::size_t id = 0;
2647
+ OperatorFunctionIdAST *operator_id = 0;
2648
+
2649
+ if (session->token_stream->lookAhead() == Token_identifier)
2650
+ {
2651
+ id = session->token_stream->cursor();
2652
+ advance();
2653
+ }
2654
+ else if (session->token_stream->lookAhead() == '~'
2655
+ && session->token_stream->lookAhead(1) == Token_identifier)
2656
+ {
2657
+ tilde = session->token_stream->cursor();
2658
+ advance(); // skip ~
2659
+
2660
+ id = session->token_stream->cursor();
2661
+ advance(); // skip classname
2662
+ }
2663
+ else if (session->token_stream->lookAhead() == Token_operator)
2664
+ {
2665
+ if (!parseOperatorFunctionId(operator_id))
2666
+ return false;
2667
+ }
2668
+ else
2669
+ {
2670
+ return false;
2671
+ }
2672
+
2673
+ UnqualifiedNameAST *ast = CreateNode<UnqualifiedNameAST>(session->mempool);
2674
+ ast->tilde = tilde;
2675
+ ast->id = id;
2676
+ ast->operator_id = operator_id;
2677
+
2678
+ if (parseTemplateId && !tilde)
2679
+ {
2680
+ std::size_t index = session->token_stream->cursor();
2681
+
2682
+ if (session->token_stream->lookAhead() == '<' && !(tokenMarkers(index) & IsNoTemplateArgumentList))
2683
+ {
2684
+ advance();
2685
+
2686
+ // optional template arguments
2687
+ parseTemplateArgumentList(ast->template_arguments);
2688
+
2689
+ if (session->token_stream->lookAhead() == '>')
2690
+ {
2691
+ advance();
2692
+ }
2693
+ else
2694
+ {
2695
+ addTokenMarkers(index, IsNoTemplateArgumentList);
2696
+ ast->template_arguments = 0;
2697
+ rewind(index);
2698
+ }
2699
+ }
2700
+ }
2701
+
2702
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2703
+ node = ast;
2704
+
2705
+ return true;
2706
+ }
2707
+
2708
+ bool Parser::parseStringLiteral(StringLiteralAST *&node)
2709
+ {
2710
+ std::size_t start = session->token_stream->cursor();
2711
+
2712
+ if (session->token_stream->lookAhead() != Token_string_literal)
2713
+ return false;
2714
+
2715
+ StringLiteralAST *ast = CreateNode<StringLiteralAST>(session->mempool);
2716
+
2717
+ while (session->token_stream->lookAhead() == Token_string_literal)
2718
+ {
2719
+ ast->literals = snoc(ast->literals, session->token_stream->cursor(), session->mempool);
2720
+ advance();
2721
+ }
2722
+
2723
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2724
+ node = ast;
2725
+
2726
+ return true;
2727
+ }
2728
+
2729
+ bool Parser::parseExpressionStatement(StatementAST *&node)
2730
+ {
2731
+ std::size_t start = session->token_stream->cursor();
2732
+
2733
+ ExpressionAST *expr = 0;
2734
+ parseCommaExpression(expr);
2735
+
2736
+ ADVANCE(';', ";");
2737
+
2738
+ ExpressionStatementAST *ast = CreateNode<ExpressionStatementAST>(session->mempool);
2739
+ ast->expression = expr;
2740
+
2741
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2742
+ node = ast;
2743
+ return true;
2744
+ }
2745
+
2746
+ bool Parser::parseJumpStatement(StatementAST *&node)
2747
+ {
2748
+ std::size_t op = session->token_stream->cursor();
2749
+ std::size_t kind = session->token_stream->lookAhead();
2750
+ std::size_t identifier = 0;
2751
+
2752
+ if (kind != Token_break && kind != Token_continue && kind != Token_goto)
2753
+ return false;
2754
+
2755
+ advance();
2756
+ if (kind == Token_goto)
2757
+ {
2758
+ ADVANCE(Token_identifier,"label");
2759
+ identifier = op+1;
2760
+ }
2761
+ ADVANCE(';',";");
2762
+
2763
+ JumpStatementAST* ast = CreateNode<JumpStatementAST>(session->mempool);
2764
+ ast->op = op;
2765
+ ast->identifier = identifier;
2766
+
2767
+ UPDATE_POS(ast,ast->op,_M_last_valid_token+1);
2768
+ node = ast;
2769
+ return true;
2770
+ }
2771
+
2772
+ bool Parser::parseStatement(StatementAST *&node)
2773
+ {
2774
+ std::size_t start = session->token_stream->cursor();
2775
+
2776
+ switch(session->token_stream->lookAhead())
2777
+ {
2778
+ case Token_while:
2779
+ return parseWhileStatement(node);
2780
+
2781
+ case Token_do:
2782
+ return parseDoStatement(node);
2783
+
2784
+ case Token_for:
2785
+ return parseForStatement(node);
2786
+
2787
+ case Token_if:
2788
+ return parseIfStatement(node);
2789
+
2790
+ case Token_switch:
2791
+ return parseSwitchStatement(node);
2792
+
2793
+ case Token_try:
2794
+ return parseTryBlockStatement(node);
2795
+
2796
+ case Token_case:
2797
+ case Token_default:
2798
+ return parseLabeledStatement(node);
2799
+
2800
+ case Token_break:
2801
+ case Token_continue:
2802
+ case Token_goto:
2803
+ return parseJumpStatement(node);
2804
+
2805
+ case Token_return:
2806
+ {
2807
+ advance();
2808
+ ExpressionAST *expr = 0;
2809
+ parseCommaExpression(expr);
2810
+
2811
+ ADVANCE(';', ";");
2812
+
2813
+ ReturnStatementAST *ast = CreateNode<ReturnStatementAST>(session->mempool);
2814
+ ast->expression = expr;
2815
+
2816
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2817
+
2818
+ node = ast;
2819
+ }
2820
+ return true;
2821
+
2822
+ case '{':
2823
+ return parseCompoundStatement(node);
2824
+
2825
+ case Token_identifier:
2826
+ if (parseLabeledStatement(node))
2827
+ return true;
2828
+ break;
2829
+ }
2830
+
2831
+ return parseExpressionOrDeclarationStatement(node);
2832
+ }
2833
+
2834
+ bool Parser::parseExpressionOrDeclarationStatement(StatementAST *&node)
2835
+ {
2836
+ // hold any errors while the expression/declaration ambiguity is resolved
2837
+ // for this statement
2838
+ bool hold = holdErrors(true);
2839
+
2840
+ std::size_t start = session->token_stream->cursor();
2841
+
2842
+ ///@todo solve -1 thing
2843
+ StatementAST *decl_ast = 0;
2844
+ bool maybe_amb = parseDeclarationStatement(decl_ast);
2845
+ maybe_amb &= session->token_stream->kind(session->token_stream->cursor() - 1) == ';';
2846
+
2847
+ // if parsing as a declaration succeeded, then any pending errors are genuine.
2848
+ // Otherwise this is not a declaration so ignore the errors.
2849
+ if (decl_ast)
2850
+ reportPendingErrors();
2851
+ else
2852
+ m_pendingErrors.clear();
2853
+
2854
+ std::size_t end = session->token_stream->cursor();
2855
+
2856
+ rewind(start);
2857
+ StatementAST *expr_ast = 0;
2858
+ maybe_amb &= parseExpressionStatement(expr_ast);
2859
+ maybe_amb &= session->token_stream->kind(session->token_stream->cursor() - 1) == ';';
2860
+
2861
+ // if parsing as an expression succeeded, then any pending errors are genuine.
2862
+ // Otherwise this is not an expression so ignore the errors.
2863
+ if (expr_ast)
2864
+ reportPendingErrors();
2865
+ else
2866
+ m_pendingErrors.clear();
2867
+
2868
+ if (maybe_amb)
2869
+ {
2870
+ Q_ASSERT(decl_ast != 0 && expr_ast != 0);
2871
+ ExpressionOrDeclarationStatementAST *ast
2872
+ = CreateNode<ExpressionOrDeclarationStatementAST>(session->mempool);
2873
+ ast->declaration = decl_ast;
2874
+ ast->expression = expr_ast;
2875
+
2876
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2877
+ node = ast;
2878
+ }
2879
+ else
2880
+ {
2881
+ rewind(std::max(end, session->token_stream->cursor()));
2882
+
2883
+ node = decl_ast;
2884
+ if (!node)
2885
+ node = expr_ast;
2886
+ }
2887
+
2888
+ holdErrors(hold);
2889
+
2890
+ if (!node)
2891
+ syntaxError();
2892
+
2893
+ return node != 0;
2894
+ }
2895
+
2896
+ bool Parser::parseCondition(ConditionAST *&node, bool initRequired)
2897
+ {
2898
+ std::size_t start = session->token_stream->cursor();
2899
+
2900
+ ConditionAST *ast = CreateNode<ConditionAST>(session->mempool);
2901
+ TypeSpecifierAST *spec = 0;
2902
+
2903
+ if (parseTypeSpecifier(spec))
2904
+ {
2905
+ ast->type_specifier = spec;
2906
+
2907
+ std::size_t declarator_start = session->token_stream->cursor();
2908
+
2909
+ DeclaratorAST *decl = 0;
2910
+ if (!parseDeclarator(decl))
2911
+ {
2912
+ rewind(declarator_start);
2913
+ if (!initRequired && !parseAbstractDeclarator(decl))
2914
+ decl = 0;
2915
+ }
2916
+
2917
+ if (decl && (!initRequired || session->token_stream->lookAhead() == '='))
2918
+ {
2919
+ ast->declarator = decl;
2920
+
2921
+ if (session->token_stream->lookAhead() == '=')
2922
+ {
2923
+ advance();
2924
+
2925
+ parseExpression(ast->expression);
2926
+ }
2927
+
2928
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2929
+ node = ast;
2930
+ return true;
2931
+ }
2932
+ }
2933
+
2934
+ ast->type_specifier = 0;
2935
+
2936
+ rewind(start);
2937
+
2938
+ if (!parseCommaExpression(ast->expression)) {
2939
+ return false;
2940
+ }
2941
+ Q_ASSERT(ast->expression);
2942
+
2943
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2944
+ node = ast;
2945
+
2946
+ return true;
2947
+ }
2948
+
2949
+
2950
+ bool Parser::parseWhileStatement(StatementAST *&node)
2951
+ {
2952
+ std::size_t start = session->token_stream->cursor();
2953
+
2954
+ ADVANCE(Token_while, "while");
2955
+ ADVANCE('(' , "(");
2956
+
2957
+ ConditionAST *cond = 0;
2958
+ if (!parseCondition(cond))
2959
+ {
2960
+ reportError("Condition expected");
2961
+ return false;
2962
+ }
2963
+ ADVANCE(')', ")");
2964
+
2965
+ StatementAST *body = 0;
2966
+ if (!parseStatement(body))
2967
+ {
2968
+ reportError("Statement expected");
2969
+ return false;
2970
+ }
2971
+
2972
+ WhileStatementAST *ast = CreateNode<WhileStatementAST>(session->mempool);
2973
+ ast->condition = cond;
2974
+ ast->statement = body;
2975
+
2976
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
2977
+ node = ast;
2978
+
2979
+ return true;
2980
+ }
2981
+
2982
+ bool Parser::parseDoStatement(StatementAST *&node)
2983
+ {
2984
+ std::size_t start = session->token_stream->cursor();
2985
+
2986
+ ADVANCE(Token_do, "do");
2987
+
2988
+ StatementAST *body = 0;
2989
+ if (!parseStatement(body))
2990
+ {
2991
+ reportError(("Statement expected"));
2992
+ //return false;
2993
+ }
2994
+
2995
+ ADVANCE_NR(Token_while, "while");
2996
+ ADVANCE_NR('(' , "(");
2997
+
2998
+ ExpressionAST *expr = 0;
2999
+ if (!parseCommaExpression(expr))
3000
+ {
3001
+ reportError(("Expression expected"));
3002
+ //return false;
3003
+ }
3004
+
3005
+ ADVANCE_NR(')', ")");
3006
+ ADVANCE_NR(';', ";");
3007
+
3008
+ DoStatementAST *ast = CreateNode<DoStatementAST>(session->mempool);
3009
+ ast->statement = body;
3010
+ ast->expression = expr;
3011
+
3012
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3013
+ node = ast;
3014
+
3015
+ return true;
3016
+ }
3017
+
3018
+ bool Parser::parseForStatement(StatementAST *&node)
3019
+ {
3020
+ std::size_t start = session->token_stream->cursor();
3021
+
3022
+ ADVANCE(Token_for, "for");
3023
+ ADVANCE('(', "(");
3024
+
3025
+ StatementAST *init = 0;
3026
+ if (!parseForInitStatement(init))
3027
+ {
3028
+ reportError(("'for' initialization expected"));
3029
+ return false;
3030
+ }
3031
+
3032
+ ConditionAST *cond = 0;
3033
+ parseCondition(cond);
3034
+ ADVANCE(';', ";");
3035
+
3036
+ ExpressionAST *expr = 0;
3037
+ parseCommaExpression(expr);
3038
+ ADVANCE(')', ")");
3039
+
3040
+ StatementAST *body = 0;
3041
+ if (!parseStatement(body))
3042
+ return false;
3043
+
3044
+ ForStatementAST *ast = CreateNode<ForStatementAST>(session->mempool);
3045
+ ast->init_statement = init;
3046
+ ast->condition = cond;
3047
+ ast->expression = expr;
3048
+ ast->statement = body;
3049
+
3050
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3051
+ node = ast;
3052
+
3053
+ return true;
3054
+ }
3055
+
3056
+ bool Parser::parseForInitStatement(StatementAST *&node)
3057
+ {
3058
+ if (parseDeclarationStatement(node))
3059
+ return true;
3060
+
3061
+ return parseExpressionStatement(node);
3062
+ }
3063
+
3064
+ bool Parser::parseCompoundStatement(StatementAST *&node)
3065
+ {
3066
+ std::size_t start = session->token_stream->cursor();
3067
+
3068
+ CHECK('{');
3069
+
3070
+ CompoundStatementAST *ast = CreateNode<CompoundStatementAST>(session->mempool);
3071
+ while (session->token_stream->lookAhead())
3072
+ {
3073
+ if (session->token_stream->lookAhead() == '}')
3074
+ break;
3075
+
3076
+ std::size_t startStmt = session->token_stream->cursor();
3077
+
3078
+ StatementAST *stmt = 0;
3079
+ if (!parseStatement(stmt))
3080
+ {
3081
+ if (startStmt == session->token_stream->cursor())
3082
+ advance();
3083
+
3084
+ skipUntilStatement();
3085
+ }
3086
+ else
3087
+ {
3088
+ ast->statements = snoc(ast->statements, stmt, session->mempool);
3089
+ }
3090
+ }
3091
+
3092
+ clearComment();
3093
+ ADVANCE_NR('}', "}");
3094
+
3095
+
3096
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3097
+ node = ast;
3098
+
3099
+ return true;
3100
+ }
3101
+
3102
+ bool Parser::parseIfStatement(StatementAST *&node)
3103
+ {
3104
+ std::size_t start = session->token_stream->cursor();
3105
+
3106
+ ADVANCE(Token_if, "if");
3107
+
3108
+ ADVANCE('(' , "(");
3109
+ IfStatementAST *ast = CreateNode<IfStatementAST>(session->mempool);
3110
+
3111
+ ConditionAST *cond = 0;
3112
+ if (!parseCondition(cond))
3113
+ {
3114
+ reportError(("Condition expected"));
3115
+ return false;
3116
+ }
3117
+
3118
+ ADVANCE(')', ")");
3119
+
3120
+ StatementAST *stmt = 0;
3121
+ if (!parseStatement(stmt))
3122
+ {
3123
+ reportError(("Statement expected"));
3124
+ return false;
3125
+ }
3126
+
3127
+ ast->condition = cond;
3128
+ ast->statement = stmt;
3129
+
3130
+ if (session->token_stream->lookAhead() == Token_else)
3131
+ {
3132
+ advance();
3133
+
3134
+ if (!parseStatement(ast->else_statement))
3135
+ {
3136
+ reportError(("Statement expected"));
3137
+ return false;
3138
+ }
3139
+ }
3140
+
3141
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3142
+ node = ast;
3143
+
3144
+ return true;
3145
+ }
3146
+
3147
+ bool Parser::parseSwitchStatement(StatementAST *&node)
3148
+ {
3149
+ std::size_t start = session->token_stream->cursor();
3150
+ ADVANCE(Token_switch, "switch");
3151
+
3152
+ ADVANCE('(' , "(");
3153
+
3154
+ ConditionAST *cond = 0;
3155
+ if (!parseCondition(cond))
3156
+ {
3157
+ reportError(("Condition expected"));
3158
+ return false;
3159
+ }
3160
+ ADVANCE(')', ")");
3161
+
3162
+ StatementAST *stmt = 0;
3163
+ if (!parseCompoundStatement(stmt))
3164
+ {
3165
+ syntaxError();
3166
+ return false;
3167
+ }
3168
+
3169
+ SwitchStatementAST *ast = CreateNode<SwitchStatementAST>(session->mempool);
3170
+ ast->condition = cond;
3171
+ ast->statement = stmt;
3172
+
3173
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3174
+ node = ast;
3175
+
3176
+ return true;
3177
+ }
3178
+
3179
+ bool Parser::parseLabeledStatement(StatementAST *&node)
3180
+ {
3181
+ switch(session->token_stream->lookAhead())
3182
+ {
3183
+ case Token_identifier:
3184
+ case Token_default:
3185
+ {
3186
+ std::size_t start = session->token_stream->cursor();
3187
+ if (session->token_stream->lookAhead(1) == ':')
3188
+ {
3189
+ advance();
3190
+ advance();
3191
+
3192
+ StatementAST *stmt = 0;
3193
+ if (parseStatement(stmt))
3194
+ {
3195
+ LabeledStatementAST* ast = CreateNode<LabeledStatementAST>(session->mempool);
3196
+ ast->label = start;
3197
+ ast->statement = stmt;
3198
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3199
+ node = ast;
3200
+ return true;
3201
+ }
3202
+ }
3203
+ break;
3204
+ }
3205
+
3206
+ case Token_case:
3207
+ {
3208
+ std::size_t start = session->token_stream->cursor();
3209
+
3210
+ advance();
3211
+ ExpressionAST *expr = 0;
3212
+ if (!parseConstantExpression(expr))
3213
+ {
3214
+ reportError(("Expression expected"));
3215
+ }
3216
+ else if (session->token_stream->lookAhead() == Token_ellipsis)
3217
+ {
3218
+ advance();
3219
+
3220
+ if (!parseConstantExpression(expr))
3221
+ {
3222
+ reportError(("Expression expected"));
3223
+ }
3224
+ }
3225
+ ADVANCE(':', ":");
3226
+
3227
+ LabeledStatementAST* ast = CreateNode<LabeledStatementAST>(session->mempool);
3228
+ ast->label = start;
3229
+ ast->expression = expr;
3230
+
3231
+ parseStatement(ast->statement);
3232
+
3233
+ if(ast->expression || ast->statement) {
3234
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3235
+ node = ast;
3236
+ return true;
3237
+ }
3238
+ }
3239
+ break;
3240
+
3241
+ }
3242
+
3243
+ return false;
3244
+ }
3245
+
3246
+ bool Parser::parseBlockDeclaration(DeclarationAST *&node)
3247
+ {
3248
+ switch(session->token_stream->lookAhead())
3249
+ {
3250
+ case Token_typedef:
3251
+ return parseTypedef(node);
3252
+ case Token_using:
3253
+ return parseUsing(node);
3254
+ case Token_asm:
3255
+ return parseAsmDefinition(node);
3256
+ case Token_namespace:
3257
+ return parseNamespaceAliasDefinition(node);
3258
+ }
3259
+
3260
+ Comment mcomment = comment();
3261
+ clearComment();
3262
+
3263
+ std::size_t start = session->token_stream->cursor();
3264
+
3265
+ const ListNode<std::size_t> *cv = 0;
3266
+ parseCvQualify(cv);
3267
+
3268
+ const ListNode<std::size_t> *storageSpec = 0;
3269
+ parseStorageClassSpecifier(storageSpec);
3270
+
3271
+ parseCvQualify(cv);
3272
+
3273
+ TypeSpecifierAST *spec = 0;
3274
+ if (!parseTypeSpecifierOrClassSpec(spec))
3275
+ { // replace with simpleTypeSpecifier?!?!
3276
+ rewind(start);
3277
+ return false;
3278
+ }
3279
+
3280
+ parseCvQualify(cv);
3281
+ spec->cv = cv;
3282
+
3283
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
3284
+ parseInitDeclaratorList(declarators);
3285
+
3286
+ if (session->token_stream->lookAhead() != ';')
3287
+ {
3288
+ rewind(start);
3289
+ return false;
3290
+ }
3291
+ advance();
3292
+
3293
+ SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(session->mempool);
3294
+ ast->type_specifier = spec;
3295
+ ast->init_declarators = declarators;
3296
+
3297
+ if(mcomment)
3298
+ addComment(ast, mcomment);
3299
+
3300
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3301
+ node = ast;
3302
+
3303
+ return true;
3304
+ }
3305
+
3306
+ bool Parser::parseNamespaceAliasDefinition(DeclarationAST *&node)
3307
+ {
3308
+ std::size_t start = session->token_stream->cursor();
3309
+
3310
+ CHECK(Token_namespace);
3311
+
3312
+ NamespaceAliasDefinitionAST *ast
3313
+ = CreateNode<NamespaceAliasDefinitionAST>(session->mempool);
3314
+
3315
+ size_t pos = session->token_stream->cursor();
3316
+ ADVANCE(Token_identifier, "identifier");
3317
+ ast->namespace_name = pos;
3318
+
3319
+ ADVANCE('=', "=");
3320
+
3321
+ if (!parseName(ast->alias_name))
3322
+ {
3323
+ reportError(("Namespace name expected"));
3324
+ }
3325
+
3326
+ ADVANCE(';', ";");
3327
+
3328
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3329
+ node = ast;
3330
+
3331
+ return true;
3332
+ }
3333
+
3334
+ bool Parser::parseDeclarationStatement(StatementAST *&node)
3335
+ {
3336
+ std::size_t start = session->token_stream->cursor();
3337
+
3338
+ DeclarationAST *decl = 0;
3339
+ if (!parseBlockDeclaration(decl))
3340
+ return false;
3341
+
3342
+ DeclarationStatementAST *ast = CreateNode<DeclarationStatementAST>(session->mempool);
3343
+ ast->declaration = decl;
3344
+
3345
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3346
+ node = ast;
3347
+
3348
+ return true;
3349
+ }
3350
+
3351
+ bool Parser::parseDeclarationInternal(DeclarationAST *&node)
3352
+ {
3353
+ std::size_t start = session->token_stream->cursor();
3354
+
3355
+ // that is for the case '__declspec(dllexport) int ...' or
3356
+ // '__declspec(dllexport) inline int ...', etc.
3357
+ WinDeclSpecAST *winDeclSpec = 0;
3358
+ parseWinDeclSpec(winDeclSpec);
3359
+
3360
+ const ListNode<std::size_t> *funSpec = 0;
3361
+ bool hasFunSpec = parseFunctionSpecifier(funSpec);
3362
+
3363
+ const ListNode<std::size_t> *cv = 0;
3364
+ parseCvQualify(cv);
3365
+
3366
+ const ListNode<std::size_t> *storageSpec = 0;
3367
+ bool hasStorageSpec = parseStorageClassSpecifier(storageSpec);
3368
+
3369
+ // needed here for 'friend __declspec(dllimport) inline ...'
3370
+ if (!winDeclSpec)
3371
+ parseWinDeclSpec(winDeclSpec);
3372
+
3373
+ if (hasStorageSpec && !hasFunSpec)
3374
+ hasFunSpec = parseFunctionSpecifier(funSpec);
3375
+
3376
+ // that is for the case 'friend __declspec(dllexport) ....'
3377
+ if (!winDeclSpec)
3378
+ parseWinDeclSpec(winDeclSpec);
3379
+
3380
+ if (!cv)
3381
+ parseCvQualify(cv);
3382
+
3383
+ int index = session->token_stream->cursor();
3384
+ NameAST *name = 0;
3385
+ if (parseName(name, AcceptTemplate) && session->token_stream->lookAhead() == '(')
3386
+ {
3387
+ // no type specifier, maybe a constructor or a cast operator??
3388
+
3389
+ rewind(index);
3390
+
3391
+ InitDeclaratorAST *declarator = 0;
3392
+ if (parseInitDeclarator(declarator))
3393
+ {
3394
+ switch(session->token_stream->lookAhead())
3395
+ {
3396
+ case ';':
3397
+ {
3398
+ advance();
3399
+
3400
+ SimpleDeclarationAST *ast
3401
+ = CreateNode<SimpleDeclarationAST>(session->mempool);
3402
+ ast->init_declarators = snoc(ast->init_declarators,
3403
+ declarator, session->mempool);
3404
+ ast->function_specifiers = funSpec;
3405
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3406
+ node = ast;
3407
+ }
3408
+ return true;
3409
+
3410
+ case ':':
3411
+ {
3412
+ CtorInitializerAST *ctorInit = 0;
3413
+ StatementAST *funBody = 0;
3414
+
3415
+ if (parseCtorInitializer(ctorInit)
3416
+ && parseFunctionBody(funBody))
3417
+ {
3418
+ FunctionDefinitionAST *ast
3419
+ = CreateNode<FunctionDefinitionAST>(session->mempool);
3420
+
3421
+ ast->storage_specifiers = storageSpec;
3422
+ ast->function_specifiers = funSpec;
3423
+ ast->init_declarator = declarator;
3424
+ ast->function_body = funBody;
3425
+ ast->constructor_initializers = ctorInit;
3426
+
3427
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3428
+ node = ast;
3429
+
3430
+ return true;
3431
+ }
3432
+ }
3433
+ break;
3434
+
3435
+ case Token_try:
3436
+ case '{':
3437
+ {
3438
+ StatementAST *funBody = 0;
3439
+ if (parseFunctionBody(funBody))
3440
+ {
3441
+ FunctionDefinitionAST *ast
3442
+ = CreateNode<FunctionDefinitionAST>(session->mempool);
3443
+
3444
+ ast->storage_specifiers = storageSpec;
3445
+ ast->function_specifiers = funSpec;
3446
+ ast->init_declarator = declarator;
3447
+ ast->function_body = funBody;
3448
+
3449
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3450
+ node = ast;
3451
+
3452
+ return true;
3453
+ }
3454
+ }
3455
+ break;
3456
+
3457
+ case '(':
3458
+ case '[':
3459
+ // ops!! it seems a declarator
3460
+ goto start_decl;
3461
+ break;
3462
+ }
3463
+
3464
+ }
3465
+ }
3466
+
3467
+ start_decl:
3468
+ rewind(index);
3469
+
3470
+ if (session->token_stream->lookAhead() == Token_const
3471
+ && session->token_stream->lookAhead(1) == Token_identifier
3472
+ && session->token_stream->lookAhead(2) == '=')
3473
+ {
3474
+ // constant definition
3475
+ advance(); // skip const
3476
+
3477
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
3478
+ if (!parseInitDeclaratorList(declarators))
3479
+ {
3480
+ syntaxError();
3481
+ return false;
3482
+ }
3483
+
3484
+ ADVANCE(';', ";");
3485
+
3486
+ #if defined(__GNUC__)
3487
+ #warning "mark the ast as constant"
3488
+ #endif
3489
+ SimpleDeclarationAST *ast = CreateNode<SimpleDeclarationAST>(session->mempool);
3490
+ ast->init_declarators = declarators;
3491
+
3492
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3493
+ node = ast;
3494
+
3495
+ return true;
3496
+ }
3497
+
3498
+ TypeSpecifierAST *spec = 0;
3499
+ if (parseTypeSpecifier(spec))
3500
+ {
3501
+ Q_ASSERT(spec != 0);
3502
+
3503
+ if (!hasFunSpec)
3504
+ parseFunctionSpecifier(funSpec); // e.g. "void inline"
3505
+
3506
+ spec->cv = cv;
3507
+
3508
+ const ListNode<InitDeclaratorAST*> *declarators = 0;
3509
+ InitDeclaratorAST *decl = 0;
3510
+ int startDeclarator = session->token_stream->cursor();
3511
+ bool maybeFunctionDefinition = false;
3512
+
3513
+ if (session->token_stream->lookAhead() != ';')
3514
+ {
3515
+ if (parseInitDeclarator(decl) && (session->token_stream->lookAhead() == '{' || session->token_stream->lookAhead() == Token_try))
3516
+ {
3517
+ // function definition
3518
+ maybeFunctionDefinition = true;
3519
+ }
3520
+ else
3521
+ {
3522
+ rewind(startDeclarator);
3523
+ if (!parseInitDeclaratorList(declarators))
3524
+ {
3525
+ syntaxError();
3526
+ return false;
3527
+ }
3528
+ }
3529
+ }
3530
+
3531
+ switch(session->token_stream->lookAhead())
3532
+ {
3533
+ case ';':
3534
+ {
3535
+ advance();
3536
+ SimpleDeclarationAST *ast
3537
+ = CreateNode<SimpleDeclarationAST>(session->mempool);
3538
+
3539
+ ast->storage_specifiers = storageSpec;
3540
+ ast->function_specifiers = funSpec;
3541
+ ast->type_specifier = spec;
3542
+ ast->win_decl_specifiers = winDeclSpec;
3543
+ ast->init_declarators = declarators;
3544
+
3545
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3546
+ node = ast;
3547
+ }
3548
+ return true;
3549
+
3550
+ case Token_try:
3551
+ case '{':
3552
+ {
3553
+ if (!maybeFunctionDefinition)
3554
+ {
3555
+ syntaxError();
3556
+ return false;
3557
+ }
3558
+
3559
+ StatementAST *funBody = 0;
3560
+ if (parseFunctionBody(funBody))
3561
+ {
3562
+ FunctionDefinitionAST *ast
3563
+ = CreateNode<FunctionDefinitionAST>(session->mempool);
3564
+
3565
+ ast->win_decl_specifiers = winDeclSpec;
3566
+ ast->storage_specifiers = storageSpec;
3567
+ ast->function_specifiers = funSpec;
3568
+ ast->type_specifier = spec;
3569
+ ast->init_declarator = decl;
3570
+ ast->function_body = funBody;
3571
+
3572
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3573
+ node = ast;
3574
+
3575
+ return true;
3576
+ }
3577
+ }
3578
+ break;
3579
+ } // end switch
3580
+ }
3581
+
3582
+ syntaxError();
3583
+ return false;
3584
+ }
3585
+
3586
+ bool Parser::parseFunctionBody(StatementAST *&node)
3587
+ {
3588
+ if (session->token_stream->lookAhead() == Token_try)
3589
+ return parseTryBlockStatement(node);
3590
+
3591
+ return parseCompoundStatement(node);
3592
+ }
3593
+
3594
+ bool Parser::parseTypeSpecifierOrClassSpec(TypeSpecifierAST *&node)
3595
+ {
3596
+ if (parseClassSpecifier(node))
3597
+ return true;
3598
+ else if (parseEnumSpecifier(node))
3599
+ return true;
3600
+ else if (parseTypeSpecifier(node))
3601
+ return true;
3602
+
3603
+ return false;
3604
+ }
3605
+
3606
+ bool Parser::parseTryBlockStatement(StatementAST *&node)
3607
+ {
3608
+ std::size_t start = session->token_stream->cursor();
3609
+
3610
+ CHECK(Token_try);
3611
+
3612
+ TryBlockStatementAST *ast = CreateNode<TryBlockStatementAST>(session->mempool);
3613
+
3614
+ StatementAST *stmt = 0;
3615
+ if (!parseCompoundStatement(stmt))
3616
+ {
3617
+ syntaxError();
3618
+ return false;
3619
+ }
3620
+ ast->try_block = stmt;
3621
+
3622
+ if (session->token_stream->lookAhead() != Token_catch)
3623
+ {
3624
+ reportError(("'catch' expected after try block"));
3625
+ return false;
3626
+ }
3627
+
3628
+ while (session->token_stream->lookAhead() == Token_catch)
3629
+ {
3630
+ std::size_t catchStart = session->token_stream->cursor();
3631
+
3632
+ advance();
3633
+ ADVANCE('(', "(");
3634
+ ConditionAST *cond = 0;
3635
+ if (session->token_stream->lookAhead() == Token_ellipsis)
3636
+ {
3637
+ advance();
3638
+ }
3639
+ else if(session->token_stream->lookAhead() == ')') {
3640
+ //Do nothing, this is equivalent to ellipsis
3641
+ } else if (!parseCondition(cond, false))
3642
+ {
3643
+ reportError(("condition expected"));
3644
+ return false;
3645
+ }
3646
+ ADVANCE(')', ")");
3647
+
3648
+ StatementAST *body = 0;
3649
+ if (!parseCompoundStatement(body))
3650
+ {
3651
+ syntaxError();
3652
+ return false;
3653
+ }
3654
+
3655
+ CatchStatementAST *catch_ast = CreateNode<CatchStatementAST>(session->mempool);
3656
+ catch_ast->condition = cond;
3657
+ catch_ast->statement = body;
3658
+ UPDATE_POS(catch_ast, catchStart, _M_last_valid_token+1);
3659
+
3660
+ ast->catch_blocks = snoc(ast->catch_blocks, catch_ast, session->mempool);
3661
+ }
3662
+
3663
+ node = ast;
3664
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3665
+ return true;
3666
+ }
3667
+
3668
+ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
3669
+ {
3670
+ std::size_t start = session->token_stream->cursor();
3671
+
3672
+ PrimaryExpressionAST *ast = CreateNode<PrimaryExpressionAST>(session->mempool);
3673
+
3674
+ switch(session->token_stream->lookAhead())
3675
+ {
3676
+ case Token_string_literal:
3677
+ parseStringLiteral(ast->literal);
3678
+ break;
3679
+
3680
+ case Token_number_literal:
3681
+ case Token_char_literal:
3682
+ case Token_true:
3683
+ case Token_false:
3684
+ case Token_this:
3685
+ ast->token = session->token_stream->cursor();
3686
+ advance();
3687
+ break;
3688
+
3689
+ case '(':
3690
+ advance();
3691
+
3692
+ if (session->token_stream->lookAhead() == '{')
3693
+ {
3694
+ if (!parseCompoundStatement(ast->expression_statement))
3695
+ return false;
3696
+ }
3697
+ else
3698
+ {
3699
+ if (!parseExpression(ast->sub_expression))
3700
+ return false;
3701
+ }
3702
+
3703
+ CHECK(')');
3704
+ break;
3705
+
3706
+ default:
3707
+ if (!parseName(ast->name, EventuallyAcceptTemplate))
3708
+ return false;
3709
+
3710
+ break;
3711
+ }
3712
+
3713
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3714
+ node = ast;
3715
+
3716
+ return true;
3717
+ }
3718
+
3719
+
3720
+ /*
3721
+ postfix-expression-internal:
3722
+ [ expression ]
3723
+ ( expression-list [opt] )
3724
+ (.|->) template [opt] id-expression
3725
+ (.|->) pseudo-destructor-name
3726
+ ++
3727
+ --
3728
+ */
3729
+ bool Parser::parsePostfixExpressionInternal(ExpressionAST *&node)
3730
+ {
3731
+ std::size_t start = session->token_stream->cursor();
3732
+
3733
+ switch (session->token_stream->lookAhead())
3734
+ {
3735
+ case '[':
3736
+ {
3737
+ advance();
3738
+ ExpressionAST *expr = 0;
3739
+ parseExpression(expr);
3740
+ CHECK(']');
3741
+
3742
+ SubscriptExpressionAST *ast
3743
+ = CreateNode<SubscriptExpressionAST>(session->mempool);
3744
+
3745
+ ast->subscript = expr;
3746
+
3747
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3748
+ node = ast;
3749
+ }
3750
+ return true;
3751
+
3752
+ case '(':
3753
+ {
3754
+ advance();
3755
+ ExpressionAST *expr = 0;
3756
+ parseExpression(expr);
3757
+ CHECK(')');
3758
+
3759
+ FunctionCallAST *ast = CreateNode<FunctionCallAST>(session->mempool);
3760
+ ast->arguments = expr;
3761
+
3762
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3763
+ node = ast;
3764
+ }
3765
+ return true;
3766
+
3767
+ case '.':
3768
+ case Token_arrow:
3769
+ {
3770
+ std::size_t op = session->token_stream->cursor();
3771
+ advance();
3772
+
3773
+ // std::size_t templ = 0;
3774
+ // if (session->token_stream->lookAhead() == Token_template)
3775
+ // {
3776
+ // templ = session->token_stream->cursor();
3777
+ // advance();
3778
+ // }
3779
+
3780
+ NameAST *name = 0;
3781
+ if (!parseName(name, EventuallyAcceptTemplate))
3782
+ return false;
3783
+
3784
+ ClassMemberAccessAST *ast = CreateNode<ClassMemberAccessAST>(session->mempool);
3785
+ ast->op = op;
3786
+ ast->name = name;
3787
+
3788
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3789
+ node = ast;
3790
+ }
3791
+ return true;
3792
+
3793
+ case Token_incr:
3794
+ case Token_decr:
3795
+ {
3796
+ std::size_t op = session->token_stream->cursor();
3797
+ advance();
3798
+
3799
+ IncrDecrExpressionAST *ast = CreateNode<IncrDecrExpressionAST>(session->mempool);
3800
+ ast->op = op;
3801
+
3802
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3803
+ node = ast;
3804
+ }
3805
+ return true;
3806
+
3807
+ default:
3808
+ return false;
3809
+ }
3810
+ }
3811
+
3812
+ /*
3813
+ postfix-expression:
3814
+ simple-type-specifier ( expression-list [opt] )
3815
+ primary-expression postfix-expression-internal*
3816
+ */
3817
+ bool Parser::parsePostfixExpression(ExpressionAST *&node)
3818
+ {
3819
+ std::size_t start = session->token_stream->cursor();
3820
+
3821
+ switch (session->token_stream->lookAhead())
3822
+ {
3823
+ case Token_dynamic_cast:
3824
+ case Token_static_cast:
3825
+ case Token_reinterpret_cast:
3826
+ case Token_const_cast:
3827
+ {
3828
+ std::size_t castOp = session->token_stream->cursor();
3829
+ advance();
3830
+
3831
+ CHECK('<');
3832
+ TypeIdAST *typeId = 0;
3833
+ parseTypeId(typeId);
3834
+ CHECK('>');
3835
+
3836
+ CHECK('(');
3837
+ ExpressionAST *expr = 0;
3838
+ parseCommaExpression(expr);
3839
+ CHECK(')');
3840
+
3841
+ CppCastExpressionAST *ast = CreateNode<CppCastExpressionAST>(session->mempool);
3842
+ ast->op = castOp;
3843
+ ast->type_id = typeId;
3844
+ ast->expression = expr;
3845
+
3846
+ ExpressionAST *e = 0;
3847
+ while (parsePostfixExpressionInternal(e))
3848
+ {
3849
+ ast->sub_expressions = snoc(ast->sub_expressions, e, session->mempool);
3850
+ }
3851
+
3852
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3853
+ node = ast;
3854
+ }
3855
+ return true;
3856
+
3857
+ case Token_typename:
3858
+ {
3859
+ std::size_t token = session->token_stream->cursor();
3860
+ advance();
3861
+
3862
+ NameAST* name = 0;
3863
+ if (!parseName(name, AcceptTemplate))
3864
+ return false;
3865
+
3866
+ CHECK('(');
3867
+ ExpressionAST *expr = 0;
3868
+ parseCommaExpression(expr);
3869
+ CHECK(')');
3870
+
3871
+ TypeIdentificationAST *ast = CreateNode<TypeIdentificationAST>(session->mempool);
3872
+ ast->typename_token = token;
3873
+ ast->name = name;
3874
+ ast->expression = expr;
3875
+
3876
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3877
+ node = ast;
3878
+ }
3879
+ return true;
3880
+
3881
+ case Token_typeid:
3882
+ {
3883
+ advance();
3884
+
3885
+ CHECK('(');
3886
+ TypeIdAST *typeId = 0;
3887
+ parseTypeId(typeId);
3888
+ CHECK(')');
3889
+
3890
+ TypeIdentificationAST *ast = CreateNode<TypeIdentificationAST>(session->mempool);
3891
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3892
+ node = ast;
3893
+ }
3894
+ return true;
3895
+
3896
+ default:
3897
+ break;
3898
+ }
3899
+
3900
+ std::size_t saved_pos = session->token_stream->cursor();
3901
+
3902
+ TypeSpecifierAST *typeSpec = 0;
3903
+ ExpressionAST *expr = 0;
3904
+
3905
+ // let's try to parse a type
3906
+ NameAST *name = 0;
3907
+ if (parseName(name, AcceptTemplate))
3908
+ {
3909
+ Q_ASSERT(name->unqualified_name != 0);
3910
+
3911
+ bool has_template_args
3912
+ = name->unqualified_name->template_arguments != 0;
3913
+
3914
+ if (has_template_args && session->token_stream->lookAhead() == '(')
3915
+ {
3916
+ ExpressionAST *cast_expr = 0;
3917
+ if (parseCastExpression(cast_expr)
3918
+ && cast_expr->kind == AST::Kind_CastExpression)
3919
+ {
3920
+ rewind(saved_pos);
3921
+ parsePrimaryExpression(expr);
3922
+ goto L_no_rewind;
3923
+ }
3924
+ }
3925
+ }
3926
+
3927
+ rewind(saved_pos);
3928
+
3929
+ L_no_rewind:
3930
+ if (!expr && parseSimpleTypeSpecifier(typeSpec,true)
3931
+ && session->token_stream->lookAhead() == '(')
3932
+ {
3933
+ advance(); // skip '('
3934
+ parseCommaExpression(expr);
3935
+ CHECK(')');
3936
+ }
3937
+ else if (expr)
3938
+ {
3939
+ typeSpec = 0;
3940
+ }
3941
+ else
3942
+ {
3943
+ typeSpec = 0;
3944
+ rewind(start);
3945
+
3946
+ if (!parsePrimaryExpression(expr))
3947
+ return false;
3948
+ }
3949
+
3950
+ const ListNode<ExpressionAST*> *sub_expressions = 0;
3951
+
3952
+ ExpressionAST *sub_expression = 0;
3953
+ while (parsePostfixExpressionInternal(sub_expression))
3954
+ {
3955
+ sub_expressions = snoc(sub_expressions, sub_expression, session->mempool);
3956
+ }
3957
+
3958
+ node = expr;
3959
+ if (sub_expressions || !node)
3960
+ {
3961
+ PostfixExpressionAST *ast = CreateNode<PostfixExpressionAST>(session->mempool);
3962
+ ast->type_specifier = typeSpec;
3963
+ ast->expression = expr;
3964
+ ast->sub_expressions = sub_expressions;
3965
+
3966
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
3967
+ node = ast;
3968
+ }
3969
+
3970
+ return true;
3971
+ }
3972
+
3973
+ bool Parser::parseUnaryExpression(ExpressionAST *&node)
3974
+ {
3975
+ std::size_t start = session->token_stream->cursor();
3976
+
3977
+ switch(session->token_stream->lookAhead())
3978
+ {
3979
+ case Token_incr:
3980
+ case Token_decr:
3981
+ case '*':
3982
+ case '&':
3983
+ case '+':
3984
+ case '-':
3985
+ case '!':
3986
+ case Token_not:
3987
+ case '~':
3988
+ {
3989
+ std::size_t op = session->token_stream->cursor();
3990
+ advance();
3991
+
3992
+ ExpressionAST *expr = 0;
3993
+ if (!parseCastExpression(expr))
3994
+ return false;
3995
+
3996
+ UnaryExpressionAST *ast = CreateNode<UnaryExpressionAST>(session->mempool);
3997
+ ast->op = op;
3998
+ ast->expression = expr;
3999
+
4000
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4001
+ node = ast;
4002
+ }
4003
+ return true;
4004
+
4005
+ case Token_sizeof:
4006
+ {
4007
+ std::size_t sizeof_token = session->token_stream->cursor();
4008
+ advance();
4009
+
4010
+ SizeofExpressionAST *ast = CreateNode<SizeofExpressionAST>(session->mempool);
4011
+ ast->sizeof_token = sizeof_token;
4012
+
4013
+ std::size_t index = session->token_stream->cursor();
4014
+ if (session->token_stream->lookAhead() == '(')
4015
+ {
4016
+ advance();
4017
+ if (parseTypeId(ast->type_id) && session->token_stream->lookAhead() == ')')
4018
+ {
4019
+ advance(); // skip )
4020
+
4021
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4022
+ node = ast;
4023
+ return true;
4024
+ }
4025
+
4026
+ ast->type_id = 0;
4027
+ rewind(index);
4028
+ }
4029
+
4030
+ if (!parseUnaryExpression(ast->expression))
4031
+ return false;
4032
+
4033
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4034
+ node = ast;
4035
+ return true;
4036
+ }
4037
+
4038
+ default:
4039
+ break;
4040
+ }
4041
+
4042
+ int token = session->token_stream->lookAhead();
4043
+
4044
+ if (token == Token_new
4045
+ || (token == Token_scope && session->token_stream->lookAhead(1) == Token_new))
4046
+ return parseNewExpression(node);
4047
+
4048
+ if (token == Token_delete
4049
+ || (token == Token_scope && session->token_stream->lookAhead(1) == Token_delete))
4050
+ return parseDeleteExpression(node);
4051
+
4052
+ return parsePostfixExpression(node);
4053
+ }
4054
+
4055
+ bool Parser::parseNewExpression(ExpressionAST *&node)
4056
+ {
4057
+ std::size_t start = session->token_stream->cursor();
4058
+
4059
+ NewExpressionAST *ast = CreateNode<NewExpressionAST>(session->mempool);
4060
+
4061
+ if (session->token_stream->lookAhead() == Token_scope
4062
+ && session->token_stream->lookAhead(1) == Token_new)
4063
+ {
4064
+ ast->scope_token = session->token_stream->cursor();
4065
+ advance();
4066
+ }
4067
+
4068
+ size_t pos = session->token_stream->cursor();
4069
+ CHECK(Token_new);
4070
+ ast->new_token = pos;
4071
+
4072
+ if (session->token_stream->lookAhead() == '(')
4073
+ {
4074
+ advance();
4075
+ parseCommaExpression(ast->expression);
4076
+ CHECK(')');
4077
+ }
4078
+
4079
+ if (session->token_stream->lookAhead() == '(')
4080
+ {
4081
+ advance();
4082
+ parseTypeId(ast->type_id);
4083
+ CHECK(')');
4084
+ }
4085
+ else
4086
+ {
4087
+ parseNewTypeId(ast->new_type_id);
4088
+ }
4089
+
4090
+ parseNewInitializer(ast->new_initializer);
4091
+
4092
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4093
+ node = ast;
4094
+
4095
+ return true;
4096
+ }
4097
+
4098
+ bool Parser::parseNewTypeId(NewTypeIdAST *&node)
4099
+ {
4100
+ std::size_t start = session->token_stream->cursor();
4101
+
4102
+ TypeSpecifierAST *typeSpec = 0;
4103
+ if (!parseTypeSpecifier(typeSpec))
4104
+ return false;
4105
+
4106
+ NewTypeIdAST *ast = CreateNode<NewTypeIdAST>(session->mempool);
4107
+ ast->type_specifier = typeSpec;
4108
+
4109
+ parseNewDeclarator(ast->new_declarator);
4110
+
4111
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4112
+ node = ast;
4113
+
4114
+ return true;
4115
+ }
4116
+
4117
+ bool Parser::parseNewDeclarator(NewDeclaratorAST *&node)
4118
+ {
4119
+ std::size_t start = session->token_stream->cursor();
4120
+
4121
+ NewDeclaratorAST *ast = CreateNode<NewDeclaratorAST>(session->mempool);
4122
+ PtrOperatorAST *ptrOp = 0;
4123
+ if (parsePtrOperator(ptrOp))
4124
+ {
4125
+ ast->ptr_op = ptrOp;
4126
+ parseNewDeclarator(ast->sub_declarator);
4127
+ }
4128
+
4129
+ while (session->token_stream->lookAhead() == '[')
4130
+ {
4131
+ advance();
4132
+ ExpressionAST *expr = 0;
4133
+ parseExpression(expr);
4134
+ ast->expressions = snoc(ast->expressions, expr, session->mempool);
4135
+ ADVANCE(']', "]");
4136
+ }
4137
+
4138
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4139
+ node = ast;
4140
+
4141
+ return true;
4142
+ }
4143
+
4144
+ bool Parser::parseNewInitializer(NewInitializerAST *&node)
4145
+ {
4146
+ std::size_t start = session->token_stream->cursor();
4147
+
4148
+ CHECK('(');
4149
+
4150
+ NewInitializerAST *ast = CreateNode<NewInitializerAST>(session->mempool);
4151
+
4152
+ parseCommaExpression(ast->expression);
4153
+
4154
+ CHECK(')');
4155
+
4156
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4157
+ node = ast;
4158
+
4159
+ return true;
4160
+ }
4161
+
4162
+ bool Parser::parseDeleteExpression(ExpressionAST *&node)
4163
+ {
4164
+ std::size_t start = session->token_stream->cursor();
4165
+
4166
+ DeleteExpressionAST *ast = CreateNode<DeleteExpressionAST>(session->mempool);
4167
+
4168
+ if (session->token_stream->lookAhead() == Token_scope
4169
+ && session->token_stream->lookAhead(1) == Token_delete)
4170
+ {
4171
+ ast->scope_token = session->token_stream->cursor();
4172
+ advance();
4173
+ }
4174
+
4175
+ size_t pos = session->token_stream->cursor();
4176
+ CHECK(Token_delete);
4177
+ ast->delete_token = pos;
4178
+
4179
+ if (session->token_stream->lookAhead() == '[')
4180
+ {
4181
+ ast->lbracket_token = session->token_stream->cursor();
4182
+ advance();
4183
+ size_t pos = session->token_stream->cursor();
4184
+ CHECK(']');
4185
+ ast->rbracket_token = pos;
4186
+ }
4187
+
4188
+ if (!parseCastExpression(ast->expression))
4189
+ return false;
4190
+
4191
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4192
+ node = ast;
4193
+
4194
+ return true;
4195
+ }
4196
+
4197
+ bool Parser::parseCastExpression(ExpressionAST *&node)
4198
+ {
4199
+ std::size_t start = session->token_stream->cursor();
4200
+
4201
+ if (session->token_stream->lookAhead() == '(')
4202
+ {
4203
+ advance();
4204
+
4205
+ CastExpressionAST *ast = CreateNode<CastExpressionAST>(session->mempool);
4206
+
4207
+ if (parseTypeId(ast->type_id))
4208
+ {
4209
+ if (session->token_stream->lookAhead() == ')')
4210
+ {
4211
+ advance();
4212
+
4213
+ if (parseCastExpression(ast->expression))
4214
+ {
4215
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4216
+ node = ast;
4217
+
4218
+ return true;
4219
+ }
4220
+ }
4221
+ }
4222
+ }
4223
+
4224
+ rewind(start);
4225
+ return parseUnaryExpression(node);
4226
+ }
4227
+
4228
+ bool Parser::parsePmExpression(ExpressionAST *&node)
4229
+ {
4230
+ std::size_t start = session->token_stream->cursor();
4231
+
4232
+ if (!parseCastExpression(node) || !node) // ### fixme
4233
+ return false;
4234
+
4235
+ while (session->token_stream->lookAhead() == Token_ptrmem)
4236
+ {
4237
+ std::size_t op = session->token_stream->cursor();
4238
+ advance();
4239
+
4240
+ ExpressionAST *rightExpr = 0;
4241
+ if (!parseCastExpression(rightExpr))
4242
+ return false;
4243
+
4244
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4245
+ ast->op = op;
4246
+ ast->left_expression = node;
4247
+ ast->right_expression = rightExpr;
4248
+
4249
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4250
+ node = ast;
4251
+ }
4252
+
4253
+ return true;
4254
+ }
4255
+
4256
+ bool Parser::parseMultiplicativeExpression(ExpressionAST *&node)
4257
+ {
4258
+ std::size_t start = session->token_stream->cursor();
4259
+
4260
+ if (!parsePmExpression(node))
4261
+ return false;
4262
+
4263
+ while (session->token_stream->lookAhead() == '*'
4264
+ || session->token_stream->lookAhead() == '/'
4265
+ || session->token_stream->lookAhead() == '%')
4266
+ {
4267
+ std::size_t op = session->token_stream->cursor();
4268
+ advance();
4269
+
4270
+ ExpressionAST *rightExpr = 0;
4271
+ if (!parsePmExpression(rightExpr))
4272
+ return false;
4273
+
4274
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4275
+ ast->op = op;
4276
+ ast->left_expression = node;
4277
+ ast->right_expression = rightExpr;
4278
+
4279
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4280
+ node = ast;
4281
+ }
4282
+
4283
+ return true;
4284
+ }
4285
+
4286
+
4287
+ bool Parser::parseAdditiveExpression(ExpressionAST *&node)
4288
+ {
4289
+ std::size_t start = session->token_stream->cursor();
4290
+
4291
+ if (!parseMultiplicativeExpression(node))
4292
+ return false;
4293
+
4294
+ while (session->token_stream->lookAhead() == '+' || session->token_stream->lookAhead() == '-')
4295
+ {
4296
+ std::size_t op = session->token_stream->cursor();
4297
+ advance();
4298
+
4299
+ ExpressionAST *rightExpr = 0;
4300
+ if (!parseMultiplicativeExpression(rightExpr))
4301
+ return false;
4302
+
4303
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4304
+ ast->op = op;
4305
+ ast->left_expression = node;
4306
+ ast->right_expression = rightExpr;
4307
+
4308
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4309
+ node = ast;
4310
+ }
4311
+
4312
+ return true;
4313
+ }
4314
+
4315
+ bool Parser::parseShiftExpression(ExpressionAST *&node)
4316
+ {
4317
+ std::size_t start = session->token_stream->cursor();
4318
+
4319
+ if (!parseAdditiveExpression(node))
4320
+ return false;
4321
+
4322
+ while (session->token_stream->lookAhead() == Token_shift)
4323
+ {
4324
+ std::size_t op = session->token_stream->cursor();
4325
+ advance();
4326
+
4327
+ ExpressionAST *rightExpr = 0;
4328
+ if (!parseAdditiveExpression(rightExpr))
4329
+ return false;
4330
+
4331
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4332
+ ast->op = op;
4333
+ ast->left_expression = node;
4334
+ ast->right_expression = rightExpr;
4335
+
4336
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4337
+ node = ast;
4338
+ }
4339
+
4340
+ return true;
4341
+ }
4342
+
4343
+ bool Parser::parseRelationalExpression(ExpressionAST *&node, bool templArgs)
4344
+ {
4345
+ std::size_t start = session->token_stream->cursor();
4346
+
4347
+ if (!parseShiftExpression(node))
4348
+ return false;
4349
+
4350
+ while (session->token_stream->lookAhead() == '<'
4351
+ || (session->token_stream->lookAhead() == '>' && !templArgs)
4352
+ || session->token_stream->lookAhead() == Token_leq
4353
+ || session->token_stream->lookAhead() == Token_geq)
4354
+ {
4355
+ std::size_t op = session->token_stream->cursor();
4356
+ advance();
4357
+
4358
+ ExpressionAST *rightExpr = 0;
4359
+ if (!parseShiftExpression(rightExpr))
4360
+ return false;
4361
+
4362
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4363
+ ast->op = op;
4364
+ ast->left_expression = node;
4365
+ ast->right_expression = rightExpr;
4366
+
4367
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4368
+ node = ast;
4369
+ }
4370
+
4371
+ return true;
4372
+ }
4373
+
4374
+ bool Parser::parseEqualityExpression(ExpressionAST *&node, bool templArgs)
4375
+ {
4376
+ std::size_t start = session->token_stream->cursor();
4377
+
4378
+ if (!parseRelationalExpression(node, templArgs))
4379
+ return false;
4380
+
4381
+ while (session->token_stream->lookAhead() == Token_eq
4382
+ || session->token_stream->lookAhead() == Token_not_eq)
4383
+ {
4384
+ std::size_t op = session->token_stream->cursor();
4385
+ advance();
4386
+
4387
+ ExpressionAST *rightExpr = 0;
4388
+ if (!parseRelationalExpression(rightExpr, templArgs))
4389
+ return false;
4390
+
4391
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4392
+ ast->op = op;
4393
+ ast->left_expression = node;
4394
+ ast->right_expression = rightExpr;
4395
+
4396
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4397
+ node = ast;
4398
+ }
4399
+
4400
+ return true;
4401
+ }
4402
+
4403
+ bool Parser::parseAndExpression(ExpressionAST *&node, bool templArgs)
4404
+ {
4405
+ std::size_t start = session->token_stream->cursor();
4406
+
4407
+ if (!parseEqualityExpression(node, templArgs))
4408
+ return false;
4409
+
4410
+ while (session->token_stream->lookAhead() == '&')
4411
+ {
4412
+ std::size_t op = session->token_stream->cursor();
4413
+ advance();
4414
+
4415
+ ExpressionAST *rightExpr = 0;
4416
+ if (!parseEqualityExpression(rightExpr, templArgs))
4417
+ return false;
4418
+
4419
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4420
+ ast->op = op;
4421
+ ast->left_expression = node;
4422
+ ast->right_expression = rightExpr;
4423
+
4424
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4425
+ node = ast;
4426
+ }
4427
+
4428
+ return true;
4429
+ }
4430
+
4431
+ bool Parser::parseExclusiveOrExpression(ExpressionAST *&node, bool templArgs)
4432
+ {
4433
+ std::size_t start = session->token_stream->cursor();
4434
+
4435
+ if (!parseAndExpression(node, templArgs))
4436
+ return false;
4437
+
4438
+ while (session->token_stream->lookAhead() == '^')
4439
+ {
4440
+ std::size_t op = session->token_stream->cursor();
4441
+ advance();
4442
+
4443
+ ExpressionAST *rightExpr = 0;
4444
+ if (!parseAndExpression(rightExpr, templArgs))
4445
+ return false;
4446
+
4447
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4448
+ ast->op = op;
4449
+ ast->left_expression = node;
4450
+ ast->right_expression = rightExpr;
4451
+
4452
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4453
+ node = ast;
4454
+ }
4455
+
4456
+ return true;
4457
+ }
4458
+
4459
+ bool Parser::parseInclusiveOrExpression(ExpressionAST *&node, bool templArgs)
4460
+ {
4461
+ std::size_t start = session->token_stream->cursor();
4462
+
4463
+ if (!parseExclusiveOrExpression(node, templArgs))
4464
+ return false;
4465
+
4466
+ while (session->token_stream->lookAhead() == '|')
4467
+ {
4468
+ std::size_t op = session->token_stream->cursor();
4469
+ advance();
4470
+
4471
+ ExpressionAST *rightExpr = 0;
4472
+ if (!parseExclusiveOrExpression(rightExpr, templArgs))
4473
+ return false;
4474
+
4475
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4476
+ ast->op = op;
4477
+ ast->left_expression = node;
4478
+ ast->right_expression = rightExpr;
4479
+
4480
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4481
+ node = ast;
4482
+ }
4483
+
4484
+ return true;
4485
+ }
4486
+
4487
+ bool Parser::parseLogicalAndExpression(ExpressionAST *&node, bool templArgs)
4488
+ {
4489
+ std::size_t start = session->token_stream->cursor();
4490
+
4491
+ if (!parseInclusiveOrExpression(node, templArgs))
4492
+ return false;
4493
+
4494
+ while (session->token_stream->lookAhead() == Token_and)
4495
+ {
4496
+ std::size_t op = session->token_stream->cursor();
4497
+ advance();
4498
+
4499
+ ExpressionAST *rightExpr = 0;
4500
+ if (!parseInclusiveOrExpression(rightExpr, templArgs))
4501
+ return false;
4502
+
4503
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4504
+ ast->op = op;
4505
+ ast->left_expression = node;
4506
+ ast->right_expression = rightExpr;
4507
+
4508
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4509
+ node = ast;
4510
+ }
4511
+
4512
+ return true;
4513
+ }
4514
+
4515
+ bool Parser::parseLogicalOrExpression(ExpressionAST *&node, bool templArgs)
4516
+ {
4517
+ std::size_t start = session->token_stream->cursor();
4518
+
4519
+ if (!parseLogicalAndExpression(node, templArgs))
4520
+ return false;
4521
+
4522
+ while (session->token_stream->lookAhead() == Token_or)
4523
+ {
4524
+ std::size_t op = session->token_stream->cursor();
4525
+ advance();
4526
+
4527
+ ExpressionAST *rightExpr = 0;
4528
+ if (!parseLogicalAndExpression(rightExpr, templArgs))
4529
+ return false;
4530
+
4531
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4532
+ ast->op = op;
4533
+ ast->left_expression = node;
4534
+ ast->right_expression = rightExpr;
4535
+
4536
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4537
+ node = ast;
4538
+ }
4539
+
4540
+ return true;
4541
+ }
4542
+
4543
+ bool Parser::parseConditionalExpression(ExpressionAST *&node)
4544
+ {
4545
+ std::size_t start = session->token_stream->cursor();
4546
+
4547
+ if (!parseLogicalOrExpression(node))
4548
+ return false;
4549
+
4550
+ if (session->token_stream->lookAhead() == '?')
4551
+ {
4552
+ advance();
4553
+
4554
+ ExpressionAST *leftExpr = 0;
4555
+ if (!parseExpression(leftExpr))
4556
+ return false;
4557
+
4558
+ CHECK(':');
4559
+
4560
+ ExpressionAST *rightExpr = 0;
4561
+ if (!parseAssignmentExpression(rightExpr))
4562
+ return false;
4563
+
4564
+ ConditionalExpressionAST *ast
4565
+ = CreateNode<ConditionalExpressionAST>(session->mempool);
4566
+
4567
+ ast->condition = node;
4568
+ ast->left_expression = leftExpr;
4569
+ ast->right_expression = rightExpr;
4570
+
4571
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4572
+ node = ast;
4573
+ }
4574
+
4575
+ return true;
4576
+ }
4577
+
4578
+ bool Parser::parseAssignmentExpression(ExpressionAST *&node)
4579
+ {
4580
+ std::size_t start = session->token_stream->cursor();
4581
+
4582
+ if(parseSignalSlotExpression(node))
4583
+ return true;
4584
+ //Parsed a signal/slot expression, fine
4585
+
4586
+ if (session->token_stream->lookAhead() == Token_throw && !parseThrowExpression(node))
4587
+ return false;
4588
+ else if (!parseConditionalExpression(node))
4589
+ return false;
4590
+
4591
+ while (session->token_stream->lookAhead() == Token_assign
4592
+ || session->token_stream->lookAhead() == '=')
4593
+ {
4594
+ std::size_t op = session->token_stream->cursor();
4595
+ advance();
4596
+
4597
+ ExpressionAST *rightExpr = 0;
4598
+ if (!parseConditionalExpression(rightExpr))
4599
+ return false;
4600
+
4601
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4602
+ ast->op = op;
4603
+ ast->left_expression = node;
4604
+ ast->right_expression = rightExpr;
4605
+
4606
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4607
+ node = ast;
4608
+ }
4609
+
4610
+ return true;
4611
+ }
4612
+
4613
+ bool Parser::parseConstantExpression(ExpressionAST *&node)
4614
+ {
4615
+ return parseConditionalExpression(node);
4616
+ }
4617
+
4618
+ bool Parser::parseExpression(ExpressionAST *&node)
4619
+ {
4620
+ return parseCommaExpression(node);
4621
+ }
4622
+
4623
+ bool Parser::parseSignalSlotExpression(ExpressionAST *&node) {
4624
+ if(session->token_stream->lookAhead() == Token___qt_sig_slot__) {
4625
+ std::size_t start = session->token_stream->cursor();
4626
+ CHECK(Token___qt_sig_slot__);
4627
+ CHECK('(');
4628
+
4629
+ SignalSlotExpressionAST *ast = CreateNode<SignalSlotExpressionAST>(session->mempool);
4630
+ parseUnqualifiedName(ast->name, false);
4631
+ CHECK('(');
4632
+
4633
+ if(ast->name)
4634
+ parseTemplateArgumentList(ast->name->template_arguments);
4635
+
4636
+ CHECK(')');
4637
+
4638
+ if(ast->name)
4639
+ ast->name->end_token = _M_last_valid_token+1;
4640
+
4641
+ CHECK(')');
4642
+
4643
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4644
+ node = ast;
4645
+
4646
+ return true;
4647
+ }else{
4648
+ return false;
4649
+ }
4650
+ }
4651
+
4652
+ bool Parser::parseCommaExpression(ExpressionAST *&node)
4653
+ {
4654
+ std::size_t start = session->token_stream->cursor();
4655
+
4656
+ if (!parseAssignmentExpression(node))
4657
+ return false;
4658
+
4659
+ while (session->token_stream->lookAhead() == ',')
4660
+ {
4661
+ std::size_t op = session->token_stream->cursor();
4662
+ advance();
4663
+
4664
+ ExpressionAST *rightExpr = 0;
4665
+ if (!parseAssignmentExpression(rightExpr))
4666
+ return false;
4667
+
4668
+ BinaryExpressionAST *ast = CreateNode<BinaryExpressionAST>(session->mempool);
4669
+ ast->op = op;
4670
+ ast->left_expression = node;
4671
+ ast->right_expression = rightExpr;
4672
+
4673
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4674
+ node = ast;
4675
+ }
4676
+
4677
+ return true;
4678
+ }
4679
+
4680
+ bool Parser::parseThrowExpression(ExpressionAST *&node)
4681
+ {
4682
+ std::size_t start = session->token_stream->cursor();
4683
+
4684
+ size_t pos = session->token_stream->cursor();
4685
+
4686
+ CHECK(Token_throw);
4687
+
4688
+ ThrowExpressionAST *ast = CreateNode<ThrowExpressionAST>(session->mempool);
4689
+ ast->throw_token = pos;
4690
+
4691
+ parseAssignmentExpression(ast->expression);
4692
+
4693
+ UPDATE_POS(ast, start, _M_last_valid_token+1);
4694
+ node = ast;
4695
+
4696
+ return true;
4697
+ }
4698
+
4699
+ bool Parser::holdErrors(bool hold)
4700
+ {
4701
+ bool current = _M_hold_errors;
4702
+ _M_hold_errors = hold;
4703
+ return current;
4704
+ }
4705
+
4706
+