deg-yard 0.8.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. data/.travis.yml +39 -0
  2. data/.yardopts +25 -0
  3. data/.yardopts_guide +19 -0
  4. data/.yardopts_i18n +22 -0
  5. data/Gemfile +35 -0
  6. data/LEGAL +66 -0
  7. data/LICENSE +22 -0
  8. data/README.md +609 -0
  9. data/Rakefile +66 -0
  10. data/benchmarks/builtins_vs_eval.rb +23 -0
  11. data/benchmarks/concat_vs_join.rb +12 -0
  12. data/benchmarks/erb_vs_erubis.rb +53 -0
  13. data/benchmarks/format_args.rb +46 -0
  14. data/benchmarks/generation.rb +37 -0
  15. data/benchmarks/marshal_vs_dbm.rb +63 -0
  16. data/benchmarks/parsing.rb +46 -0
  17. data/benchmarks/pathname_vs_string.rb +50 -0
  18. data/benchmarks/rdoc_vs_yardoc.rb +10 -0
  19. data/benchmarks/registry_store_types.rb +48 -0
  20. data/benchmarks/ri_vs_yri.rb +18 -0
  21. data/benchmarks/ripper_parser.rb +12 -0
  22. data/benchmarks/splat_vs_flatten.rb +12 -0
  23. data/benchmarks/template_erb.rb +22 -0
  24. data/benchmarks/template_format.rb +6 -0
  25. data/benchmarks/template_profile.rb +17 -0
  26. data/benchmarks/yri_cache.rb +19 -0
  27. data/bin/yard +12 -0
  28. data/bin/yardoc +12 -0
  29. data/bin/yri +12 -0
  30. data/docs/CodeObjects.md +115 -0
  31. data/docs/GettingStarted.md +592 -0
  32. data/docs/Handlers.md +152 -0
  33. data/docs/Overview.md +61 -0
  34. data/docs/Parser.md +191 -0
  35. data/docs/Tags.md +282 -0
  36. data/docs/TagsArch.md +123 -0
  37. data/docs/Templates.md +496 -0
  38. data/docs/WhatsNew.md +1244 -0
  39. data/docs/images/code-objects-class-diagram.png +0 -0
  40. data/docs/images/handlers-class-diagram.png +0 -0
  41. data/docs/images/overview-class-diagram.png +0 -0
  42. data/docs/images/parser-class-diagram.png +0 -0
  43. data/docs/images/tags-class-diagram.png +0 -0
  44. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  45. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  46. data/docs/templates/default/layout/html/setup.rb +8 -0
  47. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  48. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  49. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  50. data/docs/templates/plugin.rb +65 -0
  51. data/lib/rubygems_plugin.rb +4 -0
  52. data/lib/yard/autoload.rb +290 -0
  53. data/lib/yard/cli/command.rb +84 -0
  54. data/lib/yard/cli/command_parser.rb +92 -0
  55. data/lib/yard/cli/config.rb +136 -0
  56. data/lib/yard/cli/diff.rb +270 -0
  57. data/lib/yard/cli/display.rb +68 -0
  58. data/lib/yard/cli/gems.rb +83 -0
  59. data/lib/yard/cli/graph.rb +126 -0
  60. data/lib/yard/cli/help.rb +18 -0
  61. data/lib/yard/cli/i18n.rb +69 -0
  62. data/lib/yard/cli/list.rb +22 -0
  63. data/lib/yard/cli/markup_types.rb +33 -0
  64. data/lib/yard/cli/server.rb +253 -0
  65. data/lib/yard/cli/stats.rb +213 -0
  66. data/lib/yard/cli/yardoc.rb +752 -0
  67. data/lib/yard/cli/yardopts_command.rb +109 -0
  68. data/lib/yard/cli/yri.rb +214 -0
  69. data/lib/yard/code_objects/base.rb +585 -0
  70. data/lib/yard/code_objects/class_object.rb +143 -0
  71. data/lib/yard/code_objects/class_variable_object.rb +8 -0
  72. data/lib/yard/code_objects/constant_object.rb +13 -0
  73. data/lib/yard/code_objects/extended_method_object.rb +23 -0
  74. data/lib/yard/code_objects/extra_file_object.rb +128 -0
  75. data/lib/yard/code_objects/macro_object.rb +172 -0
  76. data/lib/yard/code_objects/method_object.rb +191 -0
  77. data/lib/yard/code_objects/module_object.rb +18 -0
  78. data/lib/yard/code_objects/namespace_object.rb +200 -0
  79. data/lib/yard/code_objects/proxy.rb +258 -0
  80. data/lib/yard/code_objects/root_object.rb +17 -0
  81. data/lib/yard/config.rb +269 -0
  82. data/lib/yard/core_ext/array.rb +15 -0
  83. data/lib/yard/core_ext/file.rb +65 -0
  84. data/lib/yard/core_ext/hash.rb +15 -0
  85. data/lib/yard/core_ext/insertion.rb +60 -0
  86. data/lib/yard/core_ext/module.rb +19 -0
  87. data/lib/yard/core_ext/string.rb +67 -0
  88. data/lib/yard/core_ext/symbol_hash.rb +73 -0
  89. data/lib/yard/docstring.rb +362 -0
  90. data/lib/yard/docstring_parser.rb +321 -0
  91. data/lib/yard/globals.rb +18 -0
  92. data/lib/yard/handlers/base.rb +597 -0
  93. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  94. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  95. data/lib/yard/handlers/c/base.rb +110 -0
  96. data/lib/yard/handlers/c/class_handler.rb +26 -0
  97. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  98. data/lib/yard/handlers/c/handler_methods.rb +166 -0
  99. data/lib/yard/handlers/c/init_handler.rb +18 -0
  100. data/lib/yard/handlers/c/method_handler.rb +35 -0
  101. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  102. data/lib/yard/handlers/c/module_handler.rb +16 -0
  103. data/lib/yard/handlers/c/override_comment_handler.rb +30 -0
  104. data/lib/yard/handlers/c/path_handler.rb +10 -0
  105. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  106. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  107. data/lib/yard/handlers/processor.rb +201 -0
  108. data/lib/yard/handlers/ruby/alias_handler.rb +41 -0
  109. data/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
  110. data/lib/yard/handlers/ruby/base.rb +164 -0
  111. data/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
  112. data/lib/yard/handlers/ruby/class_handler.rb +121 -0
  113. data/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
  114. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  115. data/lib/yard/handlers/ruby/constant_handler.rb +45 -0
  116. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  117. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
  118. data/lib/yard/handlers/ruby/exception_handler.rb +26 -0
  119. data/lib/yard/handlers/ruby/extend_handler.rb +21 -0
  120. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +34 -0
  121. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
  122. data/lib/yard/handlers/ruby/legacy/base.rb +250 -0
  123. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
  124. data/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
  125. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
  126. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  127. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
  128. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  129. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
  130. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
  131. data/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
  132. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
  133. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  134. data/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
  135. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
  136. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
  137. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
  138. data/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
  139. data/lib/yard/handlers/ruby/method_handler.rb +92 -0
  140. data/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
  141. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  142. data/lib/yard/handlers/ruby/module_handler.rb +11 -0
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
  146. data/lib/yard/handlers/ruby/yield_handler.rb +30 -0
  147. data/lib/yard/i18n/locale.rb +74 -0
  148. data/lib/yard/i18n/message.rb +56 -0
  149. data/lib/yard/i18n/messages.rb +55 -0
  150. data/lib/yard/i18n/pot_generator.rb +280 -0
  151. data/lib/yard/i18n/text.rb +173 -0
  152. data/lib/yard/logging.rb +190 -0
  153. data/lib/yard/options.rb +216 -0
  154. data/lib/yard/parser/base.rb +56 -0
  155. data/lib/yard/parser/c/c_parser.rb +231 -0
  156. data/lib/yard/parser/c/comment_parser.rb +131 -0
  157. data/lib/yard/parser/c/statement.rb +63 -0
  158. data/lib/yard/parser/ruby/ast_node.rb +496 -0
  159. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1378 -0
  160. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
  161. data/lib/yard/parser/ruby/legacy/statement.rb +65 -0
  162. data/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
  163. data/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
  164. data/lib/yard/parser/ruby/ruby_parser.rb +625 -0
  165. data/lib/yard/parser/source_parser.rb +517 -0
  166. data/lib/yard/rake/yardoc_task.rb +74 -0
  167. data/lib/yard/registry.rb +438 -0
  168. data/lib/yard/registry_store.rb +319 -0
  169. data/lib/yard/rubygems/backports/LICENSE.txt +57 -0
  170. data/lib/yard/rubygems/backports/MIT.txt +20 -0
  171. data/lib/yard/rubygems/backports/gem.rb +9 -0
  172. data/lib/yard/rubygems/backports/source_index.rb +370 -0
  173. data/lib/yard/rubygems/backports.rb +8 -0
  174. data/lib/yard/rubygems/doc_manager.rb +88 -0
  175. data/lib/yard/rubygems/specification.rb +41 -0
  176. data/lib/yard/serializers/base.rb +80 -0
  177. data/lib/yard/serializers/file_system_serializer.rb +90 -0
  178. data/lib/yard/serializers/process_serializer.rb +24 -0
  179. data/lib/yard/serializers/stdout_serializer.rb +32 -0
  180. data/lib/yard/serializers/yardoc_serializer.rb +124 -0
  181. data/lib/yard/server/adapter.rb +100 -0
  182. data/lib/yard/server/commands/base.rb +192 -0
  183. data/lib/yard/server/commands/display_file_command.rb +24 -0
  184. data/lib/yard/server/commands/display_object_command.rb +58 -0
  185. data/lib/yard/server/commands/frames_command.rb +15 -0
  186. data/lib/yard/server/commands/library_command.rb +148 -0
  187. data/lib/yard/server/commands/library_index_command.rb +24 -0
  188. data/lib/yard/server/commands/list_command.rb +24 -0
  189. data/lib/yard/server/commands/search_command.rb +78 -0
  190. data/lib/yard/server/commands/static_file_command.rb +57 -0
  191. data/lib/yard/server/doc_server_helper.rb +76 -0
  192. data/lib/yard/server/doc_server_serializer.rb +33 -0
  193. data/lib/yard/server/library_version.rb +227 -0
  194. data/lib/yard/server/rack_adapter.rb +88 -0
  195. data/lib/yard/server/router.rb +176 -0
  196. data/lib/yard/server/static_caching.rb +45 -0
  197. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
  198. data/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
  199. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
  200. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
  201. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  202. data/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
  203. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
  204. data/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
  205. data/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
  206. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
  207. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
  208. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
  209. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
  210. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
  211. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
  212. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
  213. data/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
  214. data/lib/yard/server/webrick_adapter.rb +43 -0
  215. data/lib/yard/server.rb +11 -0
  216. data/lib/yard/tags/default_factory.rb +176 -0
  217. data/lib/yard/tags/default_tag.rb +12 -0
  218. data/lib/yard/tags/directives.rb +599 -0
  219. data/lib/yard/tags/library.rb +630 -0
  220. data/lib/yard/tags/option_tag.rb +12 -0
  221. data/lib/yard/tags/overload_tag.rb +66 -0
  222. data/lib/yard/tags/ref_tag.rb +7 -0
  223. data/lib/yard/tags/ref_tag_list.rb +27 -0
  224. data/lib/yard/tags/tag.rb +57 -0
  225. data/lib/yard/tags/tag_format_error.rb +6 -0
  226. data/lib/yard/templates/engine.rb +185 -0
  227. data/lib/yard/templates/erb_cache.rb +22 -0
  228. data/lib/yard/templates/helpers/base_helper.rb +212 -0
  229. data/lib/yard/templates/helpers/filter_helper.rb +26 -0
  230. data/lib/yard/templates/helpers/html_helper.rb +599 -0
  231. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +59 -0
  232. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
  233. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
  234. data/lib/yard/templates/helpers/markup_helper.rb +169 -0
  235. data/lib/yard/templates/helpers/method_helper.rb +74 -0
  236. data/lib/yard/templates/helpers/module_helper.rb +19 -0
  237. data/lib/yard/templates/helpers/text_helper.rb +95 -0
  238. data/lib/yard/templates/helpers/uml_helper.rb +46 -0
  239. data/lib/yard/templates/section.rb +106 -0
  240. data/lib/yard/templates/template.rb +407 -0
  241. data/lib/yard/templates/template_options.rb +88 -0
  242. data/lib/yard/verifier.rb +148 -0
  243. data/lib/yard/version.rb +3 -0
  244. data/lib/yard.rb +71 -0
  245. data/po/ja.po +31118 -0
  246. data/spec/cli/command_parser_spec.rb +43 -0
  247. data/spec/cli/command_spec.rb +36 -0
  248. data/spec/cli/config_spec.rb +92 -0
  249. data/spec/cli/diff_spec.rb +260 -0
  250. data/spec/cli/display_spec.rb +30 -0
  251. data/spec/cli/gems_spec.rb +81 -0
  252. data/spec/cli/graph_spec.rb +17 -0
  253. data/spec/cli/help_spec.rb +22 -0
  254. data/spec/cli/i18n_spec.rb +111 -0
  255. data/spec/cli/list_spec.rb +8 -0
  256. data/spec/cli/markup_types_spec.rb +22 -0
  257. data/spec/cli/server_spec.rb +327 -0
  258. data/spec/cli/stats_spec.rb +90 -0
  259. data/spec/cli/yardoc_spec.rb +804 -0
  260. data/spec/cli/yri_spec.rb +99 -0
  261. data/spec/code_objects/base_spec.rb +438 -0
  262. data/spec/code_objects/class_object_spec.rb +225 -0
  263. data/spec/code_objects/code_object_list_spec.rb +33 -0
  264. data/spec/code_objects/constants_spec.rb +82 -0
  265. data/spec/code_objects/extra_file_object_spec.rb +147 -0
  266. data/spec/code_objects/macro_object_spec.rb +148 -0
  267. data/spec/code_objects/method_object_spec.rb +175 -0
  268. data/spec/code_objects/module_object_spec.rb +141 -0
  269. data/spec/code_objects/namespace_object_spec.rb +170 -0
  270. data/spec/code_objects/proxy_spec.rb +140 -0
  271. data/spec/code_objects/spec_helper.rb +3 -0
  272. data/spec/config_spec.rb +176 -0
  273. data/spec/core_ext/array_spec.rb +14 -0
  274. data/spec/core_ext/file_spec.rb +68 -0
  275. data/spec/core_ext/hash_spec.rb +14 -0
  276. data/spec/core_ext/insertion_spec.rb +37 -0
  277. data/spec/core_ext/module_spec.rb +15 -0
  278. data/spec/core_ext/string_spec.rb +42 -0
  279. data/spec/core_ext/symbol_hash_spec.rb +86 -0
  280. data/spec/docstring_parser_spec.rb +228 -0
  281. data/spec/docstring_spec.rb +335 -0
  282. data/spec/handlers/alias_handler_spec.rb +80 -0
  283. data/spec/handlers/attribute_handler_spec.rb +94 -0
  284. data/spec/handlers/base_spec.rb +206 -0
  285. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  286. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  287. data/spec/handlers/c/class_handler_spec.rb +63 -0
  288. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  289. data/spec/handlers/c/init_handler_spec.rb +47 -0
  290. data/spec/handlers/c/method_handler_spec.rb +229 -0
  291. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  292. data/spec/handlers/c/module_handler_spec.rb +38 -0
  293. data/spec/handlers/c/override_comment_handler_spec.rb +46 -0
  294. data/spec/handlers/c/path_handler_spec.rb +35 -0
  295. data/spec/handlers/c/spec_helper.rb +13 -0
  296. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  297. data/spec/handlers/class_condition_handler_spec.rb +67 -0
  298. data/spec/handlers/class_handler_spec.rb +246 -0
  299. data/spec/handlers/class_variable_handler_spec.rb +11 -0
  300. data/spec/handlers/constant_handler_spec.rb +64 -0
  301. data/spec/handlers/dsl_handler_spec.rb +197 -0
  302. data/spec/handlers/examples/alias_handler_001.rb.txt +44 -0
  303. data/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
  304. data/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
  305. data/spec/handlers/examples/class_handler_001.rb.txt +120 -0
  306. data/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
  307. data/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
  308. data/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
  309. data/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
  310. data/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
  311. data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  312. data/spec/handlers/examples/method_handler_001.rb.txt +126 -0
  313. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
  314. data/spec/handlers/examples/module_handler_001.rb.txt +29 -0
  315. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
  316. data/spec/handlers/examples/process_handler_001.rb.txt +11 -0
  317. data/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
  318. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
  319. data/spec/handlers/exception_handler_spec.rb +48 -0
  320. data/spec/handlers/extend_handler_spec.rb +23 -0
  321. data/spec/handlers/legacy_base_spec.rb +128 -0
  322. data/spec/handlers/method_condition_handler_spec.rb +14 -0
  323. data/spec/handlers/method_handler_spec.rb +184 -0
  324. data/spec/handlers/mixin_handler_spec.rb +55 -0
  325. data/spec/handlers/module_function_handler_spec.rb +105 -0
  326. data/spec/handlers/module_handler_spec.rb +34 -0
  327. data/spec/handlers/private_constant_handler_spec.rb +24 -0
  328. data/spec/handlers/processor_spec.rb +34 -0
  329. data/spec/handlers/ruby/base_spec.rb +94 -0
  330. data/spec/handlers/ruby/legacy/base_spec.rb +82 -0
  331. data/spec/handlers/spec_helper.rb +33 -0
  332. data/spec/handlers/visibility_handler_spec.rb +39 -0
  333. data/spec/handlers/yield_handler_spec.rb +51 -0
  334. data/spec/i18n/locale_spec.rb +68 -0
  335. data/spec/i18n/message_spec.rb +52 -0
  336. data/spec/i18n/messages_spec.rb +67 -0
  337. data/spec/i18n/pot_generator_spec.rb +262 -0
  338. data/spec/i18n/text_spec.rb +180 -0
  339. data/spec/logging_spec.rb +35 -0
  340. data/spec/options_spec.rb +171 -0
  341. data/spec/parser/base_spec.rb +24 -0
  342. data/spec/parser/c_parser_spec.rb +171 -0
  343. data/spec/parser/examples/array.c.txt +3887 -0
  344. data/spec/parser/examples/example1.rb.txt +8 -0
  345. data/spec/parser/examples/extrafile.c.txt +8 -0
  346. data/spec/parser/examples/multifile.c.txt +22 -0
  347. data/spec/parser/examples/override.c.txt +424 -0
  348. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
  349. data/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
  350. data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  351. data/spec/parser/ruby/ast_node_spec.rb +33 -0
  352. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
  353. data/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
  354. data/spec/parser/ruby/ruby_parser_spec.rb +334 -0
  355. data/spec/parser/source_parser_spec.rb +717 -0
  356. data/spec/parser/tag_parsing_spec.rb +18 -0
  357. data/spec/rake/yardoc_task_spec.rb +101 -0
  358. data/spec/registry_spec.rb +393 -0
  359. data/spec/registry_store_spec.rb +315 -0
  360. data/spec/rubygems/doc_manager_spec.rb +112 -0
  361. data/spec/serializers/data/serialized_yardoc/checksums +1 -0
  362. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  363. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  364. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  365. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  366. data/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
  367. data/spec/serializers/file_system_serializer_spec.rb +124 -0
  368. data/spec/serializers/spec_helper.rb +2 -0
  369. data/spec/serializers/yardoc_serializer_spec.rb +46 -0
  370. data/spec/server/adapter_spec.rb +38 -0
  371. data/spec/server/commands/base_spec.rb +87 -0
  372. data/spec/server/commands/library_command_spec.rb +39 -0
  373. data/spec/server/commands/static_file_command_spec.rb +84 -0
  374. data/spec/server/doc_server_helper_spec.rb +53 -0
  375. data/spec/server/doc_server_serializer_spec.rb +45 -0
  376. data/spec/server/rack_adapter_spec.rb +20 -0
  377. data/spec/server/router_spec.rb +122 -0
  378. data/spec/server/spec_helper.rb +17 -0
  379. data/spec/server/static_caching_spec.rb +39 -0
  380. data/spec/server/webrick_servlet_spec.rb +20 -0
  381. data/spec/server_spec.rb +10 -0
  382. data/spec/spec_helper.rb +128 -0
  383. data/spec/tags/default_factory_spec.rb +152 -0
  384. data/spec/tags/default_tag_spec.rb +11 -0
  385. data/spec/tags/directives_spec.rb +453 -0
  386. data/spec/tags/library_spec.rb +34 -0
  387. data/spec/tags/overload_tag_spec.rb +53 -0
  388. data/spec/tags/ref_tag_list_spec.rb +53 -0
  389. data/spec/templates/class_spec.rb +44 -0
  390. data/spec/templates/constant_spec.rb +40 -0
  391. data/spec/templates/engine_spec.rb +121 -0
  392. data/spec/templates/examples/class001.html +280 -0
  393. data/spec/templates/examples/class001.txt +36 -0
  394. data/spec/templates/examples/class002.html +35 -0
  395. data/spec/templates/examples/constant001.txt +25 -0
  396. data/spec/templates/examples/constant002.txt +7 -0
  397. data/spec/templates/examples/constant003.txt +11 -0
  398. data/spec/templates/examples/method001.html +130 -0
  399. data/spec/templates/examples/method001.txt +35 -0
  400. data/spec/templates/examples/method002.html +86 -0
  401. data/spec/templates/examples/method002.txt +20 -0
  402. data/spec/templates/examples/method003.html +159 -0
  403. data/spec/templates/examples/method003.txt +45 -0
  404. data/spec/templates/examples/method004.html +44 -0
  405. data/spec/templates/examples/method004.txt +10 -0
  406. data/spec/templates/examples/method005.html +99 -0
  407. data/spec/templates/examples/method005.txt +33 -0
  408. data/spec/templates/examples/module001.dot +33 -0
  409. data/spec/templates/examples/module001.html +825 -0
  410. data/spec/templates/examples/module001.txt +33 -0
  411. data/spec/templates/examples/module002.html +318 -0
  412. data/spec/templates/examples/module003.html +185 -0
  413. data/spec/templates/examples/module004.html +387 -0
  414. data/spec/templates/examples/tag001.txt +82 -0
  415. data/spec/templates/helpers/base_helper_spec.rb +175 -0
  416. data/spec/templates/helpers/html_helper_spec.rb +612 -0
  417. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +48 -0
  418. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
  419. data/spec/templates/helpers/markup_helper_spec.rb +135 -0
  420. data/spec/templates/helpers/method_helper_spec.rb +82 -0
  421. data/spec/templates/helpers/shared_signature_examples.rb +123 -0
  422. data/spec/templates/helpers/text_helper_spec.rb +44 -0
  423. data/spec/templates/method_spec.rb +102 -0
  424. data/spec/templates/module_spec.rb +181 -0
  425. data/spec/templates/onefile_spec.rb +64 -0
  426. data/spec/templates/section_spec.rb +146 -0
  427. data/spec/templates/spec_helper.rb +73 -0
  428. data/spec/templates/tag_spec.rb +51 -0
  429. data/spec/templates/template_spec.rb +409 -0
  430. data/spec/verifier_spec.rb +106 -0
  431. data/templates/default/class/dot/setup.rb +6 -0
  432. data/templates/default/class/dot/superklass.erb +3 -0
  433. data/templates/default/class/html/constructor_details.erb +8 -0
  434. data/templates/default/class/html/setup.rb +1 -0
  435. data/templates/default/class/html/subclasses.erb +4 -0
  436. data/templates/default/class/setup.rb +36 -0
  437. data/templates/default/class/text/setup.rb +11 -0
  438. data/templates/default/class/text/subclasses.erb +5 -0
  439. data/templates/default/constant/text/header.erb +11 -0
  440. data/templates/default/constant/text/setup.rb +3 -0
  441. data/templates/default/docstring/html/abstract.erb +4 -0
  442. data/templates/default/docstring/html/deprecated.erb +1 -0
  443. data/templates/default/docstring/html/index.erb +5 -0
  444. data/templates/default/docstring/html/note.erb +6 -0
  445. data/templates/default/docstring/html/private.erb +4 -0
  446. data/templates/default/docstring/html/returns_void.erb +1 -0
  447. data/templates/default/docstring/html/text.erb +1 -0
  448. data/templates/default/docstring/html/todo.erb +6 -0
  449. data/templates/default/docstring/setup.rb +51 -0
  450. data/templates/default/docstring/text/abstract.erb +2 -0
  451. data/templates/default/docstring/text/deprecated.erb +2 -0
  452. data/templates/default/docstring/text/index.erb +2 -0
  453. data/templates/default/docstring/text/note.erb +4 -0
  454. data/templates/default/docstring/text/private.erb +2 -0
  455. data/templates/default/docstring/text/returns_void.erb +1 -0
  456. data/templates/default/docstring/text/text.erb +1 -0
  457. data/templates/default/docstring/text/todo.erb +4 -0
  458. data/templates/default/fulldoc/html/css/common.css +1 -0
  459. data/templates/default/fulldoc/html/css/full_list.css +57 -0
  460. data/templates/default/fulldoc/html/css/style.css +338 -0
  461. data/templates/default/fulldoc/html/frames.erb +28 -0
  462. data/templates/default/fulldoc/html/full_list.erb +40 -0
  463. data/templates/default/fulldoc/html/full_list_class.erb +2 -0
  464. data/templates/default/fulldoc/html/full_list_file.erb +5 -0
  465. data/templates/default/fulldoc/html/full_list_method.erb +8 -0
  466. data/templates/default/fulldoc/html/js/app.js +214 -0
  467. data/templates/default/fulldoc/html/js/full_list.js +178 -0
  468. data/templates/default/fulldoc/html/js/jquery.js +4 -0
  469. data/templates/default/fulldoc/html/setup.rb +199 -0
  470. data/templates/default/layout/dot/header.erb +6 -0
  471. data/templates/default/layout/dot/setup.rb +14 -0
  472. data/templates/default/layout/html/breadcrumb.erb +13 -0
  473. data/templates/default/layout/html/files.erb +11 -0
  474. data/templates/default/layout/html/footer.erb +5 -0
  475. data/templates/default/layout/html/headers.erb +14 -0
  476. data/templates/default/layout/html/index.erb +2 -0
  477. data/templates/default/layout/html/layout.erb +20 -0
  478. data/templates/default/layout/html/listing.erb +4 -0
  479. data/templates/default/layout/html/objects.erb +32 -0
  480. data/templates/default/layout/html/script_setup.erb +5 -0
  481. data/templates/default/layout/html/search.erb +8 -0
  482. data/templates/default/layout/html/setup.rb +71 -0
  483. data/templates/default/method/html/header.erb +16 -0
  484. data/templates/default/method/setup.rb +3 -0
  485. data/templates/default/method/text/header.erb +1 -0
  486. data/templates/default/method_details/html/header.erb +3 -0
  487. data/templates/default/method_details/html/method_signature.erb +25 -0
  488. data/templates/default/method_details/html/source.erb +10 -0
  489. data/templates/default/method_details/setup.rb +10 -0
  490. data/templates/default/method_details/text/header.erb +10 -0
  491. data/templates/default/method_details/text/method_signature.erb +12 -0
  492. data/templates/default/method_details/text/setup.rb +10 -0
  493. data/templates/default/module/dot/child.erb +1 -0
  494. data/templates/default/module/dot/dependencies.erb +3 -0
  495. data/templates/default/module/dot/header.erb +6 -0
  496. data/templates/default/module/dot/info.erb +14 -0
  497. data/templates/default/module/dot/setup.rb +14 -0
  498. data/templates/default/module/html/attribute_details.erb +10 -0
  499. data/templates/default/module/html/attribute_summary.erb +8 -0
  500. data/templates/default/module/html/box_info.erb +37 -0
  501. data/templates/default/module/html/children.erb +8 -0
  502. data/templates/default/module/html/constant_summary.erb +13 -0
  503. data/templates/default/module/html/defines.erb +3 -0
  504. data/templates/default/module/html/header.erb +5 -0
  505. data/templates/default/module/html/inherited_attributes.erb +14 -0
  506. data/templates/default/module/html/inherited_constants.erb +8 -0
  507. data/templates/default/module/html/inherited_methods.erb +19 -0
  508. data/templates/default/module/html/item_summary.erb +40 -0
  509. data/templates/default/module/html/method_details_list.erb +9 -0
  510. data/templates/default/module/html/method_summary.erb +14 -0
  511. data/templates/default/module/html/methodmissing.erb +12 -0
  512. data/templates/default/module/html/pre_docstring.erb +1 -0
  513. data/templates/default/module/setup.rb +164 -0
  514. data/templates/default/module/text/children.erb +10 -0
  515. data/templates/default/module/text/class_meths_list.erb +8 -0
  516. data/templates/default/module/text/extends.erb +8 -0
  517. data/templates/default/module/text/header.erb +7 -0
  518. data/templates/default/module/text/includes.erb +8 -0
  519. data/templates/default/module/text/instance_meths_list.erb +8 -0
  520. data/templates/default/module/text/setup.rb +12 -0
  521. data/templates/default/onefile/html/files.erb +5 -0
  522. data/templates/default/onefile/html/headers.erb +6 -0
  523. data/templates/default/onefile/html/layout.erb +17 -0
  524. data/templates/default/onefile/html/readme.erb +3 -0
  525. data/templates/default/onefile/html/setup.rb +61 -0
  526. data/templates/default/root/dot/child.erb +3 -0
  527. data/templates/default/root/dot/setup.rb +5 -0
  528. data/templates/default/root/html/setup.rb +1 -0
  529. data/templates/default/tags/html/example.erb +11 -0
  530. data/templates/default/tags/html/index.erb +3 -0
  531. data/templates/default/tags/html/option.erb +24 -0
  532. data/templates/default/tags/html/overload.erb +14 -0
  533. data/templates/default/tags/html/see.erb +8 -0
  534. data/templates/default/tags/html/tag.erb +20 -0
  535. data/templates/default/tags/setup.rb +55 -0
  536. data/templates/default/tags/text/example.erb +12 -0
  537. data/templates/default/tags/text/index.erb +1 -0
  538. data/templates/default/tags/text/option.erb +20 -0
  539. data/templates/default/tags/text/overload.erb +19 -0
  540. data/templates/default/tags/text/see.erb +11 -0
  541. data/templates/default/tags/text/tag.erb +13 -0
  542. data/templates/guide/class/html/setup.rb +1 -0
  543. data/templates/guide/docstring/html/setup.rb +1 -0
  544. data/templates/guide/fulldoc/html/css/style.css +108 -0
  545. data/templates/guide/fulldoc/html/js/app.js +33 -0
  546. data/templates/guide/fulldoc/html/setup.rb +73 -0
  547. data/templates/guide/layout/html/layout.erb +81 -0
  548. data/templates/guide/layout/html/setup.rb +28 -0
  549. data/templates/guide/method/html/header.erb +18 -0
  550. data/templates/guide/method/html/setup.rb +21 -0
  551. data/templates/guide/module/html/header.erb +7 -0
  552. data/templates/guide/module/html/method_list.erb +5 -0
  553. data/templates/guide/module/html/setup.rb +26 -0
  554. data/templates/guide/onefile/html/files.erb +4 -0
  555. data/templates/guide/onefile/html/setup.rb +5 -0
  556. data/templates/guide/onefile/html/toc.erb +3 -0
  557. data/templates/guide/tags/html/setup.rb +8 -0
  558. metadata +689 -0
