rock-qtbindings 4.8.6.5

Sign up to get free protection for your applications and to get access to all the features.
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
+