rock-qtbindings 4.8.6.5

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