yard 0.9.16 → 0.9.17

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of yard might be problematic. Click here for more details.

Files changed (566) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +728 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +53 -47
  8. data/benchmarks/builtins_vs_eval.rb +24 -24
  9. data/benchmarks/concat_vs_join.rb +13 -13
  10. data/benchmarks/erb_vs_erubis.rb +54 -54
  11. data/benchmarks/format_args.rb +47 -47
  12. data/benchmarks/generation.rb +38 -38
  13. data/benchmarks/marshal_vs_dbm.rb +64 -64
  14. data/benchmarks/parsing.rb +46 -46
  15. data/benchmarks/pathname_vs_string.rb +50 -50
  16. data/benchmarks/rdoc_vs_yardoc.rb +11 -11
  17. data/benchmarks/registry_store_types.rb +49 -49
  18. data/benchmarks/ri_vs_yri.rb +19 -19
  19. data/benchmarks/ripper_parser.rb +13 -13
  20. data/benchmarks/splat_vs_flatten.rb +13 -13
  21. data/benchmarks/template_erb.rb +23 -23
  22. data/benchmarks/template_format.rb +7 -7
  23. data/benchmarks/template_profile.rb +18 -18
  24. data/benchmarks/yri_cache.rb +20 -20
  25. data/bin/yard +13 -13
  26. data/bin/yardoc +13 -13
  27. data/bin/yri +13 -13
  28. data/docs/CodeObjects.md +115 -115
  29. data/docs/GettingStarted.md +679 -679
  30. data/docs/Handlers.md +152 -152
  31. data/docs/Overview.md +61 -61
  32. data/docs/Parser.md +191 -191
  33. data/docs/Tags.md +283 -283
  34. data/docs/TagsArch.md +123 -123
  35. data/docs/Templates.md +496 -496
  36. data/docs/WhatsNew.md +1245 -1245
  37. data/docs/templates/default/fulldoc/html/full_list_tag.erb +8 -8
  38. data/docs/templates/default/fulldoc/html/setup.rb +6 -6
  39. data/docs/templates/default/layout/html/setup.rb +9 -9
  40. data/docs/templates/default/layout/html/tag_list.erb +11 -11
  41. data/docs/templates/default/yard_tags/html/list.erb +18 -18
  42. data/docs/templates/default/yard_tags/html/setup.rb +26 -26
  43. data/docs/templates/plugin.rb +70 -70
  44. data/lib/rubygems_plugin.rb +9 -9
  45. data/lib/yard.rb +69 -69
  46. data/lib/yard/autoload.rb +303 -303
  47. data/lib/yard/cli/command.rb +85 -85
  48. data/lib/yard/cli/command_parser.rb +93 -93
  49. data/lib/yard/cli/config.rb +198 -198
  50. data/lib/yard/cli/diff.rb +270 -270
  51. data/lib/yard/cli/display.rb +69 -69
  52. data/lib/yard/cli/gems.rb +84 -84
  53. data/lib/yard/cli/graph.rb +125 -125
  54. data/lib/yard/cli/help.rb +20 -20
  55. data/lib/yard/cli/i18n.rb +70 -70
  56. data/lib/yard/cli/list.rb +23 -23
  57. data/lib/yard/cli/markup_types.rb +32 -32
  58. data/lib/yard/cli/server.rb +257 -257
  59. data/lib/yard/cli/stats.rb +231 -231
  60. data/lib/yard/cli/yardoc.rb +788 -788
  61. data/lib/yard/cli/yardopts_command.rb +110 -110
  62. data/lib/yard/cli/yri.rb +215 -215
  63. data/lib/yard/code_objects/base.rb +615 -610
  64. data/lib/yard/code_objects/class_object.rb +146 -146
  65. data/lib/yard/code_objects/class_variable_object.rb +11 -11
  66. data/lib/yard/code_objects/constant_object.rb +16 -16
  67. data/lib/yard/code_objects/extended_method_object.rb +24 -24
  68. data/lib/yard/code_objects/extra_file_object.rb +131 -131
  69. data/lib/yard/code_objects/macro_object.rb +172 -172
  70. data/lib/yard/code_objects/method_object.rb +196 -196
  71. data/lib/yard/code_objects/module_object.rb +21 -21
  72. data/lib/yard/code_objects/namespace_mapper.rb +114 -114
  73. data/lib/yard/code_objects/namespace_object.rb +200 -200
  74. data/lib/yard/code_objects/proxy.rb +240 -240
  75. data/lib/yard/code_objects/root_object.rb +19 -19
  76. data/lib/yard/config.rb +270 -270
  77. data/lib/yard/core_ext/array.rb +16 -16
  78. data/lib/yard/core_ext/file.rb +69 -69
  79. data/lib/yard/core_ext/hash.rb +16 -16
  80. data/lib/yard/core_ext/insertion.rb +63 -63
  81. data/lib/yard/core_ext/module.rb +20 -20
  82. data/lib/yard/core_ext/string.rb +68 -68
  83. data/lib/yard/core_ext/symbol_hash.rb +75 -75
  84. data/lib/yard/docstring.rb +386 -378
  85. data/lib/yard/docstring_parser.rb +345 -345
  86. data/lib/yard/gem_index.rb +29 -29
  87. data/lib/yard/globals.rb +22 -22
  88. data/lib/yard/handlers/base.rb +595 -595
  89. data/lib/yard/handlers/c/alias_handler.rb +16 -16
  90. data/lib/yard/handlers/c/attribute_handler.rb +13 -13
  91. data/lib/yard/handlers/c/base.rb +129 -129
  92. data/lib/yard/handlers/c/class_handler.rb +27 -27
  93. data/lib/yard/handlers/c/constant_handler.rb +13 -13
  94. data/lib/yard/handlers/c/handler_methods.rb +211 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -36
  97. data/lib/yard/handlers/c/mixin_handler.rb +21 -21
  98. data/lib/yard/handlers/c/module_handler.rb +17 -17
  99. data/lib/yard/handlers/c/override_comment_handler.rb +31 -31
  100. data/lib/yard/handlers/c/path_handler.rb +11 -11
  101. data/lib/yard/handlers/c/struct_handler.rb +13 -13
  102. data/lib/yard/handlers/c/symbol_handler.rb +8 -8
  103. data/lib/yard/handlers/processor.rb +200 -200
  104. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  105. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  106. data/lib/yard/handlers/ruby/base.rb +165 -165
  107. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  108. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  109. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  110. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  111. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  112. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  113. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  114. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -95
  115. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  116. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  117. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  118. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  119. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  120. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  121. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  122. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  123. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  124. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  125. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  126. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  127. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  128. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  129. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  130. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  131. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  132. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  133. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  135. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  136. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  137. data/lib/yard/handlers/ruby/method_handler.rb +118 -118
  138. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  139. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  140. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  141. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  142. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  143. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  146. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  147. data/lib/yard/i18n/locale.rb +67 -67
  148. data/lib/yard/i18n/message.rb +57 -57
  149. data/lib/yard/i18n/messages.rb +56 -56
  150. data/lib/yard/i18n/po_parser.rb +61 -61
  151. data/lib/yard/i18n/pot_generator.rb +290 -290
  152. data/lib/yard/i18n/text.rb +173 -173
  153. data/lib/yard/logging.rb +205 -205
  154. data/lib/yard/options.rb +217 -217
  155. data/lib/yard/parser/base.rb +57 -57
  156. data/lib/yard/parser/c/c_parser.rb +235 -235
  157. data/lib/yard/parser/c/comment_parser.rb +134 -134
  158. data/lib/yard/parser/c/statement.rb +64 -64
  159. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  160. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  161. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  162. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  163. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  164. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  165. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  166. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  167. data/lib/yard/parser/source_parser.rb +526 -526
  168. data/lib/yard/rake/yardoc_task.rb +81 -81
  169. data/lib/yard/registry.rb +439 -439
  170. data/lib/yard/registry_resolver.rb +189 -189
  171. data/lib/yard/registry_store.rb +337 -337
  172. data/lib/yard/rubygems/backports.rb +10 -10
  173. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  174. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  175. data/lib/yard/rubygems/backports/gem.rb +10 -10
  176. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  177. data/lib/yard/rubygems/doc_manager.rb +90 -90
  178. data/lib/yard/rubygems/hook.rb +197 -197
  179. data/lib/yard/rubygems/specification.rb +50 -50
  180. data/lib/yard/serializers/base.rb +83 -83
  181. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  182. data/lib/yard/serializers/process_serializer.rb +24 -24
  183. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  184. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  185. data/lib/yard/server.rb +13 -13
  186. data/lib/yard/server/adapter.rb +100 -100
  187. data/lib/yard/server/commands/base.rb +209 -209
  188. data/lib/yard/server/commands/display_file_command.rb +29 -29
  189. data/lib/yard/server/commands/display_object_command.rb +65 -65
  190. data/lib/yard/server/commands/frames_command.rb +16 -16
  191. data/lib/yard/server/commands/library_command.rb +187 -187
  192. data/lib/yard/server/commands/library_index_command.rb +28 -28
  193. data/lib/yard/server/commands/list_command.rb +25 -25
  194. data/lib/yard/server/commands/root_request_command.rb +15 -15
  195. data/lib/yard/server/commands/search_command.rb +79 -79
  196. data/lib/yard/server/commands/static_file_command.rb +23 -23
  197. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  198. data/lib/yard/server/doc_server_helper.rb +91 -91
  199. data/lib/yard/server/doc_server_serializer.rb +39 -39
  200. data/lib/yard/server/library_version.rb +277 -277
  201. data/lib/yard/server/rack_adapter.rb +89 -89
  202. data/lib/yard/server/router.rb +187 -187
  203. data/lib/yard/server/static_caching.rb +46 -46
  204. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  205. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  206. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  207. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  208. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  209. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  210. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  211. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  212. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  213. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  214. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  215. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  216. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  217. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  218. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  219. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  220. data/lib/yard/server/webrick_adapter.rb +45 -45
  221. data/lib/yard/tags/default_factory.rb +191 -191
  222. data/lib/yard/tags/default_tag.rb +13 -13
  223. data/lib/yard/tags/directives.rb +616 -616
  224. data/lib/yard/tags/library.rb +633 -633
  225. data/lib/yard/tags/option_tag.rb +13 -13
  226. data/lib/yard/tags/overload_tag.rb +71 -71
  227. data/lib/yard/tags/ref_tag.rb +8 -8
  228. data/lib/yard/tags/ref_tag_list.rb +28 -28
  229. data/lib/yard/tags/tag.rb +71 -71
  230. data/lib/yard/tags/tag_format_error.rb +7 -7
  231. data/lib/yard/tags/types_explainer.rb +162 -162
  232. data/lib/yard/templates/engine.rb +186 -186
  233. data/lib/yard/templates/erb_cache.rb +23 -23
  234. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  235. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  236. data/lib/yard/templates/helpers/html_helper.rb +646 -642
  237. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  238. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  239. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  240. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  241. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  242. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  243. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  244. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  245. data/lib/yard/templates/section.rb +105 -105
  246. data/lib/yard/templates/template.rb +418 -418
  247. data/lib/yard/templates/template_options.rb +92 -92
  248. data/lib/yard/verifier.rb +151 -151
  249. data/lib/yard/version.rb +3 -1
  250. data/spec/cli/command_parser_spec.rb +43 -43
  251. data/spec/cli/command_spec.rb +36 -36
  252. data/spec/cli/config_spec.rb +148 -148
  253. data/spec/cli/diff_spec.rb +254 -254
  254. data/spec/cli/display_spec.rb +30 -30
  255. data/spec/cli/gems_spec.rb +81 -81
  256. data/spec/cli/graph_spec.rb +18 -18
  257. data/spec/cli/help_spec.rb +22 -22
  258. data/spec/cli/i18n_spec.rb +107 -107
  259. data/spec/cli/list_spec.rb +8 -8
  260. data/spec/cli/markup_types_spec.rb +22 -22
  261. data/spec/cli/server_spec.rb +324 -324
  262. data/spec/cli/stats_spec.rb +96 -96
  263. data/spec/cli/yard_on_yard_spec.rb +38 -38
  264. data/spec/cli/yardoc_spec.rb +862 -849
  265. data/spec/cli/yri_spec.rb +101 -101
  266. data/spec/code_objects/base_spec.rb +470 -460
  267. data/spec/code_objects/class_object_spec.rb +226 -226
  268. data/spec/code_objects/code_object_list_spec.rb +36 -36
  269. data/spec/code_objects/constants_spec.rb +116 -116
  270. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  271. data/spec/code_objects/macro_object_spec.rb +150 -150
  272. data/spec/code_objects/method_object_spec.rb +184 -184
  273. data/spec/code_objects/module_object_spec.rb +142 -142
  274. data/spec/code_objects/namespace_object_spec.rb +171 -171
  275. data/spec/code_objects/proxy_spec.rb +141 -141
  276. data/spec/code_objects/spec_helper.rb +3 -3
  277. data/spec/config_spec.rb +171 -171
  278. data/spec/core_ext/array_spec.rb +13 -13
  279. data/spec/core_ext/file_spec.rb +72 -72
  280. data/spec/core_ext/hash_spec.rb +14 -14
  281. data/spec/core_ext/insertion_spec.rb +37 -37
  282. data/spec/core_ext/module_spec.rb +15 -15
  283. data/spec/core_ext/string_spec.rb +42 -42
  284. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  285. data/spec/docstring_parser_spec.rb +280 -262
  286. data/spec/docstring_spec.rb +373 -364
  287. data/spec/examples.txt +1875 -1871
  288. data/spec/handlers/alias_handler_spec.rb +82 -82
  289. data/spec/handlers/attribute_handler_spec.rb +96 -96
  290. data/spec/handlers/base_spec.rb +216 -216
  291. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  292. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  293. data/spec/handlers/c/class_handler_spec.rb +78 -78
  294. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  295. data/spec/handlers/c/init_handler_spec.rb +48 -48
  296. data/spec/handlers/c/method_handler_spec.rb +325 -325
  297. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  298. data/spec/handlers/c/module_handler_spec.rb +71 -71
  299. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  300. data/spec/handlers/c/path_handler_spec.rb +36 -36
  301. data/spec/handlers/c/spec_helper.rb +23 -23
  302. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  303. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  304. data/spec/handlers/class_handler_spec.rb +247 -247
  305. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  306. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  307. data/spec/handlers/constant_handler_spec.rb +112 -112
  308. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  309. data/spec/handlers/dsl_handler_spec.rb +219 -219
  310. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  311. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  312. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  313. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  314. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  315. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  316. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  317. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  318. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  319. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  320. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  321. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  322. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  323. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  324. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  325. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  326. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  327. data/spec/handlers/exception_handler_spec.rb +49 -49
  328. data/spec/handlers/extend_handler_spec.rb +24 -24
  329. data/spec/handlers/legacy_base_spec.rb +128 -128
  330. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  331. data/spec/handlers/method_handler_spec.rb +190 -190
  332. data/spec/handlers/mixin_handler_spec.rb +56 -56
  333. data/spec/handlers/module_function_handler_spec.rb +106 -106
  334. data/spec/handlers/module_handler_spec.rb +35 -35
  335. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  336. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  337. data/spec/handlers/processor_spec.rb +35 -35
  338. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  339. data/spec/handlers/ruby/base_spec.rb +95 -95
  340. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  341. data/spec/handlers/spec_helper.rb +33 -33
  342. data/spec/handlers/visibility_handler_spec.rb +44 -44
  343. data/spec/handlers/yield_handler_spec.rb +52 -52
  344. data/spec/i18n/locale_spec.rb +81 -81
  345. data/spec/i18n/message_spec.rb +52 -52
  346. data/spec/i18n/messages_spec.rb +67 -67
  347. data/spec/i18n/pot_generator_spec.rb +295 -295
  348. data/spec/i18n/text_spec.rb +184 -184
  349. data/spec/logging_spec.rb +44 -44
  350. data/spec/options_spec.rb +171 -171
  351. data/spec/parser/base_spec.rb +24 -24
  352. data/spec/parser/c_parser_spec.rb +236 -223
  353. data/spec/parser/examples/array.c.txt +6267 -6267
  354. data/spec/parser/examples/example1.rb.txt +7 -7
  355. data/spec/parser/examples/extrafile.c.txt +8 -8
  356. data/spec/parser/examples/file.c.txt +28 -0
  357. data/spec/parser/examples/multifile.c.txt +22 -22
  358. data/spec/parser/examples/namespace.cpp.txt +68 -68
  359. data/spec/parser/examples/override.c.txt +424 -424
  360. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  361. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  362. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  363. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  364. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  365. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  366. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  367. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  368. data/spec/parser/source_parser_spec.rb +727 -727
  369. data/spec/parser/tag_parsing_spec.rb +17 -17
  370. data/spec/rake/yardoc_task_spec.rb +118 -118
  371. data/spec/registry_spec.rb +463 -463
  372. data/spec/registry_store_spec.rb +316 -316
  373. data/spec/rubygems/doc_manager_spec.rb +112 -112
  374. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  375. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  376. data/spec/serializers/spec_helper.rb +2 -2
  377. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  378. data/spec/server/adapter_spec.rb +39 -39
  379. data/spec/server/commands/base_spec.rb +91 -91
  380. data/spec/server/commands/library_command_spec.rb +39 -39
  381. data/spec/server/doc_server_helper_spec.rb +72 -72
  382. data/spec/server/doc_server_serializer_spec.rb +60 -60
  383. data/spec/server/rack_adapter_spec.rb +21 -21
  384. data/spec/server/router_spec.rb +123 -123
  385. data/spec/server/spec_helper.rb +22 -22
  386. data/spec/server/static_caching_spec.rb +47 -47
  387. data/spec/server/webrick_servlet_spec.rb +20 -20
  388. data/spec/server_spec.rb +19 -19
  389. data/spec/spec_helper.rb +212 -212
  390. data/spec/tags/default_factory_spec.rb +168 -168
  391. data/spec/tags/default_tag_spec.rb +11 -11
  392. data/spec/tags/directives_spec.rb +463 -463
  393. data/spec/tags/library_spec.rb +48 -48
  394. data/spec/tags/overload_tag_spec.rb +53 -53
  395. data/spec/tags/ref_tag_list_spec.rb +53 -53
  396. data/spec/tags/types_explainer_spec.rb +203 -203
  397. data/spec/templates/class_spec.rb +45 -45
  398. data/spec/templates/constant_spec.rb +41 -41
  399. data/spec/templates/engine_spec.rb +131 -131
  400. data/spec/templates/examples/class001.html +308 -308
  401. data/spec/templates/examples/class001.txt +36 -36
  402. data/spec/templates/examples/class002.html +39 -39
  403. data/spec/templates/examples/constant001.txt +24 -24
  404. data/spec/templates/examples/constant002.txt +6 -6
  405. data/spec/templates/examples/constant003.txt +10 -10
  406. data/spec/templates/examples/method001.html +137 -137
  407. data/spec/templates/examples/method001.txt +35 -35
  408. data/spec/templates/examples/method002.html +91 -91
  409. data/spec/templates/examples/method002.txt +20 -20
  410. data/spec/templates/examples/method003.html +165 -165
  411. data/spec/templates/examples/method003.txt +45 -45
  412. data/spec/templates/examples/method004.html +48 -48
  413. data/spec/templates/examples/method004.txt +10 -10
  414. data/spec/templates/examples/method005.html +105 -105
  415. data/spec/templates/examples/method005.txt +33 -33
  416. data/spec/templates/examples/method006.html +107 -107
  417. data/spec/templates/examples/method006.txt +20 -20
  418. data/spec/templates/examples/module001.dot +33 -33
  419. data/spec/templates/examples/module001.html +833 -833
  420. data/spec/templates/examples/module001.txt +33 -33
  421. data/spec/templates/examples/module002.html +341 -341
  422. data/spec/templates/examples/module003.html +202 -202
  423. data/spec/templates/examples/module004.html +394 -394
  424. data/spec/templates/examples/module005.html +81 -81
  425. data/spec/templates/examples/tag001.txt +82 -82
  426. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  427. data/spec/templates/helpers/html_helper_spec.rb +668 -653
  428. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  429. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  430. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  431. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  432. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  433. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  434. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  435. data/spec/templates/method_spec.rb +118 -118
  436. data/spec/templates/module_spec.rb +203 -203
  437. data/spec/templates/onefile_spec.rb +66 -66
  438. data/spec/templates/section_spec.rb +144 -144
  439. data/spec/templates/spec_helper.rb +76 -76
  440. data/spec/templates/tag_spec.rb +52 -52
  441. data/spec/templates/template_spec.rb +410 -410
  442. data/spec/verifier_spec.rb +106 -106
  443. data/templates/default/class/dot/setup.rb +7 -7
  444. data/templates/default/class/dot/superklass.erb +2 -2
  445. data/templates/default/class/html/constructor_details.erb +8 -8
  446. data/templates/default/class/html/setup.rb +2 -2
  447. data/templates/default/class/html/subclasses.erb +4 -4
  448. data/templates/default/class/setup.rb +36 -36
  449. data/templates/default/class/text/setup.rb +12 -12
  450. data/templates/default/class/text/subclasses.erb +5 -5
  451. data/templates/default/constant/text/header.erb +11 -11
  452. data/templates/default/constant/text/setup.rb +4 -4
  453. data/templates/default/docstring/html/abstract.erb +4 -4
  454. data/templates/default/docstring/html/deprecated.erb +1 -1
  455. data/templates/default/docstring/html/index.erb +5 -5
  456. data/templates/default/docstring/html/note.erb +6 -6
  457. data/templates/default/docstring/html/private.erb +4 -4
  458. data/templates/default/docstring/html/text.erb +1 -1
  459. data/templates/default/docstring/html/todo.erb +6 -6
  460. data/templates/default/docstring/setup.rb +52 -52
  461. data/templates/default/docstring/text/abstract.erb +2 -2
  462. data/templates/default/docstring/text/deprecated.erb +2 -2
  463. data/templates/default/docstring/text/index.erb +2 -2
  464. data/templates/default/docstring/text/note.erb +3 -3
  465. data/templates/default/docstring/text/private.erb +2 -2
  466. data/templates/default/docstring/text/text.erb +1 -1
  467. data/templates/default/docstring/text/todo.erb +3 -3
  468. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  469. data/templates/default/fulldoc/html/css/style.css +496 -496
  470. data/templates/default/fulldoc/html/frames.erb +17 -17
  471. data/templates/default/fulldoc/html/full_list.erb +37 -37
  472. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  473. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  474. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  475. data/templates/default/fulldoc/html/js/app.js +292 -292
  476. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  477. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  478. data/templates/default/fulldoc/html/setup.rb +241 -241
  479. data/templates/default/layout/dot/header.erb +5 -5
  480. data/templates/default/layout/dot/setup.rb +15 -15
  481. data/templates/default/layout/html/breadcrumb.erb +11 -11
  482. data/templates/default/layout/html/files.erb +11 -11
  483. data/templates/default/layout/html/footer.erb +5 -5
  484. data/templates/default/layout/html/headers.erb +15 -15
  485. data/templates/default/layout/html/index.erb +2 -2
  486. data/templates/default/layout/html/layout.erb +23 -23
  487. data/templates/default/layout/html/listing.erb +4 -4
  488. data/templates/default/layout/html/objects.erb +32 -32
  489. data/templates/default/layout/html/script_setup.erb +4 -4
  490. data/templates/default/layout/html/search.erb +12 -12
  491. data/templates/default/layout/html/setup.rb +89 -89
  492. data/templates/default/method/html/header.erb +16 -16
  493. data/templates/default/method/setup.rb +4 -4
  494. data/templates/default/method_details/html/header.erb +2 -2
  495. data/templates/default/method_details/html/method_signature.erb +24 -24
  496. data/templates/default/method_details/html/source.erb +9 -9
  497. data/templates/default/method_details/setup.rb +11 -11
  498. data/templates/default/method_details/text/header.erb +10 -10
  499. data/templates/default/method_details/text/method_signature.erb +12 -12
  500. data/templates/default/method_details/text/setup.rb +11 -11
  501. data/templates/default/module/dot/child.erb +1 -1
  502. data/templates/default/module/dot/dependencies.erb +2 -2
  503. data/templates/default/module/dot/header.erb +6 -6
  504. data/templates/default/module/dot/info.erb +13 -13
  505. data/templates/default/module/dot/setup.rb +15 -15
  506. data/templates/default/module/html/attribute_details.erb +10 -10
  507. data/templates/default/module/html/attribute_summary.erb +8 -8
  508. data/templates/default/module/html/box_info.erb +43 -43
  509. data/templates/default/module/html/children.erb +8 -8
  510. data/templates/default/module/html/constant_summary.erb +17 -17
  511. data/templates/default/module/html/defines.erb +2 -2
  512. data/templates/default/module/html/header.erb +5 -5
  513. data/templates/default/module/html/inherited_attributes.erb +14 -14
  514. data/templates/default/module/html/inherited_constants.erb +8 -8
  515. data/templates/default/module/html/inherited_methods.erb +18 -18
  516. data/templates/default/module/html/item_summary.erb +40 -40
  517. data/templates/default/module/html/method_details_list.erb +9 -9
  518. data/templates/default/module/html/method_summary.erb +13 -13
  519. data/templates/default/module/html/methodmissing.erb +12 -12
  520. data/templates/default/module/setup.rb +167 -167
  521. data/templates/default/module/text/children.erb +9 -9
  522. data/templates/default/module/text/class_meths_list.erb +7 -7
  523. data/templates/default/module/text/extends.erb +7 -7
  524. data/templates/default/module/text/header.erb +7 -7
  525. data/templates/default/module/text/includes.erb +7 -7
  526. data/templates/default/module/text/instance_meths_list.erb +7 -7
  527. data/templates/default/module/text/setup.rb +13 -13
  528. data/templates/default/onefile/html/files.erb +4 -4
  529. data/templates/default/onefile/html/headers.erb +6 -6
  530. data/templates/default/onefile/html/layout.erb +17 -17
  531. data/templates/default/onefile/html/readme.erb +2 -2
  532. data/templates/default/onefile/html/setup.rb +62 -62
  533. data/templates/default/root/dot/child.erb +2 -2
  534. data/templates/default/root/dot/setup.rb +6 -6
  535. data/templates/default/root/html/setup.rb +2 -2
  536. data/templates/default/tags/html/example.erb +10 -10
  537. data/templates/default/tags/html/index.erb +2 -2
  538. data/templates/default/tags/html/option.erb +24 -24
  539. data/templates/default/tags/html/overload.erb +13 -13
  540. data/templates/default/tags/html/see.erb +7 -7
  541. data/templates/default/tags/html/tag.erb +20 -20
  542. data/templates/default/tags/setup.rb +57 -57
  543. data/templates/default/tags/text/example.erb +12 -12
  544. data/templates/default/tags/text/index.erb +1 -1
  545. data/templates/default/tags/text/option.erb +20 -20
  546. data/templates/default/tags/text/overload.erb +19 -19
  547. data/templates/default/tags/text/see.erb +11 -11
  548. data/templates/default/tags/text/tag.erb +13 -13
  549. data/templates/guide/class/html/setup.rb +2 -2
  550. data/templates/guide/docstring/html/setup.rb +2 -2
  551. data/templates/guide/fulldoc/html/css/style.css +108 -108
  552. data/templates/guide/fulldoc/html/js/app.js +33 -33
  553. data/templates/guide/fulldoc/html/setup.rb +74 -74
  554. data/templates/guide/layout/html/layout.erb +81 -81
  555. data/templates/guide/layout/html/setup.rb +25 -25
  556. data/templates/guide/method/html/header.erb +17 -17
  557. data/templates/guide/method/html/setup.rb +22 -22
  558. data/templates/guide/module/html/header.erb +6 -6
  559. data/templates/guide/module/html/method_list.erb +4 -4
  560. data/templates/guide/module/html/setup.rb +27 -27
  561. data/templates/guide/onefile/html/files.erb +4 -4
  562. data/templates/guide/onefile/html/setup.rb +6 -6
  563. data/templates/guide/onefile/html/toc.erb +3 -3
  564. data/templates/guide/tags/html/setup.rb +9 -9
  565. data/yard.gemspec +43 -43
  566. metadata +4 -4
