yard 0.9.18 → 0.9.23

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