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,75 +1,75 @@
1
- # frozen_string_literal: true
2
- # A subclass of Hash where all keys are converted into Symbols, and
3
- # optionally, all String values are converted into Symbols.
4
- class SymbolHash < Hash
5
- # Creates a new SymbolHash object
6
- #
7
- # @param [Boolean] symbolize_value converts any String values into Symbols
8
- # if this is set to +true+.
9
- def initialize(symbolize_value = true)
10
- @symbolize_value = symbolize_value
11
- end
12
-
13
- # @overload [](hash)
14
- # Creates a SymbolHash object from an existing Hash
15
- #
16
- # @example
17
- # SymbolHash['x' => 1, :y => 2] # => #<SymbolHash:0x...>
18
- # @param [Hash] hash the hash object
19
- # @return [SymbolHash] a new SymbolHash from a hash object
20
- #
21
- # @overload [](*list)
22
- # Creates a SymbolHash from an even list of keys and values
23
- #
24
- # @example
25
- # SymbolHash[key1, value1, key2, value2, ...]
26
- # @param [Array] list an even list of key followed by value
27
- # @return [SymbolHash] a new SymbolHash object
28
- def self.[](*hsh)
29
- obj = new
30
- if hsh.size == 1 && hsh.first.is_a?(Hash)
31
- hsh.first.each {|k, v| obj[k] = v }
32
- else
33
- 0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n + 1] }
34
- end
35
- obj
36
- end
37
-
38
- # Assigns a value to a symbolized key
39
- # @param [#to_sym] key the key
40
- # @param [Object] value the value to be assigned. If this is a String and
41
- # values are set to be symbolized, it will be converted into a Symbol.
42
- def []=(key, value)
43
- super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value)
44
- end
45
-
46
- # Accessed a symbolized key
47
- # @param [#to_sym] key the key to access
48
- # @return [Object] the value associated with the key
49
- def [](key) super(key.to_sym) end
50
-
51
- # Deleted a key and value associated with it
52
- # @param [#to_sym] key the key to delete
53
- # @return [void]
54
- def delete(key) super(key.to_sym) end
55
-
56
- # Tests if a symbolized key exists
57
- # @param [#to_sym] key the key to test
58
- # @return [Boolean] whether the key exists
59
- def key?(key) super(key.to_sym) end
60
- alias has_key? key?
61
-
62
- # Updates the object with the contents of another Hash object.
63
- # This method modifies the original SymbolHash object
64
- #
65
- # @param [Hash] hash the hash object to copy the values from
66
- # @return [SymbolHash] self
67
- def update(hash) hash.each {|k, v| self[k] = v }; self end
68
- alias merge! update
69
-
70
- # Merges the contents of another hash into a new SymbolHash object
71
- #
72
- # @param [Hash] hash the hash of objects to copy
73
- # @return [SymbolHash] a new SymbolHash containing the merged data
74
- def merge(hash) dup.merge!(hash) end
75
- end
1
+ # frozen_string_literal: true
2
+ # A subclass of Hash where all keys are converted into Symbols, and
3
+ # optionally, all String values are converted into Symbols.
4
+ class SymbolHash < Hash
5
+ # Creates a new SymbolHash object
6
+ #
7
+ # @param [Boolean] symbolize_value converts any String values into Symbols
8
+ # if this is set to +true+.
9
+ def initialize(symbolize_value = true)
10
+ @symbolize_value = symbolize_value
11
+ end
12
+
13
+ # @overload [](hash)
14
+ # Creates a SymbolHash object from an existing Hash
15
+ #
16
+ # @example
17
+ # SymbolHash['x' => 1, :y => 2] # => #<SymbolHash:0x...>
18
+ # @param [Hash] hash the hash object
19
+ # @return [SymbolHash] a new SymbolHash from a hash object
20
+ #
21
+ # @overload [](*list)
22
+ # Creates a SymbolHash from an even list of keys and values
23
+ #
24
+ # @example
25
+ # SymbolHash[key1, value1, key2, value2, ...]
26
+ # @param [Array] list an even list of key followed by value
27
+ # @return [SymbolHash] a new SymbolHash object
28
+ def self.[](*hsh)
29
+ obj = new
30
+ if hsh.size == 1 && hsh.first.is_a?(Hash)
31
+ hsh.first.each {|k, v| obj[k] = v }
32
+ else
33
+ 0.step(hsh.size, 2) {|n| obj[hsh[n]] = hsh[n + 1] }
34
+ end
35
+ obj
36
+ end
37
+
38
+ # Assigns a value to a symbolized key
39
+ # @param [#to_sym] key the key
40
+ # @param [Object] value the value to be assigned. If this is a String and
41
+ # values are set to be symbolized, it will be converted into a Symbol.
42
+ def []=(key, value)
43
+ super(key.to_sym, value.instance_of?(String) && @symbolize_value ? value.to_sym : value)
44
+ end
45
+
46
+ # Accessed a symbolized key
47
+ # @param [#to_sym] key the key to access
48
+ # @return [Object] the value associated with the key
49
+ def [](key) super(key.to_sym) end
50
+
51
+ # Deleted a key and value associated with it
52
+ # @param [#to_sym] key the key to delete
53
+ # @return [void]
54
+ def delete(key) super(key.to_sym) end
55
+
56
+ # Tests if a symbolized key exists
57
+ # @param [#to_sym] key the key to test
58
+ # @return [Boolean] whether the key exists
59
+ def key?(key) super(key.to_sym) end
60
+ alias has_key? key?
61
+
62
+ # Updates the object with the contents of another Hash object.
63
+ # This method modifies the original SymbolHash object
64
+ #
65
+ # @param [Hash] hash the hash object to copy the values from
66
+ # @return [SymbolHash] self
67
+ def update(hash) hash.each {|k, v| self[k] = v }; self end
68
+ alias merge! update
69
+
70
+ # Merges the contents of another hash into a new SymbolHash object
71
+ #
72
+ # @param [Hash] hash the hash of objects to copy
73
+ # @return [SymbolHash] a new SymbolHash containing the merged data
74
+ def merge(hash) dup.merge!(hash) end
75
+ end
@@ -1,378 +1,386 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- # A documentation string, or "docstring" for short, encapsulates the
4
- # comments and metadata, or "tags", of an object. Meta-data is expressed
5
- # in the form +@tag VALUE+, where VALUE can span over multiple lines as
6
- # long as they are indented. The following +@example+ tag shows how tags
7
- # can be indented:
8
- #
9
- # # @example My example
10
- # # a = "hello world"
11
- # # a.reverse
12
- # # @version 1.0
13
- #
14
- # Tags can be nested in a documentation string, though the {Tags::Tag}
15
- # itself is responsible for parsing the inner tags.
16
- class Docstring < String
17
- class << self
18
- # @note Plugin developers should make sure to reset this value
19
- # after parsing finishes. This can be done via the
20
- # {Parser::SourceParser.after_parse_list} callback. This will
21
- # ensure that YARD can properly parse multiple projects in
22
- # the same process.
23
- # @return [Class<DocstringParser>] the parser class used to parse
24
- # text and optional meta-data from docstrings. Defaults to
25
- # {DocstringParser}.
26
- # @see DocstringParser
27
- # @see Parser::SourceParser.after_parse_list
28
- attr_accessor :default_parser
29
-
30
- # Creates a parser object using the current {default_parser}.
31
- # Equivalent to:
32
- # Docstring.default_parser.new(*args)
33
- # @param args arguments are passed to the {DocstringParser}
34
- # class. See {DocstringParser#initialize} for details on
35
- # arguments.
36
- # @return [DocstringParser] the parser object used to parse a
37
- # docstring.
38
- def parser(*args) default_parser.new(*args) end
39
- end
40
-
41
- self.default_parser = DocstringParser
42
-
43
- # @return [Array<Tags::RefTag>] the list of reference tags
44
- attr_reader :ref_tags
45
-
46
- # @return [CodeObjects::Base] the object that owns the docstring.
47
- attr_accessor :object
48
-
49
- # @return [Range] line range in the {#object}'s file where the docstring was parsed from
50
- attr_accessor :line_range
51
-
52
- # @return [String] the raw documentation (including raw tag text)
53
- attr_reader :all
54
-
55
- # @return [Boolean] whether the docstring was started with "##"
56
- attr_reader :hash_flag
57
- def hash_flag=(v) @hash_flag = v.nil? ? false : v end
58
-
59
- # Matches a tag at the start of a comment line
60
- # @deprecated Use {DocstringParser::META_MATCH}
61
- META_MATCH = DocstringParser::META_MATCH
62
-
63
- # @group Creating a Docstring Object
64
-
65
- # Creates a new docstring without performing any parsing through
66
- # a {DocstringParser}. This method is called by +DocstringParser+
67
- # when creating the new docstring object.
68
- #
69
- # @param [String] text the textual portion of the docstring
70
- # @param [Array<Tags::Tag>] tags the list of tag objects in the docstring
71
- # @param [CodeObjects::Base, nil] object the object associated with the
72
- # docstring. May be nil.
73
- # @param [String] raw_data the complete docstring, including all
74
- # original formatting and any unparsed tags/directives.
75
- # @param [CodeObjects::Base, nil] ref_object a reference object used for
76
- # the base set of documentation / tag information.
77
- def self.new!(text, tags = [], object = nil, raw_data = nil, ref_object = nil)
78
- docstring = allocate
79
- docstring.replace(text, false)
80
- docstring.object = object
81
- docstring.add_tag(*tags)
82
- docstring.instance_variable_set("@unresolved_reference", ref_object)
83
- docstring.instance_variable_set("@all", raw_data) if raw_data
84
- docstring
85
- end
86
-
87
- # Creates a new docstring with the raw contents attached to an optional
88
- # object. Parsing will be done by the {DocstringParser} class.
89
- #
90
- # @note To properly parse directives with proper parser context within
91
- # handlers, you should not use this method to create a Docstring.
92
- # Instead, use the {parser}, which takes a handler object that
93
- # can pass parser state onto directives. If a Docstring is created
94
- # with this method, directives do not have access to any parser
95
- # state, and may not function as expected.
96
- # @example
97
- # Docstring.new("hello world\n@return Object return", someobj)
98
- #
99
- # @param [String] content the raw comments to be parsed into a docstring
100
- # and associated meta-data.
101
- # @param [CodeObjects::Base] object an object to associate the docstring
102
- # with.
103
- def initialize(content = '', object = nil)
104
- @object = object
105
- @summary = nil
106
- @hash_flag = false
107
-
108
- self.all = content
109
- end
110
-
111
- # Adds another {Docstring}, copying over tags.
112
- #
113
- # @param [Docstring, String] other the other docstring (or string) to
114
- # add.
115
- # @return [Docstring] a new docstring with both docstrings combines
116
- def +(other)
117
- case other
118
- when Docstring
119
- Docstring.new([all, other.all].join("\n"), object)
120
- else
121
- super
122
- end
123
- end
124
-
125
- def to_s
126
- resolve_reference
127
- super
128
- end
129
-
130
- # Replaces the docstring with new raw content. Called by {#all=}.
131
- # @param [String] content the raw comments to be parsed
132
- def replace(content, parse = true)
133
- content = content.join("\n") if content.is_a?(Array)
134
- @tags = []
135
- @ref_tags = []
136
- if parse
137
- super(parse_comments(content))
138
- else
139
- @all = content
140
- @unresolved_reference = nil
141
- super(content)
142
- end
143
- end
144
- alias all= replace
145
-
146
- # Deep-copies a docstring
147
- #
148
- # @note This method creates a new docstring with new tag lists, but does
149
- # not create new individual tags. Modifying the tag objects will still
150
- # affect the original tags.
151
- # @return [Docstring] a new copied docstring
152
- # @since 0.7.0
153
- def dup
154
- resolve_reference
155
- obj = super
156
- %w(all summary tags ref_tags).each do |name|
157
- val = instance_variable_defined?("@#{name}") && instance_variable_get("@#{name}")
158
- obj.instance_variable_set("@#{name}", val ? val.dup : nil)
159
- end
160
- obj
161
- end
162
-
163
- # @endgroup
164
-
165
- # @return [Fixnum] the first line of the {#line_range}
166
- # @return [nil] if there is no associated {#line_range}
167
- def line
168
- line_range ? line_range.first : nil
169
- end
170
-
171
- # Gets the first line of a docstring to the period or the first paragraph.
172
- # @return [String] The first line or paragraph of the docstring; always ends with a period.
173
- def summary
174
- resolve_reference
175
- return @summary if defined?(@summary) && @summary
176
- stripped = gsub(/[\r\n](?![\r\n])/, ' ').strip
177
- num_parens = 0
178
- idx = length.times do |index|
179
- case stripped[index, 1]
180
- when "."
181
- next_char = stripped[index + 1, 1].to_s
182
- break index - 1 if num_parens <= 0 && next_char =~ /^\s*$/
183
- when "\r", "\n"
184
- next_char = stripped[index + 1, 1].to_s
185
- if next_char =~ /^\s*$/
186
- break stripped[index - 1, 1] == '.' ? index - 2 : index - 1
187
- end
188
- when "{", "(", "["
189
- num_parens += 1
190
- when "}", ")", "]"
191
- num_parens -= 1
192
- end
193
- end
194
- @summary = stripped[0..idx]
195
- if !@summary.empty? && @summary !~ /\A\s*\{include:.+\}\s*\Z/
196
- @summary += '.'
197
- end
198
- @summary
199
- end
200
-
201
- # Reformats and returns a raw representation of the tag data using the
202
- # current tag and docstring data, not the original text.
203
- #
204
- # @return [String] the updated raw formatted docstring data
205
- # @since 0.7.0
206
- # @todo Add Tags::Tag#to_raw and refactor
207
- def to_raw
208
- tag_data = tags.sort_by(&:tag_name).map do |tag|
209
- case tag
210
- when Tags::OverloadTag
211
- tag_text = "@#{tag.tag_name} #{tag.signature}\n"
212
- unless tag.docstring.blank?
213
- tag_text += "\n " + tag.docstring.all.gsub(/\r?\n/, "\n ")
214
- end
215
- when Tags::OptionTag
216
- tag_text = "@#{tag.tag_name} #{tag.name}"
217
- tag_text += ' [' + tag.pair.types.join(', ') + ']' if tag.pair.types
218
- tag_text += ' ' + tag.pair.name.to_s if tag.pair.name
219
- tag_text += "\n " if tag.name && tag.text
220
- tag_text += ' (' + tag.pair.defaults.join(', ') + ')' if tag.pair.defaults
221
- tag_text += " " + tag.pair.text.strip.gsub(/\n/, "\n ") if tag.pair.text
222
- else
223
- tag_text = '@' + tag.tag_name
224
- tag_text += ' [' + tag.types.join(', ') + ']' if tag.types
225
- tag_text += ' ' + tag.name.to_s if tag.name
226
- tag_text += "\n " if tag.name && tag.text
227
- tag_text += ' ' + tag.text.strip.gsub(/\n/, "\n ") if tag.text
228
- end
229
- tag_text
230
- end
231
- [strip, tag_data.join("\n")].reject(&:empty?).compact.join("\n")
232
- end
233
-
234
- # @group Creating and Accessing Meta-data
235
-
236
- # Adds a tag or reftag object to the tag list. If you want to parse
237
- # tag data based on the {Tags::DefaultFactory} tag factory, use
238
- # {DocstringParser} instead.
239
- #
240
- # @param [Tags::Tag, Tags::RefTag] tags list of tag objects to add
241
- # @return [void]
242
- def add_tag(*tags)
243
- tags.each_with_index do |tag, i|
244
- case tag
245
- when Tags::Tag
246
- tag.object = object
247
- @tags << tag
248
- when Tags::RefTag, Tags::RefTagList
249
- @ref_tags << tag
250
- else
251
- raise ArgumentError, "expected Tag or RefTag, got #{tag.class} (at index #{i})"
252
- end
253
- end
254
- end
255
-
256
- # Convenience method to return the first tag
257
- # object in the list of tag objects of that name
258
- #
259
- # @example
260
- # doc = Docstring.new("@return zero when nil")
261
- # doc.tag(:return).text # => "zero when nil"
262
- #
263
- # @param [#to_s] name the tag name to return data for
264
- # @return [Tags::Tag] the first tag in the list of {#tags}
265
- def tag(name)
266
- tags.find {|tag| tag.tag_name.to_s == name.to_s }
267
- end
268
-
269
- # Returns a list of tags specified by +name+ or all tags if +name+ is not specified.
270
- #
271
- # @param [#to_s] name the tag name to return data for, or nil for all tags
272
- # @return [Array<Tags::Tag>] the list of tags by the specified tag name
273
- def tags(name = nil)
274
- list = @tags + convert_ref_tags
275
- return list unless name
276
- list.select {|tag| tag.tag_name.to_s == name.to_s }
277
- end
278
-
279
- # Returns true if at least one tag by the name +name+ was declared
280
- #
281
- # @param [String] name the tag name to search for
282
- # @return [Boolean] whether or not the tag +name+ was declared
283
- def has_tag?(name)
284
- tags.any? {|tag| tag.tag_name.to_s == name.to_s }
285
- end
286
-
287
- # Delete all tags with +name+
288
- # @param [String] name the tag name
289
- # @return [void]
290
- # @since 0.7.0
291
- def delete_tags(name)
292
- delete_tag_if {|tag| tag.tag_name.to_s == name.to_s }
293
- end
294
-
295
- # Deletes all tags where the block returns true
296
- # @yieldparam [Tags::Tag] tag the tag that is being tested
297
- # @yieldreturn [Boolean] true if the tag should be deleted
298
- # @return [void]
299
- # @since 0.7.0
300
- def delete_tag_if(&block)
301
- @tags.delete_if(&block)
302
- @ref_tags.delete_if(&block)
303
- end
304
-
305
- # Returns true if the docstring has no content that is visible to a template.
306
- #
307
- # @param [Boolean] only_visible_tags whether only {Tags::Library.visible_tags}
308
- # should be checked, or if all tags should be considered.
309
- # @return [Boolean] whether or not the docstring has content
310
- def blank?(only_visible_tags = true)
311
- if only_visible_tags
312
- empty? && !tags.any? {|tag| Tags::Library.visible_tags.include?(tag.tag_name.to_sym) }
313
- else
314
- empty? && @tags.empty? && @ref_tags.empty?
315
- end
316
- end
317
-
318
- # @endgroup
319
-
320
- # Resolves unresolved other docstring reference if there is
321
- # unresolved reference. Does nothing if there is no unresolved
322
- # reference.
323
- #
324
- # Normally, you don't need to call this method
325
- # explicitly. Resolving unresolved reference is done implicitly.
326
- #
327
- # @return [void]
328
- def resolve_reference
329
- loop do
330
- return if defined?(@unresolved_reference).nil? || @unresolved_reference.nil?
331
- return if CodeObjects::Proxy === @unresolved_reference
332
-
333
- reference = @unresolved_reference
334
- @unresolved_reference = nil
335
- self.all = [reference.docstring.all, @all].join("\n")
336
- end
337
- end
338
-
339
- private
340
-
341
- # Maps valid reference tags
342
- #
343
- # @return [Array<Tags::RefTag>] the list of valid reference tags
344
- def convert_ref_tags
345
- list = @ref_tags.reject {|t| CodeObjects::Proxy === t.owner }
346
-
347
- @ref_tag_recurse_count ||= 0
348
- @ref_tag_recurse_count += 1
349
- if @ref_tag_recurse_count > 2
350
- log.error "#{@object.file}:#{@object.line}: Detected circular reference tag in " \
351
- "`#{@object}', ignoring all reference tags for this object " \
352
- "(#{@ref_tags.map {|t| "@#{t.tag_name}" }.join(", ")})."
353
- @ref_tags = []
354
- return @ref_tags
355
- end
356
- list = list.map(&:tags).flatten
357
- @ref_tag_recurse_count -= 1
358
- list
359
- end
360
-
361
- # Parses out comments split by newlines into a new code object
362
- #
363
- # @param [String] comments
364
- # the newline delimited array of comments. If the comments
365
- # are passed as a String, they will be split by newlines.
366
- #
367
- # @return [String] the non-metadata portion of the comments to
368
- # be used as a docstring
369
- def parse_comments(comments)
370
- parser = self.class.parser
371
- parser.parse(comments, object)
372
- @all = parser.raw_text
373
- @unresolved_reference = parser.reference
374
- add_tag(*parser.tags)
375
- parser.text
376
- end
377
- end
378
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ # A documentation string, or "docstring" for short, encapsulates the
4
+ # comments and metadata, or "tags", of an object. Meta-data is expressed
5
+ # in the form +@tag VALUE+, where VALUE can span over multiple lines as
6
+ # long as they are indented. The following +@example+ tag shows how tags
7
+ # can be indented:
8
+ #
9
+ # # @example My example
10
+ # # a = "hello world"
11
+ # # a.reverse
12
+ # # @version 1.0
13
+ #
14
+ # Tags can be nested in a documentation string, though the {Tags::Tag}
15
+ # itself is responsible for parsing the inner tags.
16
+ class Docstring < String
17
+ class << self
18
+ # @note Plugin developers should make sure to reset this value
19
+ # after parsing finishes. This can be done via the
20
+ # {Parser::SourceParser.after_parse_list} callback. This will
21
+ # ensure that YARD can properly parse multiple projects in
22
+ # the same process.
23
+ # @return [Class<DocstringParser>] the parser class used to parse
24
+ # text and optional meta-data from docstrings. Defaults to
25
+ # {DocstringParser}.
26
+ # @see DocstringParser
27
+ # @see Parser::SourceParser.after_parse_list
28
+ attr_accessor :default_parser
29
+
30
+ # Creates a parser object using the current {default_parser}.
31
+ # Equivalent to:
32
+ # Docstring.default_parser.new(*args)
33
+ # @param args arguments are passed to the {DocstringParser}
34
+ # class. See {DocstringParser#initialize} for details on
35
+ # arguments.
36
+ # @return [DocstringParser] the parser object used to parse a
37
+ # docstring.
38
+ def parser(*args) default_parser.new(*args) end
39
+ end
40
+
41
+ self.default_parser = DocstringParser
42
+
43
+ # @return [Array<Tags::RefTag>] the list of reference tags
44
+ attr_reader :ref_tags
45
+
46
+ # @return [CodeObjects::Base] the object that owns the docstring.
47
+ attr_accessor :object
48
+
49
+ # @return [Range] line range in the {#object}'s file where the docstring was parsed from
50
+ attr_accessor :line_range
51
+
52
+ # @return [String] the raw documentation (including raw tag text)
53
+ attr_reader :all
54
+
55
+ # @return [Boolean] whether the docstring was started with "##"
56
+ attr_reader :hash_flag
57
+ def hash_flag=(v) @hash_flag = v.nil? ? false : v end
58
+
59
+ # Matches a tag at the start of a comment line
60
+ # @deprecated Use {DocstringParser::META_MATCH}
61
+ META_MATCH = DocstringParser::META_MATCH
62
+
63
+ # @group Creating a Docstring Object
64
+
65
+ # Creates a new docstring without performing any parsing through
66
+ # a {DocstringParser}. This method is called by +DocstringParser+
67
+ # when creating the new docstring object.
68
+ #
69
+ # @param [String] text the textual portion of the docstring
70
+ # @param [Array<Tags::Tag>] tags the list of tag objects in the docstring
71
+ # @param [CodeObjects::Base, nil] object the object associated with the
72
+ # docstring. May be nil.
73
+ # @param [String] raw_data the complete docstring, including all
74
+ # original formatting and any unparsed tags/directives.
75
+ # @param [CodeObjects::Base, nil] ref_object a reference object used for
76
+ # the base set of documentation / tag information.
77
+ def self.new!(text, tags = [], object = nil, raw_data = nil, ref_object = nil)
78
+ docstring = allocate
79
+ docstring.replace(text, false)
80
+ docstring.object = object
81
+ docstring.add_tag(*tags)
82
+ docstring.instance_variable_set("@unresolved_reference", ref_object)
83
+ docstring.instance_variable_set("@all", raw_data) if raw_data
84
+ docstring
85
+ end
86
+
87
+ # Creates a new docstring with the raw contents attached to an optional
88
+ # object. Parsing will be done by the {DocstringParser} class.
89
+ #
90
+ # @note To properly parse directives with proper parser context within
91
+ # handlers, you should not use this method to create a Docstring.
92
+ # Instead, use the {parser}, which takes a handler object that
93
+ # can pass parser state onto directives. If a Docstring is created
94
+ # with this method, directives do not have access to any parser
95
+ # state, and may not function as expected.
96
+ # @example
97
+ # Docstring.new("hello world\n@return Object return", someobj)
98
+ #
99
+ # @param [String] content the raw comments to be parsed into a docstring
100
+ # and associated meta-data.
101
+ # @param [CodeObjects::Base] object an object to associate the docstring
102
+ # with.
103
+ def initialize(content = '', object = nil)
104
+ @object = object
105
+ @summary = nil
106
+ @hash_flag = false
107
+
108
+ self.all = content
109
+ end
110
+
111
+ # Adds another {Docstring}, copying over tags.
112
+ #
113
+ # @param [Docstring, String] other the other docstring (or string) to
114
+ # add.
115
+ # @return [Docstring] a new docstring with both docstrings combines
116
+ def +(other)
117
+ case other
118
+ when Docstring
119
+ Docstring.new([all, other.all].join("\n"), object)
120
+ else
121
+ super
122
+ end
123
+ end
124
+
125
+ def to_s
126
+ resolve_reference
127
+ super
128
+ end
129
+
130
+ # Replaces the docstring with new raw content. Called by {#all=}.
131
+ # @param [String] content the raw comments to be parsed
132
+ def replace(content, parse = true)
133
+ content = content.join("\n") if content.is_a?(Array)
134
+ @tags = []
135
+ @ref_tags = []
136
+ if parse
137
+ super(parse_comments(content))
138
+ else
139
+ @all = content
140
+ @unresolved_reference = nil
141
+ super(content)
142
+ end
143
+ end
144
+ alias all= replace
145
+
146
+ # Deep-copies a docstring
147
+ #
148
+ # @note This method creates a new docstring with new tag lists, but does
149
+ # not create new individual tags. Modifying the tag objects will still
150
+ # affect the original tags.
151
+ # @return [Docstring] a new copied docstring
152
+ # @since 0.7.0
153
+ def dup
154
+ resolve_reference
155
+ obj = super
156
+ %w(all summary tags ref_tags).each do |name|
157
+ val = instance_variable_defined?("@#{name}") && instance_variable_get("@#{name}")
158
+ obj.instance_variable_set("@#{name}", val ? val.dup : nil)
159
+ end
160
+ obj
161
+ end
162
+
163
+ # @endgroup
164
+
165
+ # @return [Fixnum] the first line of the {#line_range}
166
+ # @return [nil] if there is no associated {#line_range}
167
+ def line
168
+ line_range ? line_range.first : nil
169
+ end
170
+
171
+ # Gets the first line of a docstring to the period or the first paragraph.
172
+ # @return [String] The first line or paragraph of the docstring; always ends with a period.
173
+ def summary
174
+ resolve_reference
175
+ return @summary if defined?(@summary) && @summary
176
+ stripped = gsub(/[\r\n](?![\r\n])/, ' ').strip
177
+ num_parens = 0
178
+ idx = length.times do |index|
179
+ case stripped[index, 1]
180
+ when "."
181
+ next_char = stripped[index + 1, 1].to_s
182
+ break index - 1 if num_parens <= 0 && next_char =~ /^\s*$/
183
+ when "\r", "\n"
184
+ next_char = stripped[index + 1, 1].to_s
185
+ if next_char =~ /^\s*$/
186
+ break stripped[index - 1, 1] == '.' ? index - 2 : index - 1
187
+ end
188
+ when "{", "(", "["
189
+ num_parens += 1
190
+ when "}", ")", "]"
191
+ num_parens -= 1
192
+ end
193
+ end
194
+ @summary = stripped[0..idx]
195
+ if !@summary.empty? && @summary !~ /\A\s*\{include:.+\}\s*\Z/
196
+ @summary += '.'
197
+ end
198
+ @summary
199
+ end
200
+
201
+ # Reformats and returns a raw representation of the tag data using the
202
+ # current tag and docstring data, not the original text.
203
+ #
204
+ # @return [String] the updated raw formatted docstring data
205
+ # @since 0.7.0
206
+ # @todo Add Tags::Tag#to_raw and refactor
207
+ def to_raw
208
+ tag_data = tags.map do |tag|
209
+ case tag
210
+ when Tags::OverloadTag
211
+ tag_text = "@#{tag.tag_name} #{tag.signature}\n"
212
+ unless tag.docstring.blank?
213
+ tag_text += "\n " + tag.docstring.all.gsub(/\r?\n/, "\n ")
214
+ end
215
+ when Tags::OptionTag
216
+ tag_text = "@#{tag.tag_name} #{tag.name}"
217
+ tag_text += ' [' + tag.pair.types.join(', ') + ']' if tag.pair.types
218
+ tag_text += ' ' + tag.pair.name.to_s if tag.pair.name
219
+ tag_text += "\n " if tag.name && tag.text
220
+ tag_text += ' (' + tag.pair.defaults.join(', ') + ')' if tag.pair.defaults
221
+ tag_text += " " + tag.pair.text.strip.gsub(/\n/, "\n ") if tag.pair.text
222
+ else
223
+ tag_text = '@' + tag.tag_name
224
+ tag_text += ' [' + tag.types.join(', ') + ']' if tag.types
225
+ tag_text += ' ' + tag.name.to_s if tag.name
226
+ tag_text += "\n " if tag.name && tag.text
227
+ tag_text += ' ' + tag.text.strip.gsub(/\n/, "\n ") if tag.text
228
+ end
229
+ tag_text
230
+ end
231
+ [strip, tag_data.join("\n")].reject(&:empty?).compact.join("\n")
232
+ end
233
+
234
+ # @group Creating and Accessing Meta-data
235
+
236
+ # Adds a tag or reftag object to the tag list. If you want to parse
237
+ # tag data based on the {Tags::DefaultFactory} tag factory, use
238
+ # {DocstringParser} instead.
239
+ #
240
+ # @param [Tags::Tag, Tags::RefTag] tags list of tag objects to add
241
+ # @return [void]
242
+ def add_tag(*tags)
243
+ tags.each_with_index do |tag, i|
244
+ case tag
245
+ when Tags::Tag
246
+ tag.object = object
247
+ @tags << tag
248
+ when Tags::RefTag, Tags::RefTagList
249
+ @ref_tags << tag
250
+ else
251
+ raise ArgumentError, "expected Tag or RefTag, got #{tag.class} (at index #{i})"
252
+ end
253
+ end
254
+ end
255
+
256
+ # Convenience method to return the first tag
257
+ # object in the list of tag objects of that name
258
+ #
259
+ # @example
260
+ # doc = Docstring.new("@return zero when nil")
261
+ # doc.tag(:return).text # => "zero when nil"
262
+ #
263
+ # @param [#to_s] name the tag name to return data for
264
+ # @return [Tags::Tag] the first tag in the list of {#tags}
265
+ def tag(name)
266
+ tags.find {|tag| tag.tag_name.to_s == name.to_s }
267
+ end
268
+
269
+ # Returns a list of tags specified by +name+ or all tags if +name+ is not specified.
270
+ #
271
+ # @param [#to_s] name the tag name to return data for, or nil for all tags
272
+ # @return [Array<Tags::Tag>] the list of tags by the specified tag name
273
+ def tags(name = nil)
274
+ list = stable_sort_by(@tags + convert_ref_tags, &:tag_name)
275
+ return list unless name
276
+ list.select {|tag| tag.tag_name.to_s == name.to_s }
277
+ end
278
+
279
+ # Returns true if at least one tag by the name +name+ was declared
280
+ #
281
+ # @param [String] name the tag name to search for
282
+ # @return [Boolean] whether or not the tag +name+ was declared
283
+ def has_tag?(name)
284
+ tags.any? {|tag| tag.tag_name.to_s == name.to_s }
285
+ end
286
+
287
+ # Delete all tags with +name+
288
+ # @param [String] name the tag name
289
+ # @return [void]
290
+ # @since 0.7.0
291
+ def delete_tags(name)
292
+ delete_tag_if {|tag| tag.tag_name.to_s == name.to_s }
293
+ end
294
+
295
+ # Deletes all tags where the block returns true
296
+ # @yieldparam [Tags::Tag] tag the tag that is being tested
297
+ # @yieldreturn [Boolean] true if the tag should be deleted
298
+ # @return [void]
299
+ # @since 0.7.0
300
+ def delete_tag_if(&block)
301
+ @tags.delete_if(&block)
302
+ @ref_tags.delete_if(&block)
303
+ end
304
+
305
+ # Returns true if the docstring has no content that is visible to a template.
306
+ #
307
+ # @param [Boolean] only_visible_tags whether only {Tags::Library.visible_tags}
308
+ # should be checked, or if all tags should be considered.
309
+ # @return [Boolean] whether or not the docstring has content
310
+ def blank?(only_visible_tags = true)
311
+ if only_visible_tags
312
+ empty? && !tags.any? {|tag| Tags::Library.visible_tags.include?(tag.tag_name.to_sym) }
313
+ else
314
+ empty? && @tags.empty? && @ref_tags.empty?
315
+ end
316
+ end
317
+
318
+ # @endgroup
319
+
320
+ # Resolves unresolved other docstring reference if there is
321
+ # unresolved reference. Does nothing if there is no unresolved
322
+ # reference.
323
+ #
324
+ # Normally, you don't need to call this method
325
+ # explicitly. Resolving unresolved reference is done implicitly.
326
+ #
327
+ # @return [void]
328
+ def resolve_reference
329
+ loop do
330
+ return if defined?(@unresolved_reference).nil? || @unresolved_reference.nil?
331
+ return if CodeObjects::Proxy === @unresolved_reference
332
+
333
+ reference = @unresolved_reference
334
+ @unresolved_reference = nil
335
+ self.all = [reference.docstring.all, @all].join("\n")
336
+ end
337
+ end
338
+
339
+ private
340
+
341
+ # Maps valid reference tags
342
+ #
343
+ # @return [Array<Tags::RefTag>] the list of valid reference tags
344
+ def convert_ref_tags
345
+ list = @ref_tags.reject {|t| CodeObjects::Proxy === t.owner }
346
+
347
+ @ref_tag_recurse_count ||= 0
348
+ @ref_tag_recurse_count += 1
349
+ if @ref_tag_recurse_count > 2
350
+ log.error "#{@object.file}:#{@object.line}: Detected circular reference tag in " \
351
+ "`#{@object}', ignoring all reference tags for this object " \
352
+ "(#{@ref_tags.map {|t| "@#{t.tag_name}" }.join(", ")})."
353
+ @ref_tags = []
354
+ return @ref_tags
355
+ end
356
+ list = list.map(&:tags).flatten
357
+ @ref_tag_recurse_count -= 1
358
+ list
359
+ end
360
+
361
+ # Parses out comments split by newlines into a new code object
362
+ #
363
+ # @param [String] comments
364
+ # the newline delimited array of comments. If the comments
365
+ # are passed as a String, they will be split by newlines.
366
+ #
367
+ # @return [String] the non-metadata portion of the comments to
368
+ # be used as a docstring
369
+ def parse_comments(comments)
370
+ parser = self.class.parser
371
+ parser.parse(comments, object)
372
+ @all = parser.raw_text
373
+ @unresolved_reference = parser.reference
374
+ add_tag(*parser.tags)
375
+ parser.text
376
+ end
377
+
378
+ # A stable sort_by method.
379
+ #
380
+ # @param list [Enumerable] the list to sort.
381
+ # @return [Array] a stable sorted list.
382
+ def stable_sort_by(list)
383
+ list.each_with_index.sort_by {|tag, i| [yield(tag), i] }.map(&:first)
384
+ end
385
+ end
386
+ end