@@ -0,0 +1,1378 @@
1
+ #coding: UTF-8
2
+ require "e2mmap"
3
+ require "irb/slex"
4
+
5
+ module YARD
6
+ module Parser::Ruby::Legacy
7
+ # Legacy lexical tokenizer module.
8
+ module RubyToken
9
+ EXPR_BEG = :EXPR_BEG
10
+ EXPR_MID = :EXPR_MID
11
+ EXPR_END = :EXPR_END
12
+ EXPR_ARG = :EXPR_ARG
13
+ EXPR_FNAME = :EXPR_FNAME
14
+ EXPR_DOT = :EXPR_DOT
15
+ EXPR_CLASS = :EXPR_CLASS
16
+
17
+ # Represents a token in the Ruby lexer
18
+ class Token
19
+ # @return [Integer] the line number in the file/stream the token is
20
+ # located.
21
+ attr_reader :line_no
22
+
23
+ # @return [Integer] the character number in the file/stream the token
24
+ # is located.
25
+ attr_reader :char_no
26
+
27
+ # @return [String] the token text value
28
+ attr_reader :text
29
+
30
+ # @return [Symbol] the lexical state at the token
31
+ attr_accessor :lex_state
32
+
33
+ # @private
34
+ NO_TEXT = "??".freeze
35
+
36
+ # Creates a new Token object
37
+ # @param [Integer] line_no the line number to initialize the token to
38
+ # @param [Integer] char_no the char number to initialize the token to
39
+ def initialize(line_no, char_no)
40
+ @line_no = line_no
41
+ @char_no = char_no
42
+ @text = NO_TEXT
43
+ end
44
+
45
+ # Chainable way to sets the text attribute
46
+ #
47
+ # @param [String] text the new text
48
+ # @return [Token] this token object
49
+ def set_text(text)
50
+ @text = text
51
+ self
52
+ end
53
+ end
54
+
55
+ # Represents a block
56
+ class TkBlockContents < Token
57
+ def text; '...' end
58
+ end
59
+
60
+ # Represents an end statement
61
+ class TkStatementEnd < Token
62
+ def text; '' end
63
+ end
64
+
65
+ class TkNode < Token
66
+ attr :node
67
+ end
68
+
69
+ # Represents whitespace
70
+ class TkWhitespace < Token
71
+ end
72
+
73
+ # Represents a Ruby identifier
74
+ class TkId < Token
75
+ def initialize(line_no, char_no, name)
76
+ super(line_no, char_no)
77
+ @name = name
78
+ end
79
+ attr :name
80
+ end
81
+
82
+ # Represents a Ruby keyword
83
+ class TkKW < TkId
84
+ end
85
+
86
+ # Represents a Ruby value
87
+ class TkVal < Token
88
+ def initialize(line_no, char_no, value = nil)
89
+ super(line_no, char_no)
90
+ set_text(value)
91
+ end
92
+ end
93
+
94
+ class TkOp < Token
95
+ def name
96
+ self.class.op_name
97
+ end
98
+ end
99
+
100
+ class TkOPASGN < TkOp
101
+ def initialize(line_no, char_no, op)
102
+ super(line_no, char_no)
103
+ op = TkReading2Token[op] unless op.kind_of?(Symbol)
104
+ @op = op
105
+ end
106
+ attr :op
107
+ end
108
+
109
+ class TkUnknownChar < Token
110
+ def initialize(line_no, char_no, id)
111
+ super(line_no, char_no)
112
+ @name = char_no > 255 ? '?' : char_no.chr
113
+ end
114
+ attr :name
115
+ end
116
+
117
+ class TkError < Token
118
+ end
119
+
120
+ # @private
121
+ def set_token_position(line, char)
122
+ @prev_line_no = line
123
+ @prev_char_no = char
124
+ end
125
+
126
+ # @private
127
+ def Token(token, value = nil)
128
+ tk = nil
129
+ case token
130
+ when String, Symbol
131
+ source = token.kind_of?(String) ? TkReading2Token : TkSymbol2Token
132
+ if (tk = source[token]).nil?
133
+ IRB.fail TkReading2TokenNoKey, token
134
+ end
135
+ tk = Token(tk[0], value)
136
+ else
137
+ if token
138
+ tk = if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty?
139
+ token.new(@prev_line_no, @prev_char_no)
140
+ else
141
+ token.new(@prev_line_no, @prev_char_no, value)
142
+ end
143
+ end
144
+ end
145
+ tk
146
+ end
147
+
148
+ # @private
149
+ TokenDefinitions = [
150
+ [:TkCLASS, TkKW, "class", EXPR_CLASS],
151
+ [:TkMODULE, TkKW, "module", EXPR_BEG],
152
+ [:TkDEF, TkKW, "def", EXPR_FNAME],
153
+ [:TkUNDEF, TkKW, "undef", EXPR_FNAME],
154
+ [:TkBEGIN, TkKW, "begin", EXPR_BEG],
155
+ [:TkRESCUE, TkKW, "rescue", EXPR_MID],
156
+ [:TkENSURE, TkKW, "ensure", EXPR_BEG],
157
+ [:TkEND, TkKW, "end", EXPR_END],
158
+ [:TkIF, TkKW, "if", EXPR_BEG, :TkIF_MOD],
159
+ [:TkUNLESS, TkKW, "unless", EXPR_BEG, :TkUNLESS_MOD],
160
+ [:TkTHEN, TkKW, "then", EXPR_BEG],
161
+ [:TkELSIF, TkKW, "elsif", EXPR_BEG],
162
+ [:TkELSE, TkKW, "else", EXPR_BEG],
163
+ [:TkCASE, TkKW, "case", EXPR_BEG],
164
+ [:TkWHEN, TkKW, "when", EXPR_BEG],
165
+ [:TkWHILE, TkKW, "while", EXPR_BEG, :TkWHILE_MOD],
166
+ [:TkUNTIL, TkKW, "until", EXPR_BEG, :TkUNTIL_MOD],
167
+ [:TkFOR, TkKW, "for", EXPR_BEG],
168
+ [:TkBREAK, TkKW, "break", EXPR_END],
169
+ [:TkNEXT, TkKW, "next", EXPR_END],
170
+ [:TkREDO, TkKW, "redo", EXPR_END],
171
+ [:TkRETRY, TkKW, "retry", EXPR_END],
172
+ [:TkIN, TkKW, "in", EXPR_BEG],
173
+ [:TkDO, TkKW, "do", EXPR_BEG],
174
+ [:TkRETURN, TkKW, "return", EXPR_MID],
175
+ [:TkYIELD, TkKW, "yield", EXPR_END],
176
+ [:TkSUPER, TkKW, "super", EXPR_END],
177
+ [:TkSELF, TkKW, "self", EXPR_END],
178
+ [:TkNIL, TkKW, "nil", EXPR_END],
179
+ [:TkTRUE, TkKW, "true", EXPR_END],
180
+ [:TkFALSE, TkKW, "false", EXPR_END],
181
+ [:TkAND, TkKW, "and", EXPR_BEG],
182
+ [:TkOR, TkKW, "or", EXPR_BEG],
183
+ [:TkNOT, TkKW, "not", EXPR_BEG],
184
+ [:TkIF_MOD, TkKW],
185
+ [:TkUNLESS_MOD, TkKW],
186
+ [:TkWHILE_MOD, TkKW],
187
+ [:TkUNTIL_MOD, TkKW],
188
+ [:TkALIAS, TkKW, "alias", EXPR_FNAME],
189
+ [:TkDEFINED, TkKW, "defined?", EXPR_END],
190
+ [:TklBEGIN, TkKW, "BEGIN", EXPR_END],
191
+ [:TklEND, TkKW, "END", EXPR_END],
192
+ [:Tk__LINE__, TkKW, "__LINE__", EXPR_END],
193
+ [:Tk__FILE__, TkKW, "__FILE__", EXPR_END],
194
+
195
+ [:TkIDENTIFIER, TkId],
196
+ [:TkFID, TkId],
197
+ [:TkGVAR, TkId],
198
+ [:TkIVAR, TkId],
199
+ [:TkCONSTANT, TkId],
200
+
201
+ [:TkINTEGER, TkVal],
202
+ [:TkFLOAT, TkVal],
203
+ [:TkSYMBOL, TkVal],
204
+ [:TkLABEL, TkVal],
205
+ [:TkSTRING, TkVal],
206
+ [:TkXSTRING, TkVal],
207
+ [:TkREGEXP, TkVal],
208
+ [:TkCOMMENT, TkVal],
209
+
210
+ [:TkDSTRING, TkNode],
211
+ [:TkDXSTRING, TkNode],
212
+ [:TkDREGEXP, TkNode],
213
+ [:TkNTH_REF, TkId],
214
+ [:TkBACK_REF, TkId],
215
+
216
+ [:TkUPLUS, TkOp, "+@"],
217
+ [:TkUMINUS, TkOp, "-@"],
218
+ [:TkPOW, TkOp, "**"],
219
+ [:TkCMP, TkOp, "<=>"],
220
+ [:TkEQ, TkOp, "=="],
221
+ [:TkEQQ, TkOp, "==="],
222
+ [:TkNEQ, TkOp, "!="],
223
+ [:TkGEQ, TkOp, ">="],
224
+ [:TkLEQ, TkOp, "<="],
225
+ [:TkANDOP, TkOp, "&&"],
226
+ [:TkOROP, TkOp, "||"],
227
+ [:TkMATCH, TkOp, "=~"],
228
+ [:TkNMATCH, TkOp, "!~"],
229
+ [:TkDOT2, TkOp, ".."],
230
+ [:TkDOT3, TkOp, "..."],
231
+ [:TkAREF, TkOp, "[]"],
232
+ [:TkASET, TkOp, "[]="],
233
+ [:TkLSHFT, TkOp, "<<"],
234
+ [:TkRSHFT, TkOp, ">>"],
235
+ [:TkCOLON2, TkOp],
236
+ [:TkCOLON3, TkOp],
237
+ [:OPASGN, TkOp], # +=, -= etc. #
238
+ [:TkASSOC, TkOp, "=>"],
239
+ [:TkQUESTION, TkOp, "?"], #?
240
+ [:TkCOLON, TkOp, ":"], #:
241
+
242
+ # [:TkfLPAREN], # func( #
243
+ # [:TkfLBRACK], # func[ #
244
+ # [:TkfLBRACE], # func{ #
245
+ [:TkSTAR], # *arg
246
+ [:TkAMPER], # &arg #
247
+ # [:TkSYMBOL, TkId], # :SYMBOL
248
+ [:TkSYMBEG, TkId],
249
+ [:TkGT, TkOp, ">"],
250
+ [:TkLT, TkOp, "<"],
251
+ [:TkPLUS, TkOp, "+"],
252
+ [:TkMINUS, TkOp, "-"],
253
+ [:TkMULT, TkOp, "*"],
254
+ [:TkDIV, TkOp, "/"],
255
+ [:TkMOD, TkOp, "%"],
256
+ [:TkBITOR, TkOp, "|"],
257
+ [:TkBITXOR, TkOp, "^"],
258
+ [:TkBITAND, TkOp, "&"],
259
+ [:TkBITNOT, TkOp, "~"],
260
+ [:TkNOTOP, TkOp, "!"],
261
+
262
+ [:TkBACKQUOTE, TkOp, "`"],
263
+
264
+ [:TkASSIGN, Token, "="],
265
+ [:TkDOT, Token, "."],
266
+ [:TkLPAREN, Token, "("], #(exp)
267
+ [:TkLBRACK, Token, "["], #[arry]
268
+ [:TkLBRACE, Token, "{"], #{hash}
269
+ [:TkRPAREN, Token, ")"],
270
+ [:TkRBRACK, Token, "]"],
271
+ [:TkRBRACE, Token, "}"],
272
+ [:TkCOMMA, Token, ","],
273
+ [:TkSEMICOLON, Token, ";"],
274
+
275
+ # [:TkRD_COMMENT, TkVal],
276
+ [:TkSPACE, TkWhitespace],
277
+ [:TkNL, TkWhitespace],
278
+ [:TkEND_OF_SCRIPT, TkWhitespace],
279
+
280
+ [:TkBACKSLASH, TkUnknownChar, "\\"],
281
+ [:TkAT, TkUnknownChar, "@"],
282
+ [:TkDOLLAR, TkUnknownChar, "\$"], #"
283
+ ]
284
+
285
+ # { reading => token_class }
286
+ # { reading => [token_class, *opt] }
287
+ TkReading2Token = {}
288
+ TkSymbol2Token = {}
289
+
290
+ # @private
291
+ def RubyToken.def_token(token_n, super_token = Token, reading = nil, *opts)
292
+ token_n = token_n.id2name unless token_n.kind_of?(String)
293
+ if RubyToken.const_defined?(token_n)
294
+ # IRB.fail AlreadyDefinedToken, token_n
295
+ end
296
+
297
+ token_c = Class.new super_token
298
+ RubyToken.const_set token_n, token_c
299
+ # token_c.inspect
300
+
301
+ if reading
302
+ if TkReading2Token[reading]
303
+ IRB.fail TkReading2TokenDuplicateError, token_n, reading
304
+ end
305
+ if opts.empty?
306
+ TkReading2Token[reading] = [token_c]
307
+ else
308
+ TkReading2Token[reading] = [token_c].concat(opts)
309
+ end
310
+ end
311
+ TkSymbol2Token[token_n.intern] = token_c
312
+
313
+ if token_c <= TkOp
314
+ token_c.class_eval %{
315
+ def self.op_name; "#{reading}"; end
316
+ }
317
+ end
318
+ end
319
+
320
+ for defs in TokenDefinitions
321
+ def_token(*defs)
322
+ end
323
+
324
+ NEWLINE_TOKEN = TkNL.new(0,0)
325
+ NEWLINE_TOKEN.set_text("\n")
326
+
327
+ end
328
+
329
+
330
+
331
+ # Lexical analyzer for Ruby source
332
+ # @private
333
+ class RubyLex
334
+ # Read an input stream character by character. We allow for unlimited
335
+ # ungetting of characters just read.
336
+ #
337
+ # We simplify the implementation greatly by reading the entire input
338
+ # into a buffer initially, and then simply traversing it using
339
+ # pointers.
340
+ #
341
+ # We also have to allow for the <i>here document diversion</i>. This
342
+ # little gem comes about when the lexer encounters a here
343
+ # document. At this point we effectively need to split the input
344
+ # stream into two parts: one to read the body of the here document,
345
+ # the other to read the rest of the input line where the here
346
+ # document was initially encountered. For example, we might have
347
+ #
348
+ # do_something(<<-A, <<-B)
349
+ # stuff
350
+ # for
351
+ # A
352
+ # stuff
353
+ # for
354
+ # B
355
+ #
356
+ # When the lexer encounters the <<A, it reads until the end of the
357
+ # line, and keeps it around for later. It then reads the body of the
358
+ # here document. Once complete, it needs to read the rest of the
359
+ # original line, but then skip the here document body.
360
+ #
361
+ # @private
362
+ class BufferedReader
363
+
364
+ attr_reader :line_num
365
+
366
+ def initialize(content)
367
+ if /\t/ =~ content
368
+ tab_width = 2
369
+ content = content.split(/\n/).map do |line|
370
+ 1 while line.gsub!(/\t+/) { ' ' * (tab_width*$&.length - $`.length % tab_width)} && $~ #`
371
+ line
372
+ end .join("\n")
373
+ end
374
+ @content = content
375
+ @content << "\n" unless @content[-1,1] == "\n"
376
+ @size = @content.size
377
+ @offset = 0
378
+ @hwm = 0
379
+ @line_num = 1
380
+ @read_back_offset = 0
381
+ @last_newline = 0
382
+ @newline_pending = false
383
+ end
384
+
385
+ def column
386
+ @offset - @last_newline
387
+ end
388
+
389
+ def getc
390
+ return nil if @offset >= @size
391
+ ch = @content[@offset, 1]
392
+
393
+ @offset += 1
394
+ @hwm = @offset if @hwm < @offset
395
+
396
+ if @newline_pending
397
+ @line_num += 1
398
+ @last_newline = @offset - 1
399
+ @newline_pending = false
400
+ end
401
+
402
+ if ch == "\n"
403
+ @newline_pending = true
404
+ end
405
+ ch
406
+ end
407
+
408
+ def getc_already_read
409
+ getc
410
+ end
411
+
412
+ def ungetc(ch)
413
+ raise "unget past beginning of file" if @offset <= 0
414
+ @offset -= 1
415
+ if @content[@offset] == ?\n
416
+ @newline_pending = false
417
+ end
418
+ end
419
+
420
+ def get_read
421
+ res = @content[@read_back_offset...@offset]
422
+ @read_back_offset = @offset
423
+ res
424
+ end
425
+
426
+ def peek(at)
427
+ pos = @offset + at
428
+ if pos >= @size
429
+ nil
430
+ else
431
+ @content[pos, 1]
432
+ end
433
+ end
434
+
435
+ def peek_equal(str)
436
+ @content[@offset, str.length] == str
437
+ end
438
+
439
+ def divert_read_from(reserve)
440
+ @content[@offset, 0] = reserve
441
+ @size = @content.size
442
+ end
443
+ end
444
+
445
+ # end of nested class BufferedReader
446
+
447
+ extend Exception2MessageMapper
448
+ def_exception(:AlreadyDefinedToken, "Already defined token(%s)")
449
+ def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
450
+ def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
451
+ def_exception(:TkReading2TokenDuplicateError,
452
+ "key duplicate(token_n='%s', key='%s')")
453
+ def_exception(:SyntaxError, "%s")
454
+
455
+ include RubyToken
456
+ include IRB
457
+
458
+ attr_reader :continue
459
+ attr_reader :lex_state
460
+
461
+ def RubyLex.debug?
462
+ false
463
+ end
464
+
465
+ def initialize(content)
466
+ lex_init
467
+
468
+ @reader = BufferedReader.new(content)
469
+
470
+ @exp_line_no = @line_no = 1
471
+ @base_char_no = 0
472
+ @indent = 0
473
+
474
+ @ltype = nil
475
+ @quoted = nil
476
+ @lex_state = EXPR_BEG
477
+ @space_seen = false
478
+
479
+ @continue = false
480
+ @line = ""
481
+
482
+ @skip_space = false
483
+ @read_auto_clean_up = false
484
+ @exception_on_syntax_error = true
485
+ end
486
+
487
+ attr_accessor :skip_space
488
+ attr_accessor :read_auto_clean_up
489
+ attr_accessor :exception_on_syntax_error
490
+
491
+ attr :indent
492
+
493
+ # io functions
494
+ def line_no
495
+ @reader.line_num
496
+ end
497
+
498
+ def char_no
499
+ @reader.column
500
+ end
501
+
502
+ def get_read
503
+ @reader.get_read
504
+ end
505
+
506
+ def getc
507
+ @reader.getc
508
+ end
509
+
510
+ def getc_of_rests
511
+ @reader.getc_already_read
512
+ end
513
+
514
+ def gets
515
+ c = getc or return
516
+ l = ""
517
+ begin
518
+ l.concat c unless c == "\r"
519
+ break if c == "\n"
520
+ end while c = getc
521
+ l
522
+ end
523
+
524
+
525
+ def ungetc(c = nil)
526
+ @reader.ungetc(c)
527
+ end
528
+
529
+ def peek_equal?(str)
530
+ @reader.peek_equal(str)
531
+ end
532
+
533
+ def peek(i = 0)
534
+ @reader.peek(i)
535
+ end
536
+
537
+ def lex
538
+ catch(:eof) do
539
+ until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) &&
540
+ !@continue or
541
+ tk.nil?)
542
+ end
543
+ line = get_read
544
+
545
+ if line == "" and tk.kind_of?(TkEND_OF_SCRIPT) || tk.nil?
546
+ nil
547
+ else
548
+ line
549
+ end
550
+ end
551
+ end
552
+
553
+ def token
554
+ set_token_position(line_no, char_no)
555
+ catch(:eof) do
556
+ begin
557
+ begin
558
+ tk = @OP.match(self)
559
+ @space_seen = tk.kind_of?(TkSPACE)
560
+ rescue SyntaxError
561
+ abort if @exception_on_syntax_error
562
+ tk = TkError.new(line_no, char_no)
563
+ end
564
+ end while @skip_space and tk.kind_of?(TkSPACE)
565
+ if @read_auto_clean_up
566
+ get_read
567
+ end
568
+ # throw :eof unless tk
569
+ p tk if $DEBUG
570
+ tk.lex_state = lex_state if tk
571
+ tk
572
+ end
573
+ end
574
+
575
+ ENINDENT_CLAUSE = [
576
+ "case", "class", "def", "do", "for", "if",
577
+ "module", "unless", "until", "while", "begin" #, "when"
578
+ ]
579
+ ACCEPTS_COLON = ["if", "for", "unless", "until", "while"]
580
+ DEINDENT_CLAUSE = ["end" #, "when"
581
+ ]
582
+
583
+ PERCENT_LTYPE = {
584
+ "q" => "\'",
585
+ "Q" => "\"",
586
+ "x" => "\`",
587
+ "r" => "/",
588
+ "w" => "]",
589
+ "W" => "]"
590
+ }
591
+
592
+ PERCENT_PAREN = {
593
+ "{" => "}",
594
+ "[" => "]",
595
+ "<" => ">",
596
+ "(" => ")"
597
+ }
598
+
599
+ Ltype2Token = {
600
+ "\'" => TkSTRING,
601
+ "\"" => TkSTRING,
602
+ "\`" => TkXSTRING,
603
+ "/" => TkREGEXP,
604
+ "]" => TkDSTRING
605
+ }
606
+ Ltype2Token.default = TkSTRING
607
+
608
+ DLtype2Token = {
609
+ "\"" => TkDSTRING,
610
+ "\`" => TkDXSTRING,
611
+ "/" => TkDREGEXP,
612
+ }
613
+
614
+ def lex_init()
615
+ @OP = SLex.new
616
+ @OP.def_rules("\0", "\004", "\032") do |chars, io|
617
+ Token(TkEND_OF_SCRIPT).set_text(chars)
618
+ end
619
+
620
+ @OP.def_rules(" ", "\t", "\f", "\r", "\13") do |chars, io|
621
+ @space_seen = TRUE
622
+ while (ch = getc) =~ /[ \t\f\r\13]/
623
+ chars << ch
624
+ end
625
+ ungetc
626
+ Token(TkSPACE).set_text(chars)
627
+ end
628
+
629
+ @OP.def_rule("#") do
630
+ |op, io|
631
+ identify_comment
632
+ end
633
+
634
+ @OP.def_rule("=begin", proc{@prev_char_no == 0 && peek(0) =~ /\s/}) do
635
+ |op, io|
636
+ str = op
637
+ @ltype = "="
638
+
639
+
640
+ begin
641
+ line = ""
642
+ begin
643
+ ch = getc
644
+ line << ch
645
+ end until ch == "\n"
646
+ str << line
647
+ end until line =~ /^=end/
648
+
649
+ ungetc
650
+
651
+ @ltype = nil
652
+
653
+ if str =~ /\A=begin\s+rdoc/i
654
+ str.sub!(/\A=begin.*\n/, '')
655
+ str.sub!(/^=end.*/m, '')
656
+ Token(TkCOMMENT).set_text(str)
657
+ else
658
+ Token(TkCOMMENT).set_text(str)
659
+ end
660
+ end
661
+
662
+ @OP.def_rule("\n") do
663
+ print "\\n\n" if RubyLex.debug?
664
+ @colonblock_seen = false
665
+ case @lex_state
666
+ when EXPR_BEG, EXPR_FNAME, EXPR_DOT
667
+ @continue = TRUE
668
+ else
669
+ @continue = FALSE
670
+ @lex_state = EXPR_BEG
671
+ end
672
+ Token(TkNL).set_text("\n")
673
+ end
674
+
675
+ @OP.def_rules("*", "**",
676
+ "!", "!=", "!~",
677
+ "=", "==", "===",
678
+ "=~", "<=>",
679
+ "<", "<=",
680
+ ">", ">=", ">>") do |op, io|
681
+ @lex_state = EXPR_BEG
682
+ Token(op).set_text(op)
683
+ end
684
+
685
+ @OP.def_rules("<<") do |op, io|
686
+ tk = nil
687
+ if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
688
+ (@lex_state != EXPR_ARG || @space_seen)
689
+ c = peek(0)
690
+ tk = identify_here_document if /[-\p{Word}_\"\'\`]/ =~ c
691
+ end
692
+ if !tk
693
+ @lex_state = EXPR_BEG
694
+ tk = Token(op).set_text(op)
695
+ end
696
+ tk
697
+ end
698
+
699
+ @OP.def_rules("'", '"') do |op, io|
700
+ identify_string(op)
701
+ end
702
+
703
+ @OP.def_rules("`") do |op, io|
704
+ if @lex_state == EXPR_FNAME
705
+ Token(op).set_text(op)
706
+ else
707
+ identify_string(op)
708
+ end
709
+ end
710
+
711
+ @OP.def_rules('?') do |op, io|
712
+ if @lex_state == EXPR_END
713
+ @lex_state = EXPR_BEG
714
+ Token(TkQUESTION).set_text(op)
715
+ else
716
+ ch = getc
717
+ if @lex_state == EXPR_ARG && ch !~ /\s/
718
+ ungetc
719
+ @lex_state = EXPR_BEG
720
+ Token(TkQUESTION).set_text(op)
721
+ else
722
+ str = op
723
+ str << ch
724
+ if (ch == '\\') #'
725
+ str << read_escape
726
+ end
727
+ @lex_state = EXPR_END
728
+ Token(TkINTEGER).set_text(str)
729
+ end
730
+ end
731
+ end
732
+
733
+ @OP.def_rules("&", "&&", "|", "||") do |op, io|
734
+ @lex_state = EXPR_BEG
735
+ Token(op).set_text(op)
736
+ end
737
+
738
+ @OP.def_rules("+=", "-=", "*=", "**=",
739
+ "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do |op, io|
740
+ @lex_state = EXPR_BEG
741
+ op =~ /^(.*)=$/
742
+ Token(TkOPASGN, $1).set_text(op)
743
+ end
744
+
745
+ @OP.def_rule("+@", proc{@lex_state == EXPR_FNAME}) do |op, io|
746
+ Token(TkUPLUS).set_text(op)
747
+ end
748
+
749
+ @OP.def_rule("-@", proc{@lex_state == EXPR_FNAME}) do |op, io|
750
+ Token(TkUMINUS).set_text(op)
751
+ end
752
+
753
+ @OP.def_rules("+", "-") do |op, io|
754
+ catch(:RET) do
755
+ if @lex_state == EXPR_ARG
756
+ if @space_seen and peek(0) =~ /[0-9]/
757
+ throw :RET, identify_number(op)
758
+ else
759
+ @lex_state = EXPR_BEG
760
+ end
761
+ elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
762
+ throw :RET, identify_number(op)
763
+ else
764
+ @lex_state = EXPR_BEG
765
+ end
766
+ Token(op).set_text(op)
767
+ end
768
+ end
769
+
770
+ @OP.def_rule(".") do
771
+ @lex_state = EXPR_BEG
772
+ if peek(0) =~ /[0-9]/
773
+ ungetc
774
+ identify_number("")
775
+ else
776
+ # for obj.if
777
+ @lex_state = EXPR_DOT
778
+ Token(TkDOT).set_text(".")
779
+ end
780
+ end
781
+
782
+ @OP.def_rules("..", "...") do |op, io|
783
+ @lex_state = EXPR_BEG
784
+ Token(op).set_text(op)
785
+ end
786
+
787
+ lex_int2
788
+ end
789
+
790
+ def lex_int2
791
+ @OP.def_rules("]", "}", ")") do
792
+ |op, io|
793
+ @lex_state = EXPR_END
794
+ @indent -= 1
795
+ Token(op).set_text(op)
796
+ end
797
+
798
+ @OP.def_rule(":") do
799
+ if (@colonblock_seen && @lex_state != EXPR_BEG) || peek(0) =~ /\s/
800
+ @lex_state = EXPR_BEG
801
+ tk = Token(TkCOLON)
802
+ else
803
+ @lex_state = EXPR_FNAME
804
+ tk = Token(TkSYMBEG)
805
+ end
806
+ tk.set_text(":")
807
+ end
808
+
809
+ @OP.def_rule("::") do
810
+ # p @lex_state.id2name, @space_seen
811
+ if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
812
+ @lex_state = EXPR_BEG
813
+ tk = Token(TkCOLON3)
814
+ else
815
+ @lex_state = EXPR_DOT
816
+ tk = Token(TkCOLON2)
817
+ end
818
+ tk.set_text("::")
819
+ end
820
+
821
+ @OP.def_rule("/") do |op, io|
822
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
823
+ identify_string(op)
824
+ elsif peek(0) == '='
825
+ getc
826
+ @lex_state = EXPR_BEG
827
+ Token(TkOPASGN, :/).set_text("/=") #")
828
+ elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
829
+ identify_string(op)
830
+ else
831
+ @lex_state = EXPR_BEG
832
+ Token("/").set_text(op)
833
+ end
834
+ end
835
+
836
+ @OP.def_rules("^") do
837
+ @lex_state = EXPR_BEG
838
+ Token("^").set_text("^")
839
+ end
840
+
841
+ # @OP.def_rules("^=") do
842
+ # @lex_state = EXPR_BEG
843
+ # Token(TkOPASGN, :^)
844
+ # end
845
+
846
+ @OP.def_rules(",", ";") do |op, io|
847
+ @colonblock_seen = false
848
+ @lex_state = EXPR_BEG
849
+ Token(op).set_text(op)
850
+ end
851
+
852
+ @OP.def_rule("~") do
853
+ @lex_state = EXPR_BEG
854
+ Token("~").set_text("~")
855
+ end
856
+
857
+ @OP.def_rule("~@", proc{@lex_state = EXPR_FNAME}) do
858
+ @lex_state = EXPR_BEG
859
+ Token("~").set_text("~@")
860
+ end
861
+
862
+ @OP.def_rule("(") do
863
+ @indent += 1
864
+ # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
865
+ # @lex_state = EXPR_BEG
866
+ # tk = Token(TkfLPAREN)
867
+ # else
868
+ @lex_state = EXPR_BEG
869
+ tk = Token(TkLPAREN)
870
+ # end
871
+ tk.set_text("(")
872
+ end
873
+
874
+ @OP.def_rule("[]", proc{@lex_state == EXPR_FNAME}) do
875
+ Token("[]").set_text("[]")
876
+ end
877
+
878
+ @OP.def_rule("[]=", proc{@lex_state == EXPR_FNAME}) do
879
+ Token("[]=").set_text("[]=")
880
+ end
881
+
882
+ @OP.def_rule("[") do
883
+ @indent += 1
884
+ # if @lex_state == EXPR_FNAME
885
+ # t = Token(TkfLBRACK)
886
+ # else
887
+ # if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
888
+ # t = Token(TkLBRACK)
889
+ # elsif @lex_state == EXPR_ARG && @space_seen
890
+ # else
891
+ # t = Token(TkfLBRACK)
892
+ # end
893
+ # end
894
+ t = Token(TkLBRACK)
895
+ @lex_state = EXPR_BEG
896
+ t.set_text("[")
897
+ end
898
+
899
+ @OP.def_rule("{") do
900
+ @indent += 1
901
+ # if @lex_state != EXPR_END && @lex_state != EXPR_ARG
902
+ # t = Token(TkLBRACE)
903
+ # else
904
+ # t = Token(TkfLBRACE)
905
+ # end
906
+ t = Token(TkLBRACE)
907
+ @lex_state = EXPR_BEG
908
+ t.set_text("{")
909
+ end
910
+
911
+ @OP.def_rule('\\') do #'
912
+ if getc == "\n"
913
+ @space_seen = true
914
+ @continue = true
915
+ Token(TkSPACE).set_text("\\\n")
916
+ else
917
+ ungetc
918
+ Token("\\").set_text("\\") #"
919
+ end
920
+ end
921
+
922
+ @OP.def_rule('%') do
923
+ |op, io|
924
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
925
+ identify_quotation('%')
926
+ elsif peek(0) == '='
927
+ getc
928
+ Token(TkOPASGN, "%").set_text("%=")
929
+ elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
930
+ identify_quotation('%')
931
+ else
932
+ @lex_state = EXPR_BEG
933
+ Token("%").set_text("%")
934
+ end
935
+ end
936
+
937
+ @OP.def_rule('$') do #'
938
+ identify_gvar
939
+ end
940
+
941
+ @OP.def_rule('@') do
942
+ if peek(0) =~ /[@\p{Word}_]/
943
+ ungetc
944
+ identify_identifier
945
+ else
946
+ Token("@").set_text("@")
947
+ end
948
+ end
949
+
950
+ # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
951
+ # |op, io|
952
+ # @indent += 1
953
+ # @lex_state = EXPR_FNAME
954
+ # # @lex_state = EXPR_END
955
+ # # until @rests[0] == "\n" or @rests[0] == ";"
956
+ # # rests.shift
957
+ # # end
958
+ # end
959
+
960
+ @OP.def_rule("__END__", proc{@prev_char_no == 0 && peek(0) =~ /[\r\n]/}) do
961
+ throw :eof
962
+ end
963
+
964
+ @OP.def_rule("") do |op, io|
965
+ printf "MATCH: start %s: %s\n", op, io.inspect if RubyLex.debug?
966
+ if peek(0) =~ /[0-9]/
967
+ t = identify_number("")
968
+ elsif peek(0) =~ /[\p{Word}_]/
969
+ t = identify_identifier
970
+ end
971
+ printf "MATCH: end %s: %s\n", op, io.inspect if RubyLex.debug?
972
+ t
973
+ end
974
+
975
+ p @OP if RubyLex.debug?
976
+ end
977
+
978
+ def identify_gvar
979
+ @lex_state = EXPR_END
980
+ str = "$"
981
+
982
+ tk = case ch = getc
983
+ when /[~_*$?!@\/\\;,=:<>".]/ #"
984
+ str << ch
985
+ Token(TkGVAR, str)
986
+
987
+ when "-"
988
+ str << "-" << getc
989
+ Token(TkGVAR, str)
990
+
991
+ when "&", "`", "'", "+"
992
+ str << ch
993
+ Token(TkBACK_REF, str)
994
+
995
+ when /[1-9]/
996
+ str << ch
997
+ while (ch = getc) =~ /[0-9]/
998
+ str << ch
999
+ end
1000
+ ungetc
1001
+ Token(TkNTH_REF)
1002
+ when /\p{Word}/
1003
+ ungetc
1004
+ ungetc
1005
+ return identify_identifier
1006
+ else
1007
+ ungetc
1008
+ Token("$")
1009
+ end
1010
+ tk.set_text(str)
1011
+ end
1012
+
1013
+ def identify_identifier
1014
+ token = ""
1015
+ token.concat getc if peek(0) =~ /[$@]/
1016
+ token.concat getc if peek(0) == "@"
1017
+
1018
+ while (ch = getc) =~ /[\p{Word}_]/
1019
+ print ":", ch, ":" if RubyLex.debug?
1020
+ token.concat ch
1021
+ end
1022
+ ungetc
1023
+
1024
+ if ch == "!" or ch == "?"
1025
+ token.concat getc
1026
+ end
1027
+ # fix token
1028
+
1029
+ # $stderr.puts "identifier - #{token}, state = #@lex_state"
1030
+
1031
+ case token
1032
+ when /^\$/
1033
+ return Token(TkGVAR, token).set_text(token)
1034
+ when /^\@/
1035
+ @lex_state = EXPR_END
1036
+ return Token(TkIVAR, token).set_text(token)
1037
+ end
1038
+
1039
+ if @lex_state != EXPR_DOT
1040
+ print token, "\n" if RubyLex.debug?
1041
+
1042
+ token_c, *trans = TkReading2Token[token]
1043
+ if token_c
1044
+ # reserved word?
1045
+
1046
+ if (@lex_state != EXPR_BEG &&
1047
+ @lex_state != EXPR_FNAME &&
1048
+ trans[1])
1049
+ # modifiers
1050
+ token_c = TkSymbol2Token[trans[1]]
1051
+ @lex_state = trans[0]
1052
+ else
1053
+ if @lex_state != EXPR_FNAME
1054
+ if ENINDENT_CLAUSE.include?(token)
1055
+ @indent += 1
1056
+
1057
+ if ACCEPTS_COLON.include?(token)
1058
+ @colonblock_seen = true
1059
+ else
1060
+ @colonblock_seen = false
1061
+ end
1062
+ elsif DEINDENT_CLAUSE.include?(token)
1063
+ @indent -= 1
1064
+ @colonblock_seen = false
1065
+ end
1066
+ @lex_state = trans[0]
1067
+ else
1068
+ @lex_state = EXPR_END
1069
+ end
1070
+ end
1071
+ return Token(token_c, token).set_text(token)
1072
+ end
1073
+ end
1074
+
1075
+ if @lex_state == EXPR_FNAME
1076
+ @lex_state = EXPR_END
1077
+ if peek(0) == '='
1078
+ token.concat getc
1079
+ end
1080
+ elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
1081
+ @lex_state = EXPR_ARG
1082
+ else
1083
+ @lex_state = EXPR_END
1084
+ end
1085
+
1086
+ if token[0, 1] =~ /[A-Z]/
1087
+ return Token(TkCONSTANT, token).set_text(token)
1088
+ elsif token[token.size - 1, 1] =~ /[!?]/
1089
+ return Token(TkFID, token).set_text(token)
1090
+ else
1091
+ return Token(TkIDENTIFIER, token).set_text(token)
1092
+ end
1093
+ end
1094
+
1095
+ def identify_here_document
1096
+ ch = getc
1097
+ if ch == "-"
1098
+ ch = getc
1099
+ indent = true
1100
+ end
1101
+ if /['"`]/ =~ ch # '
1102
+ lt = ch
1103
+ quoted = ""
1104
+ while (c = getc) && c != lt
1105
+ quoted.concat c
1106
+ end
1107
+ else
1108
+ lt = '"'
1109
+ quoted = ch.dup
1110
+ while (c = getc) && c =~ /\p{Word}/
1111
+ quoted.concat c
1112
+ end
1113
+ ungetc
1114
+ end
1115
+
1116
+ ltback, @ltype = @ltype, lt
1117
+ reserve = ""
1118
+
1119
+ while ch = getc
1120
+ reserve << ch
1121
+ if ch == "\\" #"
1122
+ ch = getc
1123
+ reserve << ch
1124
+ elsif ch == "\n"
1125
+ break
1126
+ end
1127
+ end
1128
+
1129
+ str = ""
1130
+ while (l = gets)
1131
+ l.chomp!
1132
+ l.strip! if indent
1133
+ break if l == quoted
1134
+ str << l.chomp << "\n"
1135
+ end
1136
+
1137
+ @reader.divert_read_from(reserve)
1138
+
1139
+ @ltype = ltback
1140
+ @lex_state = EXPR_END
1141
+ Token(Ltype2Token[lt], str).set_text(str.dump)
1142
+ end
1143
+
1144
+ def identify_quotation(initial_char)
1145
+ ch = getc
1146
+ if lt = PERCENT_LTYPE[ch]
1147
+ initial_char += ch
1148
+ ch = getc
1149
+ elsif ch =~ /[^\p{Word}]/
1150
+ lt = "\""
1151
+ else
1152
+ # RubyLex.fail SyntaxError, "unknown type of %string ('#{ch}')"
1153
+ end
1154
+ # if ch !~ /[^\p{Word}]/
1155
+ # ungetc
1156
+ # next
1157
+ # end
1158
+ # @ltype = lt
1159
+ @quoted = ch unless @quoted = PERCENT_PAREN[ch]
1160
+ identify_string(lt, @quoted, ch, initial_char) if lt
1161
+ end
1162
+
1163
+ def identify_number(start)
1164
+ str = start.dup
1165
+
1166
+ if start == "+" or start == "-" or start == ""
1167
+ start = getc
1168
+ str << start
1169
+ end
1170
+
1171
+ @lex_state = EXPR_END
1172
+
1173
+ if start == "0"
1174
+ if peek(0) == "x"
1175
+ ch = getc
1176
+ str << ch
1177
+ match = /[0-9a-f_]/
1178
+ else
1179
+ match = /[0-7_]/
1180
+ end
1181
+ while ch = getc
1182
+ if ch !~ match
1183
+ ungetc
1184
+ break
1185
+ else
1186
+ str << ch
1187
+ end
1188
+ end
1189
+ return Token(TkINTEGER).set_text(str)
1190
+ end
1191
+
1192
+ type = TkINTEGER
1193
+ allow_point = TRUE
1194
+ allow_e = TRUE
1195
+ while ch = getc
1196
+ case ch
1197
+ when /[0-9_]/
1198
+ str << ch
1199
+
1200
+ when allow_point && "."
1201
+ type = TkFLOAT
1202
+ if peek(0) !~ /[0-9]/
1203
+ ungetc
1204
+ break
1205
+ end
1206
+ str << ch
1207
+ allow_point = false
1208
+
1209
+ when allow_e && "e", allow_e && "E"
1210
+ str << ch
1211
+ type = TkFLOAT
1212
+ if peek(0) =~ /[+-]/
1213
+ str << getc
1214
+ end
1215
+ allow_e = false
1216
+ allow_point = false
1217
+ else
1218
+ ungetc
1219
+ break
1220
+ end
1221
+ end
1222
+ Token(type).set_text(str)
1223
+ end
1224
+
1225
+ def identify_string(ltype, quoted = ltype, opener=nil, initial_char = nil)
1226
+ @ltype = ltype
1227
+ @quoted = quoted
1228
+ subtype = nil
1229
+
1230
+ str = ""
1231
+ str << initial_char if initial_char
1232
+ str << (opener||quoted)
1233
+
1234
+ nest = 0
1235
+ begin
1236
+ while ch = getc
1237
+ str << ch
1238
+ if @quoted == ch
1239
+ if nest == 0
1240
+ break
1241
+ else
1242
+ nest -= 1
1243
+ end
1244
+ elsif opener == ch
1245
+ nest += 1
1246
+ elsif @ltype != "'" && @ltype != "]" and ch == "#"
1247
+ ch = getc
1248
+ if ch == "{"
1249
+ subtype = true
1250
+ str << ch << skip_inner_expression
1251
+ else
1252
+ ungetc(ch)
1253
+ end
1254
+ elsif ch == '\\' #'
1255
+ str << read_escape
1256
+ end
1257
+ end
1258
+ if @ltype == "/"
1259
+ if peek(0) =~ /i|o|n|e|s/
1260
+ str << getc
1261
+ end
1262
+ end
1263
+ if subtype
1264
+ Token(DLtype2Token[ltype], str)
1265
+ else
1266
+ Token(Ltype2Token[ltype], str)
1267
+ end.set_text(str)
1268
+ ensure
1269
+ @ltype = nil
1270
+ @quoted = nil
1271
+ @lex_state = EXPR_END
1272
+ end
1273
+ end
1274
+
1275
+ def skip_inner_expression
1276
+ res = ""
1277
+ nest = 0
1278
+ while (ch = getc)
1279
+ res << ch
1280
+ if ch == '}'
1281
+ break if nest.zero?
1282
+ nest -= 1
1283
+ elsif ch == '{'
1284
+ nest += 1
1285
+ end
1286
+ end
1287
+ res
1288
+ end
1289
+
1290
+ def identify_comment
1291
+ @ltype = "#"
1292
+ comment = "#"
1293
+ while ch = getc
1294
+ if ch == "\\"
1295
+ ch = getc
1296
+ if ch == "\n"
1297
+ ch = " "
1298
+ else
1299
+ comment << "\\"
1300
+ end
1301
+ else
1302
+ if ch == "\n"
1303
+ @ltype = nil
1304
+ ungetc
1305
+ break
1306
+ end
1307
+ end
1308
+ comment << ch
1309
+ end
1310
+ return Token(TkCOMMENT).set_text(comment)
1311
+ end
1312
+
1313
+ def read_escape
1314
+ res = ""
1315
+ case ch = getc
1316
+ when /[0-7]/
1317
+ ungetc ch
1318
+ 3.times do
1319
+ case ch = getc
1320
+ when /[0-7]/
1321
+ when nil
1322
+ break
1323
+ else
1324
+ ungetc
1325
+ break
1326
+ end
1327
+ res << ch
1328
+ end
1329
+
1330
+ when "x"
1331
+ res << ch
1332
+ 2.times do
1333
+ case ch = getc
1334
+ when /[0-9a-fA-F]/
1335
+ when nil
1336
+ break
1337
+ else
1338
+ ungetc
1339
+ break
1340
+ end
1341
+ res << ch
1342
+ end
1343
+
1344
+ when "M"
1345
+ res << ch
1346
+ if (ch = getc) != '-'
1347
+ ungetc
1348
+ else
1349
+ res << ch
1350
+ if (ch = getc) == "\\" #"
1351
+ res << ch
1352
+ res << read_escape
1353
+ else
1354
+ res << ch
1355
+ end
1356
+ end
1357
+
1358
+ when "C", "c" #, "^"
1359
+ res << ch
1360
+ if ch == "C" and (ch = getc) != "-"
1361
+ ungetc
1362
+ else
1363
+ res << ch
1364
+ if (ch = getc) == "\\" #"
1365
+ res << ch
1366
+ res << read_escape
1367
+ else
1368
+ res << ch
1369
+ end
1370
+ end
1371
+ else
1372
+ res << ch
1373
+ end
1374
+ res
1375
+ end
1376
+ end
1377
+ end
1378
+ end