@@ -1,152 +1,152 @@
1
- # @title Handlers Architecture
2
-
3
- # Handlers Architecture
4
-
5
- Handlers allow the processing of parsed source code. Handling is done after
6
- parsing to abstract away the implementation details of lexical and semantic
7
- analysis on source and to only deal with the logic regarding recognizing
8
- source statements as {file:docs/CodeObjects.md code objects}.
9
-
10
- ![Handlers Architecture Class Diagram](images/handlers-class-diagram.png)
11
-
12
- ## The Pipeline
13
-
14
- After the {file:docs/Parser.md parser component} finishes analyzing the
15
- source, it is handed off for post-processing to the {YARD::Handlers::Processor}
16
- class, which is responsible for traversing the set of statements given by
17
- the parser and delegating them to matching handlers. Handlers match when the
18
- {YARD::Handlers::Base.handles?} method returns true for a given statement.
19
- The handler can then perform any action after being invoked by the `process`
20
- method.
21
-
22
- ## The Processor Class
23
-
24
- The main purpose of the processor, as mentioned above, is to traverse through
25
- the list of statements given to it by the parser. The processor also keeps
26
- state about what is being processed. For instance, the processor is what keeps
27
- track of the current namespace (the module or class an object is being defined
28
- in), scope (class or instance), file and owner. The owner refers to the object
29
- that is most directly responsible for the source statement being processed. This
30
- is most often the same as the namespace, except when parsing the body of a method,
31
- where the namespace would be the class/module the method is defined in and the
32
- owner would be the method object itself.
33
-
34
- ## Implementing a Handler
35
-
36
- This section covers the basics of implementing a *new-style* Ruby handler. For
37
- details on implementing a legacy handler, see the "API Differences" section below.
38
-
39
- a Ruby handler can be implemented simply by subclassing the {YARD::Handlers::Ruby::Base}
40
- class and declaring what node types or source to process with the {YARD::Handlers::Base.handles handles}
41
- class method. A very simple handler that handles a module definition would be:
42
-
43
- class MyModuleHandler < YARD::Handlers::Ruby::Base
44
- handles :module
45
-
46
- def process
47
- puts "Handling a module named #{statement[0].source}"
48
- end
49
- end
50
-
51
- For details on what nodes are, and what node types are, see the
52
- {file:docs/Parser.md parser architecture document}.
53
-
54
- In this case the node type being handled is the `:module` type. More than one
55
- node type or `handles` declarations may describe a single handler, for instance,
56
- a handler that handles class definitions should handle the `:class` and `:sclass`
57
- node types respectively (the latter refers to classes defined as `class << Something`).
58
- The {YARD::Handlers::Base#statement statement} attribute refers to the current
59
- node (or statement) that is being handled by the handler.
60
-
61
- ### Handling a Method Call
62
-
63
- In some cases, a developer might need to handle a method call. The parser can
64
- express a method call in many AST forms, so to simplify this process, a method
65
- call can be handled by declaring the following in a `handles` statement:
66
-
67
- class MyHandler < YARD::Handlers::Ruby::Base
68
- handles method_call(:describe)
69
-
70
- def process
71
- # Process the method call
72
- end
73
- end
74
-
75
- In this case we handle any of the method calls to method name `describe` with
76
- the following syntaxes:
77
-
78
- describe(something)
79
- describe arg1, arg2, arg3
80
- describe(something) { perform_a_block }
81
- describe "Something" do
82
- a_block
83
- end
84
-
85
- ### Creating a new Code Object
86
-
87
- Usually (but not always) handling is performed to create new code objects to add
88
- to the registry (for information about code objects, see {file:docs/CodeObjects.md this document}).
89
- Code objects should simply be created and added to the existing `namespace`. This
90
- will be enough to add them to the registry. There is also a convenience
91
- {YARD::Handlers::Base#register register} method which quickly sets standard attributed
92
- on the newly created object, such as the file, line, source and docstring of the
93
- object. This method will be seen in the next example.
94
-
95
- ### Handling an Inner Block
96
-
97
- By default, the parser gives the processor class a list of all the top level
98
- statements and the processor parses only those top level statements. If an inner
99
- block of a module, class, method declaration or even a block passed to a method call
100
- needs to be handled, the {YARD::Handlers::Base#parse_block parse_block} method must be called on the list of statements
101
- to parse. This will send the list to the processor to continue processing on that
102
- statement list. The source tree can be selectively parsed in this manner by parsing
103
- only the inner blocks that are relevant to documentation.
104
-
105
- For example, the module handler parses the inner body of a module by performing
106
- the following commands:
107
-
108
- class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base
109
- handles :module
110
-
111
- def process
112
- modname = statement[0].source
113
- mod = register ModuleObject.new(namespace, modname)
114
- parse_block(statement[1], :namespace => mod)
115
- end
116
- end
117
-
118
- In this case `statement[1]` refers to a list of extra statements, the block we
119
- wish to parse. Note here that when parsing objects like modules and classes,
120
- we set the namespace for the duration of the block parsing by setting options
121
- on the `parse_block` method.
122
-
123
- ### API Differences for Legacy Handler
124
-
125
- Because the legacy handler uses the legacy parser and therefore a different kind
126
- of AST, there are subtle differences in the handler API. Most importantly, the
127
- `handles` method usually deals with either lexical tokens or source code as a string
128
- or RegExp object. The statement object, similarly, is made up of lexical tokens instead
129
- of semantically parsed nodes (this is described in the {file:docs/Parser.md parser document}).
130
-
131
- The module example above can be rewritten as a legacy handler as follows:
132
-
133
- class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base
134
- handles TkMODULE
135
-
136
- def process
137
- modname = statement.tokens.to_s[/^module\s+(#{NAMESPACEMATCH})/, 1]
138
- mod = register ModuleObject.new(namespace, modname)
139
- parse_block(:namespace => mod)
140
- end
141
- end
142
-
143
- A few notes on the differences:
144
-
145
- * We inherit from `Legacy::Base` instead of the standard Ruby Base handler class.
146
- * We exchange node type `:module` for `TkMODULE`, which represents the
147
- first token in the statement.
148
- * We perform direct string manipulation to get the module name.
149
- * `parse_block` does not take a list of statements. In the old parser API,
150
- each statement has a `block` attribute which defines the list of
151
- statements within that statement, if any. Therefore, `parse_block` will
152
- always parse the `statement.block` if it exists.
1
+ # @title Handlers Architecture
2
+
3
+ # Handlers Architecture
4
+
5
+ Handlers allow the processing of parsed source code. Handling is done after
6
+ parsing to abstract away the implementation details of lexical and semantic
7
+ analysis on source and to only deal with the logic regarding recognizing
8
+ source statements as {file:docs/CodeObjects.md code objects}.
9
+
10
+ ![Handlers Architecture Class Diagram](images/handlers-class-diagram.png)
11
+
12
+ ## The Pipeline
13
+
14
+ After the {file:docs/Parser.md parser component} finishes analyzing the
15
+ source, it is handed off for post-processing to the {YARD::Handlers::Processor}
16
+ class, which is responsible for traversing the set of statements given by
17
+ the parser and delegating them to matching handlers. Handlers match when the
18
+ {YARD::Handlers::Base.handles?} method returns true for a given statement.
19
+ The handler can then perform any action after being invoked by the `process`
20
+ method.
21
+
22
+ ## The Processor Class
23
+
24
+ The main purpose of the processor, as mentioned above, is to traverse through
25
+ the list of statements given to it by the parser. The processor also keeps
26
+ state about what is being processed. For instance, the processor is what keeps
27
+ track of the current namespace (the module or class an object is being defined
28
+ in), scope (class or instance), file and owner. The owner refers to the object
29
+ that is most directly responsible for the source statement being processed. This
30
+ is most often the same as the namespace, except when parsing the body of a method,
31
+ where the namespace would be the class/module the method is defined in and the
32
+ owner would be the method object itself.
33
+
34
+ ## Implementing a Handler
35
+
36
+ This section covers the basics of implementing a *new-style* Ruby handler. For
37
+ details on implementing a legacy handler, see the "API Differences" section below.
38
+
39
+ a Ruby handler can be implemented simply by subclassing the {YARD::Handlers::Ruby::Base}
40
+ class and declaring what node types or source to process with the {YARD::Handlers::Base.handles handles}
41
+ class method. A very simple handler that handles a module definition would be:
42
+
43
+ class MyModuleHandler < YARD::Handlers::Ruby::Base
44
+ handles :module
45
+
46
+ def process
47
+ puts "Handling a module named #{statement[0].source}"
48
+ end
49
+ end
50
+
51
+ For details on what nodes are, and what node types are, see the
52
+ {file:docs/Parser.md parser architecture document}.
53
+
54
+ In this case the node type being handled is the `:module` type. More than one
55
+ node type or `handles` declarations may describe a single handler, for instance,
56
+ a handler that handles class definitions should handle the `:class` and `:sclass`
57
+ node types respectively (the latter refers to classes defined as `class << Something`).
58
+ The {YARD::Handlers::Base#statement statement} attribute refers to the current
59
+ node (or statement) that is being handled by the handler.
60
+
61
+ ### Handling a Method Call
62
+
63
+ In some cases, a developer might need to handle a method call. The parser can
64
+ express a method call in many AST forms, so to simplify this process, a method
65
+ call can be handled by declaring the following in a `handles` statement:
66
+
67
+ class MyHandler < YARD::Handlers::Ruby::Base
68
+ handles method_call(:describe)
69
+
70
+ def process
71
+ # Process the method call
72
+ end
73
+ end
74
+
75
+ In this case we handle any of the method calls to method name `describe` with
76
+ the following syntaxes:
77
+
78
+ describe(something)
79
+ describe arg1, arg2, arg3
80
+ describe(something) { perform_a_block }
81
+ describe "Something" do
82
+ a_block
83
+ end
84
+
85
+ ### Creating a new Code Object
86
+
87
+ Usually (but not always) handling is performed to create new code objects to add
88
+ to the registry (for information about code objects, see {file:docs/CodeObjects.md this document}).
89
+ Code objects should simply be created and added to the existing `namespace`. This
90
+ will be enough to add them to the registry. There is also a convenience
91
+ {YARD::Handlers::Base#register register} method which quickly sets standard attributed
92
+ on the newly created object, such as the file, line, source and docstring of the
93
+ object. This method will be seen in the next example.
94
+
95
+ ### Handling an Inner Block
96
+
97
+ By default, the parser gives the processor class a list of all the top level
98
+ statements and the processor parses only those top level statements. If an inner
99
+ block of a module, class, method declaration or even a block passed to a method call
100
+ needs to be handled, the {YARD::Handlers::Base#parse_block parse_block} method must be called on the list of statements
101
+ to parse. This will send the list to the processor to continue processing on that
102
+ statement list. The source tree can be selectively parsed in this manner by parsing
103
+ only the inner blocks that are relevant to documentation.
104
+
105
+ For example, the module handler parses the inner body of a module by performing
106
+ the following commands:
107
+
108
+ class YARD::Handlers::Ruby::ModuleHandler < YARD::Handlers::Ruby::Base
109
+ handles :module
110
+
111
+ def process
112
+ modname = statement[0].source
113
+ mod = register ModuleObject.new(namespace, modname)
114
+ parse_block(statement[1], :namespace => mod)
115
+ end
116
+ end
117
+
118
+ In this case `statement[1]` refers to a list of extra statements, the block we
119
+ wish to parse. Note here that when parsing objects like modules and classes,
120
+ we set the namespace for the duration of the block parsing by setting options
121
+ on the `parse_block` method.
122
+
123
+ ### API Differences for Legacy Handler
124
+
125
+ Because the legacy handler uses the legacy parser and therefore a different kind
126
+ of AST, there are subtle differences in the handler API. Most importantly, the
127
+ `handles` method usually deals with either lexical tokens or source code as a string
128
+ or RegExp object. The statement object, similarly, is made up of lexical tokens instead
129
+ of semantically parsed nodes (this is described in the {file:docs/Parser.md parser document}).
130
+
131
+ The module example above can be rewritten as a legacy handler as follows:
132
+
133
+ class YARD::Handlers::Ruby::Legacy::ModuleHandler < YARD::Handlers::Ruby::Legacy::Base
134
+ handles TkMODULE
135
+
136
+ def process
137
+ modname = statement.tokens.to_s[/^module\s+(#{NAMESPACEMATCH})/, 1]
138
+ mod = register ModuleObject.new(namespace, modname)
139
+ parse_block(:namespace => mod)
140
+ end
141
+ end
142
+
143
+ A few notes on the differences:
144
+
145
+ * We inherit from `Legacy::Base` instead of the standard Ruby Base handler class.
146
+ * We exchange node type `:module` for `TkMODULE`, which represents the
147
+ first token in the statement.
148
+ * We perform direct string manipulation to get the module name.
149
+ * `parse_block` does not take a list of statements. In the old parser API,
150
+ each statement has a `block` attribute which defines the list of
151
+ statements within that statement, if any. Therefore, `parse_block` will
152
+ always parse the `statement.block` if it exists.
@@ -1,61 +1,61 @@
1
- # @title Architecture Overview
2
-
3
- # Architecture Overview
4
-
5
- YARD is separated in three major components, each of which allows YARD to be
6
- extended for a separate purpose. The split also emphasizes YARD's design choice
7
- to explicitly separate data gathering from HTML document generation, something
8
- that tools like RDoc do not do. These components are:
9
-
10
- * [Code Parsing & Processing Component](#parsing)
11
- * [Data Storage Component](#storage)
12
- * [Post Processing & Templating System](#templates)
13
-
14
- This separation is a major goal of the project, and means that YARD is not *just*
15
- a tool to generate HTML output. The expectation is that any subset of YARD's
16
- major components may be used, extended or modified independently. YARD may be
17
- used just as a data gathering tool (to parse and audit code), just as a data
18
- source (a webserver containing raw unformatted data about code), or just as a
19
- conventional HTML documentation generation tool (like RDoc).
20
-
21
- The important classes and dependencies of these components are shown in the
22
- following class diagram:
23
-
24
- ![Overview Class Diagram](images/overview-class-diagram.png)
25
-
26
- <a name="parsing"></a>
27
-
28
- ## Code Parsing & Processing Component
29
-
30
- This component is made up of four sub-components, each of which have separate
31
- tasks during the data gathering process (*note: the tag architecture is not*
32
- *shown in the class diagram*). These sub-components are:
33
-
34
- * {file:docs/Parser.md}
35
- * {file:docs/Handlers.md}
36
- * {file:docs/CodeObjects.md}
37
- * {file:docs/Tags.md}
38
-
39
- The parser component reads source files and converts it into a set of statements
40
- which the handlers then process, creating code objects which in turn create tags
41
- (meta-data) attached to the objects. These objects are all added to the {YARD::Registry},
42
- the data store component.
43
-
44
- <a name="storage"></a>
45
-
46
- ## Data Storage Component
47
-
48
- This component is currently implemented as a simple Ruby marshalled flat namespace
49
- of object. The implementation is found in the single class {YARD::Registry}, which
50
- is the centralized repository for all data being parsed, stored and accessed. There
51
- are future plans to improve this storage mechanism to be backend agnostic and allow
52
- for more robust storage.
53
-
54
- <a name="templates"></a>
55
-
56
- ## Post Processing & Templating System
57
-
58
- This component handles processing of objects from the registry through a templating
59
- engine that allows output to a variety of formats. Practically speaking, this is
60
- where templates can be implemented to change the design, output or structure of
61
- the data. See {file:docs/Templates.md Templates Architecture} for a complete overview.
1
+ # @title Architecture Overview
2
+
3
+ # Architecture Overview
4
+
5
+ YARD is separated in three major components, each of which allows YARD to be
6
+ extended for a separate purpose. The split also emphasizes YARD's design choice
7
+ to explicitly separate data gathering from HTML document generation, something
8
+ that tools like RDoc do not do. These components are:
9
+
10
+ * [Code Parsing & Processing Component](#parsing)
11
+ * [Data Storage Component](#storage)
12
+ * [Post Processing & Templating System](#templates)
13
+
14
+ This separation is a major goal of the project, and means that YARD is not *just*
15
+ a tool to generate HTML output. The expectation is that any subset of YARD's
16
+ major components may be used, extended or modified independently. YARD may be
17
+ used just as a data gathering tool (to parse and audit code), just as a data
18
+ source (a webserver containing raw unformatted data about code), or just as a
19
+ conventional HTML documentation generation tool (like RDoc).
20
+
21
+ The important classes and dependencies of these components are shown in the
22
+ following class diagram:
23
+
24
+ ![Overview Class Diagram](images/overview-class-diagram.png)
25
+
26
+ <a name="parsing"></a>
27
+
28
+ ## Code Parsing & Processing Component
29
+
30
+ This component is made up of four sub-components, each of which have separate
31
+ tasks during the data gathering process (*note: the tag architecture is not*
32
+ *shown in the class diagram*). These sub-components are:
33
+
34
+ * {file:docs/Parser.md}
35
+ * {file:docs/Handlers.md}
36
+ * {file:docs/CodeObjects.md}
37
+ * {file:docs/Tags.md}
38
+
39
+ The parser component reads source files and converts it into a set of statements
40
+ which the handlers then process, creating code objects which in turn create tags
41
+ (meta-data) attached to the objects. These objects are all added to the {YARD::Registry},
42
+ the data store component.
43
+
44
+ <a name="storage"></a>
45
+
46
+ ## Data Storage Component
47
+
48
+ This component is currently implemented as a simple Ruby marshalled flat namespace
49
+ of object. The implementation is found in the single class {YARD::Registry}, which
50
+ is the centralized repository for all data being parsed, stored and accessed. There
51
+ are future plans to improve this storage mechanism to be backend agnostic and allow
52
+ for more robust storage.
53
+
54
+ <a name="templates"></a>
55
+
56
+ ## Post Processing & Templating System
57
+
58
+ This component handles processing of objects from the registry through a templating
59
+ engine that allows output to a variety of formats. Practically speaking, this is
60
+ where templates can be implemented to change the design, output or structure of
61
+ the data. See {file:docs/Templates.md Templates Architecture} for a complete overview.
@@ -1,191 +1,191 @@
1
- # @title Parser Architecture
2
-
3
- # Parser Architecture
4
-
5
- The parser component of YARD is the first component in the data processing pipeline
6
- that runs before any handling is done on the source. The parser is meant to translate
7
- the source into a set of statements that can be understood by the {file:docs/Handlers.md Handlers}
8
- that run immediately afterwards.
9
-
10
- The important classes are described in the class diagram of the entire parser
11
- system below:
12
-
13
- ![Parser Class Diagram](images/parser-class-diagram.png)
14
-
15
- (Note: the RubyToken classes are omitted from the diagram)
16
-
17
- ## SourceParser
18
-
19
- The main class {YARD::Parser::SourceParser} acts as a factory class, instantiating
20
- the correct parser class, an implementation of {YARD::Parser::Base}. The selected parser
21
- is chosen based on either the file extension or by selecting it explicitly (as an argument
22
- to parsing methods). YARD supports Ruby and C source files, but custom parsers can
23
- be implemented and registered for various other languages by subclassing `Parser::Base`
24
- and registering the parser with {YARD::Parser::SourceParser.register_parser_type}.
25
-
26
- This factory class should always be used when parsing source files rather than
27
- the individual parser classes since it initiates the pipeline that runs the
28
- handlers on the parsed source. The parser used must also match the handlers,
29
- and this is coordinated by the `SourceParser` class as well.
30
-
31
- ## Using the SourceParser Class
32
-
33
- The `SourceParser` class API is optimized for parsing globs of files. As such,
34
- the main method to use the class is the `parse` class method, which takes an
35
- array of file globs or a single file glob.
36
-
37
- YARD::Parser::SourceParser.parse('spec_*.rb')
38
- YARD::Parser::SourceParser.parse(['spec_*.rb', '*_helper.rb'])
39
-
40
- This is equivalent to the convenience method {YARD.parse}:
41
-
42
- YARD.parse('lib/**/*.rb')
43
-
44
- In some cases (ie. for testing), it may be more helpful to parse a string of input
45
- directly. In such a case, the method {YARD::Parser::SourceParser.parse_string} should be
46
- used:
47
-
48
- YARD::Parser::SourceParser.parse_string("def method(a, b) end")
49
-
50
- You can also provide the parser type explicitly as the second argument:
51
-
52
- # Parses a string of C
53
- YARD::Parser::SourceParser.parse_string("int main() { }", :c)
54
-
55
- Note that these two methods are aliased as {YARD.parse} and {YARD.parse_string} for
56
- convenience.
57
-
58
- ## Implementing and Registering a Custom Parser
59
-
60
- To implement a custom parser, subclass {YARD::Parser::Base}. Documentation on which
61
- abstract methods should be implemented are documented in that class. After the class
62
- is implemented, it is registered with the {YARD::Parser::SourceParser} factory class
63
- to be called when a file of the right extension needs to be parsed, or when a user
64
- selects that parser type explicitly. To register your new parser class, call the
65
- method {YARD::Parser::SourceParser.register_parser_type}:
66
-
67
- SourceParser.register_parser_type(:my_parser, MyParser, 'my_parser_ext')
68
-
69
- The last argument can be a single extension, a list of extensions (Array), a single Regexp, or a
70
- list of Regexps. Do not include the '.' in the extension.
71
-
72
-
73
- ## The Two Ruby Parser Types
74
-
75
- When parsing Ruby, the SourceParser can either instantiate the new {YARD::Parser::Ruby::RubyParser}
76
- class or the {YARD::Parser::Ruby::Legacy::StatementList} class. The first of the
77
- two, although faster, more robust and more efficient, is only available for
78
- Ruby 1.9. The legacy parser parser is available in both 1.8.x and 1.9, if
79
- compatibility is required. The choice of parser will affect which handlers
80
- ultimately get used, since new handlers can only use the new parser and the
81
- same requirement applies to the legacy parser & handlers.
82
-
83
- ## Switching to Legacy Parser
84
-
85
- By default, running YARD under Ruby 1.9 will automatically select the new parser
86
- and new handlers by extension. Although YARD supports both handler styles, plugins
87
- may choose to only implement one of the two (though this is not recommended). If
88
- only the legacy handlers are implemented, the `SourceParser` class should force
89
- the use of the legacy parser by setting the `parser_type` attribute as such:
90
-
91
- YARD::Parser::SourceParser.parser_type = :ruby18
92
-
93
- The default value is `:ruby`. Note that this cannot be forced the other way around,
94
- a parser type of `:ruby` cannot be set under Ruby 1.8.x as the new parser is not
95
- supported under 1.8.
96
-
97
- ## RubyParser (the New Parser)
98
-
99
- The new Ruby parser uses the Ripper library that is packaged as part of stdlib
100
- in Ruby 1.9. Because of this, it can generate an AST from a string of Ruby input
101
- that is similar to the style of other sexp libraries (such as ParseTree). Each
102
- node generated in the tree is of the base type {YARD::Parser::Ruby::AstNode},
103
- which has some subclasses for common node types.
104
-
105
- ### AstNode Basics
106
-
107
- The `AstNode` class behaves like a standard Array class in which all of its data
108
- make up the list of elements in the array. Unlike other sexp style libraries, however,
109
- the node type is not the first element of the list. Instead, the node type is defined
110
- by the `#type` method. The following examples show some of the basic uses of `AstNode`:
111
-
112
- # The sexp defines the statement `hello if 1`
113
- node = s(:if_mod, s(:int, "1"), s(:var_ref, s(:ident, "hello")))
114
- node.type #=> :if_mod
115
- node[0] #=> s(:int, "1")
116
- node[0][0] #=> "1"
117
-
118
- (Note the `s()` syntax is shorthand for `AstNode.new(...)`. `s()` with no type
119
- is shorthand for a node of type `:list`)
120
-
121
- As shown, not all of the elements are AstNodes in themselves, some are String
122
- objects containing values. A list of only the AstNodes within a node can be
123
- accessed via the {YARD::Parser::Ruby::AstNode#children #children} method. Using
124
- the sexp declared above, we can do:
125
-
126
- node.children #=> [s(:int, "1"), s(:var_ref, s(:ident, "hello"))]
127
-
128
- ### AstNode#source and #line
129
-
130
- Every node defines the `#source` method which returns the source code that the
131
- node represents. One of the most common things to do with a node is to grab its
132
- source. The following example shows how this can be done:
133
-
134
- source = "if 1 == 1 then\n raise Exception\n end"
135
- ast = YARD::Parser::Ruby::RubyParser.parse(source).root
136
- ast[0].condition.source #=> "1 == 1"
137
- ast[0].then_block.source #=> "raise Exception"
138
-
139
- Note that this only works on source parsed from the RubyParser, not sexps
140
- declared using the `s()` syntax. This is because no source code is generated
141
- or stored by nodes. Instead, only the character ranges are stored, which are
142
- then looked up in the original full source string object. For example:
143
-
144
- # Following the code snippet above
145
- ast[0].then_block.source_range #=> 17..31
146
-
147
- We can also get the line and line ranges in a similar fashion:
148
-
149
- ast[0].type #=> :if
150
- ast[0].line #=> 1
151
- ast[0].line_range #=> 1..3 (note the newlines in the source)
152
-
153
- ### AstNode#jump
154
-
155
- Often the AST will be such that the node we care about might be buried arbitrarily
156
- deep in a node's hierarchy. The {YARD::Parser::Ruby::AstNode#jump} method exists
157
- to quickly get at a node of a specific type in such a situation:
158
-
159
- # Get the first identifier in the statement
160
- ast = s(s(:int, "1"), s(s(:var_ref, s(:ident, "hello"))))
161
- ast.jump(:ident)[0] #=> "hello"
162
-
163
- Multiple types can be searched for at once. If none are found, the original root
164
- node is returned so that it may be chained.
165
-
166
- ## The Legacy Parser
167
-
168
- The goal of the legacy parser is much the same as the new parser, but it is far
169
- more simplistic. Instead of a full-blown AST, the legacy parser simply groups
170
- together lists of "statements" called a {YARD::Parser::Ruby::Legacy::StatementList}.
171
- These statement lists are made up of {YARD::Parser::Ruby::Legacy::Statement} objects.
172
- A statement is any method call condition, loop, or declaration. Each statement
173
- may or may not have a block. In the case of a condition or loop, the block is
174
- the inner list of statements; in the case of a method call, the block is a do
175
- block (if provided). The statements themselves are made up of tokens, so instead
176
- of being semantic in nature like the new parser, statements are tied directly
177
- to the lexical tokens that make them up. To convert a statement into source, you
178
- simply join all the tokens together (this is done through the use of `#to_s`).
179
-
180
- Note that because there is little semantic parsing, the legacy parser is less
181
- able to deal with certain Ruby syntaxes. Specifically, the `:if_mod` syntax
182
- seen above ("hello if 1") would be considered two statements with the new parser,
183
- but using the legacy parser it is only one statement:
184
-
185
- stmts = ARD::Parser::Ruby::Legacy::StatementList.new("hello if 1")
186
- stmts[0].block #=> nil
187
- stmts[0].tokens.to_s #=> "hello if 1"
188
-
189
- In addition, this means that most handling still needs to be done via string
190
- manipulation and regular expression matching, making it considerably more
191
- difficult to use in edge case scenarios.
1
+ # @title Parser Architecture
2
+
3
+ # Parser Architecture
4
+
5
+ The parser component of YARD is the first component in the data processing pipeline
6
+ that runs before any handling is done on the source. The parser is meant to translate
7
+ the source into a set of statements that can be understood by the {file:docs/Handlers.md Handlers}
8
+ that run immediately afterwards.
9
+
10
+ The important classes are described in the class diagram of the entire parser
11
+ system below:
12
+
13
+ ![Parser Class Diagram](images/parser-class-diagram.png)
14
+
15
+ (Note: the RubyToken classes are omitted from the diagram)
16
+
17
+ ## SourceParser
18
+
19
+ The main class {YARD::Parser::SourceParser} acts as a factory class, instantiating
20
+ the correct parser class, an implementation of {YARD::Parser::Base}. The selected parser
21
+ is chosen based on either the file extension or by selecting it explicitly (as an argument
22
+ to parsing methods). YARD supports Ruby and C source files, but custom parsers can
23
+ be implemented and registered for various other languages by subclassing `Parser::Base`
24
+ and registering the parser with {YARD::Parser::SourceParser.register_parser_type}.
25
+
26
+ This factory class should always be used when parsing source files rather than
27
+ the individual parser classes since it initiates the pipeline that runs the
28
+ handlers on the parsed source. The parser used must also match the handlers,
29
+ and this is coordinated by the `SourceParser` class as well.
30
+
31
+ ## Using the SourceParser Class
32
+
33
+ The `SourceParser` class API is optimized for parsing globs of files. As such,
34
+ the main method to use the class is the `parse` class method, which takes an
35
+ array of file globs or a single file glob.
36
+
37
+ YARD::Parser::SourceParser.parse('spec_*.rb')
38
+ YARD::Parser::SourceParser.parse(['spec_*.rb', '*_helper.rb'])
39
+
40
+ This is equivalent to the convenience method {YARD.parse}:
41
+
42
+ YARD.parse('lib/**/*.rb')
43
+
44
+ In some cases (ie. for testing), it may be more helpful to parse a string of input
45
+ directly. In such a case, the method {YARD::Parser::SourceParser.parse_string} should be
46
+ used:
47
+
48
+ YARD::Parser::SourceParser.parse_string("def method(a, b) end")
49
+
50
+ You can also provide the parser type explicitly as the second argument:
51
+
52
+ # Parses a string of C
53
+ YARD::Parser::SourceParser.parse_string("int main() { }", :c)
54
+
55
+ Note that these two methods are aliased as {YARD.parse} and {YARD.parse_string} for
56
+ convenience.
57
+
58
+ ## Implementing and Registering a Custom Parser
59
+
60
+ To implement a custom parser, subclass {YARD::Parser::Base}. Documentation on which
61
+ abstract methods should be implemented are documented in that class. After the class
62
+ is implemented, it is registered with the {YARD::Parser::SourceParser} factory class
63
+ to be called when a file of the right extension needs to be parsed, or when a user
64
+ selects that parser type explicitly. To register your new parser class, call the
65
+ method {YARD::Parser::SourceParser.register_parser_type}:
66
+
67
+ SourceParser.register_parser_type(:my_parser, MyParser, 'my_parser_ext')
68
+
69
+ The last argument can be a single extension, a list of extensions (Array), a single Regexp, or a
70
+ list of Regexps. Do not include the '.' in the extension.
71
+
72
+
73
+ ## The Two Ruby Parser Types
74
+
75
+ When parsing Ruby, the SourceParser can either instantiate the new {YARD::Parser::Ruby::RubyParser}
76
+ class or the {YARD::Parser::Ruby::Legacy::StatementList} class. The first of the
77
+ two, although faster, more robust and more efficient, is only available for
78
+ Ruby 1.9. The legacy parser parser is available in both 1.8.x and 1.9, if
79
+ compatibility is required. The choice of parser will affect which handlers
80
+ ultimately get used, since new handlers can only use the new parser and the
81
+ same requirement applies to the legacy parser & handlers.
82
+
83
+ ## Switching to Legacy Parser
84
+
85
+ By default, running YARD under Ruby 1.9 will automatically select the new parser
86
+ and new handlers by extension. Although YARD supports both handler styles, plugins
87
+ may choose to only implement one of the two (though this is not recommended). If
88
+ only the legacy handlers are implemented, the `SourceParser` class should force
89
+ the use of the legacy parser by setting the `parser_type` attribute as such:
90
+
91
+ YARD::Parser::SourceParser.parser_type = :ruby18
92
+
93
+ The default value is `:ruby`. Note that this cannot be forced the other way around,
94
+ a parser type of `:ruby` cannot be set under Ruby 1.8.x as the new parser is not
95
+ supported under 1.8.
96
+
97
+ ## RubyParser (the New Parser)
98
+
99
+ The new Ruby parser uses the Ripper library that is packaged as part of stdlib
100
+ in Ruby 1.9. Because of this, it can generate an AST from a string of Ruby input
101
+ that is similar to the style of other sexp libraries (such as ParseTree). Each
102
+ node generated in the tree is of the base type {YARD::Parser::Ruby::AstNode},
103
+ which has some subclasses for common node types.
104
+
105
+ ### AstNode Basics
106
+
107
+ The `AstNode` class behaves like a standard Array class in which all of its data
108
+ make up the list of elements in the array. Unlike other sexp style libraries, however,
109
+ the node type is not the first element of the list. Instead, the node type is defined
110
+ by the `#type` method. The following examples show some of the basic uses of `AstNode`:
111
+
112
+ # The sexp defines the statement `hello if 1`
113
+ node = s(:if_mod, s(:int, "1"), s(:var_ref, s(:ident, "hello")))
114
+ node.type #=> :if_mod
115
+ node[0] #=> s(:int, "1")
116
+ node[0][0] #=> "1"
117
+
118
+ (Note the `s()` syntax is shorthand for `AstNode.new(...)`. `s()` with no type
119
+ is shorthand for a node of type `:list`)
120
+
121
+ As shown, not all of the elements are AstNodes in themselves, some are String
122
+ objects containing values. A list of only the AstNodes within a node can be
123
+ accessed via the {YARD::Parser::Ruby::AstNode#children #children} method. Using
124
+ the sexp declared above, we can do:
125
+
126
+ node.children #=> [s(:int, "1"), s(:var_ref, s(:ident, "hello"))]
127
+
128
+ ### AstNode#source and #line
129
+
130
+ Every node defines the `#source` method which returns the source code that the
131
+ node represents. One of the most common things to do with a node is to grab its
132
+ source. The following example shows how this can be done:
133
+
134
+ source = "if 1 == 1 then\n raise Exception\n end"
135
+ ast = YARD::Parser::Ruby::RubyParser.parse(source).root
136
+ ast[0].condition.source #=> "1 == 1"
137
+ ast[0].then_block.source #=> "raise Exception"
138
+
139
+ Note that this only works on source parsed from the RubyParser, not sexps
140
+ declared using the `s()` syntax. This is because no source code is generated
141
+ or stored by nodes. Instead, only the character ranges are stored, which are
142
+ then looked up in the original full source string object. For example:
143
+
144
+ # Following the code snippet above
145
+ ast[0].then_block.source_range #=> 17..31
146
+
147
+ We can also get the line and line ranges in a similar fashion:
148
+
149
+ ast[0].type #=> :if
150
+ ast[0].line #=> 1
151
+ ast[0].line_range #=> 1..3 (note the newlines in the source)
152
+
153
+ ### AstNode#jump
154
+
155
+ Often the AST will be such that the node we care about might be buried arbitrarily
156
+ deep in a node's hierarchy. The {YARD::Parser::Ruby::AstNode#jump} method exists
157
+ to quickly get at a node of a specific type in such a situation:
158
+
159
+ # Get the first identifier in the statement
160
+ ast = s(s(:int, "1"), s(s(:var_ref, s(:ident, "hello"))))
161
+ ast.jump(:ident)[0] #=> "hello"
162
+
163
+ Multiple types can be searched for at once. If none are found, the original root
164
+ node is returned so that it may be chained.
165
+
166
+ ## The Legacy Parser
167
+
168
+ The goal of the legacy parser is much the same as the new parser, but it is far
169
+ more simplistic. Instead of a full-blown AST, the legacy parser simply groups
170
+ together lists of "statements" called a {YARD::Parser::Ruby::Legacy::StatementList}.
171
+ These statement lists are made up of {YARD::Parser::Ruby::Legacy::Statement} objects.
172
+ A statement is any method call condition, loop, or declaration. Each statement
173
+ may or may not have a block. In the case of a condition or loop, the block is
174
+ the inner list of statements; in the case of a method call, the block is a do
175
+ block (if provided). The statements themselves are made up of tokens, so instead
176
+ of being semantic in nature like the new parser, statements are tied directly
177
+ to the lexical tokens that make them up. To convert a statement into source, you
178
+ simply join all the tokens together (this is done through the use of `#to_s`).
179
+
180
+ Note that because there is little semantic parsing, the legacy parser is less
181
+ able to deal with certain Ruby syntaxes. Specifically, the `:if_mod` syntax
182
+ seen above ("hello if 1") would be considered two statements with the new parser,
183
+ but using the legacy parser it is only one statement:
184
+
185
+ stmts = ARD::Parser::Ruby::Legacy::StatementList.new("hello if 1")
186
+ stmts[0].block #=> nil
187
+ stmts[0].tokens.to_s #=> "hello if 1"
188
+
189
+ In addition, this means that most handling still needs to be done via string
190
+ manipulation and regular expression matching, making it considerably more
191
+ difficult to use in edge case scenarios.