shoesgem 0.1424.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (808) hide show
  1. data/LICENSE +30 -0
  2. data/README.rdoc +31 -0
  3. data/lib/shoes.rb +4 -0
  4. data/shoes/CHANGELOG.txt +21 -0
  5. data/shoes/COPYING.txt +30 -0
  6. data/shoes/README.txt +117 -0
  7. data/shoes/VERSION.txt +1 -0
  8. data/shoes/fonts/Coolvetica.ttf +0 -0
  9. data/shoes/fonts/Lacuna.ttf +0 -0
  10. data/shoes/freetype6.dll +0 -0
  11. data/shoes/lib/shoes/cache.rb +54 -0
  12. data/shoes/lib/shoes/data.rb +39 -0
  13. data/shoes/lib/shoes/help.rb +421 -0
  14. data/shoes/lib/shoes/image.rb +25 -0
  15. data/shoes/lib/shoes/inspect.rb +128 -0
  16. data/shoes/lib/shoes/log.rb +48 -0
  17. data/shoes/lib/shoes/minitar.rb +986 -0
  18. data/shoes/lib/shoes/override.rb +38 -0
  19. data/shoes/lib/shoes/pack.rb +503 -0
  20. data/shoes/lib/shoes/search.rb +46 -0
  21. data/shoes/lib/shoes/setup.rb +329 -0
  22. data/shoes/lib/shoes/shy.rb +131 -0
  23. data/shoes/lib/shoes/shybuilder.rb +44 -0
  24. data/shoes/lib/shoes.rb +522 -0
  25. data/shoes/libcairo-2.dll +0 -0
  26. data/shoes/libeay32.dll +0 -0
  27. data/shoes/libexpat-1.dll +0 -0
  28. data/shoes/libfontconfig-1.dll +0 -0
  29. data/shoes/libgio-2.0-0.dll +0 -0
  30. data/shoes/libglib-2.0-0.dll +0 -0
  31. data/shoes/libgmodule-2.0-0.dll +0 -0
  32. data/shoes/libgobject-2.0-0.dll +0 -0
  33. data/shoes/libgthread-2.0-0.dll +0 -0
  34. data/shoes/libiconv2.dll +0 -0
  35. data/shoes/libjpeg-8.dll +0 -0
  36. data/shoes/libpango-1.0-0.dll +0 -0
  37. data/shoes/libpangocairo-1.0-0.dll +0 -0
  38. data/shoes/libpangoft2-1.0-0.dll +0 -0
  39. data/shoes/libpangowin32-1.0-0.dll +0 -0
  40. data/shoes/libpng14-14.dll +0 -0
  41. data/shoes/libportaudio-2.dll +0 -0
  42. data/shoes/libshoes.dll +0 -0
  43. data/shoes/libssl32.dll +0 -0
  44. data/shoes/libungif4.dll +0 -0
  45. data/shoes/msvcrt-ruby191.dll +0 -0
  46. data/shoes/readline5.dll +0 -0
  47. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/fast_xs.so +0 -0
  48. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/blankslate.rb +63 -0
  49. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/builder.rb +216 -0
  50. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/elements.rb +510 -0
  51. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/htmlinfo.rb +691 -0
  52. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/inspect.rb +103 -0
  53. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/modules.rb +40 -0
  54. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/parse.rb +38 -0
  55. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tag.rb +202 -0
  56. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tags.rb +164 -0
  57. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/traverse.rb +838 -0
  58. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/xchar.rb +94 -0
  59. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot.rb +26 -0
  60. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot_scan.so +0 -0
  61. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/core.rb +135 -0
  62. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/rails.rb +58 -0
  63. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/common.rb +354 -0
  64. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/generator.so +0 -0
  65. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/parser.so +0 -0
  66. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext.rb +13 -0
  67. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/version.rb +9 -0
  68. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json.rb +8 -0
  69. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/constants.rb +49 -0
  70. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/database.rb +721 -0
  71. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/api.rb +152 -0
  72. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/driver.rb +307 -0
  73. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/native/driver.rb +219 -0
  74. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/errors.rb +68 -0
  75. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/pragmas.rb +271 -0
  76. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/resultset.rb +180 -0
  77. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/statement.rb +231 -0
  78. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/translator.rb +109 -0
  79. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/value.rb +57 -0
  80. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/version.rb +16 -0
  81. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3.rb +1 -0
  82. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3_api.so +0 -0
  83. data/shoes/ruby/gems/1.9.1/specifications/hpricot-0.8.1.gemspec +32 -0
  84. data/shoes/ruby/gems/1.9.1/specifications/json-shoes-1.1.3.gemspec +34 -0
  85. data/shoes/ruby/gems/1.9.1/specifications/sqlite3-ruby-1.2.5-x86-mswin32.gemspec +46 -0
  86. data/shoes/ruby/lib/English.rb +155 -0
  87. data/shoes/ruby/lib/Win32API.rb +28 -0
  88. data/shoes/ruby/lib/abbrev.rb +103 -0
  89. data/shoes/ruby/lib/base64.rb +91 -0
  90. data/shoes/ruby/lib/benchmark.rb +573 -0
  91. data/shoes/ruby/lib/bigdecimal/jacobian.rb +85 -0
  92. data/shoes/ruby/lib/bigdecimal/ludcmp.rb +86 -0
  93. data/shoes/ruby/lib/bigdecimal/math.rb +237 -0
  94. data/shoes/ruby/lib/bigdecimal/newton.rb +77 -0
  95. data/shoes/ruby/lib/bigdecimal/util.rb +53 -0
  96. data/shoes/ruby/lib/cgi/cookie.rb +144 -0
  97. data/shoes/ruby/lib/cgi/core.rb +786 -0
  98. data/shoes/ruby/lib/cgi/html.rb +1021 -0
  99. data/shoes/ruby/lib/cgi/session/pstore.rb +111 -0
  100. data/shoes/ruby/lib/cgi/session.rb +537 -0
  101. data/shoes/ruby/lib/cgi/util.rb +181 -0
  102. data/shoes/ruby/lib/cgi.rb +274 -0
  103. data/shoes/ruby/lib/cmath.rb +233 -0
  104. data/shoes/ruby/lib/complex.rb +24 -0
  105. data/shoes/ruby/lib/csv.rb +2320 -0
  106. data/shoes/ruby/lib/date/format.rb +1313 -0
  107. data/shoes/ruby/lib/date.rb +1834 -0
  108. data/shoes/ruby/lib/debug.rb +907 -0
  109. data/shoes/ruby/lib/delegate.rb +311 -0
  110. data/shoes/ruby/lib/digest/hmac.rb +274 -0
  111. data/shoes/ruby/lib/digest/sha2.rb +74 -0
  112. data/shoes/ruby/lib/digest.rb +50 -0
  113. data/shoes/ruby/lib/dl/callback.rb +69 -0
  114. data/shoes/ruby/lib/dl/cparser.rb +109 -0
  115. data/shoes/ruby/lib/dl/func.rb +153 -0
  116. data/shoes/ruby/lib/dl/import.rb +215 -0
  117. data/shoes/ruby/lib/dl/pack.rb +173 -0
  118. data/shoes/ruby/lib/dl/stack.rb +146 -0
  119. data/shoes/ruby/lib/dl/struct.rb +213 -0
  120. data/shoes/ruby/lib/dl/types.rb +40 -0
  121. data/shoes/ruby/lib/dl/value.rb +112 -0
  122. data/shoes/ruby/lib/drb/acl.rb +146 -0
  123. data/shoes/ruby/lib/drb/drb.rb +1778 -0
  124. data/shoes/ruby/lib/drb/eq.rb +16 -0
  125. data/shoes/ruby/lib/drb/extserv.rb +71 -0
  126. data/shoes/ruby/lib/drb/extservm.rb +85 -0
  127. data/shoes/ruby/lib/drb/gw.rb +122 -0
  128. data/shoes/ruby/lib/drb/invokemethod.rb +34 -0
  129. data/shoes/ruby/lib/drb/observer.rb +22 -0
  130. data/shoes/ruby/lib/drb/ssl.rb +190 -0
  131. data/shoes/ruby/lib/drb/timeridconv.rb +91 -0
  132. data/shoes/ruby/lib/drb/unix.rb +108 -0
  133. data/shoes/ruby/lib/drb.rb +2 -0
  134. data/shoes/ruby/lib/e2mmap.rb +172 -0
  135. data/shoes/ruby/lib/erb.rb +902 -0
  136. data/shoes/ruby/lib/fileutils.rb +1592 -0
  137. data/shoes/ruby/lib/find.rb +81 -0
  138. data/shoes/ruby/lib/forwardable.rb +270 -0
  139. data/shoes/ruby/lib/ftsearch/analysis/analyzer.rb +16 -0
  140. data/shoes/ruby/lib/ftsearch/analysis/simple_identifier_analyzer.rb +23 -0
  141. data/shoes/ruby/lib/ftsearch/analysis/whitespace_analyzer.rb +22 -0
  142. data/shoes/ruby/lib/ftsearch/document_map_reader.rb +106 -0
  143. data/shoes/ruby/lib/ftsearch/document_map_writer.rb +46 -0
  144. data/shoes/ruby/lib/ftsearch/field_infos.rb +46 -0
  145. data/shoes/ruby/lib/ftsearch/fragment_writer.rb +114 -0
  146. data/shoes/ruby/lib/ftsearch/fulltext_reader.rb +52 -0
  147. data/shoes/ruby/lib/ftsearch/fulltext_writer.rb +75 -0
  148. data/shoes/ruby/lib/ftsearch/suffix_array_reader.rb +275 -0
  149. data/shoes/ruby/lib/ftsearch/suffix_array_writer.rb +99 -0
  150. data/shoes/ruby/lib/ftsearch/util.rb +21 -0
  151. data/shoes/ruby/lib/getoptlong.rb +610 -0
  152. data/shoes/ruby/lib/gserver.rb +253 -0
  153. data/shoes/ruby/lib/i386-mingw32/bigdecimal.so +0 -0
  154. data/shoes/ruby/lib/i386-mingw32/binject.so +0 -0
  155. data/shoes/ruby/lib/i386-mingw32/bloops.so +0 -0
  156. data/shoes/ruby/lib/i386-mingw32/continuation.so +0 -0
  157. data/shoes/ruby/lib/i386-mingw32/coverage.so +0 -0
  158. data/shoes/ruby/lib/i386-mingw32/curses.so +0 -0
  159. data/shoes/ruby/lib/i386-mingw32/digest/bubblebabble.so +0 -0
  160. data/shoes/ruby/lib/i386-mingw32/digest/md5.so +0 -0
  161. data/shoes/ruby/lib/i386-mingw32/digest/rmd160.so +0 -0
  162. data/shoes/ruby/lib/i386-mingw32/digest/sha1.so +0 -0
  163. data/shoes/ruby/lib/i386-mingw32/digest/sha2.so +0 -0
  164. data/shoes/ruby/lib/i386-mingw32/digest.so +0 -0
  165. data/shoes/ruby/lib/i386-mingw32/dl.so +0 -0
  166. data/shoes/ruby/lib/i386-mingw32/enc/big5.so +0 -0
  167. data/shoes/ruby/lib/i386-mingw32/enc/cp949.so +0 -0
  168. data/shoes/ruby/lib/i386-mingw32/enc/emacs_mule.so +0 -0
  169. data/shoes/ruby/lib/i386-mingw32/enc/encdb.so +0 -0
  170. data/shoes/ruby/lib/i386-mingw32/enc/euc_jp.so +0 -0
  171. data/shoes/ruby/lib/i386-mingw32/enc/euc_kr.so +0 -0
  172. data/shoes/ruby/lib/i386-mingw32/enc/euc_tw.so +0 -0
  173. data/shoes/ruby/lib/i386-mingw32/enc/gb18030.so +0 -0
  174. data/shoes/ruby/lib/i386-mingw32/enc/gb2312.so +0 -0
  175. data/shoes/ruby/lib/i386-mingw32/enc/gbk.so +0 -0
  176. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_1.so +0 -0
  177. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_10.so +0 -0
  178. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_11.so +0 -0
  179. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_13.so +0 -0
  180. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_14.so +0 -0
  181. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_15.so +0 -0
  182. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_16.so +0 -0
  183. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_2.so +0 -0
  184. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_3.so +0 -0
  185. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_4.so +0 -0
  186. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_5.so +0 -0
  187. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_6.so +0 -0
  188. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_7.so +0 -0
  189. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_8.so +0 -0
  190. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_9.so +0 -0
  191. data/shoes/ruby/lib/i386-mingw32/enc/koi8_r.so +0 -0
  192. data/shoes/ruby/lib/i386-mingw32/enc/koi8_u.so +0 -0
  193. data/shoes/ruby/lib/i386-mingw32/enc/shift_jis.so +0 -0
  194. data/shoes/ruby/lib/i386-mingw32/enc/trans/big5.so +0 -0
  195. data/shoes/ruby/lib/i386-mingw32/enc/trans/chinese.so +0 -0
  196. data/shoes/ruby/lib/i386-mingw32/enc/trans/escape.so +0 -0
  197. data/shoes/ruby/lib/i386-mingw32/enc/trans/gb18030.so +0 -0
  198. data/shoes/ruby/lib/i386-mingw32/enc/trans/gbk.so +0 -0
  199. data/shoes/ruby/lib/i386-mingw32/enc/trans/iso2022.so +0 -0
  200. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese.so +0 -0
  201. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_euc.so +0 -0
  202. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_sjis.so +0 -0
  203. data/shoes/ruby/lib/i386-mingw32/enc/trans/korean.so +0 -0
  204. data/shoes/ruby/lib/i386-mingw32/enc/trans/single_byte.so +0 -0
  205. data/shoes/ruby/lib/i386-mingw32/enc/trans/transdb.so +0 -0
  206. data/shoes/ruby/lib/i386-mingw32/enc/trans/utf_16_32.so +0 -0
  207. data/shoes/ruby/lib/i386-mingw32/enc/utf_16be.so +0 -0
  208. data/shoes/ruby/lib/i386-mingw32/enc/utf_16le.so +0 -0
  209. data/shoes/ruby/lib/i386-mingw32/enc/utf_32be.so +0 -0
  210. data/shoes/ruby/lib/i386-mingw32/enc/utf_32le.so +0 -0
  211. data/shoes/ruby/lib/i386-mingw32/enc/windows_1251.so +0 -0
  212. data/shoes/ruby/lib/i386-mingw32/etc.so +0 -0
  213. data/shoes/ruby/lib/i386-mingw32/fcntl.so +0 -0
  214. data/shoes/ruby/lib/i386-mingw32/fiber.so +0 -0
  215. data/shoes/ruby/lib/i386-mingw32/ftsearchrt.so +0 -0
  216. data/shoes/ruby/lib/i386-mingw32/gdbm.so +0 -0
  217. data/shoes/ruby/lib/i386-mingw32/iconv.so +0 -0
  218. data/shoes/ruby/lib/i386-mingw32/io/wait.so +0 -0
  219. data/shoes/ruby/lib/i386-mingw32/json/ext/generator.so +0 -0
  220. data/shoes/ruby/lib/i386-mingw32/json/ext/parser.so +0 -0
  221. data/shoes/ruby/lib/i386-mingw32/mathn/complex.so +0 -0
  222. data/shoes/ruby/lib/i386-mingw32/mathn/rational.so +0 -0
  223. data/shoes/ruby/lib/i386-mingw32/nkf.so +0 -0
  224. data/shoes/ruby/lib/i386-mingw32/openssl.so +0 -0
  225. data/shoes/ruby/lib/i386-mingw32/racc/cparse.so +0 -0
  226. data/shoes/ruby/lib/i386-mingw32/rbconfig.rb +196 -0
  227. data/shoes/ruby/lib/i386-mingw32/readline.so +0 -0
  228. data/shoes/ruby/lib/i386-mingw32/ripper.so +0 -0
  229. data/shoes/ruby/lib/i386-mingw32/sdbm.so +0 -0
  230. data/shoes/ruby/lib/i386-mingw32/socket.so +0 -0
  231. data/shoes/ruby/lib/i386-mingw32/stringio.so +0 -0
  232. data/shoes/ruby/lib/i386-mingw32/strscan.so +0 -0
  233. data/shoes/ruby/lib/i386-mingw32/syck.so +0 -0
  234. data/shoes/ruby/lib/i386-mingw32/win32ole.so +0 -0
  235. data/shoes/ruby/lib/i386-mingw32/zlib.so +0 -0
  236. data/shoes/ruby/lib/io/nonblock.rb +23 -0
  237. data/shoes/ruby/lib/ipaddr.rb +813 -0
  238. data/shoes/ruby/lib/irb/cmd/chws.rb +32 -0
  239. data/shoes/ruby/lib/irb/cmd/fork.rb +38 -0
  240. data/shoes/ruby/lib/irb/cmd/help.rb +36 -0
  241. data/shoes/ruby/lib/irb/cmd/load.rb +66 -0
  242. data/shoes/ruby/lib/irb/cmd/nop.rb +38 -0
  243. data/shoes/ruby/lib/irb/cmd/pushws.rb +38 -0
  244. data/shoes/ruby/lib/irb/cmd/subirb.rb +42 -0
  245. data/shoes/ruby/lib/irb/completion.rb +207 -0
  246. data/shoes/ruby/lib/irb/context.rb +255 -0
  247. data/shoes/ruby/lib/irb/ext/change-ws.rb +61 -0
  248. data/shoes/ruby/lib/irb/ext/history.rb +109 -0
  249. data/shoes/ruby/lib/irb/ext/loader.rb +119 -0
  250. data/shoes/ruby/lib/irb/ext/math-mode.rb +36 -0
  251. data/shoes/ruby/lib/irb/ext/multi-irb.rb +240 -0
  252. data/shoes/ruby/lib/irb/ext/save-history.rb +100 -0
  253. data/shoes/ruby/lib/irb/ext/tracer.rb +60 -0
  254. data/shoes/ruby/lib/irb/ext/use-loader.rb +64 -0
  255. data/shoes/ruby/lib/irb/ext/workspaces.rb +55 -0
  256. data/shoes/ruby/lib/irb/extend-command.rb +272 -0
  257. data/shoes/ruby/lib/irb/frame.rb +66 -0
  258. data/shoes/ruby/lib/irb/help.rb +35 -0
  259. data/shoes/ruby/lib/irb/init.rb +288 -0
  260. data/shoes/ruby/lib/irb/input-method.rb +142 -0
  261. data/shoes/ruby/lib/irb/lc/error.rb +29 -0
  262. data/shoes/ruby/lib/irb/lc/help-message +38 -0
  263. data/shoes/ruby/lib/irb/lc/ja/encoding_aliases.rb +8 -0
  264. data/shoes/ruby/lib/irb/lc/ja/error.rb +27 -0
  265. data/shoes/ruby/lib/irb/lc/ja/help-message +39 -0
  266. data/shoes/ruby/lib/irb/locale.rb +195 -0
  267. data/shoes/ruby/lib/irb/magic-file.rb +36 -0
  268. data/shoes/ruby/lib/irb/notifier.rb +144 -0
  269. data/shoes/ruby/lib/irb/output-method.rb +69 -0
  270. data/shoes/ruby/lib/irb/ruby-lex.rb +1188 -0
  271. data/shoes/ruby/lib/irb/ruby-token.rb +270 -0
  272. data/shoes/ruby/lib/irb/slex.rb +282 -0
  273. data/shoes/ruby/lib/irb/src_encoding.rb +4 -0
  274. data/shoes/ruby/lib/irb/version.rb +15 -0
  275. data/shoes/ruby/lib/irb/workspace.rb +108 -0
  276. data/shoes/ruby/lib/irb/ws-for-case-2.rb +14 -0
  277. data/shoes/ruby/lib/irb/xmp.rb +97 -0
  278. data/shoes/ruby/lib/irb.rb +354 -0
  279. data/shoes/ruby/lib/json/add/core.rb +135 -0
  280. data/shoes/ruby/lib/json/add/rails.rb +58 -0
  281. data/shoes/ruby/lib/json/common.rb +354 -0
  282. data/shoes/ruby/lib/json/editor.rb +1371 -0
  283. data/shoes/ruby/lib/json/ext.rb +15 -0
  284. data/shoes/ruby/lib/json/version.rb +9 -0
  285. data/shoes/ruby/lib/json.rb +297 -0
  286. data/shoes/ruby/lib/kconv.rb +282 -0
  287. data/shoes/ruby/lib/logger.rb +732 -0
  288. data/shoes/ruby/lib/mathn.rb +206 -0
  289. data/shoes/ruby/lib/matrix.rb +1381 -0
  290. data/shoes/ruby/lib/minitest/autorun.rb +9 -0
  291. data/shoes/ruby/lib/minitest/mock.rb +37 -0
  292. data/shoes/ruby/lib/minitest/spec.rb +89 -0
  293. data/shoes/ruby/lib/minitest/unit.rb +497 -0
  294. data/shoes/ruby/lib/mkmf.rb +1958 -0
  295. data/shoes/ruby/lib/monitor.rb +265 -0
  296. data/shoes/ruby/lib/mutex_m.rb +91 -0
  297. data/shoes/ruby/lib/net/ftp.rb +981 -0
  298. data/shoes/ruby/lib/net/http.rb +2399 -0
  299. data/shoes/ruby/lib/net/https.rb +136 -0
  300. data/shoes/ruby/lib/net/imap.rb +3500 -0
  301. data/shoes/ruby/lib/net/pop.rb +1000 -0
  302. data/shoes/ruby/lib/net/protocol.rb +382 -0
  303. data/shoes/ruby/lib/net/smtp.rb +1014 -0
  304. data/shoes/ruby/lib/net/telnet.rb +759 -0
  305. data/shoes/ruby/lib/observer.rb +193 -0
  306. data/shoes/ruby/lib/open-uri.rb +832 -0
  307. data/shoes/ruby/lib/open3.rb +98 -0
  308. data/shoes/ruby/lib/openssl/bn.rb +35 -0
  309. data/shoes/ruby/lib/openssl/buffering.rb +242 -0
  310. data/shoes/ruby/lib/openssl/cipher.rb +65 -0
  311. data/shoes/ruby/lib/openssl/digest.rb +61 -0
  312. data/shoes/ruby/lib/openssl/ssl.rb +178 -0
  313. data/shoes/ruby/lib/openssl/x509.rb +155 -0
  314. data/shoes/ruby/lib/openssl.rb +24 -0
  315. data/shoes/ruby/lib/optparse/date.rb +17 -0
  316. data/shoes/ruby/lib/optparse/shellwords.rb +6 -0
  317. data/shoes/ruby/lib/optparse/time.rb +10 -0
  318. data/shoes/ruby/lib/optparse/uri.rb +6 -0
  319. data/shoes/ruby/lib/optparse/version.rb +70 -0
  320. data/shoes/ruby/lib/optparse.rb +1810 -0
  321. data/shoes/ruby/lib/ostruct.rb +145 -0
  322. data/shoes/ruby/lib/pathname.rb +1099 -0
  323. data/shoes/ruby/lib/pp.rb +532 -0
  324. data/shoes/ruby/lib/prettyprint.rb +896 -0
  325. data/shoes/ruby/lib/prime.rb +471 -0
  326. data/shoes/ruby/lib/profile.rb +10 -0
  327. data/shoes/ruby/lib/profiler.rb +59 -0
  328. data/shoes/ruby/lib/pstore.rb +543 -0
  329. data/shoes/ruby/lib/racc/parser.rb +441 -0
  330. data/shoes/ruby/lib/rake/classic_namespace.rb +8 -0
  331. data/shoes/ruby/lib/rake/clean.rb +33 -0
  332. data/shoes/ruby/lib/rake/gempackagetask.rb +97 -0
  333. data/shoes/ruby/lib/rake/loaders/makefile.rb +35 -0
  334. data/shoes/ruby/lib/rake/packagetask.rb +185 -0
  335. data/shoes/ruby/lib/rake/rake_test_loader.rb +5 -0
  336. data/shoes/ruby/lib/rake/rdoctask.rb +147 -0
  337. data/shoes/ruby/lib/rake/runtest.rb +23 -0
  338. data/shoes/ruby/lib/rake/tasklib.rb +23 -0
  339. data/shoes/ruby/lib/rake/testtask.rb +161 -0
  340. data/shoes/ruby/lib/rake/win32.rb +34 -0
  341. data/shoes/ruby/lib/rake.rb +2465 -0
  342. data/shoes/ruby/lib/rational.rb +19 -0
  343. data/shoes/ruby/lib/rbconfig/datadir.rb +24 -0
  344. data/shoes/ruby/lib/rdoc/code_objects.rb +1061 -0
  345. data/shoes/ruby/lib/rdoc/diagram.rb +340 -0
  346. data/shoes/ruby/lib/rdoc/dot.rb +249 -0
  347. data/shoes/ruby/lib/rdoc/generator/chm/chm.rb +100 -0
  348. data/shoes/ruby/lib/rdoc/generator/chm.rb +113 -0
  349. data/shoes/ruby/lib/rdoc/generator/html/common.rb +24 -0
  350. data/shoes/ruby/lib/rdoc/generator/html/frameless.rb +92 -0
  351. data/shoes/ruby/lib/rdoc/generator/html/hefss.rb +150 -0
  352. data/shoes/ruby/lib/rdoc/generator/html/html.rb +769 -0
  353. data/shoes/ruby/lib/rdoc/generator/html/kilmer.rb +151 -0
  354. data/shoes/ruby/lib/rdoc/generator/html/kilmerfactory.rb +427 -0
  355. data/shoes/ruby/lib/rdoc/generator/html/one_page_html.rb +122 -0
  356. data/shoes/ruby/lib/rdoc/generator/html.rb +445 -0
  357. data/shoes/ruby/lib/rdoc/generator/ri.rb +226 -0
  358. data/shoes/ruby/lib/rdoc/generator/texinfo/class.texinfo.erb +44 -0
  359. data/shoes/ruby/lib/rdoc/generator/texinfo/file.texinfo.erb +6 -0
  360. data/shoes/ruby/lib/rdoc/generator/texinfo/method.texinfo.erb +6 -0
  361. data/shoes/ruby/lib/rdoc/generator/texinfo/texinfo.erb +28 -0
  362. data/shoes/ruby/lib/rdoc/generator/texinfo.rb +81 -0
  363. data/shoes/ruby/lib/rdoc/generator/xml/rdf.rb +113 -0
  364. data/shoes/ruby/lib/rdoc/generator/xml/xml.rb +123 -0
  365. data/shoes/ruby/lib/rdoc/generator/xml.rb +117 -0
  366. data/shoes/ruby/lib/rdoc/generator.rb +1082 -0
  367. data/shoes/ruby/lib/rdoc/known_classes.rb +68 -0
  368. data/shoes/ruby/lib/rdoc/markup/attribute_manager.rb +265 -0
  369. data/shoes/ruby/lib/rdoc/markup/formatter.rb +14 -0
  370. data/shoes/ruby/lib/rdoc/markup/fragments.rb +337 -0
  371. data/shoes/ruby/lib/rdoc/markup/inline.rb +101 -0
  372. data/shoes/ruby/lib/rdoc/markup/lines.rb +152 -0
  373. data/shoes/ruby/lib/rdoc/markup/preprocess.rb +75 -0
  374. data/shoes/ruby/lib/rdoc/markup/to_flow.rb +185 -0
  375. data/shoes/ruby/lib/rdoc/markup/to_html.rb +403 -0
  376. data/shoes/ruby/lib/rdoc/markup/to_html_crossref.rb +148 -0
  377. data/shoes/ruby/lib/rdoc/markup/to_latex.rb +328 -0
  378. data/shoes/ruby/lib/rdoc/markup/to_test.rb +50 -0
  379. data/shoes/ruby/lib/rdoc/markup/to_texinfo.rb +69 -0
  380. data/shoes/ruby/lib/rdoc/markup.rb +378 -0
  381. data/shoes/ruby/lib/rdoc/options.rb +638 -0
  382. data/shoes/ruby/lib/rdoc/parser/c.rb +661 -0
  383. data/shoes/ruby/lib/rdoc/parser/f95.rb +1835 -0
  384. data/shoes/ruby/lib/rdoc/parser/perl.rb +165 -0
  385. data/shoes/ruby/lib/rdoc/parser/ruby.rb +2829 -0
  386. data/shoes/ruby/lib/rdoc/parser/simple.rb +38 -0
  387. data/shoes/ruby/lib/rdoc/parser.rb +142 -0
  388. data/shoes/ruby/lib/rdoc/rdoc.rb +293 -0
  389. data/shoes/ruby/lib/rdoc/ri/cache.rb +187 -0
  390. data/shoes/ruby/lib/rdoc/ri/descriptions.rb +156 -0
  391. data/shoes/ruby/lib/rdoc/ri/display.rb +392 -0
  392. data/shoes/ruby/lib/rdoc/ri/driver.rb +669 -0
  393. data/shoes/ruby/lib/rdoc/ri/formatter.rb +616 -0
  394. data/shoes/ruby/lib/rdoc/ri/paths.rb +99 -0
  395. data/shoes/ruby/lib/rdoc/ri/reader.rb +106 -0
  396. data/shoes/ruby/lib/rdoc/ri/util.rb +79 -0
  397. data/shoes/ruby/lib/rdoc/ri/writer.rb +68 -0
  398. data/shoes/ruby/lib/rdoc/ri.rb +8 -0
  399. data/shoes/ruby/lib/rdoc/stats.rb +115 -0
  400. data/shoes/ruby/lib/rdoc/template.rb +64 -0
  401. data/shoes/ruby/lib/rdoc/tokenstream.rb +33 -0
  402. data/shoes/ruby/lib/rdoc.rb +395 -0
  403. data/shoes/ruby/lib/resolv-replace.rb +63 -0
  404. data/shoes/ruby/lib/resolv.rb +2262 -0
  405. data/shoes/ruby/lib/rexml/attlistdecl.rb +62 -0
  406. data/shoes/ruby/lib/rexml/attribute.rb +188 -0
  407. data/shoes/ruby/lib/rexml/cdata.rb +67 -0
  408. data/shoes/ruby/lib/rexml/child.rb +96 -0
  409. data/shoes/ruby/lib/rexml/comment.rb +80 -0
  410. data/shoes/ruby/lib/rexml/doctype.rb +270 -0
  411. data/shoes/ruby/lib/rexml/document.rb +231 -0
  412. data/shoes/ruby/lib/rexml/dtd/attlistdecl.rb +10 -0
  413. data/shoes/ruby/lib/rexml/dtd/dtd.rb +51 -0
  414. data/shoes/ruby/lib/rexml/dtd/elementdecl.rb +17 -0
  415. data/shoes/ruby/lib/rexml/dtd/entitydecl.rb +56 -0
  416. data/shoes/ruby/lib/rexml/dtd/notationdecl.rb +39 -0
  417. data/shoes/ruby/lib/rexml/element.rb +1246 -0
  418. data/shoes/ruby/lib/rexml/encoding.rb +71 -0
  419. data/shoes/ruby/lib/rexml/encodings/CP-1252.rb +103 -0
  420. data/shoes/ruby/lib/rexml/encodings/EUC-JP.rb +35 -0
  421. data/shoes/ruby/lib/rexml/encodings/ICONV.rb +22 -0
  422. data/shoes/ruby/lib/rexml/encodings/ISO-8859-1.rb +7 -0
  423. data/shoes/ruby/lib/rexml/encodings/ISO-8859-15.rb +72 -0
  424. data/shoes/ruby/lib/rexml/encodings/SHIFT-JIS.rb +37 -0
  425. data/shoes/ruby/lib/rexml/encodings/SHIFT_JIS.rb +1 -0
  426. data/shoes/ruby/lib/rexml/encodings/UNILE.rb +34 -0
  427. data/shoes/ruby/lib/rexml/encodings/US-ASCII.rb +30 -0
  428. data/shoes/ruby/lib/rexml/encodings/UTF-16.rb +35 -0
  429. data/shoes/ruby/lib/rexml/encodings/UTF-8.rb +18 -0
  430. data/shoes/ruby/lib/rexml/entity.rb +166 -0
  431. data/shoes/ruby/lib/rexml/formatters/default.rb +109 -0
  432. data/shoes/ruby/lib/rexml/formatters/pretty.rb +139 -0
  433. data/shoes/ruby/lib/rexml/formatters/transitive.rb +58 -0
  434. data/shoes/ruby/lib/rexml/functions.rb +388 -0
  435. data/shoes/ruby/lib/rexml/instruction.rb +70 -0
  436. data/shoes/ruby/lib/rexml/light/node.rb +196 -0
  437. data/shoes/ruby/lib/rexml/namespace.rb +47 -0
  438. data/shoes/ruby/lib/rexml/node.rb +75 -0
  439. data/shoes/ruby/lib/rexml/output.rb +24 -0
  440. data/shoes/ruby/lib/rexml/parent.rb +166 -0
  441. data/shoes/ruby/lib/rexml/parseexception.rb +51 -0
  442. data/shoes/ruby/lib/rexml/parsers/baseparser.rb +530 -0
  443. data/shoes/ruby/lib/rexml/parsers/lightparser.rb +58 -0
  444. data/shoes/ruby/lib/rexml/parsers/pullparser.rb +196 -0
  445. data/shoes/ruby/lib/rexml/parsers/sax2parser.rb +247 -0
  446. data/shoes/ruby/lib/rexml/parsers/streamparser.rb +46 -0
  447. data/shoes/ruby/lib/rexml/parsers/treeparser.rb +100 -0
  448. data/shoes/ruby/lib/rexml/parsers/ultralightparser.rb +56 -0
  449. data/shoes/ruby/lib/rexml/parsers/xpathparser.rb +698 -0
  450. data/shoes/ruby/lib/rexml/quickpath.rb +263 -0
  451. data/shoes/ruby/lib/rexml/rexml.rb +31 -0
  452. data/shoes/ruby/lib/rexml/sax2listener.rb +97 -0
  453. data/shoes/ruby/lib/rexml/source.rb +258 -0
  454. data/shoes/ruby/lib/rexml/streamlistener.rb +92 -0
  455. data/shoes/ruby/lib/rexml/syncenumerator.rb +32 -0
  456. data/shoes/ruby/lib/rexml/text.rb +404 -0
  457. data/shoes/ruby/lib/rexml/undefinednamespaceexception.rb +8 -0
  458. data/shoes/ruby/lib/rexml/validation/relaxng.rb +559 -0
  459. data/shoes/ruby/lib/rexml/validation/validation.rb +155 -0
  460. data/shoes/ruby/lib/rexml/validation/validationexception.rb +9 -0
  461. data/shoes/ruby/lib/rexml/xmldecl.rb +119 -0
  462. data/shoes/ruby/lib/rexml/xmltokens.rb +18 -0
  463. data/shoes/ruby/lib/rexml/xpath.rb +77 -0
  464. data/shoes/ruby/lib/rexml/xpath_parser.rb +792 -0
  465. data/shoes/ruby/lib/rinda/rinda.rb +283 -0
  466. data/shoes/ruby/lib/rinda/ring.rb +271 -0
  467. data/shoes/ruby/lib/rinda/tuplespace.rb +642 -0
  468. data/shoes/ruby/lib/ripper/core.rb +70 -0
  469. data/shoes/ruby/lib/ripper/filter.rb +70 -0
  470. data/shoes/ruby/lib/ripper/lexer.rb +179 -0
  471. data/shoes/ruby/lib/ripper/sexp.rb +99 -0
  472. data/shoes/ruby/lib/ripper.rb +4 -0
  473. data/shoes/ruby/lib/rss/0.9.rb +427 -0
  474. data/shoes/ruby/lib/rss/1.0.rb +452 -0
  475. data/shoes/ruby/lib/rss/2.0.rb +111 -0
  476. data/shoes/ruby/lib/rss/atom.rb +748 -0
  477. data/shoes/ruby/lib/rss/content/1.0.rb +10 -0
  478. data/shoes/ruby/lib/rss/content/2.0.rb +12 -0
  479. data/shoes/ruby/lib/rss/content.rb +31 -0
  480. data/shoes/ruby/lib/rss/converter.rb +170 -0
  481. data/shoes/ruby/lib/rss/dublincore/1.0.rb +13 -0
  482. data/shoes/ruby/lib/rss/dublincore/2.0.rb +13 -0
  483. data/shoes/ruby/lib/rss/dublincore/atom.rb +17 -0
  484. data/shoes/ruby/lib/rss/dublincore.rb +161 -0
  485. data/shoes/ruby/lib/rss/image.rb +193 -0
  486. data/shoes/ruby/lib/rss/itunes.rb +410 -0
  487. data/shoes/ruby/lib/rss/maker/0.9.rb +467 -0
  488. data/shoes/ruby/lib/rss/maker/1.0.rb +434 -0
  489. data/shoes/ruby/lib/rss/maker/2.0.rb +223 -0
  490. data/shoes/ruby/lib/rss/maker/atom.rb +172 -0
  491. data/shoes/ruby/lib/rss/maker/base.rb +880 -0
  492. data/shoes/ruby/lib/rss/maker/content.rb +21 -0
  493. data/shoes/ruby/lib/rss/maker/dublincore.rb +124 -0
  494. data/shoes/ruby/lib/rss/maker/entry.rb +163 -0
  495. data/shoes/ruby/lib/rss/maker/feed.rb +430 -0
  496. data/shoes/ruby/lib/rss/maker/image.rb +111 -0
  497. data/shoes/ruby/lib/rss/maker/itunes.rb +242 -0
  498. data/shoes/ruby/lib/rss/maker/slash.rb +33 -0
  499. data/shoes/ruby/lib/rss/maker/syndication.rb +18 -0
  500. data/shoes/ruby/lib/rss/maker/taxonomy.rb +118 -0
  501. data/shoes/ruby/lib/rss/maker/trackback.rb +61 -0
  502. data/shoes/ruby/lib/rss/maker.rb +44 -0
  503. data/shoes/ruby/lib/rss/parser.rb +568 -0
  504. data/shoes/ruby/lib/rss/rexmlparser.rb +54 -0
  505. data/shoes/ruby/lib/rss/rss.rb +1313 -0
  506. data/shoes/ruby/lib/rss/slash.rb +49 -0
  507. data/shoes/ruby/lib/rss/syndication.rb +67 -0
  508. data/shoes/ruby/lib/rss/taxonomy.rb +145 -0
  509. data/shoes/ruby/lib/rss/trackback.rb +288 -0
  510. data/shoes/ruby/lib/rss/utils.rb +111 -0
  511. data/shoes/ruby/lib/rss/xml-stylesheet.rb +105 -0
  512. data/shoes/ruby/lib/rss/xml.rb +71 -0
  513. data/shoes/ruby/lib/rss/xmlparser.rb +93 -0
  514. data/shoes/ruby/lib/rss/xmlscanner.rb +121 -0
  515. data/shoes/ruby/lib/rss.rb +19 -0
  516. data/shoes/ruby/lib/rubygems/builder.rb +88 -0
  517. data/shoes/ruby/lib/rubygems/command.rb +406 -0
  518. data/shoes/ruby/lib/rubygems/command_manager.rb +146 -0
  519. data/shoes/ruby/lib/rubygems/commands/build_command.rb +53 -0
  520. data/shoes/ruby/lib/rubygems/commands/cert_command.rb +86 -0
  521. data/shoes/ruby/lib/rubygems/commands/check_command.rb +75 -0
  522. data/shoes/ruby/lib/rubygems/commands/cleanup_command.rb +91 -0
  523. data/shoes/ruby/lib/rubygems/commands/contents_command.rb +74 -0
  524. data/shoes/ruby/lib/rubygems/commands/dependency_command.rb +188 -0
  525. data/shoes/ruby/lib/rubygems/commands/environment_command.rb +128 -0
  526. data/shoes/ruby/lib/rubygems/commands/fetch_command.rb +62 -0
  527. data/shoes/ruby/lib/rubygems/commands/generate_index_command.rb +57 -0
  528. data/shoes/ruby/lib/rubygems/commands/help_command.rb +172 -0
  529. data/shoes/ruby/lib/rubygems/commands/install_command.rb +148 -0
  530. data/shoes/ruby/lib/rubygems/commands/list_command.rb +35 -0
  531. data/shoes/ruby/lib/rubygems/commands/lock_command.rb +110 -0
  532. data/shoes/ruby/lib/rubygems/commands/mirror_command.rb +111 -0
  533. data/shoes/ruby/lib/rubygems/commands/outdated_command.rb +33 -0
  534. data/shoes/ruby/lib/rubygems/commands/pristine_command.rb +93 -0
  535. data/shoes/ruby/lib/rubygems/commands/query_command.rb +233 -0
  536. data/shoes/ruby/lib/rubygems/commands/rdoc_command.rb +82 -0
  537. data/shoes/ruby/lib/rubygems/commands/search_command.rb +37 -0
  538. data/shoes/ruby/lib/rubygems/commands/server_command.rb +48 -0
  539. data/shoes/ruby/lib/rubygems/commands/sources_command.rb +152 -0
  540. data/shoes/ruby/lib/rubygems/commands/specification_command.rb +77 -0
  541. data/shoes/ruby/lib/rubygems/commands/stale_command.rb +27 -0
  542. data/shoes/ruby/lib/rubygems/commands/uninstall_command.rb +73 -0
  543. data/shoes/ruby/lib/rubygems/commands/unpack_command.rb +95 -0
  544. data/shoes/ruby/lib/rubygems/commands/update_command.rb +181 -0
  545. data/shoes/ruby/lib/rubygems/commands/which_command.rb +87 -0
  546. data/shoes/ruby/lib/rubygems/config_file.rb +266 -0
  547. data/shoes/ruby/lib/rubygems/custom_require.rb +46 -0
  548. data/shoes/ruby/lib/rubygems/defaults.rb +89 -0
  549. data/shoes/ruby/lib/rubygems/dependency.rb +119 -0
  550. data/shoes/ruby/lib/rubygems/dependency_installer.rb +258 -0
  551. data/shoes/ruby/lib/rubygems/dependency_list.rb +165 -0
  552. data/shoes/ruby/lib/rubygems/digest/digest_adapter.rb +40 -0
  553. data/shoes/ruby/lib/rubygems/digest/md5.rb +23 -0
  554. data/shoes/ruby/lib/rubygems/digest/sha1.rb +17 -0
  555. data/shoes/ruby/lib/rubygems/digest/sha2.rb +17 -0
  556. data/shoes/ruby/lib/rubygems/doc_manager.rb +214 -0
  557. data/shoes/ruby/lib/rubygems/exceptions.rb +84 -0
  558. data/shoes/ruby/lib/rubygems/ext/builder.rb +56 -0
  559. data/shoes/ruby/lib/rubygems/ext/configure_builder.rb +24 -0
  560. data/shoes/ruby/lib/rubygems/ext/ext_conf_builder.rb +23 -0
  561. data/shoes/ruby/lib/rubygems/ext/rake_builder.rb +27 -0
  562. data/shoes/ruby/lib/rubygems/ext.rb +18 -0
  563. data/shoes/ruby/lib/rubygems/format.rb +87 -0
  564. data/shoes/ruby/lib/rubygems/gem_openssl.rb +83 -0
  565. data/shoes/ruby/lib/rubygems/gem_path_searcher.rb +100 -0
  566. data/shoes/ruby/lib/rubygems/gem_runner.rb +58 -0
  567. data/shoes/ruby/lib/rubygems/indexer/abstract_index_builder.rb +88 -0
  568. data/shoes/ruby/lib/rubygems/indexer/latest_index_builder.rb +35 -0
  569. data/shoes/ruby/lib/rubygems/indexer/marshal_index_builder.rb +17 -0
  570. data/shoes/ruby/lib/rubygems/indexer/master_index_builder.rb +54 -0
  571. data/shoes/ruby/lib/rubygems/indexer/quick_index_builder.rb +50 -0
  572. data/shoes/ruby/lib/rubygems/indexer.rb +370 -0
  573. data/shoes/ruby/lib/rubygems/install_update_options.rb +113 -0
  574. data/shoes/ruby/lib/rubygems/installer.rb +578 -0
  575. data/shoes/ruby/lib/rubygems/local_remote_options.rb +134 -0
  576. data/shoes/ruby/lib/rubygems/old_format.rb +148 -0
  577. data/shoes/ruby/lib/rubygems/package/f_sync_dir.rb +24 -0
  578. data/shoes/ruby/lib/rubygems/package/tar_header.rb +245 -0
  579. data/shoes/ruby/lib/rubygems/package/tar_input.rb +219 -0
  580. data/shoes/ruby/lib/rubygems/package/tar_output.rb +143 -0
  581. data/shoes/ruby/lib/rubygems/package/tar_reader/entry.rb +99 -0
  582. data/shoes/ruby/lib/rubygems/package/tar_reader.rb +86 -0
  583. data/shoes/ruby/lib/rubygems/package/tar_writer.rb +180 -0
  584. data/shoes/ruby/lib/rubygems/package.rb +95 -0
  585. data/shoes/ruby/lib/rubygems/platform.rb +178 -0
  586. data/shoes/ruby/lib/rubygems/remote_fetcher.rb +344 -0
  587. data/shoes/ruby/lib/rubygems/require_paths_builder.rb +15 -0
  588. data/shoes/ruby/lib/rubygems/requirement.rb +163 -0
  589. data/shoes/ruby/lib/rubygems/rubygems_version.rb +6 -0
  590. data/shoes/ruby/lib/rubygems/security.rb +786 -0
  591. data/shoes/ruby/lib/rubygems/server.rb +629 -0
  592. data/shoes/ruby/lib/rubygems/source_index.rb +559 -0
  593. data/shoes/ruby/lib/rubygems/source_info_cache.rb +393 -0
  594. data/shoes/ruby/lib/rubygems/source_info_cache_entry.rb +56 -0
  595. data/shoes/ruby/lib/rubygems/spec_fetcher.rb +249 -0
  596. data/shoes/ruby/lib/rubygems/specification.rb +1262 -0
  597. data/shoes/ruby/lib/rubygems/test_utilities.rb +131 -0
  598. data/shoes/ruby/lib/rubygems/timer.rb +25 -0
  599. data/shoes/ruby/lib/rubygems/uninstaller.rb +242 -0
  600. data/shoes/ruby/lib/rubygems/user_interaction.rb +360 -0
  601. data/shoes/ruby/lib/rubygems/validator.rb +208 -0
  602. data/shoes/ruby/lib/rubygems/version.rb +167 -0
  603. data/shoes/ruby/lib/rubygems/version_option.rb +48 -0
  604. data/shoes/ruby/lib/rubygems.rb +888 -0
  605. data/shoes/ruby/lib/scanf.rb +703 -0
  606. data/shoes/ruby/lib/securerandom.rb +182 -0
  607. data/shoes/ruby/lib/set.rb +1274 -0
  608. data/shoes/ruby/lib/shell/builtin-command.rb +160 -0
  609. data/shoes/ruby/lib/shell/command-processor.rb +593 -0
  610. data/shoes/ruby/lib/shell/error.rb +25 -0
  611. data/shoes/ruby/lib/shell/filter.rb +109 -0
  612. data/shoes/ruby/lib/shell/process-controller.rb +319 -0
  613. data/shoes/ruby/lib/shell/system-command.rb +159 -0
  614. data/shoes/ruby/lib/shell/version.rb +15 -0
  615. data/shoes/ruby/lib/shell.rb +300 -0
  616. data/shoes/ruby/lib/shellwords.rb +156 -0
  617. data/shoes/ruby/lib/singleton.rb +313 -0
  618. data/shoes/ruby/lib/sync.rb +307 -0
  619. data/shoes/ruby/lib/tempfile.rb +218 -0
  620. data/shoes/ruby/lib/test/unit/assertions.rb +122 -0
  621. data/shoes/ruby/lib/test/unit/testcase.rb +12 -0
  622. data/shoes/ruby/lib/test/unit.rb +66 -0
  623. data/shoes/ruby/lib/thread.rb +367 -0
  624. data/shoes/ruby/lib/thwait.rb +168 -0
  625. data/shoes/ruby/lib/time.rb +869 -0
  626. data/shoes/ruby/lib/timeout.rb +108 -0
  627. data/shoes/ruby/lib/tmpdir.rb +138 -0
  628. data/shoes/ruby/lib/tracer.rb +166 -0
  629. data/shoes/ruby/lib/tsort.rb +290 -0
  630. data/shoes/ruby/lib/ubygems.rb +10 -0
  631. data/shoes/ruby/lib/un.rb +304 -0
  632. data/shoes/ruby/lib/uri/common.rb +727 -0
  633. data/shoes/ruby/lib/uri/ftp.rb +198 -0
  634. data/shoes/ruby/lib/uri/generic.rb +1128 -0
  635. data/shoes/ruby/lib/uri/http.rb +100 -0
  636. data/shoes/ruby/lib/uri/https.rb +20 -0
  637. data/shoes/ruby/lib/uri/ldap.rb +190 -0
  638. data/shoes/ruby/lib/uri/ldaps.rb +12 -0
  639. data/shoes/ruby/lib/uri/mailto.rb +266 -0
  640. data/shoes/ruby/lib/uri.rb +29 -0
  641. data/shoes/ruby/lib/weakref.rb +80 -0
  642. data/shoes/ruby/lib/webrick/accesslog.rb +75 -0
  643. data/shoes/ruby/lib/webrick/cgi.rb +260 -0
  644. data/shoes/ruby/lib/webrick/compat.rb +15 -0
  645. data/shoes/ruby/lib/webrick/config.rb +100 -0
  646. data/shoes/ruby/lib/webrick/cookie.rb +110 -0
  647. data/shoes/ruby/lib/webrick/htmlutils.rb +25 -0
  648. data/shoes/ruby/lib/webrick/httpauth/authenticator.rb +79 -0
  649. data/shoes/ruby/lib/webrick/httpauth/basicauth.rb +65 -0
  650. data/shoes/ruby/lib/webrick/httpauth/digestauth.rb +344 -0
  651. data/shoes/ruby/lib/webrick/httpauth/htdigest.rb +91 -0
  652. data/shoes/ruby/lib/webrick/httpauth/htgroup.rb +61 -0
  653. data/shoes/ruby/lib/webrick/httpauth/htpasswd.rb +83 -0
  654. data/shoes/ruby/lib/webrick/httpauth/userdb.rb +29 -0
  655. data/shoes/ruby/lib/webrick/httpauth.rb +45 -0
  656. data/shoes/ruby/lib/webrick/httpproxy.rb +288 -0
  657. data/shoes/ruby/lib/webrick/httprequest.rb +402 -0
  658. data/shoes/ruby/lib/webrick/httpresponse.rb +326 -0
  659. data/shoes/ruby/lib/webrick/https.rb +63 -0
  660. data/shoes/ruby/lib/webrick/httpserver.rb +217 -0
  661. data/shoes/ruby/lib/webrick/httpservlet/abstract.rb +70 -0
  662. data/shoes/ruby/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  663. data/shoes/ruby/lib/webrick/httpservlet/cgihandler.rb +110 -0
  664. data/shoes/ruby/lib/webrick/httpservlet/erbhandler.rb +54 -0
  665. data/shoes/ruby/lib/webrick/httpservlet/filehandler.rb +435 -0
  666. data/shoes/ruby/lib/webrick/httpservlet/prochandler.rb +33 -0
  667. data/shoes/ruby/lib/webrick/httpservlet.rb +22 -0
  668. data/shoes/ruby/lib/webrick/httpstatus.rb +132 -0
  669. data/shoes/ruby/lib/webrick/httputils.rb +392 -0
  670. data/shoes/ruby/lib/webrick/httpversion.rb +49 -0
  671. data/shoes/ruby/lib/webrick/log.rb +88 -0
  672. data/shoes/ruby/lib/webrick/server.rb +210 -0
  673. data/shoes/ruby/lib/webrick/ssl.rb +126 -0
  674. data/shoes/ruby/lib/webrick/utils.rb +175 -0
  675. data/shoes/ruby/lib/webrick/version.rb +13 -0
  676. data/shoes/ruby/lib/webrick.rb +29 -0
  677. data/shoes/ruby/lib/win32/registry.rb +832 -0
  678. data/shoes/ruby/lib/win32/resolv.rb +370 -0
  679. data/shoes/ruby/lib/win32/sspi.rb +330 -0
  680. data/shoes/ruby/lib/win32ole/property.rb +16 -0
  681. data/shoes/ruby/lib/xmlrpc/base64.rb +81 -0
  682. data/shoes/ruby/lib/xmlrpc/client.rb +625 -0
  683. data/shoes/ruby/lib/xmlrpc/config.rb +40 -0
  684. data/shoes/ruby/lib/xmlrpc/create.rb +290 -0
  685. data/shoes/ruby/lib/xmlrpc/datetime.rb +142 -0
  686. data/shoes/ruby/lib/xmlrpc/httpserver.rb +178 -0
  687. data/shoes/ruby/lib/xmlrpc/marshal.rb +76 -0
  688. data/shoes/ruby/lib/xmlrpc/parser.rb +813 -0
  689. data/shoes/ruby/lib/xmlrpc/server.rb +778 -0
  690. data/shoes/ruby/lib/xmlrpc/utils.rb +165 -0
  691. data/shoes/ruby/lib/yaml/baseemitter.rb +242 -0
  692. data/shoes/ruby/lib/yaml/basenode.rb +216 -0
  693. data/shoes/ruby/lib/yaml/constants.rb +45 -0
  694. data/shoes/ruby/lib/yaml/dbm.rb +111 -0
  695. data/shoes/ruby/lib/yaml/encoding.rb +33 -0
  696. data/shoes/ruby/lib/yaml/error.rb +34 -0
  697. data/shoes/ruby/lib/yaml/loader.rb +14 -0
  698. data/shoes/ruby/lib/yaml/rubytypes.rb +446 -0
  699. data/shoes/ruby/lib/yaml/store.rb +43 -0
  700. data/shoes/ruby/lib/yaml/stream.rb +40 -0
  701. data/shoes/ruby/lib/yaml/stringio.rb +83 -0
  702. data/shoes/ruby/lib/yaml/syck.rb +19 -0
  703. data/shoes/ruby/lib/yaml/tag.rb +91 -0
  704. data/shoes/ruby/lib/yaml/types.rb +192 -0
  705. data/shoes/ruby/lib/yaml/yamlnode.rb +54 -0
  706. data/shoes/ruby/lib/yaml/ypath.rb +52 -0
  707. data/shoes/ruby/lib/yaml.rb +440 -0
  708. data/shoes/samples/class-book.rb +43 -0
  709. data/shoes/samples/class-book.yaml +387 -0
  710. data/shoes/samples/expert-definr.rb +23 -0
  711. data/shoes/samples/expert-funnies.rb +51 -0
  712. data/shoes/samples/expert-irb.rb +112 -0
  713. data/shoes/samples/expert-minesweeper.rb +267 -0
  714. data/shoes/samples/expert-othello.rb +319 -0
  715. data/shoes/samples/expert-pong.rb +62 -0
  716. data/shoes/samples/expert-tankspank.rb +385 -0
  717. data/shoes/samples/good-arc.rb +37 -0
  718. data/shoes/samples/good-clock.rb +51 -0
  719. data/shoes/samples/good-follow.rb +26 -0
  720. data/shoes/samples/good-reminder.rb +174 -0
  721. data/shoes/samples/good-vjot.rb +56 -0
  722. data/shoes/samples/simple-accordion.rb +75 -0
  723. data/shoes/samples/simple-anim-shapes.rb +17 -0
  724. data/shoes/samples/simple-anim-text.rb +13 -0
  725. data/shoes/samples/simple-arc.rb +23 -0
  726. data/shoes/samples/simple-bounce.rb +24 -0
  727. data/shoes/samples/simple-calc.rb +70 -0
  728. data/shoes/samples/simple-control-sizes.rb +24 -0
  729. data/shoes/samples/simple-curve.rb +26 -0
  730. data/shoes/samples/simple-dialogs.rb +29 -0
  731. data/shoes/samples/simple-downloader.rb +27 -0
  732. data/shoes/samples/simple-draw.rb +13 -0
  733. data/shoes/samples/simple-editor.rb +28 -0
  734. data/shoes/samples/simple-form.rb +28 -0
  735. data/shoes/samples/simple-form.shy +0 -0
  736. data/shoes/samples/simple-mask.rb +21 -0
  737. data/shoes/samples/simple-menu.rb +31 -0
  738. data/shoes/samples/simple-menu1.rb +35 -0
  739. data/shoes/samples/simple-rubygems.rb +29 -0
  740. data/shoes/samples/simple-slide.rb +45 -0
  741. data/shoes/samples/simple-sphere.rb +28 -0
  742. data/shoes/samples/simple-timer.rb +13 -0
  743. data/shoes/samples/simple-video.rb +13 -0
  744. data/shoes/shoes +21 -0
  745. data/shoes/shoes.exe +0 -0
  746. data/shoes/shoes.exe.manifest +17 -0
  747. data/shoes/sqlite3.dll +0 -0
  748. data/shoes/static/Shoes.icns +0 -0
  749. data/shoes/static/Thumbs.db +0 -0
  750. data/shoes/static/app-icon.png +0 -0
  751. data/shoes/static/avatar.png +0 -0
  752. data/shoes/static/code_highlighter.js +188 -0
  753. data/shoes/static/code_highlighter_ruby.js +26 -0
  754. data/shoes/static/icon-debug.png +0 -0
  755. data/shoes/static/icon-error.png +0 -0
  756. data/shoes/static/icon-info.png +0 -0
  757. data/shoes/static/icon-warn.png +0 -0
  758. data/shoes/static/listbox_button1.png +0 -0
  759. data/shoes/static/listbox_button2.png +0 -0
  760. data/shoes/static/man-app.png +0 -0
  761. data/shoes/static/man-builds.png +0 -0
  762. data/shoes/static/man-editor-notepad.png +0 -0
  763. data/shoes/static/man-editor-osx.png +0 -0
  764. data/shoes/static/man-ele-background.png +0 -0
  765. data/shoes/static/man-ele-border.png +0 -0
  766. data/shoes/static/man-ele-button.png +0 -0
  767. data/shoes/static/man-ele-check.png +0 -0
  768. data/shoes/static/man-ele-editbox.png +0 -0
  769. data/shoes/static/man-ele-editline.png +0 -0
  770. data/shoes/static/man-ele-image.png +0 -0
  771. data/shoes/static/man-ele-listbox.png +0 -0
  772. data/shoes/static/man-ele-progress.png +0 -0
  773. data/shoes/static/man-ele-radio.png +0 -0
  774. data/shoes/static/man-ele-shape.png +0 -0
  775. data/shoes/static/man-ele-textblock.png +0 -0
  776. data/shoes/static/man-ele-video.png +0 -0
  777. data/shoes/static/man-intro-dmg.png +0 -0
  778. data/shoes/static/man-intro-exe.png +0 -0
  779. data/shoes/static/man-look-tiger.png +0 -0
  780. data/shoes/static/man-look-ubuntu.png +0 -0
  781. data/shoes/static/man-look-vista.png +0 -0
  782. data/shoes/static/man-run-osx.png +0 -0
  783. data/shoes/static/man-run-vista.png +0 -0
  784. data/shoes/static/man-run-xp.png +0 -0
  785. data/shoes/static/man-shot1.png +0 -0
  786. data/shoes/static/manual-en.txt +2783 -0
  787. data/shoes/static/manual-ja.txt +2780 -0
  788. data/shoes/static/manual.css +167 -0
  789. data/shoes/static/menu-corner1.png +0 -0
  790. data/shoes/static/menu-corner2.png +0 -0
  791. data/shoes/static/menu-gray.png +0 -0
  792. data/shoes/static/menu-left.png +0 -0
  793. data/shoes/static/menu-right.png +0 -0
  794. data/shoes/static/menu-top.png +0 -0
  795. data/shoes/static/shoes-dmg.jpg +0 -0
  796. data/shoes/static/shoes-icon-blue.png +0 -0
  797. data/shoes/static/shoes-icon.png +0 -0
  798. data/shoes/static/shoes-manual-apps.gif +0 -0
  799. data/shoes/static/stripe.png +0 -0
  800. data/shoes/static/stubs/blank.exe +0 -0
  801. data/shoes/static/stubs/blank.hfz +0 -0
  802. data/shoes/static/stubs/blank.run +375 -0
  803. data/shoes/static/stubs/cocoa-install +0 -0
  804. data/shoes/static/stubs/sh-install +48 -0
  805. data/shoes/static/tutor-back.png +0 -0
  806. data/shoes/zlib.dll +0 -0
  807. data/shoes/zlib1.dll +0 -0
  808. metadata +887 -0
