yard 0.9.18 → 0.9.19

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 (567) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +26 -26
  3. data/CHANGELOG.md +742 -728
  4. data/LEGAL +66 -66
  5. data/LICENSE +22 -22
  6. data/README.md +328 -328
  7. data/Rakefile +42 -53
  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 +308 -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 +789 -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 -615
  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 +134 -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 +11 -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 -386
  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 +212 -211
  95. data/lib/yard/handlers/c/init_handler.rb +20 -20
  96. data/lib/yard/handlers/c/method_handler.rb +45 -45
  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/common/method_handler.rb +19 -0
  104. data/lib/yard/handlers/processor.rb +200 -200
  105. data/lib/yard/handlers/ruby/alias_handler.rb +44 -44
  106. data/lib/yard/handlers/ruby/attribute_handler.rb +87 -87
  107. data/lib/yard/handlers/ruby/base.rb +165 -165
  108. data/lib/yard/handlers/ruby/class_condition_handler.rb +92 -92
  109. data/lib/yard/handlers/ruby/class_handler.rb +119 -119
  110. data/lib/yard/handlers/ruby/class_variable_handler.rb +17 -17
  111. data/lib/yard/handlers/ruby/comment_handler.rb +10 -10
  112. data/lib/yard/handlers/ruby/constant_handler.rb +59 -59
  113. data/lib/yard/handlers/ruby/decorator_handler_methods.rb +123 -123
  114. data/lib/yard/handlers/ruby/dsl_handler.rb +15 -15
  115. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +96 -96
  116. data/lib/yard/handlers/ruby/exception_handler.rb +27 -27
  117. data/lib/yard/handlers/ruby/extend_handler.rb +22 -22
  118. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +37 -37
  119. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +65 -65
  120. data/lib/yard/handlers/ruby/legacy/base.rb +245 -245
  121. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -83
  122. data/lib/yard/handlers/ruby/legacy/class_handler.rb +113 -113
  123. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +15 -15
  124. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +10 -10
  125. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +29 -29
  126. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +17 -17
  127. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +13 -13
  128. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +21 -21
  129. data/lib/yard/handlers/ruby/legacy/method_handler.rb +90 -90
  130. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -39
  131. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +19 -19
  132. data/lib/yard/handlers/ruby/legacy/module_handler.rb +12 -12
  133. data/lib/yard/handlers/ruby/legacy/private_class_method_handler.rb +22 -22
  134. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +22 -22
  135. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +17 -17
  136. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +29 -29
  137. data/lib/yard/handlers/ruby/method_condition_handler.rb +9 -9
  138. data/lib/yard/handlers/ruby/method_handler.rb +114 -118
  139. data/lib/yard/handlers/ruby/mixin_handler.rb +37 -37
  140. data/lib/yard/handlers/ruby/module_function_handler.rb +27 -27
  141. data/lib/yard/handlers/ruby/module_handler.rb +12 -12
  142. data/lib/yard/handlers/ruby/private_class_method_handler.rb +14 -14
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +43 -43
  144. data/lib/yard/handlers/ruby/public_class_method_handler.rb +14 -14
  145. data/lib/yard/handlers/ruby/struct_handler_methods.rb +143 -143
  146. data/lib/yard/handlers/ruby/visibility_handler.rb +22 -22
  147. data/lib/yard/handlers/ruby/yield_handler.rb +31 -31
  148. data/lib/yard/i18n/locale.rb +67 -67
  149. data/lib/yard/i18n/message.rb +57 -57
  150. data/lib/yard/i18n/messages.rb +56 -56
  151. data/lib/yard/i18n/po_parser.rb +61 -61
  152. data/lib/yard/i18n/pot_generator.rb +290 -290
  153. data/lib/yard/i18n/text.rb +173 -173
  154. data/lib/yard/logging.rb +205 -205
  155. data/lib/yard/options.rb +217 -217
  156. data/lib/yard/parser/base.rb +57 -57
  157. data/lib/yard/parser/c/c_parser.rb +235 -235
  158. data/lib/yard/parser/c/comment_parser.rb +134 -134
  159. data/lib/yard/parser/c/statement.rb +64 -64
  160. data/lib/yard/parser/ruby/ast_node.rb +540 -540
  161. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1354 -1354
  162. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +32 -32
  163. data/lib/yard/parser/ruby/legacy/statement.rb +66 -66
  164. data/lib/yard/parser/ruby/legacy/statement_list.rb +394 -394
  165. data/lib/yard/parser/ruby/legacy/token_list.rb +74 -74
  166. data/lib/yard/parser/ruby/ruby_parser.rb +687 -687
  167. data/lib/yard/parser/ruby/token_resolver.rb +156 -156
  168. data/lib/yard/parser/source_parser.rb +526 -526
  169. data/lib/yard/rake/yardoc_task.rb +81 -81
  170. data/lib/yard/registry.rb +439 -439
  171. data/lib/yard/registry_resolver.rb +189 -189
  172. data/lib/yard/registry_store.rb +337 -337
  173. data/lib/yard/rubygems/backports.rb +10 -10
  174. data/lib/yard/rubygems/backports/LICENSE.txt +57 -57
  175. data/lib/yard/rubygems/backports/MIT.txt +20 -20
  176. data/lib/yard/rubygems/backports/gem.rb +10 -10
  177. data/lib/yard/rubygems/backports/source_index.rb +365 -365
  178. data/lib/yard/rubygems/doc_manager.rb +90 -90
  179. data/lib/yard/rubygems/hook.rb +197 -197
  180. data/lib/yard/rubygems/specification.rb +50 -50
  181. data/lib/yard/serializers/base.rb +83 -83
  182. data/lib/yard/serializers/file_system_serializer.rb +123 -123
  183. data/lib/yard/serializers/process_serializer.rb +24 -24
  184. data/lib/yard/serializers/stdout_serializer.rb +34 -34
  185. data/lib/yard/serializers/yardoc_serializer.rb +152 -152
  186. data/lib/yard/server.rb +13 -13
  187. data/lib/yard/server/adapter.rb +100 -100
  188. data/lib/yard/server/commands/base.rb +209 -209
  189. data/lib/yard/server/commands/display_file_command.rb +29 -29
  190. data/lib/yard/server/commands/display_object_command.rb +65 -65
  191. data/lib/yard/server/commands/frames_command.rb +16 -16
  192. data/lib/yard/server/commands/library_command.rb +187 -187
  193. data/lib/yard/server/commands/library_index_command.rb +28 -28
  194. data/lib/yard/server/commands/list_command.rb +25 -25
  195. data/lib/yard/server/commands/root_request_command.rb +15 -15
  196. data/lib/yard/server/commands/search_command.rb +79 -79
  197. data/lib/yard/server/commands/static_file_command.rb +23 -23
  198. data/lib/yard/server/commands/static_file_helpers.rb +62 -62
  199. data/lib/yard/server/doc_server_helper.rb +91 -91
  200. data/lib/yard/server/doc_server_serializer.rb +39 -39
  201. data/lib/yard/server/library_version.rb +277 -277
  202. data/lib/yard/server/rack_adapter.rb +89 -89
  203. data/lib/yard/server/router.rb +187 -187
  204. data/lib/yard/server/static_caching.rb +46 -46
  205. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +127 -127
  206. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +11 -11
  207. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +37 -37
  208. data/lib/yard/server/templates/default/layout/html/script_setup.erb +7 -7
  209. data/lib/yard/server/templates/default/layout/html/setup.rb +8 -8
  210. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -4
  211. data/lib/yard/server/templates/default/method_details/html/setup.rb +5 -5
  212. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +8 -8
  213. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +14 -14
  214. data/lib/yard/server/templates/doc_server/library_list/html/listing.erb +13 -13
  215. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +6 -6
  216. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -2
  217. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +52 -52
  218. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +4 -4
  219. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -18
  220. data/lib/yard/server/templates/doc_server/search/html/setup.rb +9 -9
  221. data/lib/yard/server/webrick_adapter.rb +45 -45
  222. data/lib/yard/tags/default_factory.rb +191 -191
  223. data/lib/yard/tags/default_tag.rb +13 -13
  224. data/lib/yard/tags/directives.rb +616 -616
  225. data/lib/yard/tags/library.rb +633 -633
  226. data/lib/yard/tags/option_tag.rb +13 -13
  227. data/lib/yard/tags/overload_tag.rb +71 -71
  228. data/lib/yard/tags/ref_tag.rb +8 -8
  229. data/lib/yard/tags/ref_tag_list.rb +28 -28
  230. data/lib/yard/tags/tag.rb +71 -71
  231. data/lib/yard/tags/tag_format_error.rb +7 -7
  232. data/lib/yard/tags/types_explainer.rb +162 -162
  233. data/lib/yard/templates/engine.rb +186 -186
  234. data/lib/yard/templates/erb_cache.rb +23 -23
  235. data/lib/yard/templates/helpers/base_helper.rb +215 -215
  236. data/lib/yard/templates/helpers/filter_helper.rb +27 -27
  237. data/lib/yard/templates/helpers/html_helper.rb +646 -646
  238. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +78 -78
  239. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +23 -23
  240. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +109 -109
  241. data/lib/yard/templates/helpers/markup_helper.rb +172 -172
  242. data/lib/yard/templates/helpers/method_helper.rb +75 -75
  243. data/lib/yard/templates/helpers/module_helper.rb +21 -21
  244. data/lib/yard/templates/helpers/text_helper.rb +112 -112
  245. data/lib/yard/templates/helpers/uml_helper.rb +47 -47
  246. data/lib/yard/templates/section.rb +105 -105
  247. data/lib/yard/templates/template.rb +418 -418
  248. data/lib/yard/templates/template_options.rb +92 -92
  249. data/lib/yard/verifier.rb +151 -151
  250. data/lib/yard/version.rb +6 -6
  251. data/spec/cli/command_parser_spec.rb +43 -43
  252. data/spec/cli/command_spec.rb +36 -36
  253. data/spec/cli/config_spec.rb +148 -148
  254. data/spec/cli/diff_spec.rb +254 -254
  255. data/spec/cli/display_spec.rb +30 -30
  256. data/spec/cli/gems_spec.rb +81 -81
  257. data/spec/cli/graph_spec.rb +18 -18
  258. data/spec/cli/help_spec.rb +22 -22
  259. data/spec/cli/i18n_spec.rb +107 -107
  260. data/spec/cli/list_spec.rb +8 -8
  261. data/spec/cli/markup_types_spec.rb +22 -22
  262. data/spec/cli/server_spec.rb +324 -324
  263. data/spec/cli/stats_spec.rb +96 -96
  264. data/spec/cli/yard_on_yard_spec.rb +38 -38
  265. data/spec/cli/yardoc_spec.rb +896 -862
  266. data/spec/cli/yri_spec.rb +101 -101
  267. data/spec/code_objects/base_spec.rb +470 -470
  268. data/spec/code_objects/class_object_spec.rb +226 -226
  269. data/spec/code_objects/code_object_list_spec.rb +36 -36
  270. data/spec/code_objects/constants_spec.rb +116 -116
  271. data/spec/code_objects/extra_file_object_spec.rb +160 -160
  272. data/spec/code_objects/macro_object_spec.rb +150 -150
  273. data/spec/code_objects/method_object_spec.rb +184 -184
  274. data/spec/code_objects/module_object_spec.rb +142 -142
  275. data/spec/code_objects/namespace_object_spec.rb +171 -171
  276. data/spec/code_objects/proxy_spec.rb +141 -141
  277. data/spec/code_objects/spec_helper.rb +3 -3
  278. data/spec/config_spec.rb +171 -171
  279. data/spec/core_ext/array_spec.rb +13 -13
  280. data/spec/core_ext/file_spec.rb +72 -72
  281. data/spec/core_ext/hash_spec.rb +14 -14
  282. data/spec/core_ext/insertion_spec.rb +37 -37
  283. data/spec/core_ext/module_spec.rb +9 -15
  284. data/spec/core_ext/string_spec.rb +42 -42
  285. data/spec/core_ext/symbol_hash_spec.rb +89 -89
  286. data/spec/docstring_parser_spec.rb +280 -280
  287. data/spec/docstring_spec.rb +373 -373
  288. data/spec/examples.txt +1883 -1875
  289. data/spec/handlers/alias_handler_spec.rb +82 -82
  290. data/spec/handlers/attribute_handler_spec.rb +96 -96
  291. data/spec/handlers/base_spec.rb +216 -216
  292. data/spec/handlers/c/alias_handler_spec.rb +34 -34
  293. data/spec/handlers/c/attribute_handler_spec.rb +41 -41
  294. data/spec/handlers/c/class_handler_spec.rb +78 -78
  295. data/spec/handlers/c/constant_handler_spec.rb +71 -71
  296. data/spec/handlers/c/init_handler_spec.rb +48 -48
  297. data/spec/handlers/c/method_handler_spec.rb +327 -325
  298. data/spec/handlers/c/mixin_handler_spec.rb +44 -44
  299. data/spec/handlers/c/module_handler_spec.rb +71 -71
  300. data/spec/handlers/c/override_comment_handler_spec.rb +47 -47
  301. data/spec/handlers/c/path_handler_spec.rb +36 -36
  302. data/spec/handlers/c/spec_helper.rb +23 -23
  303. data/spec/handlers/c/struct_handler_spec.rb +16 -16
  304. data/spec/handlers/class_condition_handler_spec.rb +87 -87
  305. data/spec/handlers/class_handler_spec.rb +247 -247
  306. data/spec/handlers/class_method_handler_shared_examples.rb +133 -133
  307. data/spec/handlers/class_variable_handler_spec.rb +12 -12
  308. data/spec/handlers/constant_handler_spec.rb +112 -112
  309. data/spec/handlers/decorator_handler_methods_spec.rb +393 -393
  310. data/spec/handlers/dsl_handler_spec.rb +219 -219
  311. data/spec/handlers/examples/alias_handler_001.rb.txt +45 -45
  312. data/spec/handlers/examples/attribute_handler_001.rb.txt +31 -31
  313. data/spec/handlers/examples/class_condition_handler_001.rb.txt +68 -68
  314. data/spec/handlers/examples/class_handler_001.rb.txt +120 -120
  315. data/spec/handlers/examples/class_variable_handler_001.rb.txt +9 -9
  316. data/spec/handlers/examples/constant_handler_001.rb.txt +35 -35
  317. data/spec/handlers/examples/dsl_handler_001.rb.txt +154 -154
  318. data/spec/handlers/examples/exception_handler_001.rb.txt +58 -58
  319. data/spec/handlers/examples/extend_handler_001.rb.txt +15 -15
  320. data/spec/handlers/examples/method_condition_handler_001.rb.txt +9 -9
  321. data/spec/handlers/examples/method_handler_001.rb.txt +128 -128
  322. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -37
  323. data/spec/handlers/examples/module_handler_001.rb.txt +29 -29
  324. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -8
  325. data/spec/handlers/examples/process_handler_001.rb.txt +11 -11
  326. data/spec/handlers/examples/visibility_handler_001.rb.txt +35 -35
  327. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -54
  328. data/spec/handlers/exception_handler_spec.rb +49 -49
  329. data/spec/handlers/extend_handler_spec.rb +24 -24
  330. data/spec/handlers/legacy_base_spec.rb +128 -128
  331. data/spec/handlers/method_condition_handler_spec.rb +15 -15
  332. data/spec/handlers/method_handler_spec.rb +190 -190
  333. data/spec/handlers/mixin_handler_spec.rb +56 -56
  334. data/spec/handlers/module_function_handler_spec.rb +106 -106
  335. data/spec/handlers/module_handler_spec.rb +35 -35
  336. data/spec/handlers/private_class_method_handler_spec.rb +11 -11
  337. data/spec/handlers/private_constant_handler_spec.rb +25 -25
  338. data/spec/handlers/processor_spec.rb +35 -35
  339. data/spec/handlers/public_class_method_handler_spec.rb +11 -11
  340. data/spec/handlers/ruby/base_spec.rb +95 -95
  341. data/spec/handlers/ruby/legacy/base_spec.rb +84 -84
  342. data/spec/handlers/spec_helper.rb +33 -33
  343. data/spec/handlers/visibility_handler_spec.rb +44 -44
  344. data/spec/handlers/yield_handler_spec.rb +52 -52
  345. data/spec/i18n/locale_spec.rb +81 -81
  346. data/spec/i18n/message_spec.rb +52 -52
  347. data/spec/i18n/messages_spec.rb +67 -67
  348. data/spec/i18n/pot_generator_spec.rb +295 -295
  349. data/spec/i18n/text_spec.rb +184 -184
  350. data/spec/logging_spec.rb +44 -44
  351. data/spec/options_spec.rb +171 -171
  352. data/spec/parser/base_spec.rb +24 -24
  353. data/spec/parser/c_parser_spec.rb +236 -236
  354. data/spec/parser/examples/array.c.txt +6267 -6267
  355. data/spec/parser/examples/example1.rb.txt +7 -7
  356. data/spec/parser/examples/extrafile.c.txt +8 -8
  357. data/spec/parser/examples/file.c.txt +28 -28
  358. data/spec/parser/examples/multifile.c.txt +22 -22
  359. data/spec/parser/examples/namespace.cpp.txt +68 -68
  360. data/spec/parser/examples/override.c.txt +424 -424
  361. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -2
  362. data/spec/parser/examples/parse_in_order_002.rb.txt +1 -1
  363. data/spec/parser/examples/tag_handler_001.rb.txt +7 -7
  364. data/spec/parser/ruby/ast_node_spec.rb +33 -33
  365. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -299
  366. data/spec/parser/ruby/legacy/token_list_spec.rb +79 -79
  367. data/spec/parser/ruby/ruby_parser_spec.rb +508 -508
  368. data/spec/parser/ruby/token_resolver_spec.rb +165 -165
  369. data/spec/parser/source_parser_spec.rb +727 -727
  370. data/spec/parser/tag_parsing_spec.rb +17 -17
  371. data/spec/rake/yardoc_task_spec.rb +118 -118
  372. data/spec/registry_spec.rb +463 -463
  373. data/spec/registry_store_spec.rb +316 -316
  374. data/spec/rubygems/doc_manager_spec.rb +112 -112
  375. data/spec/serializers/data/serialized_yardoc/checksums +1 -1
  376. data/spec/serializers/file_system_serializer_spec.rb +145 -145
  377. data/spec/serializers/spec_helper.rb +2 -2
  378. data/spec/serializers/yardoc_serializer_spec.rb +78 -78
  379. data/spec/server/adapter_spec.rb +39 -39
  380. data/spec/server/commands/base_spec.rb +91 -91
  381. data/spec/server/commands/library_command_spec.rb +39 -39
  382. data/spec/server/doc_server_helper_spec.rb +72 -72
  383. data/spec/server/doc_server_serializer_spec.rb +60 -60
  384. data/spec/server/rack_adapter_spec.rb +21 -21
  385. data/spec/server/router_spec.rb +123 -123
  386. data/spec/server/spec_helper.rb +22 -22
  387. data/spec/server/static_caching_spec.rb +47 -47
  388. data/spec/server/webrick_servlet_spec.rb +20 -20
  389. data/spec/server_spec.rb +19 -19
  390. data/spec/spec_helper.rb +212 -212
  391. data/spec/tags/default_factory_spec.rb +168 -168
  392. data/spec/tags/default_tag_spec.rb +11 -11
  393. data/spec/tags/directives_spec.rb +463 -463
  394. data/spec/tags/library_spec.rb +48 -48
  395. data/spec/tags/overload_tag_spec.rb +53 -53
  396. data/spec/tags/ref_tag_list_spec.rb +53 -53
  397. data/spec/tags/types_explainer_spec.rb +203 -203
  398. data/spec/templates/class_spec.rb +45 -45
  399. data/spec/templates/constant_spec.rb +41 -41
  400. data/spec/templates/engine_spec.rb +131 -131
  401. data/spec/templates/examples/class001.html +308 -308
  402. data/spec/templates/examples/class001.txt +36 -36
  403. data/spec/templates/examples/class002.html +39 -39
  404. data/spec/templates/examples/constant001.txt +24 -24
  405. data/spec/templates/examples/constant002.txt +6 -6
  406. data/spec/templates/examples/constant003.txt +10 -10
  407. data/spec/templates/examples/method001.html +137 -137
  408. data/spec/templates/examples/method001.txt +35 -35
  409. data/spec/templates/examples/method002.html +91 -91
  410. data/spec/templates/examples/method002.txt +20 -20
  411. data/spec/templates/examples/method003.html +165 -165
  412. data/spec/templates/examples/method003.txt +45 -45
  413. data/spec/templates/examples/method004.html +48 -48
  414. data/spec/templates/examples/method004.txt +10 -10
  415. data/spec/templates/examples/method005.html +105 -105
  416. data/spec/templates/examples/method005.txt +33 -33
  417. data/spec/templates/examples/method006.html +107 -107
  418. data/spec/templates/examples/method006.txt +20 -20
  419. data/spec/templates/examples/module001.dot +33 -33
  420. data/spec/templates/examples/module001.html +833 -833
  421. data/spec/templates/examples/module001.txt +33 -33
  422. data/spec/templates/examples/module002.html +341 -341
  423. data/spec/templates/examples/module003.html +202 -202
  424. data/spec/templates/examples/module004.html +394 -394
  425. data/spec/templates/examples/module005.html +81 -81
  426. data/spec/templates/examples/tag001.txt +82 -82
  427. data/spec/templates/helpers/base_helper_spec.rb +171 -171
  428. data/spec/templates/helpers/html_helper_spec.rb +687 -668
  429. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +65 -65
  430. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +84 -84
  431. data/spec/templates/helpers/markup_helper_spec.rb +136 -136
  432. data/spec/templates/helpers/method_helper_spec.rb +107 -107
  433. data/spec/templates/helpers/module_helper_spec.rb +35 -35
  434. data/spec/templates/helpers/shared_signature_examples.rb +126 -126
  435. data/spec/templates/helpers/text_helper_spec.rb +65 -65
  436. data/spec/templates/method_spec.rb +118 -118
  437. data/spec/templates/module_spec.rb +203 -203
  438. data/spec/templates/onefile_spec.rb +66 -66
  439. data/spec/templates/section_spec.rb +144 -144
  440. data/spec/templates/spec_helper.rb +76 -76
  441. data/spec/templates/tag_spec.rb +52 -52
  442. data/spec/templates/template_spec.rb +410 -410
  443. data/spec/verifier_spec.rb +106 -106
  444. data/templates/default/class/dot/setup.rb +7 -7
  445. data/templates/default/class/dot/superklass.erb +2 -2
  446. data/templates/default/class/html/constructor_details.erb +8 -8
  447. data/templates/default/class/html/setup.rb +2 -2
  448. data/templates/default/class/html/subclasses.erb +4 -4
  449. data/templates/default/class/setup.rb +36 -36
  450. data/templates/default/class/text/setup.rb +12 -12
  451. data/templates/default/class/text/subclasses.erb +5 -5
  452. data/templates/default/constant/text/header.erb +11 -11
  453. data/templates/default/constant/text/setup.rb +4 -4
  454. data/templates/default/docstring/html/abstract.erb +4 -4
  455. data/templates/default/docstring/html/deprecated.erb +1 -1
  456. data/templates/default/docstring/html/index.erb +5 -5
  457. data/templates/default/docstring/html/note.erb +6 -6
  458. data/templates/default/docstring/html/private.erb +4 -4
  459. data/templates/default/docstring/html/text.erb +1 -1
  460. data/templates/default/docstring/html/todo.erb +6 -6
  461. data/templates/default/docstring/setup.rb +52 -52
  462. data/templates/default/docstring/text/abstract.erb +2 -2
  463. data/templates/default/docstring/text/deprecated.erb +2 -2
  464. data/templates/default/docstring/text/index.erb +2 -2
  465. data/templates/default/docstring/text/note.erb +3 -3
  466. data/templates/default/docstring/text/private.erb +2 -2
  467. data/templates/default/docstring/text/text.erb +1 -1
  468. data/templates/default/docstring/text/todo.erb +3 -3
  469. data/templates/default/fulldoc/html/css/full_list.css +58 -58
  470. data/templates/default/fulldoc/html/css/style.css +496 -496
  471. data/templates/default/fulldoc/html/frames.erb +17 -17
  472. data/templates/default/fulldoc/html/full_list.erb +37 -37
  473. data/templates/default/fulldoc/html/full_list_class.erb +2 -2
  474. data/templates/default/fulldoc/html/full_list_file.erb +7 -7
  475. data/templates/default/fulldoc/html/full_list_method.erb +10 -10
  476. data/templates/default/fulldoc/html/js/app.js +303 -292
  477. data/templates/default/fulldoc/html/js/full_list.js +216 -216
  478. data/templates/default/fulldoc/html/js/jquery.js +3 -3
  479. data/templates/default/fulldoc/html/setup.rb +241 -241
  480. data/templates/default/layout/dot/header.erb +5 -5
  481. data/templates/default/layout/dot/setup.rb +15 -15
  482. data/templates/default/layout/html/breadcrumb.erb +11 -11
  483. data/templates/default/layout/html/files.erb +11 -11
  484. data/templates/default/layout/html/footer.erb +5 -5
  485. data/templates/default/layout/html/headers.erb +15 -15
  486. data/templates/default/layout/html/index.erb +2 -2
  487. data/templates/default/layout/html/layout.erb +23 -23
  488. data/templates/default/layout/html/listing.erb +4 -4
  489. data/templates/default/layout/html/objects.erb +32 -32
  490. data/templates/default/layout/html/script_setup.erb +4 -4
  491. data/templates/default/layout/html/search.erb +12 -12
  492. data/templates/default/layout/html/setup.rb +89 -89
  493. data/templates/default/method/html/header.erb +16 -16
  494. data/templates/default/method/setup.rb +4 -4
  495. data/templates/default/method_details/html/header.erb +2 -2
  496. data/templates/default/method_details/html/method_signature.erb +24 -24
  497. data/templates/default/method_details/html/source.erb +9 -9
  498. data/templates/default/method_details/setup.rb +11 -11
  499. data/templates/default/method_details/text/header.erb +10 -10
  500. data/templates/default/method_details/text/method_signature.erb +12 -12
  501. data/templates/default/method_details/text/setup.rb +11 -11
  502. data/templates/default/module/dot/child.erb +1 -1
  503. data/templates/default/module/dot/dependencies.erb +2 -2
  504. data/templates/default/module/dot/header.erb +6 -6
  505. data/templates/default/module/dot/info.erb +13 -13
  506. data/templates/default/module/dot/setup.rb +15 -15
  507. data/templates/default/module/html/attribute_details.erb +10 -10
  508. data/templates/default/module/html/attribute_summary.erb +8 -8
  509. data/templates/default/module/html/box_info.erb +43 -43
  510. data/templates/default/module/html/children.erb +8 -8
  511. data/templates/default/module/html/constant_summary.erb +17 -17
  512. data/templates/default/module/html/defines.erb +2 -2
  513. data/templates/default/module/html/header.erb +5 -5
  514. data/templates/default/module/html/inherited_attributes.erb +14 -14
  515. data/templates/default/module/html/inherited_constants.erb +8 -8
  516. data/templates/default/module/html/inherited_methods.erb +18 -18
  517. data/templates/default/module/html/item_summary.erb +40 -40
  518. data/templates/default/module/html/method_details_list.erb +9 -9
  519. data/templates/default/module/html/method_summary.erb +13 -13
  520. data/templates/default/module/html/methodmissing.erb +12 -12
  521. data/templates/default/module/setup.rb +167 -167
  522. data/templates/default/module/text/children.erb +9 -9
  523. data/templates/default/module/text/class_meths_list.erb +7 -7
  524. data/templates/default/module/text/extends.erb +7 -7
  525. data/templates/default/module/text/header.erb +7 -7
  526. data/templates/default/module/text/includes.erb +7 -7
  527. data/templates/default/module/text/instance_meths_list.erb +7 -7
  528. data/templates/default/module/text/setup.rb +13 -13
  529. data/templates/default/onefile/html/files.erb +4 -4
  530. data/templates/default/onefile/html/headers.erb +6 -6
  531. data/templates/default/onefile/html/layout.erb +17 -17
  532. data/templates/default/onefile/html/readme.erb +2 -2
  533. data/templates/default/onefile/html/setup.rb +62 -62
  534. data/templates/default/root/dot/child.erb +2 -2
  535. data/templates/default/root/dot/setup.rb +6 -6
  536. data/templates/default/root/html/setup.rb +2 -2
  537. data/templates/default/tags/html/example.erb +10 -10
  538. data/templates/default/tags/html/index.erb +2 -2
  539. data/templates/default/tags/html/option.erb +24 -24
  540. data/templates/default/tags/html/overload.erb +13 -13
  541. data/templates/default/tags/html/see.erb +7 -7
  542. data/templates/default/tags/html/tag.erb +20 -20
  543. data/templates/default/tags/setup.rb +57 -57
  544. data/templates/default/tags/text/example.erb +12 -12
  545. data/templates/default/tags/text/index.erb +1 -1
  546. data/templates/default/tags/text/option.erb +20 -20
  547. data/templates/default/tags/text/overload.erb +19 -19
  548. data/templates/default/tags/text/see.erb +11 -11
  549. data/templates/default/tags/text/tag.erb +13 -13
  550. data/templates/guide/class/html/setup.rb +2 -2
  551. data/templates/guide/docstring/html/setup.rb +2 -2
  552. data/templates/guide/fulldoc/html/css/style.css +108 -108
  553. data/templates/guide/fulldoc/html/js/app.js +33 -33
  554. data/templates/guide/fulldoc/html/setup.rb +74 -74
  555. data/templates/guide/layout/html/layout.erb +81 -81
  556. data/templates/guide/layout/html/setup.rb +25 -25
  557. data/templates/guide/method/html/header.erb +17 -17
  558. data/templates/guide/method/html/setup.rb +22 -22
  559. data/templates/guide/module/html/header.erb +6 -6
  560. data/templates/guide/module/html/method_list.erb +4 -4
  561. data/templates/guide/module/html/setup.rb +27 -27
  562. data/templates/guide/onefile/html/files.erb +4 -4
  563. data/templates/guide/onefile/html/setup.rb +6 -6
  564. data/templates/guide/onefile/html/toc.erb +3 -3
  565. data/templates/guide/tags/html/setup.rb +9 -9
  566. data/yard.gemspec +43 -43
  567. metadata +4 -3
@@ -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,386 +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.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
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