@@ -0,0 +1,2829 @@
1
+ ##
2
+ # This file contains stuff stolen outright from:
3
+ #
4
+ # rtags.rb -
5
+ # ruby-lex.rb - ruby lexcal analyzer
6
+ # ruby-token.rb - ruby tokens
7
+ # by Keiju ISHITSUKA (Nippon Rational Inc.)
8
+ #
9
+
10
+ require 'e2mmap'
11
+ require 'irb/slex'
12
+
13
+ require 'rdoc/code_objects'
14
+ require 'rdoc/tokenstream'
15
+ require 'rdoc/markup/preprocess'
16
+ require 'rdoc/parser'
17
+
18
+ $TOKEN_DEBUG ||= nil
19
+ #$TOKEN_DEBUG = $DEBUG_RDOC
20
+
21
+ ##
22
+ # Definitions of all tokens involved in the lexical analysis
23
+
24
+ module RDoc::RubyToken
25
+
26
+ EXPR_BEG = :EXPR_BEG
27
+ EXPR_MID = :EXPR_MID
28
+ EXPR_END = :EXPR_END
29
+ EXPR_ARG = :EXPR_ARG
30
+ EXPR_FNAME = :EXPR_FNAME
31
+ EXPR_DOT = :EXPR_DOT
32
+ EXPR_CLASS = :EXPR_CLASS
33
+
34
+ class Token
35
+ NO_TEXT = "??".freeze
36
+
37
+ attr_accessor :text
38
+ attr_reader :line_no
39
+ attr_reader :char_no
40
+
41
+ def initialize(line_no, char_no)
42
+ @line_no = line_no
43
+ @char_no = char_no
44
+ @text = NO_TEXT
45
+ end
46
+
47
+ def ==(other)
48
+ self.class == other.class and
49
+ other.line_no == @line_no and
50
+ other.char_no == @char_no and
51
+ other.text == @text
52
+ end
53
+
54
+ ##
55
+ # Because we're used in contexts that expect to return a token, we set the
56
+ # text string and then return ourselves
57
+
58
+ def set_text(text)
59
+ @text = text
60
+ self
61
+ end
62
+
63
+ end
64
+
65
+ class TkNode < Token
66
+ attr :node
67
+ end
68
+
69
+ class TkId < Token
70
+ def initialize(line_no, char_no, name)
71
+ super(line_no, char_no)
72
+ @name = name
73
+ end
74
+ attr :name
75
+ end
76
+
77
+ class TkKW < TkId
78
+ end
79
+
80
+ class TkVal < Token
81
+ def initialize(line_no, char_no, value = nil)
82
+ super(line_no, char_no)
83
+ set_text(value)
84
+ end
85
+ end
86
+
87
+ class TkOp < Token
88
+ def name
89
+ self.class.op_name
90
+ end
91
+ end
92
+
93
+ class TkOPASGN < TkOp
94
+ def initialize(line_no, char_no, op)
95
+ super(line_no, char_no)
96
+ op = TkReading2Token[op] unless Symbol === op
97
+ @op = op
98
+ end
99
+ attr :op
100
+ end
101
+
102
+ class TkUnknownChar < Token
103
+ def initialize(line_no, char_no, id)
104
+ super(line_no, char_no)
105
+ @name = char_no.chr
106
+ end
107
+ attr :name
108
+ end
109
+
110
+ class TkError < Token
111
+ end
112
+
113
+ def set_token_position(line, char)
114
+ @prev_line_no = line
115
+ @prev_char_no = char
116
+ end
117
+
118
+ def Token(token, value = nil)
119
+ tk = nil
120
+ case token
121
+ when String, Symbol
122
+ source = String === token ? TkReading2Token : TkSymbol2Token
123
+ raise TkReading2TokenNoKey, token if (tk = source[token]).nil?
124
+ tk = Token(tk[0], value)
125
+ else
126
+ tk = if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty?
127
+ token.new(@prev_line_no, @prev_char_no)
128
+ else
129
+ token.new(@prev_line_no, @prev_char_no, value)
130
+ end
131
+ end
132
+ tk
133
+ end
134
+
135
+ TokenDefinitions = [
136
+ [:TkCLASS, TkKW, "class", EXPR_CLASS],
137
+ [:TkMODULE, TkKW, "module", EXPR_CLASS],
138
+ [:TkDEF, TkKW, "def", EXPR_FNAME],
139
+ [:TkUNDEF, TkKW, "undef", EXPR_FNAME],
140
+ [:TkBEGIN, TkKW, "begin", EXPR_BEG],
141
+ [:TkRESCUE, TkKW, "rescue", EXPR_MID],
142
+ [:TkENSURE, TkKW, "ensure", EXPR_BEG],
143
+ [:TkEND, TkKW, "end", EXPR_END],
144
+ [:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD],
145
+ [:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD],
146
+ [:TkTHEN, TkKW, "then", EXPR_BEG],
147
+ [:TkELSIF, TkKW, "elsif", EXPR_BEG],
148
+ [:TkELSE, TkKW, "else", EXPR_BEG],
149
+ [:TkCASE, TkKW, "case", EXPR_BEG],
150
+ [:TkWHEN, TkKW, "when", EXPR_BEG],
151
+ [:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD],
152
+ [:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD],
153
+ [:TkFOR, TkKW, "for", EXPR_BEG],
154
+ [:TkBREAK, TkKW, "break", EXPR_END],
155
+ [:TkNEXT, TkKW, "next", EXPR_END],
156
+ [:TkREDO, TkKW, "redo", EXPR_END],
157
+ [:TkRETRY, TkKW, "retry", EXPR_END],
158
+ [:TkIN, TkKW, "in", EXPR_BEG],
159
+ [:TkDO, TkKW, "do", EXPR_BEG],
160
+ [:TkRETURN, TkKW, "return", EXPR_MID],
161
+ [:TkYIELD, TkKW, "yield", EXPR_END],
162
+ [:TkSUPER, TkKW, "super", EXPR_END],
163
+ [:TkSELF, TkKW, "self", EXPR_END],
164
+ [:TkNIL, TkKW, "nil", EXPR_END],
165
+ [:TkTRUE, TkKW, "true", EXPR_END],
166
+ [:TkFALSE, TkKW, "false", EXPR_END],
167
+ [:TkAND, TkKW, "and", EXPR_BEG],
168
+ [:TkOR, TkKW, "or", EXPR_BEG],
169
+ [:TkNOT, TkKW, "not", EXPR_BEG],
170
+ [:TkIF_MOD, TkKW],
171
+ [:TkUNLESS_MOD, TkKW],
172
+ [:TkWHILE_MOD, TkKW],
173
+ [:TkUNTIL_MOD, TkKW],
174
+ [:TkALIAS, TkKW, "alias", EXPR_FNAME],
175
+ [:TkDEFINED, TkKW, "defined?", EXPR_END],
176
+ [:TklBEGIN, TkKW, "BEGIN", EXPR_END],
177
+ [:TklEND, TkKW, "END", EXPR_END],
178
+ [:Tk__LINE__, TkKW, "__LINE__", EXPR_END],
179
+ [:Tk__FILE__, TkKW, "__FILE__", EXPR_END],
180
+
181
+ [:TkIDENTIFIER, TkId],
182
+ [:TkFID, TkId],
183
+ [:TkGVAR, TkId],
184
+ [:TkIVAR, TkId],
185
+ [:TkCONSTANT, TkId],
186
+
187
+ [:TkINTEGER, TkVal],
188
+ [:TkFLOAT, TkVal],
189
+ [:TkSTRING, TkVal],
190
+ [:TkXSTRING, TkVal],
191
+ [:TkREGEXP, TkVal],
192
+ [:TkCOMMENT, TkVal],
193
+
194
+ [:TkDSTRING, TkNode],
195
+ [:TkDXSTRING, TkNode],
196
+ [:TkDREGEXP, TkNode],
197
+ [:TkNTH_REF, TkId],
198
+ [:TkBACK_REF, TkId],
199
+
200
+ [:TkUPLUS, TkOp, "+@"],
201
+ [:TkUMINUS, TkOp, "-@"],
202
+ [:TkPOW, TkOp, "**"],
203
+ [:TkCMP, TkOp, "<=>"],
204
+ [:TkEQ, TkOp, "=="],
205
+ [:TkEQQ, TkOp, "==="],
206
+ [:TkNEQ, TkOp, "!="],
207
+ [:TkGEQ, TkOp, ">="],
208
+ [:TkLEQ, TkOp, "<="],
209
+ [:TkANDOP, TkOp, "&&"],
210
+ [:TkOROP, TkOp, "||"],
211
+ [:TkMATCH, TkOp, "=~"],
212
+ [:TkNMATCH, TkOp, "!~"],
213
+ [:TkDOT2, TkOp, ".."],
214
+ [:TkDOT3, TkOp, "..."],
215
+ [:TkAREF, TkOp, "[]"],
216
+ [:TkASET, TkOp, "[]="],
217
+ [:TkLSHFT, TkOp, "<<"],
218
+ [:TkRSHFT, TkOp, ">>"],
219
+ [:TkCOLON2, TkOp],
220
+ [:TkCOLON3, TkOp],
221
+ # [:OPASGN, TkOp], # +=, -= etc. #
222
+ [:TkASSOC, TkOp, "=>"],
223
+ [:TkQUESTION, TkOp, "?"], #?
224
+ [:TkCOLON, TkOp, ":"], #:
225
+
226
+ [:TkfLPAREN], # func( #
227
+ [:TkfLBRACK], # func[ #
228
+ [:TkfLBRACE], # func{ #
229
+ [:TkSTAR], # *arg
230
+ [:TkAMPER], # &arg #
231
+ [:TkSYMBOL, TkId], # :SYMBOL
232
+ [:TkSYMBEG, TkId],
233
+ [:TkGT, TkOp, ">"],
234
+ [:TkLT, TkOp, "<"],
235
+ [:TkPLUS, TkOp, "+"],
236
+ [:TkMINUS, TkOp, "-"],
237
+ [:TkMULT, TkOp, "*"],
238
+ [:TkDIV, TkOp, "/"],
239
+ [:TkMOD, TkOp, "%"],
240
+ [:TkBITOR, TkOp, "|"],
241
+ [:TkBITXOR, TkOp, "^"],
242
+ [:TkBITAND, TkOp, "&"],
243
+ [:TkBITNOT, TkOp, "~"],
244
+ [:TkNOTOP, TkOp, "!"],
245
+
246
+ [:TkBACKQUOTE, TkOp, "`"],
247
+
248
+ [:TkASSIGN, Token, "="],
249
+ [:TkDOT, Token, "."],
250
+ [:TkLPAREN, Token, "("], #(exp)
251
+ [:TkLBRACK, Token, "["], #[arry]
252
+ [:TkLBRACE, Token, "{"], #{hash}
253
+ [:TkRPAREN, Token, ")"],
254
+ [:TkRBRACK, Token, "]"],
255
+ [:TkRBRACE, Token, "}"],
256
+ [:TkCOMMA, Token, ","],
257
+ [:TkSEMICOLON, Token, ";"],
258
+
259
+ [:TkRD_COMMENT],
260
+ [:TkSPACE],
261
+ [:TkNL],
262
+ [:TkEND_OF_SCRIPT],
263
+
264
+ [:TkBACKSLASH, TkUnknownChar, "\\"],
265
+ [:TkAT, TkUnknownChar, "@"],
266
+ [:TkDOLLAR, TkUnknownChar, "\$"], #"
267
+ ]
268
+
269
+ # {reading => token_class}
270
+ # {reading => [token_class, *opt]}
271
+ TkReading2Token = {}
272
+ TkSymbol2Token = {}
273
+
274
+ def self.def_token(token_n, super_token = Token, reading = nil, *opts)
275
+ token_n = token_n.id2name unless String === token_n
276
+
277
+ fail AlreadyDefinedToken, token_n if const_defined?(token_n)
278
+
279
+ token_c = Class.new super_token
280
+ const_set token_n, token_c
281
+ # token_c.inspect
282
+
283
+ if reading
284
+ if TkReading2Token[reading]
285
+ fail TkReading2TokenDuplicateError, token_n, reading
286
+ end
287
+ if opts.empty?
288
+ TkReading2Token[reading] = [token_c]
289
+ else
290
+ TkReading2Token[reading] = [token_c].concat(opts)
291
+ end
292
+ end
293
+ TkSymbol2Token[token_n.intern] = token_c
294
+
295
+ if token_c <= TkOp
296
+ token_c.class_eval %{
297
+ def self.op_name; "#{reading}"; end
298
+ }
299
+ end
300
+ end
301
+
302
+ for defs in TokenDefinitions
303
+ def_token(*defs)
304
+ end
305
+
306
+ NEWLINE_TOKEN = TkNL.new(0,0)
307
+ NEWLINE_TOKEN.set_text("\n")
308
+
309
+ end
310
+
311
+ ##
312
+ # Lexical analyzer for Ruby source
313
+
314
+ class RDoc::RubyLex
315
+
316
+ ##
317
+ # Read an input stream character by character. We allow for unlimited
318
+ # ungetting of characters just read.
319
+ #
320
+ # We simplify the implementation greatly by reading the entire input
321
+ # into a buffer initially, and then simply traversing it using
322
+ # pointers.
323
+ #
324
+ # We also have to allow for the <i>here document diversion</i>. This
325
+ # little gem comes about when the lexer encounters a here
326
+ # document. At this point we effectively need to split the input
327
+ # stream into two parts: one to read the body of the here document,
328
+ # the other to read the rest of the input line where the here
329
+ # document was initially encountered. For example, we might have
330
+ #
331
+ # do_something(<<-A, <<-B)
332
+ # stuff
333
+ # for
334
+ # A
335
+ # stuff
336
+ # for
337
+ # B
338
+ #
339
+ # When the lexer encounters the <<A, it reads until the end of the
340
+ # line, and keeps it around for later. It then reads the body of the
341
+ # here document. Once complete, it needs to read the rest of the
342
+ # original line, but then skip the here document body.
343
+ #
344
+
345
+ class BufferedReader
346
+
347
+ attr_reader :line_num
348
+
349
+ def initialize(content, options)
350
+ @options = options
351
+
352
+ if /\t/ =~ content
353
+ tab_width = @options.tab_width
354
+ content = content.split(/\n/).map do |line|
355
+ 1 while line.gsub!(/\t+/) { ' ' * (tab_width*$&.length - $`.length % tab_width)} && $~ #`
356
+ line
357
+ end .join("\n")
358
+ end
359
+ @content = content
360
+ @content << "\n" unless @content[-1,1] == "\n"
361
+ @size = @content.size
362
+ @offset = 0
363
+ @hwm = 0
364
+ @line_num = 1
365
+ @read_back_offset = 0
366
+ @last_newline = 0
367
+ @newline_pending = false
368
+ end
369
+
370
+ def column
371
+ @offset - @last_newline
372
+ end
373
+
374
+ def getc
375
+ return nil if @offset >= @size
376
+ ch = @content[@offset, 1]
377
+
378
+ @offset += 1
379
+ @hwm = @offset if @hwm < @offset
380
+
381
+ if @newline_pending
382
+ @line_num += 1
383
+ @last_newline = @offset - 1
384
+ @newline_pending = false
385
+ end
386
+
387
+ if ch == "\n"
388
+ @newline_pending = true
389
+ end
390
+ ch
391
+ end
392
+
393
+ def getc_already_read
394
+ getc
395
+ end
396
+
397
+ def ungetc(ch)
398
+ raise "unget past beginning of file" if @offset <= 0
399
+ @offset -= 1
400
+ if @content[@offset] == ?\n
401
+ @newline_pending = false
402
+ end
403
+ end
404
+
405
+ def get_read
406
+ res = @content[@read_back_offset...@offset]
407
+ @read_back_offset = @offset
408
+ res
409
+ end
410
+
411
+ def peek(at)
412
+ pos = @offset + at
413
+ if pos >= @size
414
+ nil
415
+ else
416
+ @content[pos, 1]
417
+ end
418
+ end
419
+
420
+ def peek_equal(str)
421
+ @content[@offset, str.length] == str
422
+ end
423
+
424
+ def divert_read_from(reserve)
425
+ @content[@offset, 0] = reserve
426
+ @size = @content.size
427
+ end
428
+ end
429
+
430
+ # end of nested class BufferedReader
431
+
432
+ extend Exception2MessageMapper
433
+ def_exception(:AlreadyDefinedToken, "Already defined token(%s)")
434
+ def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
435
+ def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
436
+ def_exception(:TkReading2TokenDuplicateError,
437
+ "key duplicate(token_n='%s', key='%s')")
438
+ def_exception(:SyntaxError, "%s")
439
+
440
+ include RDoc::RubyToken
441
+ include IRB
442
+
443
+ attr_reader :continue
444
+ attr_reader :lex_state
445
+
446
+ def self.debug?
447
+ false
448
+ end
449
+
450
+ def initialize(content, options)
451
+ lex_init
452
+
453
+ @options = options
454
+
455
+ @reader = BufferedReader.new content, @options
456
+
457
+ @exp_line_no = @line_no = 1
458
+ @base_char_no = 0
459
+ @indent = 0
460
+
461
+ @ltype = nil
462
+ @quoted = nil
463
+ @lex_state = EXPR_BEG
464
+ @space_seen = false
465
+
466
+ @continue = false
467
+ @line = ""
468
+
469
+ @skip_space = false
470
+ @read_auto_clean_up = false
471
+ @exception_on_syntax_error = true
472
+ end
473
+
474
+ attr_accessor :skip_space
475
+ attr_accessor :read_auto_clean_up
476
+ attr_accessor :exception_on_syntax_error
477
+ attr_reader :indent
478
+
479
+ # io functions
480
+ def line_no
481
+ @reader.line_num
482
+ end
483
+
484
+ def char_no
485
+ @reader.column
486
+ end
487
+
488
+ def get_read
489
+ @reader.get_read
490
+ end
491
+
492
+ def getc
493
+ @reader.getc
494
+ end
495
+
496
+ def getc_of_rests
497
+ @reader.getc_already_read
498
+ end
499
+
500
+ def gets
501
+ c = getc or return
502
+ l = ""
503
+ begin
504
+ l.concat c unless c == "\r"
505
+ break if c == "\n"
506
+ end while c = getc
507
+ l
508
+ end
509
+
510
+
511
+ def ungetc(c = nil)
512
+ @reader.ungetc(c)
513
+ end
514
+
515
+ def peek_equal?(str)
516
+ @reader.peek_equal(str)
517
+ end
518
+
519
+ def peek(i = 0)
520
+ @reader.peek(i)
521
+ end
522
+
523
+ def lex
524
+ until (TkNL === (tk = token) or TkEND_OF_SCRIPT === tk) and
525
+ not @continue or tk.nil?
526
+ end
527
+
528
+ line = get_read
529
+
530
+ if line == "" and TkEND_OF_SCRIPT === tk or tk.nil? then
531
+ nil
532
+ else
533
+ line
534
+ end
535
+ end
536
+
537
+ def token
538
+ set_token_position(line_no, char_no)
539
+ begin
540
+ begin
541
+ tk = @OP.match(self)
542
+ @space_seen = TkSPACE === tk
543
+ rescue SyntaxError => e
544
+ raise RDoc::Error, "syntax error: #{e.message}" if
545
+ @exception_on_syntax_error
546
+
547
+ tk = TkError.new(line_no, char_no)
548
+ end
549
+ end while @skip_space and TkSPACE === tk
550
+ if @read_auto_clean_up
551
+ get_read
552
+ end
553
+ # throw :eof unless tk
554
+ tk
555
+ end
556
+
557
+ ENINDENT_CLAUSE = [
558
+ "case", "class", "def", "do", "for", "if",
559
+ "module", "unless", "until", "while", "begin" #, "when"
560
+ ]
561
+ DEINDENT_CLAUSE = ["end" #, "when"
562
+ ]
563
+
564
+ PERCENT_LTYPE = {
565
+ "q" => "\'",
566
+ "Q" => "\"",
567
+ "x" => "\`",
568
+ "r" => "/",
569
+ "w" => "]"
570
+ }
571
+
572
+ PERCENT_PAREN = {
573
+ "{" => "}",
574
+ "[" => "]",
575
+ "<" => ">",
576
+ "(" => ")"
577
+ }
578
+
579
+ Ltype2Token = {
580
+ "\'" => TkSTRING,
581
+ "\"" => TkSTRING,
582
+ "\`" => TkXSTRING,
583
+ "/" => TkREGEXP,
584
+ "]" => TkDSTRING
585
+ }
586
+ Ltype2Token.default = TkSTRING
587
+
588
+ DLtype2Token = {
589
+ "\"" => TkDSTRING,
590
+ "\`" => TkDXSTRING,
591
+ "/" => TkDREGEXP,
592
+ }
593
+
594
+ def lex_init()
595
+ @OP = IRB::SLex.new
596
+ @OP.def_rules("\0", "\004", "\032") do |chars, io|
597
+ Token(TkEND_OF_SCRIPT).set_text(chars)
598
+ end
599
+
600
+ @OP.def_rules(" ", "\t", "\f", "\r", "\13") do |chars, io|
601
+ @space_seen = TRUE
602
+ while (ch = getc) =~ /[ \t\f\r\13]/
603
+ chars << ch
604
+ end
605
+ ungetc
606
+ Token(TkSPACE).set_text(chars)
607
+ end
608
+
609
+ @OP.def_rule("#") do
610
+ |op, io|
611
+ identify_comment
612
+ end
613
+
614
+ @OP.def_rule("=begin", proc{@prev_char_no == 0 && peek(0) =~ /\s/}) do
615
+ |op, io|
616
+ str = op
617
+ @ltype = "="
618
+
619
+
620
+ begin
621
+ line = ""
622
+ begin
623
+ ch = getc
624
+ line << ch
625
+ end until ch == "\n"
626
+ str << line
627
+ end until line =~ /^=end/
628
+
629
+ ungetc
630
+
631
+ @ltype = nil
632
+
633
+ if str =~ /\A=begin\s+rdoc/i
634
+ str.sub!(/\A=begin.*\n/, '')
635
+ str.sub!(/^=end.*/m, '')
636
+ Token(TkCOMMENT).set_text(str)
637
+ else
638
+ Token(TkRD_COMMENT)#.set_text(str)
639
+ end
640
+ end
641
+
642
+ @OP.def_rule("\n") do
643
+ print "\\n\n" if RDoc::RubyLex.debug?
644
+ case @lex_state
645
+ when EXPR_BEG, EXPR_FNAME, EXPR_DOT
646
+ @continue = TRUE
647
+ else
648
+ @continue = FALSE
649
+ @lex_state = EXPR_BEG
650
+ end
651
+ Token(TkNL).set_text("\n")
652
+ end
653
+
654
+ @OP.def_rules("*", "**",
655
+ "!", "!=", "!~",
656
+ "=", "==", "===",
657
+ "=~", "<=>",
658
+ "<", "<=",
659
+ ">", ">=", ">>") do
660
+ |op, io|
661
+ @lex_state = EXPR_BEG
662
+ Token(op).set_text(op)
663
+ end
664
+
665
+ @OP.def_rules("<<") do
666
+ |op, io|
667
+ tk = nil
668
+ if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
669
+ (@lex_state != EXPR_ARG || @space_seen)
670
+ c = peek(0)
671
+ if /[-\w_\"\'\`]/ =~ c
672
+ tk = identify_here_document
673
+ end
674
+ end
675
+ if !tk
676
+ @lex_state = EXPR_BEG
677
+ tk = Token(op).set_text(op)
678
+ end
679
+ tk
680
+ end
681
+
682
+ @OP.def_rules("'", '"') do
683
+ |op, io|
684
+ identify_string(op)
685
+ end
686
+
687
+ @OP.def_rules("`") do
688
+ |op, io|
689
+ if @lex_state == EXPR_FNAME
690
+ Token(op).set_text(op)
691
+ else
692
+ identify_string(op)
693
+ end
694
+ end
695
+
696
+ @OP.def_rules('?') do
697
+ |op, io|
698
+ if @lex_state == EXPR_END
699
+ @lex_state = EXPR_BEG
700
+ Token(TkQUESTION).set_text(op)
701
+ else
702
+ ch = getc
703
+ if @lex_state == EXPR_ARG && ch !~ /\s/
704
+ ungetc
705
+ @lex_state = EXPR_BEG
706
+ Token(TkQUESTION).set_text(op)
707
+ else
708
+ str = op
709
+ str << ch
710
+ if (ch == '\\') #'
711
+ str << read_escape
712
+ end
713
+ @lex_state = EXPR_END
714
+ Token(TkINTEGER).set_text(str)
715
+ end
716
+ end
717
+ end
718
+
719
+ @OP.def_rules("&", "&&", "|", "||") do
720
+ |op, io|
721
+ @lex_state = EXPR_BEG
722
+ Token(op).set_text(op)
723
+ end
724
+
725
+ @OP.def_rules("+=", "-=", "*=", "**=",
726
+ "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
727
+ |op, io|
728
+ @lex_state = EXPR_BEG
729
+ op =~ /^(.*)=$/
730
+ Token(TkOPASGN, $1).set_text(op)
731
+ end
732
+
733
+ @OP.def_rule("+@", proc{@lex_state == EXPR_FNAME}) do |op, io|
734
+ Token(TkUPLUS).set_text(op)
735
+ end
736
+
737
+ @OP.def_rule("-@", proc{@lex_state == EXPR_FNAME}) do |op, io|
738
+ Token(TkUMINUS).set_text(op)
739
+ end
740
+
741
+ @OP.def_rules("+", "-") do
742
+ |op, io|
743
+ catch(:RET) do
744
+ if @lex_state == EXPR_ARG
745
+ if @space_seen and peek(0) =~ /[0-9]/
746
+ throw :RET, identify_number(op)
747
+ else
748
+ @lex_state = EXPR_BEG
749
+ end
750
+ elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
751
+ throw :RET, identify_number(op)
752
+ else
753
+ @lex_state = EXPR_BEG
754
+ end
755
+ Token(op).set_text(op)
756
+ end
757
+ end
758
+
759
+ @OP.def_rule(".") do
760
+ @lex_state = EXPR_BEG
761
+ if peek(0) =~ /[0-9]/
762
+ ungetc
763
+ identify_number("")
764
+ else
765
+ # for obj.if
766
+ @lex_state = EXPR_DOT
767
+ Token(TkDOT).set_text(".")
768
+ end
769
+ end
770
+
771
+ @OP.def_rules("..", "...") do
772
+ |op, io|
773
+ @lex_state = EXPR_BEG
774
+ Token(op).set_text(op)
775
+ end
776
+
777
+ lex_int2
778
+ end
779
+
780
+ def lex_int2
781
+ @OP.def_rules("]", "}", ")") do
782
+ |op, io|
783
+ @lex_state = EXPR_END
784
+ @indent -= 1
785
+ Token(op).set_text(op)
786
+ end
787
+
788
+ @OP.def_rule(":") do
789
+ if @lex_state == EXPR_END || peek(0) =~ /\s/
790
+ @lex_state = EXPR_BEG
791
+ tk = Token(TkCOLON)
792
+ else
793
+ @lex_state = EXPR_FNAME
794
+ tk = Token(TkSYMBEG)
795
+ end
796
+ tk.set_text(":")
797
+ end
798
+
799
+ @OP.def_rule("::") do
800
+ if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
801
+ @lex_state = EXPR_BEG
802
+ tk = Token(TkCOLON3)
803
+ else
804
+ @lex_state = EXPR_DOT
805
+ tk = Token(TkCOLON2)
806
+ end
807
+ tk.set_text("::")
808
+ end
809
+
810
+ @OP.def_rule("/") do
811
+ |op, io|
812
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
813
+ identify_string(op)
814
+ elsif peek(0) == '='
815
+ getc
816
+ @lex_state = EXPR_BEG
817
+ Token(TkOPASGN, :/).set_text("/=") #")
818
+ elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
819
+ identify_string(op)
820
+ else
821
+ @lex_state = EXPR_BEG
822
+ Token("/").set_text(op)
823
+ end
824
+ end
825
+
826
+ @OP.def_rules("^") do
827
+ @lex_state = EXPR_BEG
828
+ Token("^").set_text("^")
829
+ end
830
+
831
+ @OP.def_rules(",", ";") do
832
+ |op, io|
833
+ @lex_state = EXPR_BEG
834
+ Token(op).set_text(op)
835
+ end
836
+
837
+ @OP.def_rule("~") do
838
+ @lex_state = EXPR_BEG
839
+ Token("~").set_text("~")
840
+ end
841
+
842
+ @OP.def_rule("~@", proc{@lex_state = EXPR_FNAME}) do
843
+ @lex_state = EXPR_BEG
844
+ Token("~").set_text("~@")
845
+ end
846
+
847
+ @OP.def_rule("(") do
848
+ @indent += 1
849
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
850
+ @lex_state = EXPR_BEG
851
+ tk = Token(TkfLPAREN)
852
+ else
853
+ @lex_state = EXPR_BEG
854
+ tk = Token(TkLPAREN)
855
+ end
856
+ tk.set_text("(")
857
+ end
858
+
859
+ @OP.def_rule("[]", proc{@lex_state == EXPR_FNAME}) do
860
+ Token("[]").set_text("[]")
861
+ end
862
+
863
+ @OP.def_rule("[]=", proc{@lex_state == EXPR_FNAME}) do
864
+ Token("[]=").set_text("[]=")
865
+ end
866
+
867
+ @OP.def_rule("[") do
868
+ @indent += 1
869
+ if @lex_state == EXPR_FNAME
870
+ t = Token(TkfLBRACK)
871
+ else
872
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
873
+ t = Token(TkLBRACK)
874
+ elsif @lex_state == EXPR_ARG && @space_seen
875
+ t = Token(TkLBRACK)
876
+ else
877
+ t = Token(TkfLBRACK)
878
+ end
879
+ @lex_state = EXPR_BEG
880
+ end
881
+ t.set_text("[")
882
+ end
883
+
884
+ @OP.def_rule("{") do
885
+ @indent += 1
886
+ if @lex_state != EXPR_END && @lex_state != EXPR_ARG
887
+ t = Token(TkLBRACE)
888
+ else
889
+ t = Token(TkfLBRACE)
890
+ end
891
+ @lex_state = EXPR_BEG
892
+ t.set_text("{")
893
+ end
894
+
895
+ @OP.def_rule('\\') do #'
896
+ if getc == "\n"
897
+ @space_seen = true
898
+ @continue = true
899
+ Token(TkSPACE).set_text("\\\n")
900
+ else
901
+ ungetc
902
+ Token("\\").set_text("\\") #"
903
+ end
904
+ end
905
+
906
+ @OP.def_rule('%') do
907
+ |op, io|
908
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
909
+ identify_quotation('%')
910
+ elsif peek(0) == '='
911
+ getc
912
+ Token(TkOPASGN, "%").set_text("%=")
913
+ elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
914
+ identify_quotation('%')
915
+ else
916
+ @lex_state = EXPR_BEG
917
+ Token("%").set_text("%")
918
+ end
919
+ end
920
+
921
+ @OP.def_rule('$') do #'
922
+ identify_gvar
923
+ end
924
+
925
+ @OP.def_rule('@') do
926
+ if peek(0) =~ /[@\w_]/
927
+ ungetc
928
+ identify_identifier
929
+ else
930
+ Token("@").set_text("@")
931
+ end
932
+ end
933
+
934
+ @OP.def_rule("__END__", proc{@prev_char_no == 0 && peek(0) =~ /[\r\n]/}) do
935
+ throw :eof
936
+ end
937
+
938
+ @OP.def_rule("") do
939
+ |op, io|
940
+ printf "MATCH: start %s: %s\n", op, io.inspect if RDoc::RubyLex.debug?
941
+ if peek(0) =~ /[0-9]/
942
+ t = identify_number("")
943
+ elsif peek(0) =~ /[\w_]/
944
+ t = identify_identifier
945
+ end
946
+ printf "MATCH: end %s: %s\n", op, io.inspect if RDoc::RubyLex.debug?
947
+ t
948
+ end
949
+ end
950
+
951
+ def identify_gvar
952
+ @lex_state = EXPR_END
953
+ str = "$"
954
+
955
+ tk = case ch = getc
956
+ when /[~_*$?!@\/\\;,=:<>".]/ #"
957
+ str << ch
958
+ Token(TkGVAR, str)
959
+
960
+ when "-"
961
+ str << "-" << getc
962
+ Token(TkGVAR, str)
963
+
964
+ when "&", "`", "'", "+"
965
+ str << ch
966
+ Token(TkBACK_REF, str)
967
+
968
+ when /[1-9]/
969
+ str << ch
970
+ while (ch = getc) =~ /[0-9]/
971
+ str << ch
972
+ end
973
+ ungetc
974
+ Token(TkNTH_REF)
975
+ when /\w/
976
+ ungetc
977
+ ungetc
978
+ return identify_identifier
979
+ else
980
+ ungetc
981
+ Token("$")
982
+ end
983
+ tk.set_text(str)
984
+ end
985
+
986
+ def identify_identifier
987
+ token = ""
988
+ token.concat getc if peek(0) =~ /[$@]/
989
+ token.concat getc if peek(0) == "@"
990
+
991
+ while (ch = getc) =~ /\w|_/
992
+ print ":", ch, ":" if RDoc::RubyLex.debug?
993
+ token.concat ch
994
+ end
995
+ ungetc
996
+
997
+ if ch == "!" or ch == "?"
998
+ token.concat getc
999
+ end
1000
+ # fix token
1001
+
1002
+ # $stderr.puts "identifier - #{token}, state = #@lex_state"
1003
+
1004
+ case token
1005
+ when /^\$/
1006
+ return Token(TkGVAR, token).set_text(token)
1007
+ when /^\@/
1008
+ @lex_state = EXPR_END
1009
+ return Token(TkIVAR, token).set_text(token)
1010
+ end
1011
+
1012
+ if @lex_state != EXPR_DOT
1013
+ print token, "\n" if RDoc::RubyLex.debug?
1014
+
1015
+ token_c, *trans = TkReading2Token[token]
1016
+ if token_c
1017
+ # reserved word?
1018
+
1019
+ if (@lex_state != EXPR_BEG &&
1020
+ @lex_state != EXPR_FNAME &&
1021
+ trans[1])
1022
+ # modifiers
1023
+ token_c = TkSymbol2Token[trans[1]]
1024
+ @lex_state = trans[0]
1025
+ else
1026
+ if @lex_state != EXPR_FNAME
1027
+ if ENINDENT_CLAUSE.include?(token)
1028
+ @indent += 1
1029
+ elsif DEINDENT_CLAUSE.include?(token)
1030
+ @indent -= 1
1031
+ end
1032
+ @lex_state = trans[0]
1033
+ else
1034
+ @lex_state = EXPR_END
1035
+ end
1036
+ end
1037
+ return Token(token_c, token).set_text(token)
1038
+ end
1039
+ end
1040
+
1041
+ if @lex_state == EXPR_FNAME
1042
+ @lex_state = EXPR_END
1043
+ if peek(0) == '='
1044
+ token.concat getc
1045
+ end
1046
+ elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
1047
+ @lex_state = EXPR_ARG
1048
+ else
1049
+ @lex_state = EXPR_END
1050
+ end
1051
+
1052
+ if token[0, 1] =~ /[A-Z]/
1053
+ return Token(TkCONSTANT, token).set_text(token)
1054
+ elsif token[token.size - 1, 1] =~ /[!?]/
1055
+ return Token(TkFID, token).set_text(token)
1056
+ else
1057
+ return Token(TkIDENTIFIER, token).set_text(token)
1058
+ end
1059
+ end
1060
+
1061
+ def identify_here_document
1062
+ ch = getc
1063
+ if ch == "-"
1064
+ ch = getc
1065
+ indent = true
1066
+ end
1067
+ if /['"`]/ =~ ch # '
1068
+ lt = ch
1069
+ quoted = ""
1070
+ while (c = getc) && c != lt
1071
+ quoted.concat c
1072
+ end
1073
+ else
1074
+ lt = '"'
1075
+ quoted = ch.dup
1076
+ while (c = getc) && c =~ /\w/
1077
+ quoted.concat c
1078
+ end
1079
+ ungetc
1080
+ end
1081
+
1082
+ ltback, @ltype = @ltype, lt
1083
+ reserve = ""
1084
+
1085
+ while ch = getc
1086
+ reserve << ch
1087
+ if ch == "\\" #"
1088
+ ch = getc
1089
+ reserve << ch
1090
+ elsif ch == "\n"
1091
+ break
1092
+ end
1093
+ end
1094
+
1095
+ str = ""
1096
+ while (l = gets)
1097
+ l.chomp!
1098
+ l.strip! if indent
1099
+ break if l == quoted
1100
+ str << l.chomp << "\n"
1101
+ end
1102
+
1103
+ @reader.divert_read_from(reserve)
1104
+
1105
+ @ltype = ltback
1106
+ @lex_state = EXPR_END
1107
+ Token(Ltype2Token[lt], str).set_text(str.dump)
1108
+ end
1109
+
1110
+ def identify_quotation(initial_char)
1111
+ ch = getc
1112
+ if lt = PERCENT_LTYPE[ch]
1113
+ initial_char += ch
1114
+ ch = getc
1115
+ elsif ch =~ /\W/
1116
+ lt = "\""
1117
+ else
1118
+ fail SyntaxError, "unknown type of %string ('#{ch}')"
1119
+ end
1120
+ # if ch !~ /\W/
1121
+ # ungetc
1122
+ # next
1123
+ # end
1124
+ #@ltype = lt
1125
+ @quoted = ch unless @quoted = PERCENT_PAREN[ch]
1126
+ identify_string(lt, @quoted, ch, initial_char)
1127
+ end
1128
+
1129
+ def identify_number(start)
1130
+ str = start.dup
1131
+
1132
+ if start == "+" or start == "-" or start == ""
1133
+ start = getc
1134
+ str << start
1135
+ end
1136
+
1137
+ @lex_state = EXPR_END
1138
+
1139
+ if start == "0"
1140
+ if peek(0) == "x"
1141
+ ch = getc
1142
+ str << ch
1143
+ match = /[0-9a-f_]/
1144
+ else
1145
+ match = /[0-7_]/
1146
+ end
1147
+ while ch = getc
1148
+ if ch !~ match
1149
+ ungetc
1150
+ break
1151
+ else
1152
+ str << ch
1153
+ end
1154
+ end
1155
+ return Token(TkINTEGER).set_text(str)
1156
+ end
1157
+
1158
+ type = TkINTEGER
1159
+ allow_point = TRUE
1160
+ allow_e = TRUE
1161
+ while ch = getc
1162
+ case ch
1163
+ when /[0-9_]/
1164
+ str << ch
1165
+
1166
+ when allow_point && "."
1167
+ type = TkFLOAT
1168
+ if peek(0) !~ /[0-9]/
1169
+ ungetc
1170
+ break
1171
+ end
1172
+ str << ch
1173
+ allow_point = false
1174
+
1175
+ when allow_e && "e", allow_e && "E"
1176
+ str << ch
1177
+ type = TkFLOAT
1178
+ if peek(0) =~ /[+-]/
1179
+ str << getc
1180
+ end
1181
+ allow_e = false
1182
+ allow_point = false
1183
+ else
1184
+ ungetc
1185
+ break
1186
+ end
1187
+ end
1188
+ Token(type).set_text(str)
1189
+ end
1190
+
1191
+ def identify_string(ltype, quoted = ltype, opener=nil, initial_char = nil)
1192
+ @ltype = ltype
1193
+ @quoted = quoted
1194
+ subtype = nil
1195
+
1196
+ str = ""
1197
+ str << initial_char if initial_char
1198
+ str << (opener||quoted)
1199
+
1200
+ nest = 0
1201
+ begin
1202
+ while ch = getc
1203
+ str << ch
1204
+ if @quoted == ch
1205
+ if nest == 0
1206
+ break
1207
+ else
1208
+ nest -= 1
1209
+ end
1210
+ elsif opener == ch
1211
+ nest += 1
1212
+ elsif @ltype != "'" && @ltype != "]" and ch == "#"
1213
+ ch = getc
1214
+ if ch == "{"
1215
+ subtype = true
1216
+ str << ch << skip_inner_expression
1217
+ else
1218
+ ungetc(ch)
1219
+ end
1220
+ elsif ch == '\\' #'
1221
+ str << read_escape
1222
+ end
1223
+ end
1224
+ if @ltype == "/"
1225
+ if peek(0) =~ /i|o|n|e|s/
1226
+ str << getc
1227
+ end
1228
+ end
1229
+ if subtype
1230
+ Token(DLtype2Token[ltype], str)
1231
+ else
1232
+ Token(Ltype2Token[ltype], str)
1233
+ end.set_text(str)
1234
+ ensure
1235
+ @ltype = nil
1236
+ @quoted = nil
1237
+ @lex_state = EXPR_END
1238
+ end
1239
+ end
1240
+
1241
+ def skip_inner_expression
1242
+ res = ""
1243
+ nest = 0
1244
+ while (ch = getc)
1245
+ res << ch
1246
+ if ch == '}'
1247
+ break if nest.zero?
1248
+ nest -= 1
1249
+ elsif ch == '{'
1250
+ nest += 1
1251
+ end
1252
+ end
1253
+ res
1254
+ end
1255
+
1256
+ def identify_comment
1257
+ @ltype = "#"
1258
+ comment = "#"
1259
+ while ch = getc
1260
+ if ch == "\\"
1261
+ ch = getc
1262
+ if ch == "\n"
1263
+ ch = " "
1264
+ else
1265
+ comment << "\\"
1266
+ end
1267
+ else
1268
+ if ch == "\n"
1269
+ @ltype = nil
1270
+ ungetc
1271
+ break
1272
+ end
1273
+ end
1274
+ comment << ch
1275
+ end
1276
+ return Token(TkCOMMENT).set_text(comment)
1277
+ end
1278
+
1279
+ def read_escape
1280
+ res = ""
1281
+ case ch = getc
1282
+ when /[0-7]/
1283
+ ungetc ch
1284
+ 3.times do
1285
+ case ch = getc
1286
+ when /[0-7]/
1287
+ when nil
1288
+ break
1289
+ else
1290
+ ungetc
1291
+ break
1292
+ end
1293
+ res << ch
1294
+ end
1295
+
1296
+ when "x"
1297
+ res << ch
1298
+ 2.times do
1299
+ case ch = getc
1300
+ when /[0-9a-fA-F]/
1301
+ when nil
1302
+ break
1303
+ else
1304
+ ungetc
1305
+ break
1306
+ end
1307
+ res << ch
1308
+ end
1309
+
1310
+ when "M"
1311
+ res << ch
1312
+ if (ch = getc) != '-'
1313
+ ungetc
1314
+ else
1315
+ res << ch
1316
+ if (ch = getc) == "\\" #"
1317
+ res << ch
1318
+ res << read_escape
1319
+ else
1320
+ res << ch
1321
+ end
1322
+ end
1323
+
1324
+ when "C", "c" #, "^"
1325
+ res << ch
1326
+ if ch == "C" and (ch = getc) != "-"
1327
+ ungetc
1328
+ else
1329
+ res << ch
1330
+ if (ch = getc) == "\\" #"
1331
+ res << ch
1332
+ res << read_escape
1333
+ else
1334
+ res << ch
1335
+ end
1336
+ end
1337
+ else
1338
+ res << ch
1339
+ end
1340
+ res
1341
+ end
1342
+ end
1343
+
1344
+ ##
1345
+ # Extracts code elements from a source file returning a TopLevel object
1346
+ # containing the constituent file elements.
1347
+ #
1348
+ # This file is based on rtags
1349
+ #
1350
+ # RubyParser understands how to document:
1351
+ # * classes
1352
+ # * modules
1353
+ # * methods
1354
+ # * constants
1355
+ # * aliases
1356
+ # * private, public, protected
1357
+ # * private_class_function, public_class_function
1358
+ # * module_function
1359
+ # * attr, attr_reader, attr_writer, attr_accessor
1360
+ # * extra accessors given on the command line
1361
+ # * metaprogrammed methods
1362
+ # * require
1363
+ # * include
1364
+ #
1365
+ # == Method Arguments
1366
+ #
1367
+ #--
1368
+ # NOTE: I don't think this works, needs tests, remove the paragraph following
1369
+ # this block when known to work
1370
+ #
1371
+ # The parser extracts the arguments from the method definition. You can
1372
+ # override this with a custom argument definition using the :args: directive:
1373
+ #
1374
+ # ##
1375
+ # # This method tries over and over until it is tired
1376
+ #
1377
+ # def go_go_go(thing_to_try, tries = 10) # :args: thing_to_try
1378
+ # puts thing_to_try
1379
+ # go_go_go thing_to_try, tries - 1
1380
+ # end
1381
+ #
1382
+ # If you have a more-complex set of overrides you can use the :call-seq:
1383
+ # directive:
1384
+ #++
1385
+ #
1386
+ # The parser extracts the arguments from the method definition. You can
1387
+ # override this with a custom argument definition using the :call-seq:
1388
+ # directive:
1389
+ #
1390
+ # ##
1391
+ # # This method can be called with a range or an offset and length
1392
+ # #
1393
+ # # :call-seq:
1394
+ # # my_method(Range)
1395
+ # # my_method(offset, length)
1396
+ #
1397
+ # def my_method(*args)
1398
+ # end
1399
+ #
1400
+ # The parser extracts +yield+ expressions from method bodies to gather the
1401
+ # yielded argument names. If your method manually calls a block instead of
1402
+ # yielding or you want to override the discovered argument names use
1403
+ # the :yields: directive:
1404
+ #
1405
+ # ##
1406
+ # # My method is awesome
1407
+ #
1408
+ # def my_method(&block) # :yields: happy, times
1409
+ # block.call 1, 2
1410
+ # end
1411
+ #
1412
+ # == Metaprogrammed Methods
1413
+ #
1414
+ # To pick up a metaprogrammed method, the parser looks for a comment starting
1415
+ # with '##' before an identifier:
1416
+ #
1417
+ # ##
1418
+ # # This is a meta-programmed method!
1419
+ #
1420
+ # add_my_method :meta_method, :arg1, :arg2
1421
+ #
1422
+ # The parser looks at the token after the identifier to determine the name, in
1423
+ # this example, :meta_method. If a name cannot be found, a warning is printed
1424
+ # and 'unknown is used.
1425
+ #
1426
+ # You can force the name of a method using the :method: directive:
1427
+ #
1428
+ # ##
1429
+ # # :method: woo_hoo!
1430
+ #
1431
+ # By default, meta-methods are instance methods. To indicate that a method is
1432
+ # a singleton method instead use the :singleton-method: directive:
1433
+ #
1434
+ # ##
1435
+ # # :singleton-method:
1436
+ #
1437
+ # You can also use the :singleton-method: directive with a name:
1438
+ #
1439
+ # ##
1440
+ # # :singleton-method: woo_hoo!
1441
+ #
1442
+ # == Hidden methods
1443
+ #
1444
+ # You can provide documentation for methods that don't appear using
1445
+ # the :method: and :singleton-method: directives:
1446
+ #
1447
+ # ##
1448
+ # # :method: ghost_method
1449
+ # # There is a method here, but you can't see it!
1450
+ #
1451
+ # ##
1452
+ # # this is a comment for a regular method
1453
+ #
1454
+ # def regular_method() end
1455
+ #
1456
+ # Note that by default, the :method: directive will be ignored if there is a
1457
+ # standard rdocable item following it.
1458
+
1459
+ class RDoc::Parser::Ruby < RDoc::Parser
1460
+
1461
+ parse_files_matching(/\.rbw?$/)
1462
+
1463
+ include RDoc::RubyToken
1464
+ include RDoc::TokenStream
1465
+
1466
+ NORMAL = "::"
1467
+ SINGLE = "<<"
1468
+
1469
+ def initialize(top_level, file_name, content, options, stats)
1470
+ super
1471
+
1472
+ @size = 0
1473
+ @token_listeners = nil
1474
+ @scanner = RDoc::RubyLex.new content, @options
1475
+ @scanner.exception_on_syntax_error = false
1476
+
1477
+ reset
1478
+ end
1479
+
1480
+ def add_token_listener(obj)
1481
+ @token_listeners ||= []
1482
+ @token_listeners << obj
1483
+ end
1484
+
1485
+ ##
1486
+ # Look for the first comment in a file that isn't a shebang line.
1487
+
1488
+ def collect_first_comment
1489
+ skip_tkspace
1490
+ res = ''
1491
+ first_line = true
1492
+
1493
+ tk = get_tk
1494
+
1495
+ while TkCOMMENT === tk
1496
+ if first_line and tk.text =~ /\A#!/ then
1497
+ skip_tkspace
1498
+ tk = get_tk
1499
+ elsif first_line and tk.text =~ /\A#\s*-\*-/ then
1500
+ first_line = false
1501
+ skip_tkspace
1502
+ tk = get_tk
1503
+ else
1504
+ first_line = false
1505
+ res << tk.text << "\n"
1506
+ tk = get_tk
1507
+
1508
+ if TkNL === tk then
1509
+ skip_tkspace false
1510
+ tk = get_tk
1511
+ end
1512
+ end
1513
+ end
1514
+
1515
+ unget_tk tk
1516
+
1517
+ res
1518
+ end
1519
+
1520
+ def error(msg)
1521
+ msg = make_message msg
1522
+ $stderr.puts msg
1523
+ exit(1)
1524
+ end
1525
+
1526
+ ##
1527
+ # Look for a 'call-seq' in the comment, and override the normal parameter
1528
+ # stuff
1529
+
1530
+ def extract_call_seq(comment, meth)
1531
+ if comment.sub!(/:?call-seq:(.*?)^\s*\#?\s*$/m, '') then
1532
+ seq = $1
1533
+ seq.gsub!(/^\s*\#\s*/, '')
1534
+ meth.call_seq = seq
1535
+ end
1536
+
1537
+ meth
1538
+ end
1539
+
1540
+ def get_bool
1541
+ skip_tkspace
1542
+ tk = get_tk
1543
+ case tk
1544
+ when TkTRUE
1545
+ true
1546
+ when TkFALSE, TkNIL
1547
+ false
1548
+ else
1549
+ unget_tk tk
1550
+ true
1551
+ end
1552
+ end
1553
+
1554
+ ##
1555
+ # Look for the name of a class of module (optionally with a leading :: or
1556
+ # with :: separated named) and return the ultimate name and container
1557
+
1558
+ def get_class_or_module(container)
1559
+ skip_tkspace
1560
+ name_t = get_tk
1561
+
1562
+ # class ::A -> A is in the top level
1563
+ if TkCOLON2 === name_t then
1564
+ name_t = get_tk
1565
+ container = @top_level
1566
+ end
1567
+
1568
+ skip_tkspace(false)
1569
+
1570
+ while TkCOLON2 === peek_tk do
1571
+ prev_container = container
1572
+ container = container.find_module_named(name_t.name)
1573
+ if !container
1574
+ # warn("Couldn't find module #{name_t.name}")
1575
+ container = prev_container.add_module RDoc::NormalModule, name_t.name
1576
+ end
1577
+ get_tk
1578
+ name_t = get_tk
1579
+ end
1580
+ skip_tkspace(false)
1581
+ return [container, name_t]
1582
+ end
1583
+
1584
+ ##
1585
+ # Return a superclass, which can be either a constant of an expression
1586
+
1587
+ def get_class_specification
1588
+ tk = get_tk
1589
+ return "self" if TkSELF === tk
1590
+
1591
+ res = ""
1592
+ while TkCOLON2 === tk or TkCOLON3 === tk or TkCONSTANT === tk do
1593
+ res += tk.text
1594
+ tk = get_tk
1595
+ end
1596
+
1597
+ unget_tk(tk)
1598
+ skip_tkspace(false)
1599
+
1600
+ get_tkread # empty out read buffer
1601
+
1602
+ tk = get_tk
1603
+
1604
+ case tk
1605
+ when TkNL, TkCOMMENT, TkSEMICOLON then
1606
+ unget_tk(tk)
1607
+ return res
1608
+ end
1609
+
1610
+ res += parse_call_parameters(tk)
1611
+ res
1612
+ end
1613
+
1614
+ ##
1615
+ # Parse a constant, which might be qualified by one or more class or module
1616
+ # names
1617
+
1618
+ def get_constant
1619
+ res = ""
1620
+ skip_tkspace(false)
1621
+ tk = get_tk
1622
+
1623
+ while TkCOLON2 === tk or TkCOLON3 === tk or TkCONSTANT === tk do
1624
+ res += tk.text
1625
+ tk = get_tk
1626
+ end
1627
+
1628
+ # if res.empty?
1629
+ # warn("Unexpected token #{tk} in constant")
1630
+ # end
1631
+ unget_tk(tk)
1632
+ res
1633
+ end
1634
+
1635
+ ##
1636
+ # Get a constant that may be surrounded by parens
1637
+
1638
+ def get_constant_with_optional_parens
1639
+ skip_tkspace(false)
1640
+ nest = 0
1641
+ while TkLPAREN === (tk = peek_tk) or TkfLPAREN === tk do
1642
+ get_tk
1643
+ skip_tkspace(true)
1644
+ nest += 1
1645
+ end
1646
+
1647
+ name = get_constant
1648
+
1649
+ while nest > 0
1650
+ skip_tkspace(true)
1651
+ tk = get_tk
1652
+ nest -= 1 if TkRPAREN === tk
1653
+ end
1654
+ name
1655
+ end
1656
+
1657
+ def get_symbol_or_name
1658
+ tk = get_tk
1659
+ case tk
1660
+ when TkSYMBOL
1661
+ tk.text.sub(/^:/, '')
1662
+ when TkId, TkOp
1663
+ tk.name
1664
+ when TkSTRING
1665
+ tk.text
1666
+ else
1667
+ raise "Name or symbol expected (got #{tk})"
1668
+ end
1669
+ end
1670
+
1671
+ def get_tk
1672
+ tk = nil
1673
+ if @tokens.empty?
1674
+ tk = @scanner.token
1675
+ @read.push @scanner.get_read
1676
+ puts "get_tk1 => #{tk.inspect}" if $TOKEN_DEBUG
1677
+ else
1678
+ @read.push @unget_read.shift
1679
+ tk = @tokens.shift
1680
+ puts "get_tk2 => #{tk.inspect}" if $TOKEN_DEBUG
1681
+ end
1682
+
1683
+ if TkSYMBEG === tk then
1684
+ set_token_position(tk.line_no, tk.char_no)
1685
+ tk1 = get_tk
1686
+ if TkId === tk1 or TkOp === tk1 or TkSTRING === tk1 then
1687
+ if tk1.respond_to?(:name)
1688
+ tk = Token(TkSYMBOL).set_text(":" + tk1.name)
1689
+ else
1690
+ tk = Token(TkSYMBOL).set_text(":" + tk1.text)
1691
+ end
1692
+ # remove the identifier we just read (we're about to
1693
+ # replace it with a symbol)
1694
+ @token_listeners.each do |obj|
1695
+ obj.pop_token
1696
+ end if @token_listeners
1697
+ else
1698
+ warn("':' not followed by identifier or operator")
1699
+ tk = tk1
1700
+ end
1701
+ end
1702
+
1703
+ # inform any listeners of our shiny new token
1704
+ @token_listeners.each do |obj|
1705
+ obj.add_token(tk)
1706
+ end if @token_listeners
1707
+
1708
+ tk
1709
+ end
1710
+
1711
+ def get_tkread
1712
+ read = @read.join("")
1713
+ @read = []
1714
+ read
1715
+ end
1716
+
1717
+ ##
1718
+ # Look for directives in a normal comment block:
1719
+ #
1720
+ # #-- - don't display comment from this point forward
1721
+ #
1722
+ # This routine modifies it's parameter
1723
+
1724
+ def look_for_directives_in(context, comment)
1725
+ preprocess = RDoc::Markup::PreProcess.new(@file_name,
1726
+ @options.rdoc_include)
1727
+
1728
+ preprocess.handle(comment) do |directive, param|
1729
+ case directive
1730
+ when 'enddoc' then
1731
+ throw :enddoc
1732
+ when 'main' then
1733
+ @options.main_page = param
1734
+ ''
1735
+ when 'method', 'singleton-method' then
1736
+ false # ignore
1737
+ when 'section' then
1738
+ context.set_current_section(param, comment)
1739
+ comment.replace ''
1740
+ break
1741
+ when 'startdoc' then
1742
+ context.start_doc
1743
+ context.force_documentation = true
1744
+ ''
1745
+ when 'stopdoc' then
1746
+ context.stop_doc
1747
+ ''
1748
+ when 'title' then
1749
+ @options.title = param
1750
+ ''
1751
+ else
1752
+ warn "Unrecognized directive '#{directive}'"
1753
+ false
1754
+ end
1755
+ end
1756
+
1757
+ remove_private_comments(comment)
1758
+ end
1759
+
1760
+ def make_message(msg)
1761
+ prefix = "\n" + @file_name + ":"
1762
+ if @scanner
1763
+ prefix << "#{@scanner.line_no}:#{@scanner.char_no}: "
1764
+ end
1765
+ return prefix + msg
1766
+ end
1767
+
1768
+ def parse_attr(context, single, tk, comment)
1769
+ args = parse_symbol_arg(1)
1770
+ if args.size > 0
1771
+ name = args[0]
1772
+ rw = "R"
1773
+ skip_tkspace(false)
1774
+ tk = get_tk
1775
+ if TkCOMMA === tk then
1776
+ rw = "RW" if get_bool
1777
+ else
1778
+ unget_tk tk
1779
+ end
1780
+ att = RDoc::Attr.new get_tkread, name, rw, comment
1781
+ read_documentation_modifiers att, RDoc::ATTR_MODIFIERS
1782
+ if att.document_self
1783
+ context.add_attribute(att)
1784
+ end
1785
+ else
1786
+ warn("'attr' ignored - looks like a variable")
1787
+ end
1788
+ end
1789
+
1790
+ def parse_attr_accessor(context, single, tk, comment)
1791
+ args = parse_symbol_arg
1792
+ read = get_tkread
1793
+ rw = "?"
1794
+
1795
+ # If nodoc is given, don't document any of them
1796
+
1797
+ tmp = RDoc::CodeObject.new
1798
+ read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS
1799
+ return unless tmp.document_self
1800
+
1801
+ case tk.name
1802
+ when "attr_reader" then rw = "R"
1803
+ when "attr_writer" then rw = "W"
1804
+ when "attr_accessor" then rw = "RW"
1805
+ else
1806
+ rw = @options.extra_accessor_flags[tk.name]
1807
+ rw = '?' if rw.nil?
1808
+ end
1809
+
1810
+ for name in args
1811
+ att = RDoc::Attr.new get_tkread, name, rw, comment
1812
+ context.add_attribute att
1813
+ end
1814
+ end
1815
+
1816
+ def parse_alias(context, single, tk, comment)
1817
+ skip_tkspace
1818
+ if TkLPAREN === peek_tk then
1819
+ get_tk
1820
+ skip_tkspace
1821
+ end
1822
+ new_name = get_symbol_or_name
1823
+ @scanner.instance_eval{@lex_state = EXPR_FNAME}
1824
+ skip_tkspace
1825
+ if TkCOMMA === peek_tk then
1826
+ get_tk
1827
+ skip_tkspace
1828
+ end
1829
+ old_name = get_symbol_or_name
1830
+
1831
+ al = RDoc::Alias.new get_tkread, old_name, new_name, comment
1832
+ read_documentation_modifiers al, RDoc::ATTR_MODIFIERS
1833
+ if al.document_self
1834
+ context.add_alias(al)
1835
+ end
1836
+ end
1837
+
1838
+ def parse_call_parameters(tk)
1839
+ end_token = case tk
1840
+ when TkLPAREN, TkfLPAREN
1841
+ TkRPAREN
1842
+ when TkRPAREN
1843
+ return ""
1844
+ else
1845
+ TkNL
1846
+ end
1847
+ nest = 0
1848
+
1849
+ loop do
1850
+ case tk
1851
+ when TkSEMICOLON
1852
+ break
1853
+ when TkLPAREN, TkfLPAREN
1854
+ nest += 1
1855
+ when end_token
1856
+ if end_token == TkRPAREN
1857
+ nest -= 1
1858
+ break if @scanner.lex_state == EXPR_END and nest <= 0
1859
+ else
1860
+ break unless @scanner.continue
1861
+ end
1862
+ when TkCOMMENT
1863
+ unget_tk(tk)
1864
+ break
1865
+ end
1866
+ tk = get_tk
1867
+ end
1868
+ res = get_tkread.tr("\n", " ").strip
1869
+ res = "" if res == ";"
1870
+ res
1871
+ end
1872
+
1873
+ def parse_class(container, single, tk, comment)
1874
+ container, name_t = get_class_or_module(container)
1875
+
1876
+ case name_t
1877
+ when TkCONSTANT
1878
+ name = name_t.name
1879
+ superclass = "Object"
1880
+
1881
+ if TkLT === peek_tk then
1882
+ get_tk
1883
+ skip_tkspace(true)
1884
+ superclass = get_class_specification
1885
+ superclass = "<unknown>" if superclass.empty?
1886
+ end
1887
+
1888
+ cls_type = single == SINGLE ? RDoc::SingleClass : RDoc::NormalClass
1889
+ cls = container.add_class cls_type, name, superclass
1890
+
1891
+ @stats.add_class cls
1892
+
1893
+ read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS
1894
+ cls.record_location @top_level
1895
+
1896
+ parse_statements cls
1897
+ cls.comment = comment
1898
+
1899
+ when TkLSHFT
1900
+ case name = get_class_specification
1901
+ when "self", container.name
1902
+ parse_statements(container, SINGLE)
1903
+ else
1904
+ other = RDoc::TopLevel.find_class_named(name)
1905
+ unless other
1906
+ # other = @top_level.add_class(NormalClass, name, nil)
1907
+ # other.record_location(@top_level)
1908
+ # other.comment = comment
1909
+ other = RDoc::NormalClass.new "Dummy", nil
1910
+ end
1911
+
1912
+ @stats.add_class other
1913
+
1914
+ read_documentation_modifiers other, RDoc::CLASS_MODIFIERS
1915
+ parse_statements(other, SINGLE)
1916
+ end
1917
+
1918
+ else
1919
+ warn("Expected class name or '<<'. Got #{name_t.class}: #{name_t.text.inspect}")
1920
+ end
1921
+ end
1922
+
1923
+ def parse_constant(container, single, tk, comment)
1924
+ name = tk.name
1925
+ skip_tkspace(false)
1926
+ eq_tk = get_tk
1927
+
1928
+ unless TkASSIGN === eq_tk then
1929
+ unget_tk(eq_tk)
1930
+ return
1931
+ end
1932
+
1933
+
1934
+ nest = 0
1935
+ get_tkread
1936
+
1937
+ tk = get_tk
1938
+ if TkGT === tk then
1939
+ unget_tk(tk)
1940
+ unget_tk(eq_tk)
1941
+ return
1942
+ end
1943
+
1944
+ loop do
1945
+ case tk
1946
+ when TkSEMICOLON
1947
+ break
1948
+ when TkLPAREN, TkfLPAREN, TkLBRACE, TkLBRACK, TkDO
1949
+ nest += 1
1950
+ when TkRPAREN, TkRBRACE, TkRBRACK, TkEND
1951
+ nest -= 1
1952
+ when TkCOMMENT
1953
+ if nest <= 0 && @scanner.lex_state == EXPR_END
1954
+ unget_tk(tk)
1955
+ break
1956
+ end
1957
+ when TkNL
1958
+ if (nest <= 0) && ((@scanner.lex_state == EXPR_END) || (!@scanner.continue))
1959
+ unget_tk(tk)
1960
+ break
1961
+ end
1962
+ end
1963
+ tk = get_tk
1964
+ end
1965
+
1966
+ res = get_tkread.tr("\n", " ").strip
1967
+ res = "" if res == ";"
1968
+
1969
+ con = RDoc::Constant.new name, res, comment
1970
+ read_documentation_modifiers con, RDoc::CONSTANT_MODIFIERS
1971
+
1972
+ if con.document_self
1973
+ container.add_constant(con)
1974
+ end
1975
+ end
1976
+
1977
+ def parse_comment(container, tk, comment)
1978
+ line_no = tk.line_no
1979
+ column = tk.char_no
1980
+
1981
+ singleton = !!comment.sub!(/(^# +:?)(singleton-)(method:)/, '\1\3')
1982
+
1983
+ if comment.sub!(/^# +:?method: *(\S*).*?\n/i, '') then
1984
+ name = $1 unless $1.empty?
1985
+ else
1986
+ return nil
1987
+ end
1988
+
1989
+ meth = RDoc::GhostMethod.new get_tkread, name
1990
+ meth.singleton = singleton
1991
+
1992
+ @stats.add_method meth
1993
+
1994
+ meth.start_collecting_tokens
1995
+ indent = TkSPACE.new 1, 1
1996
+ indent.set_text " " * column
1997
+
1998
+ position_comment = TkCOMMENT.new(line_no, 1, "# File #{@top_level.file_absolute_name}, line #{line_no}")
1999
+ meth.add_tokens [position_comment, NEWLINE_TOKEN, indent]
2000
+
2001
+ meth.params = ''
2002
+
2003
+ extract_call_seq comment, meth
2004
+
2005
+ container.add_method meth if meth.document_self
2006
+
2007
+ meth.comment = comment
2008
+ end
2009
+
2010
+ def parse_include(context, comment)
2011
+ loop do
2012
+ skip_tkspace_comment
2013
+
2014
+ name = get_constant_with_optional_parens
2015
+ context.add_include RDoc::Include.new(name, comment) unless name.empty?
2016
+
2017
+ return unless TkCOMMA === peek_tk
2018
+ get_tk
2019
+ end
2020
+ end
2021
+
2022
+ ##
2023
+ # Parses a meta-programmed method
2024
+
2025
+ def parse_meta_method(container, single, tk, comment)
2026
+ line_no = tk.line_no
2027
+ column = tk.char_no
2028
+
2029
+ start_collecting_tokens
2030
+ add_token tk
2031
+ add_token_listener self
2032
+
2033
+ skip_tkspace false
2034
+
2035
+ singleton = !!comment.sub!(/(^# +:?)(singleton-)(method:)/, '\1\3')
2036
+
2037
+ if comment.sub!(/^# +:?method: *(\S*).*?\n/i, '') then
2038
+ name = $1 unless $1.empty?
2039
+ end
2040
+
2041
+ if name.nil? then
2042
+ name_t = get_tk
2043
+ case name_t
2044
+ when TkSYMBOL then
2045
+ name = name_t.text[1..-1]
2046
+ when TkSTRING then
2047
+ name = name_t.text[1..-2]
2048
+ else
2049
+ warn "#{container.top_level.file_relative_name}:#{name_t.line_no} unknown name token #{name_t.inspect} for meta-method"
2050
+ name = 'unknown'
2051
+ end
2052
+ end
2053
+
2054
+ meth = RDoc::MetaMethod.new get_tkread, name
2055
+ meth.singleton = singleton
2056
+
2057
+ @stats.add_method meth
2058
+
2059
+ remove_token_listener self
2060
+
2061
+ meth.start_collecting_tokens
2062
+ indent = TkSPACE.new 1, 1
2063
+ indent.set_text " " * column
2064
+
2065
+ position_comment = TkCOMMENT.new(line_no, 1, "# File #{@top_level.file_absolute_name}, line #{line_no}")
2066
+ meth.add_tokens [position_comment, NEWLINE_TOKEN, indent]
2067
+ meth.add_tokens @token_stream
2068
+
2069
+ add_token_listener meth
2070
+
2071
+ meth.params = ''
2072
+
2073
+ extract_call_seq comment, meth
2074
+
2075
+ container.add_method meth if meth.document_self
2076
+
2077
+ last_tk = tk
2078
+
2079
+ while tk = get_tk do
2080
+ case tk
2081
+ when TkSEMICOLON then
2082
+ break
2083
+ when TkNL then
2084
+ break unless last_tk and TkCOMMA === last_tk
2085
+ when TkSPACE then
2086
+ # expression continues
2087
+ else
2088
+ last_tk = tk
2089
+ end
2090
+ end
2091
+
2092
+ remove_token_listener meth
2093
+
2094
+ meth.comment = comment
2095
+ end
2096
+
2097
+ ##
2098
+ # Parses a method
2099
+
2100
+ def parse_method(container, single, tk, comment)
2101
+ line_no = tk.line_no
2102
+ column = tk.char_no
2103
+
2104
+ start_collecting_tokens
2105
+ add_token(tk)
2106
+ add_token_listener(self)
2107
+
2108
+ @scanner.instance_eval do @lex_state = EXPR_FNAME end
2109
+
2110
+ skip_tkspace(false)
2111
+ name_t = get_tk
2112
+ back_tk = skip_tkspace
2113
+ meth = nil
2114
+ added_container = false
2115
+
2116
+ dot = get_tk
2117
+ if TkDOT === dot or TkCOLON2 === dot then
2118
+ @scanner.instance_eval do @lex_state = EXPR_FNAME end
2119
+ skip_tkspace
2120
+ name_t2 = get_tk
2121
+
2122
+ case name_t
2123
+ when TkSELF then
2124
+ name = name_t2.name
2125
+ when TkCONSTANT then
2126
+ name = name_t2.name
2127
+ prev_container = container
2128
+ container = container.find_module_named(name_t.name)
2129
+ unless container then
2130
+ added_container = true
2131
+ obj = name_t.name.split("::").inject(Object) do |state, item|
2132
+ state.const_get(item)
2133
+ end rescue nil
2134
+
2135
+ type = obj.class == Class ? RDoc::NormalClass : RDoc::NormalModule
2136
+
2137
+ unless [Class, Module].include?(obj.class) then
2138
+ warn("Couldn't find #{name_t.name}. Assuming it's a module")
2139
+ end
2140
+
2141
+ if type == RDoc::NormalClass then
2142
+ container = prev_container.add_class(type, name_t.name, obj.superclass.name)
2143
+ else
2144
+ container = prev_container.add_module(type, name_t.name)
2145
+ end
2146
+
2147
+ container.record_location @top_level
2148
+ end
2149
+ else
2150
+ # warn("Unexpected token '#{name_t2.inspect}'")
2151
+ # break
2152
+ skip_method(container)
2153
+ return
2154
+ end
2155
+
2156
+ meth = RDoc::AnyMethod.new(get_tkread, name)
2157
+ meth.singleton = true
2158
+ else
2159
+ unget_tk dot
2160
+ back_tk.reverse_each do |token|
2161
+ unget_tk token
2162
+ end
2163
+ name = name_t.name
2164
+
2165
+ meth = RDoc::AnyMethod.new get_tkread, name
2166
+ meth.singleton = (single == SINGLE)
2167
+ end
2168
+
2169
+ @stats.add_method meth
2170
+
2171
+ remove_token_listener self
2172
+
2173
+ meth.start_collecting_tokens
2174
+ indent = TkSPACE.new 1, 1
2175
+ indent.set_text " " * column
2176
+
2177
+ token = TkCOMMENT.new(line_no, 1, "# File #{@top_level.file_absolute_name}, line #{line_no}")
2178
+ meth.add_tokens [token, NEWLINE_TOKEN, indent]
2179
+ meth.add_tokens @token_stream
2180
+
2181
+ add_token_listener meth
2182
+
2183
+ @scanner.instance_eval do @continue = false end
2184
+ parse_method_parameters meth
2185
+
2186
+ if meth.document_self then
2187
+ container.add_method meth
2188
+ elsif added_container then
2189
+ container.document_self = false
2190
+ end
2191
+
2192
+ # Having now read the method parameters and documentation modifiers, we
2193
+ # now know whether we have to rename #initialize to ::new
2194
+
2195
+ if name == "initialize" && !meth.singleton then
2196
+ if meth.dont_rename_initialize then
2197
+ meth.visibility = :protected
2198
+ else
2199
+ meth.singleton = true
2200
+ meth.name = "new"
2201
+ meth.visibility = :public
2202
+ end
2203
+ end
2204
+
2205
+ parse_statements(container, single, meth)
2206
+
2207
+ remove_token_listener(meth)
2208
+
2209
+ extract_call_seq comment, meth
2210
+
2211
+ meth.comment = comment
2212
+ end
2213
+
2214
+ def parse_method_or_yield_parameters(method = nil,
2215
+ modifiers = RDoc::METHOD_MODIFIERS)
2216
+ skip_tkspace(false)
2217
+ tk = get_tk
2218
+
2219
+ # Little hack going on here. In the statement
2220
+ # f = 2*(1+yield)
2221
+ # We see the RPAREN as the next token, so we need
2222
+ # to exit early. This still won't catch all cases
2223
+ # (such as "a = yield + 1"
2224
+ end_token = case tk
2225
+ when TkLPAREN, TkfLPAREN
2226
+ TkRPAREN
2227
+ when TkRPAREN
2228
+ return ""
2229
+ else
2230
+ TkNL
2231
+ end
2232
+ nest = 0
2233
+
2234
+ loop do
2235
+ case tk
2236
+ when TkSEMICOLON
2237
+ break
2238
+ when TkLBRACE
2239
+ nest += 1
2240
+ when TkRBRACE
2241
+ # we might have a.each {|i| yield i }
2242
+ unget_tk(tk) if nest.zero?
2243
+ nest -= 1
2244
+ break if nest <= 0
2245
+ when TkLPAREN, TkfLPAREN
2246
+ nest += 1
2247
+ when end_token
2248
+ if end_token == TkRPAREN
2249
+ nest -= 1
2250
+ break if @scanner.lex_state == EXPR_END and nest <= 0
2251
+ else
2252
+ break unless @scanner.continue
2253
+ end
2254
+ when method && method.block_params.nil? && TkCOMMENT
2255
+ unget_tk(tk)
2256
+ read_documentation_modifiers(method, modifiers)
2257
+ end
2258
+ tk = get_tk
2259
+ end
2260
+ res = get_tkread.tr("\n", " ").strip
2261
+ res = "" if res == ";"
2262
+ res
2263
+ end
2264
+
2265
+ ##
2266
+ # Capture the method's parameters. Along the way, look for a comment
2267
+ # containing:
2268
+ #
2269
+ # # yields: ....
2270
+ #
2271
+ # and add this as the block_params for the method
2272
+
2273
+ def parse_method_parameters(method)
2274
+ res = parse_method_or_yield_parameters(method)
2275
+ res = "(" + res + ")" unless res[0] == ?(
2276
+ method.params = res unless method.params
2277
+ if method.block_params.nil?
2278
+ skip_tkspace(false)
2279
+ read_documentation_modifiers method, RDoc::METHOD_MODIFIERS
2280
+ end
2281
+ end
2282
+
2283
+ def parse_module(container, single, tk, comment)
2284
+ container, name_t = get_class_or_module(container)
2285
+
2286
+ name = name_t.name
2287
+
2288
+ mod = container.add_module RDoc::NormalModule, name
2289
+ mod.record_location @top_level
2290
+
2291
+ @stats.add_module mod
2292
+
2293
+ read_documentation_modifiers mod, RDoc::CLASS_MODIFIERS
2294
+ parse_statements(mod)
2295
+ mod.comment = comment
2296
+ end
2297
+
2298
+ def parse_require(context, comment)
2299
+ skip_tkspace_comment
2300
+ tk = get_tk
2301
+ if TkLPAREN === tk then
2302
+ skip_tkspace_comment
2303
+ tk = get_tk
2304
+ end
2305
+
2306
+ name = nil
2307
+ case tk
2308
+ when TkSTRING
2309
+ name = tk.text
2310
+ # when TkCONSTANT, TkIDENTIFIER, TkIVAR, TkGVAR
2311
+ # name = tk.name
2312
+ when TkDSTRING
2313
+ warn "Skipping require of dynamic string: #{tk.text}"
2314
+ # else
2315
+ # warn "'require' used as variable"
2316
+ end
2317
+ if name
2318
+ context.add_require RDoc::Require.new(name, comment)
2319
+ else
2320
+ unget_tk(tk)
2321
+ end
2322
+ end
2323
+
2324
+ def parse_statements(container, single = NORMAL, current_method = nil,
2325
+ comment = '')
2326
+ nest = 1
2327
+ save_visibility = container.visibility
2328
+
2329
+ non_comment_seen = true
2330
+
2331
+ while tk = get_tk do
2332
+ keep_comment = false
2333
+
2334
+ non_comment_seen = true unless TkCOMMENT === tk
2335
+
2336
+ case tk
2337
+ when TkNL then
2338
+ skip_tkspace true # Skip blanks and newlines
2339
+ tk = get_tk
2340
+
2341
+ if TkCOMMENT === tk then
2342
+ if non_comment_seen then
2343
+ # Look for RDoc in a comment about to be thrown away
2344
+ parse_comment container, tk, comment unless comment.empty?
2345
+
2346
+ comment = ''
2347
+ non_comment_seen = false
2348
+ end
2349
+
2350
+ while TkCOMMENT === tk do
2351
+ comment << tk.text << "\n"
2352
+ tk = get_tk # this is the newline
2353
+ skip_tkspace(false) # leading spaces
2354
+ tk = get_tk
2355
+ end
2356
+
2357
+ unless comment.empty? then
2358
+ look_for_directives_in container, comment
2359
+
2360
+ if container.done_documenting then
2361
+ container.ongoing_visibility = save_visibility
2362
+ end
2363
+ end
2364
+
2365
+ keep_comment = true
2366
+ else
2367
+ non_comment_seen = true
2368
+ end
2369
+
2370
+ unget_tk tk
2371
+ keep_comment = true
2372
+
2373
+ when TkCLASS then
2374
+ if container.document_children then
2375
+ parse_class container, single, tk, comment
2376
+ else
2377
+ nest += 1
2378
+ end
2379
+
2380
+ when TkMODULE then
2381
+ if container.document_children then
2382
+ parse_module container, single, tk, comment
2383
+ else
2384
+ nest += 1
2385
+ end
2386
+
2387
+ when TkDEF then
2388
+ if container.document_self then
2389
+ parse_method container, single, tk, comment
2390
+ else
2391
+ nest += 1
2392
+ end
2393
+
2394
+ when TkCONSTANT then
2395
+ if container.document_self then
2396
+ parse_constant container, single, tk, comment
2397
+ end
2398
+
2399
+ when TkALIAS then
2400
+ if container.document_self then
2401
+ parse_alias container, single, tk, comment
2402
+ end
2403
+
2404
+ when TkYIELD then
2405
+ if current_method.nil? then
2406
+ warn "Warning: yield outside of method" if container.document_self
2407
+ else
2408
+ parse_yield container, single, tk, current_method
2409
+ end
2410
+
2411
+ # Until and While can have a 'do', which shouldn't increase the nesting.
2412
+ # We can't solve the general case, but we can handle most occurrences by
2413
+ # ignoring a do at the end of a line.
2414
+
2415
+ when TkUNTIL, TkWHILE then
2416
+ nest += 1
2417
+ skip_optional_do_after_expression
2418
+
2419
+ # 'for' is trickier
2420
+ when TkFOR then
2421
+ nest += 1
2422
+ skip_for_variable
2423
+ skip_optional_do_after_expression
2424
+
2425
+ when TkCASE, TkDO, TkIF, TkUNLESS, TkBEGIN then
2426
+ nest += 1
2427
+
2428
+ when TkIDENTIFIER then
2429
+ if nest == 1 and current_method.nil? then
2430
+ case tk.name
2431
+ when 'private', 'protected', 'public', 'private_class_method',
2432
+ 'public_class_method', 'module_function' then
2433
+ parse_visibility container, single, tk
2434
+ keep_comment = true
2435
+ when 'attr' then
2436
+ parse_attr container, single, tk, comment
2437
+ when /^attr_(reader|writer|accessor)$/, @options.extra_accessors then
2438
+ parse_attr_accessor container, single, tk, comment
2439
+ when 'alias_method' then
2440
+ if container.document_self then
2441
+ parse_alias container, single, tk, comment
2442
+ end
2443
+ else
2444
+ if container.document_self and comment =~ /\A#\#$/ then
2445
+ parse_meta_method container, single, tk, comment
2446
+ end
2447
+ end
2448
+ end
2449
+
2450
+ case tk.name
2451
+ when "require" then
2452
+ parse_require container, comment
2453
+ when "include" then
2454
+ parse_include container, comment
2455
+ end
2456
+
2457
+ when TkEND then
2458
+ nest -= 1
2459
+ if nest == 0 then
2460
+ read_documentation_modifiers container, RDoc::CLASS_MODIFIERS
2461
+ container.ongoing_visibility = save_visibility
2462
+ return
2463
+ end
2464
+
2465
+ end
2466
+
2467
+ comment = '' unless keep_comment
2468
+
2469
+ begin
2470
+ get_tkread
2471
+ skip_tkspace(false)
2472
+ end while peek_tk == TkNL
2473
+ end
2474
+ end
2475
+
2476
+ def parse_symbol_arg(no = nil)
2477
+ args = []
2478
+ skip_tkspace_comment
2479
+ case tk = get_tk
2480
+ when TkLPAREN
2481
+ loop do
2482
+ skip_tkspace_comment
2483
+ if tk1 = parse_symbol_in_arg
2484
+ args.push tk1
2485
+ break if no and args.size >= no
2486
+ end
2487
+
2488
+ skip_tkspace_comment
2489
+ case tk2 = get_tk
2490
+ when TkRPAREN
2491
+ break
2492
+ when TkCOMMA
2493
+ else
2494
+ warn("unexpected token: '#{tk2.inspect}'") if $DEBUG_RDOC
2495
+ break
2496
+ end
2497
+ end
2498
+ else
2499
+ unget_tk tk
2500
+ if tk = parse_symbol_in_arg
2501
+ args.push tk
2502
+ return args if no and args.size >= no
2503
+ end
2504
+
2505
+ loop do
2506
+ skip_tkspace(false)
2507
+
2508
+ tk1 = get_tk
2509
+ unless TkCOMMA === tk1 then
2510
+ unget_tk tk1
2511
+ break
2512
+ end
2513
+
2514
+ skip_tkspace_comment
2515
+ if tk = parse_symbol_in_arg
2516
+ args.push tk
2517
+ break if no and args.size >= no
2518
+ end
2519
+ end
2520
+ end
2521
+ args
2522
+ end
2523
+
2524
+ def parse_symbol_in_arg
2525
+ case tk = get_tk
2526
+ when TkSYMBOL
2527
+ tk.text.sub(/^:/, '')
2528
+ when TkSTRING
2529
+ eval @read[-1]
2530
+ else
2531
+ warn("Expected symbol or string, got #{tk.inspect}") if $DEBUG_RDOC
2532
+ nil
2533
+ end
2534
+ end
2535
+
2536
+ def parse_toplevel_statements(container)
2537
+ comment = collect_first_comment
2538
+ look_for_directives_in(container, comment)
2539
+ container.comment = comment unless comment.empty?
2540
+ parse_statements container, NORMAL, nil, comment
2541
+ end
2542
+
2543
+ def parse_visibility(container, single, tk)
2544
+ singleton = (single == SINGLE)
2545
+
2546
+ vis_type = tk.name
2547
+
2548
+ vis = case vis_type
2549
+ when 'private' then :private
2550
+ when 'protected' then :protected
2551
+ when 'public' then :public
2552
+ when 'private_class_method' then
2553
+ singleton = true
2554
+ :private
2555
+ when 'public_class_method' then
2556
+ singleton = true
2557
+ :public
2558
+ when 'module_function' then
2559
+ singleton = true
2560
+ :public
2561
+ else
2562
+ raise "Invalid visibility: #{tk.name}"
2563
+ end
2564
+
2565
+ skip_tkspace_comment false
2566
+
2567
+ case peek_tk
2568
+ # Ryan Davis suggested the extension to ignore modifiers, because he
2569
+ # often writes
2570
+ #
2571
+ # protected unless $TESTING
2572
+ #
2573
+ when TkNL, TkUNLESS_MOD, TkIF_MOD, TkSEMICOLON then
2574
+ container.ongoing_visibility = vis
2575
+ else
2576
+ if vis_type == 'module_function' then
2577
+ args = parse_symbol_arg
2578
+ container.set_visibility_for args, :private, false
2579
+
2580
+ module_functions = []
2581
+
2582
+ container.methods_matching args do |m|
2583
+ s_m = m.dup
2584
+ s_m.singleton = true if RDoc::AnyMethod === s_m
2585
+ s_m.visibility = :public
2586
+ module_functions << s_m
2587
+ end
2588
+
2589
+ module_functions.each do |s_m|
2590
+ case s_m
2591
+ when RDoc::AnyMethod then
2592
+ container.add_method s_m
2593
+ when RDoc::Attr then
2594
+ container.add_attribute s_m
2595
+ end
2596
+ end
2597
+ else
2598
+ args = parse_symbol_arg
2599
+ container.set_visibility_for args, vis, singleton
2600
+ end
2601
+ end
2602
+ end
2603
+
2604
+ def parse_yield_parameters
2605
+ parse_method_or_yield_parameters
2606
+ end
2607
+
2608
+ def parse_yield(context, single, tk, method)
2609
+ if method.block_params.nil?
2610
+ get_tkread
2611
+ @scanner.instance_eval{@continue = false}
2612
+ method.block_params = parse_yield_parameters
2613
+ end
2614
+ end
2615
+
2616
+ def peek_read
2617
+ @read.join('')
2618
+ end
2619
+
2620
+ ##
2621
+ # Peek at the next token, but don't remove it from the stream
2622
+
2623
+ def peek_tk
2624
+ unget_tk(tk = get_tk)
2625
+ tk
2626
+ end
2627
+
2628
+ ##
2629
+ # Directives are modifier comments that can appear after class, module, or
2630
+ # method names. For example:
2631
+ #
2632
+ # def fred # :yields: a, b
2633
+ #
2634
+ # or:
2635
+ #
2636
+ # class MyClass # :nodoc:
2637
+ #
2638
+ # We return the directive name and any parameters as a two element array
2639
+
2640
+ def read_directive(allowed)
2641
+ tk = get_tk
2642
+ result = nil
2643
+ if TkCOMMENT === tk
2644
+ if tk.text =~ /\s*:?(\w+):\s*(.*)/
2645
+ directive = $1.downcase
2646
+ if allowed.include?(directive)
2647
+ result = [directive, $2]
2648
+ end
2649
+ end
2650
+ else
2651
+ unget_tk(tk)
2652
+ end
2653
+ result
2654
+ end
2655
+
2656
+ def read_documentation_modifiers(context, allow)
2657
+ dir = read_directive(allow)
2658
+
2659
+ case dir[0]
2660
+ when "notnew", "not_new", "not-new" then
2661
+ context.dont_rename_initialize = true
2662
+
2663
+ when "nodoc" then
2664
+ context.document_self = false
2665
+ if dir[1].downcase == "all"
2666
+ context.document_children = false
2667
+ end
2668
+
2669
+ when "doc" then
2670
+ context.document_self = true
2671
+ context.force_documentation = true
2672
+
2673
+ when "yield", "yields" then
2674
+ unless context.params.nil?
2675
+ context.params.sub!(/(,|)\s*&\w+/,'') # remove parameter &proc
2676
+ end
2677
+
2678
+ context.block_params = dir[1]
2679
+
2680
+ when "arg", "args" then
2681
+ context.params = dir[1]
2682
+ end if dir
2683
+ end
2684
+
2685
+ def remove_private_comments(comment)
2686
+ comment.gsub!(/^#--\n.*?^#\+\+/m, '')
2687
+ comment.sub!(/^#--\n.*/m, '')
2688
+ end
2689
+
2690
+ def remove_token_listener(obj)
2691
+ @token_listeners.delete(obj)
2692
+ end
2693
+
2694
+ def reset
2695
+ @tokens = []
2696
+ @unget_read = []
2697
+ @read = []
2698
+ end
2699
+
2700
+ def scan
2701
+ reset
2702
+
2703
+ catch(:eof) do
2704
+ catch(:enddoc) do
2705
+ begin
2706
+ parse_toplevel_statements(@top_level)
2707
+ rescue Exception => e
2708
+ $stderr.puts <<-EOF
2709
+
2710
+
2711
+ RDoc failure in #{@file_name} at or around line #{@scanner.line_no} column
2712
+ #{@scanner.char_no}
2713
+
2714
+ Before reporting this, could you check that the file you're documenting
2715
+ compiles cleanly--RDoc is not a full Ruby parser, and gets confused easily if
2716
+ fed invalid programs.
2717
+
2718
+ The internal error was:
2719
+
2720
+ EOF
2721
+
2722
+ e.set_backtrace(e.backtrace[0,4])
2723
+ raise
2724
+ end
2725
+ end
2726
+ end
2727
+
2728
+ @top_level
2729
+ end
2730
+
2731
+ ##
2732
+ # while, until, and for have an optional do
2733
+
2734
+ def skip_optional_do_after_expression
2735
+ skip_tkspace(false)
2736
+ tk = get_tk
2737
+ case tk
2738
+ when TkLPAREN, TkfLPAREN
2739
+ end_token = TkRPAREN
2740
+ else
2741
+ end_token = TkNL
2742
+ end
2743
+
2744
+ nest = 0
2745
+ @scanner.instance_eval{@continue = false}
2746
+
2747
+ loop do
2748
+ case tk
2749
+ when TkSEMICOLON
2750
+ break
2751
+ when TkLPAREN, TkfLPAREN
2752
+ nest += 1
2753
+ when TkDO
2754
+ break if nest.zero?
2755
+ when end_token
2756
+ if end_token == TkRPAREN
2757
+ nest -= 1
2758
+ break if @scanner.lex_state == EXPR_END and nest.zero?
2759
+ else
2760
+ break unless @scanner.continue
2761
+ end
2762
+ end
2763
+ tk = get_tk
2764
+ end
2765
+ skip_tkspace(false)
2766
+
2767
+ get_tk if TkDO === peek_tk
2768
+ end
2769
+
2770
+ ##
2771
+ # skip the var [in] part of a 'for' statement
2772
+
2773
+ def skip_for_variable
2774
+ skip_tkspace(false)
2775
+ tk = get_tk
2776
+ skip_tkspace(false)
2777
+ tk = get_tk
2778
+ unget_tk(tk) unless TkIN === tk
2779
+ end
2780
+
2781
+ def skip_method(container)
2782
+ meth = RDoc::AnyMethod.new "", "anon"
2783
+ parse_method_parameters(meth)
2784
+ parse_statements(container, false, meth)
2785
+ end
2786
+
2787
+ ##
2788
+ # Skip spaces
2789
+
2790
+ def skip_tkspace(skip_nl = true)
2791
+ tokens = []
2792
+
2793
+ while TkSPACE === (tk = get_tk) or (skip_nl and TkNL === tk) do
2794
+ tokens.push tk
2795
+ end
2796
+
2797
+ unget_tk(tk)
2798
+ tokens
2799
+ end
2800
+
2801
+ ##
2802
+ # Skip spaces until a comment is found
2803
+
2804
+ def skip_tkspace_comment(skip_nl = true)
2805
+ loop do
2806
+ skip_tkspace(skip_nl)
2807
+ return unless TkCOMMENT === peek_tk
2808
+ get_tk
2809
+ end
2810
+ end
2811
+
2812
+ def unget_tk(tk)
2813
+ @tokens.unshift tk
2814
+ @unget_read.unshift @read.pop
2815
+
2816
+ # Remove this token from any listeners
2817
+ @token_listeners.each do |obj|
2818
+ obj.pop_token
2819
+ end if @token_listeners
2820
+ end
2821
+
2822
+ def warn(msg)
2823
+ return if @options.quiet
2824
+ msg = make_message msg
2825
+ $stderr.puts msg
2826
+ end
2827
+
2828
+ end
2829
+