yard 0.9.17 → 0.9.22

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 +774 -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 -1878
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- # Backward compatibility for gem specification lookup
4
- # @see Gem::SourceIndex
5
- module YARD
6
- module GemIndex
7
- module_function
8
-
9
- def find_all_by_name(*args)
10
- if defined?(Gem::Specification) && Gem::Specification.respond_to?(:find_all_by_name)
11
- Gem::Specification.find_all_by_name(*args)
12
- else
13
- Gem.source_index.find_name(*args)
14
- end
15
- end
16
-
17
- def each(&block)
18
- if defined?(Gem::Specification) && Gem::Specification.respond_to?(:each)
19
- Gem::Specification.each(&block)
20
- else
21
- Gem.source_index.find_name('').each(&block)
22
- end
23
- end
24
-
25
- def all
26
- each.to_a
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ # Backward compatibility for gem specification lookup
4
+ # @see Gem::SourceIndex
5
+ module YARD
6
+ module GemIndex
7
+ module_function
8
+
9
+ def find_all_by_name(*args)
10
+ if defined?(Gem::Specification) && Gem::Specification.respond_to?(:find_all_by_name)
11
+ Gem::Specification.find_all_by_name(*args)
12
+ else
13
+ Gem.source_index.find_name(*args)
14
+ end
15
+ end
16
+
17
+ def each(&block)
18
+ if defined?(Gem::Specification) && Gem::Specification.respond_to?(:each)
19
+ Gem::Specification.each(&block)
20
+ else
21
+ Gem.source_index.find_name('').each(&block)
22
+ end
23
+ end
24
+
25
+ def all
26
+ each.to_a
27
+ end
28
+ end
29
+ end
data/lib/yard/globals.rb CHANGED
@@ -1,22 +1,22 @@
1
- # frozen_string_literal: true
2
- # @group Global Convenience Methods
3
-
4
- # Shortcut for creating a YARD::CodeObjects::Proxy via a path
5
- #
6
- # @see YARD::CodeObjects::Proxy
7
- # @see YARD::Registry.resolve
8
- def P(namespace, name = nil, type = nil) # rubocop:disable Style/MethodName
9
- if name.nil?
10
- name = namespace
11
- namespace = nil
12
- end
13
- YARD::Registry.resolve(namespace, name, false, true, type)
14
- end
15
-
16
- # The global {YARD::Logger} instance
17
- #
18
- # @return [YARD::Logger] the global {YARD::Logger} instance
19
- # @see YARD::Logger
20
- def log
21
- YARD::Logger.instance
22
- end
1
+ # frozen_string_literal: true
2
+ # @group Global Convenience Methods
3
+
4
+ # Shortcut for creating a YARD::CodeObjects::Proxy via a path
5
+ #
6
+ # @see YARD::CodeObjects::Proxy
7
+ # @see YARD::Registry.resolve
8
+ def P(namespace, name = nil, type = nil) # rubocop:disable Style/MethodName
9
+ if name.nil?
10
+ name = namespace
11
+ namespace = nil
12
+ end
13
+ YARD::Registry.resolve(namespace, name, false, true, type)
14
+ end
15
+
16
+ # The global {YARD::Logger} instance
17
+ #
18
+ # @return [YARD::Logger] the global {YARD::Logger} instance
19
+ # @see YARD::Logger
20
+ def log
21
+ YARD::Logger.instance
22
+ end
@@ -1,595 +1,595 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- module Handlers
4
- # Raise this error when a handler should exit before completing.
5
- # The exception will be silenced, allowing the next handler(s) in the
6
- # queue to be executed.
7
- # @since 0.8.4
8
- class HandlerAborted < ::RuntimeError; end
9
-
10
- # Raised during processing phase when a handler needs to perform
11
- # an operation on an object's namespace but the namespace could
12
- # not be resolved.
13
- class NamespaceMissingError < Parser::UndocumentableError
14
- # The object the error occurred on
15
- # @return [CodeObjects::Base] a code object
16
- attr_accessor :object
17
-
18
- def initialize(object) @object = object end
19
- end
20
-
21
- # Handlers are pluggable semantic parsers for YARD's code generation
22
- # phase. They allow developers to control what information gets
23
- # generated by YARD, giving them the ability to, for instance, document
24
- # any Ruby DSLs that a customized framework may use. A good example
25
- # of this would be the ability to document and generate meta data for
26
- # the 'describe' declaration of the RSpec testing framework by simply
27
- # adding a handler for such a keyword. Similarly, any Ruby API that
28
- # takes advantage of class level declarations could add these to the
29
- # documentation in a very explicit format by treating them as first-
30
- # class objects in any outputted documentation.
31
- #
32
- # == Overview of a Typical Handler Scenario
33
- #
34
- # Generally, a handler class will declare a set of statements which
35
- # it will handle using the {handles} class declaration. It will then
36
- # implement the {#process} method to do the work. The processing would
37
- # usually involve the manipulation of the {#namespace}, {#owner}
38
- # {CodeObjects::Base code objects} or the creation of new ones, in
39
- # which case they should be registered by {#register}, a method that
40
- # sets some basic attributes for the new objects.
41
- #
42
- # Handlers are usually simple and take up to a page of code to process
43
- # and register a new object or add new attributes to the current +namespace+.
44
- #
45
- # == Setting up a Handler for Use
46
- #
47
- # A Handler is automatically registered when it is subclassed from the
48
- # base class. The only other thing that needs to be done is to specify
49
- # which statement the handler will process. This is done with the +handles+
50
- # declaration, taking either a {Parser::Ruby::Legacy::RubyToken}, {String} or `Regexp`.
51
- # Here is a simple example which processes module statements.
52
- #
53
- # class MyModuleHandler < YARD::Handlers::Base
54
- # handles TkMODULE
55
- #
56
- # def process
57
- # # do something
58
- # end
59
- # end
60
- #
61
- # == Processing Handler Data
62
- #
63
- # The goal of a specific handler is really up to the developer, and as
64
- # such there is no real guideline on how to process the data. However,
65
- # it is important to know where the data is coming from to be able to use
66
- # it.
67
- #
68
- # === +statement+ Attribute
69
- #
70
- # The +statement+ attribute pertains to the {Parser::Ruby::Legacy::Statement} object
71
- # containing a set of tokens parsed in by the parser. This is the main set
72
- # of data to be analyzed and processed. The comments attached to the statement
73
- # can be accessed by the {Parser::Ruby::Legacy::Statement#comments} method, but generally
74
- # the data to be processed will live in the +tokens+ attribute. This list
75
- # can be converted to a +String+ using +#to_s+ to parse the data with
76
- # regular expressions (or other text processing mechanisms), if needed.
77
- #
78
- # === +namespace+ Attribute
79
- #
80
- # The +namespace+ attribute is a {CodeObjects::NamespaceObject namespace object}
81
- # which represents the current namespace that the parser is in. For instance:
82
- #
83
- # module SomeModule
84
- # class MyClass
85
- # def mymethod; end
86
- # end
87
- # end
88
- #
89
- # If a handler was to parse the 'class MyClass' statement, it would
90
- # be necessary to know that it belonged inside the SomeModule module.
91
- # This is the value that +namespace+ would return when processing such
92
- # a statement. If the class was then entered and another handler was
93
- # called on the method, the +namespace+ would be set to the 'MyClass'
94
- # code object.
95
- #
96
- # === +owner+ Attribute
97
- #
98
- # The +owner+ attribute is similar to the +namespace+ attribute in that
99
- # it also follows the scope of the code during parsing. However, a namespace
100
- # object is loosely defined as a module or class and YARD has the ability
101
- # to parse beyond module and class blocks (inside methods, for instance),
102
- # so the +owner+ attribute would not be limited to modules and classes.
103
- #
104
- # To put this into context, the example from above will be used. If a method
105
- # handler was added to the mix and decided to parse inside the method body,
106
- # the +owner+ would be set to the method object but the namespace would remain
107
- # set to the class. This would allow the developer to process any method
108
- # definitions set inside a method (def x; def y; 2 end end) by adding them
109
- # to the correct namespace (the class, not the method).
110
- #
111
- # In summary, the distinction between +namespace+ and +owner+ can be thought
112
- # of as the difference between first-class Ruby objects (namespaces) and
113
- # second-class Ruby objects (methods).
114
- #
115
- # === +visibility+ and +scope+ Attributes
116
- #
117
- # Mainly needed for parsing methods, the +visibility+ and +scope+ attributes
118
- # refer to the public/protected/private and class/instance values (respectively)
119
- # of the current parsing position.
120
- #
121
- # == Parsing Blocks in Statements
122
- #
123
- # In addition to parsing a statement and creating new objects, some
124
- # handlers may wish to continue parsing the code inside the statement's
125
- # block (if there is one). In this context, a block means the inside
126
- # of any statement, be it class definition, module definition, if
127
- # statement or classic 'Ruby block'.
128
- #
129
- # For example, a class statement would be "class MyClass" and the block
130
- # would be a list of statements including the method definitions inside
131
- # the class. For a class handler, the programmer would execute the
132
- # {#parse_block} method to continue parsing code inside the block, with
133
- # the +namespace+ now pointing to the class object the handler created.
134
- #
135
- # YARD has the ability to continue into any block: class, module, method,
136
- # even if statements. For this reason, the block parsing method must be
137
- # invoked explicitly out of efficiency sake.
138
- #
139
- # @abstract Subclass this class to provide a handler for YARD to use
140
- # during the processing phase.
141
- #
142
- # @see CodeObjects::Base
143
- # @see CodeObjects::NamespaceObject
144
- # @see handles
145
- # @see #namespace
146
- # @see #owner
147
- # @see #register
148
- # @see #parse_block
149
- class Base
150
- # For accessing convenience, eg. "MethodObject"
151
- # instead of the full qualified namespace
152
- include YARD::CodeObjects
153
-
154
- include Parser
155
-
156
- class << self
157
- # Clear all registered subclasses. Testing purposes only
158
- # @return [void]
159
- def clear_subclasses
160
- @@subclasses = []
161
- end
162
-
163
- # Returns all registered handler subclasses.
164
- # @return [Array<Base>] a list of handlers
165
- def subclasses
166
- @@subclasses ||= []
167
- end
168
-
169
- def inherited(subclass)
170
- @@subclasses ||= []
171
- @@subclasses << subclass
172
- end
173
-
174
- # Declares the statement type which will be processed
175
- # by this handler.
176
- #
177
- # A match need not be unique to a handler. Multiple
178
- # handlers can process the same statement. However,
179
- # in this case, care should be taken to make sure that
180
- # {#parse_block} would only be executed by one of
181
- # the handlers, otherwise the same code will be parsed
182
- # multiple times and slow YARD down.
183
- #
184
- # @param [Parser::Ruby::Legacy::RubyToken, Symbol, String, Regexp] matches
185
- # statements that match the declaration will be
186
- # processed by this handler. A {String} match is
187
- # equivalent to a +/\Astring/+ regular expression
188
- # (match from the beginning of the line), and all
189
- # token matches match only the first token of the
190
- # statement.
191
- #
192
- def handles(*matches)
193
- (@handlers ||= []).concat(matches)
194
- end
195
-
196
- # This class is implemented by {Ruby::Base} and {Ruby::Legacy::Base}.
197
- # To implement a base handler class for another language, implement
198
- # this method to return true if the handler should process the given
199
- # statement object. Use {handlers} to enumerate the matchers declared
200
- # for the handler class.
201
- #
202
- # @param statement a statement object or node (depends on language type)
203
- # @return [Boolean] whether or not this handler object should process
204
- # the given statement
205
- def handles?(statement) # rubocop:disable Lint/UnusedMethodArgument
206
- raise NotImplementedError, "override #handles? in a subclass"
207
- end
208
-
209
- # @return [Array] a list of matchers for the handler object.
210
- # @see handles?
211
- def handlers
212
- @handlers ||= []
213
- end
214
-
215
- # Declares that the handler should only be called when inside a
216
- # {CodeObjects::NamespaceObject}, not a method body.
217
- #
218
- # @return [void]
219
- def namespace_only
220
- @namespace_only = true
221
- end
222
-
223
- # @return [Boolean] whether the handler should only be processed inside
224
- # a namespace.
225
- def namespace_only?
226
- @namespace_only ||= false
227
- end
228
-
229
- # Declares that a handler should only be called when inside a filename
230
- # by its basename or a regex match for the full path.
231
- #
232
- # @param [String, Regexp] filename a matching filename or regex
233
- # @return [void]
234
- # @since 0.6.2
235
- def in_file(filename)
236
- (@in_files ||= []) << filename
237
- end
238
-
239
- # @return [Boolean] whether the filename matches the declared file
240
- # match for a handler. If no file match is specified, returns true.
241
- # @since 0.6.2
242
- def matches_file?(filename)
243
- @in_files ||= nil # avoid ruby warnings
244
- return true unless @in_files
245
- @in_files.any? do |in_file|
246
- case in_file
247
- when String
248
- File.basename(filename) == in_file
249
- when Regexp
250
- filename =~ in_file
251
- else
252
- true
253
- end
254
- end
255
- end
256
-
257
- # Generates a +process+ method, equivalent to +def process; ... end+.
258
- # Blocks defined with this syntax will be wrapped inside an anonymous
259
- # module so that the handler class can be extended with mixins that
260
- # override the +process+ method without alias chaining.
261
- #
262
- # @!macro yard.handlers.process
263
- # @!method process
264
- # Main processing callback
265
- # @return [void]
266
- # @see #process
267
- # @return [void]
268
- # @since 0.5.4
269
- def process(&block)
270
- mod = Module.new
271
- mod.send(:define_method, :process, &block)
272
- include mod
273
- end
274
- end
275
-
276
- def initialize(source_parser, stmt)
277
- @parser = source_parser
278
- @statement = stmt
279
- end
280
-
281
- # The main handler method called by the parser on a statement
282
- # that matches the {handles} declaration.
283
- #
284
- # Subclasses should override this method to provide the handling
285
- # functionality for the class.
286
- #
287
- # @return [Array<CodeObjects::Base>, CodeObjects::Base, Object]
288
- # If this method returns a code object (or a list of them),
289
- # they are passed to the +#register+ method which adds basic
290
- # attributes. It is not necessary to return any objects and in
291
- # some cases you may want to explicitly avoid the returning of
292
- # any objects for post-processing by the register method.
293
- #
294
- # @see handles
295
- # @see #register
296
- #
297
- def process
298
- raise NotImplementedError, "#{self} did not implement a #process method for handling."
299
- end
300
-
301
- # Parses the semantic "block" contained in the statement node.
302
- #
303
- # @abstract Subclasses should call {Processor#process parser.process}
304
- def parse_block(*)
305
- raise NotImplementedError, "#{self} did not implement a #parse_block method for handling"
306
- end
307
-
308
- # @return [Processor] the processor object that manages all global state
309
- # during handling.
310
- attr_reader :parser
311
-
312
- # @return [Object] the statement object currently being processed. Usually
313
- # refers to one semantic language statement, though the strict definition
314
- # depends on the parser used.
315
- attr_reader :statement
316
-
317
- # (see Processor#owner)
318
- attr_accessor :owner
319
-
320
- # (see Processor#namespace)
321
- attr_accessor :namespace
322
-
323
- # (see Processor#visibility)
324
- attr_accessor :visibility
325
-
326
- # (see Processor#scope)
327
- attr_accessor :scope
328
-
329
- # (see Processor#globals)
330
- attr_reader :globals
331
-
332
- # (see Processor#extra_state)
333
- attr_reader :extra_state
334
-
335
- undef owner, owner=, namespace, namespace=
336
- undef visibility, visibility=, scope, scope=
337
- undef globals, extra_state
338
-
339
- def owner; parser.owner end
340
- def owner=(v) parser.owner = v end
341
- def namespace; parser.namespace end
342
- def namespace=(v); parser.namespace = v end
343
- def visibility; parser.visibility end
344
- def visibility=(v); parser.visibility = v end
345
- def scope; parser.scope end
346
- def scope=(v); parser.scope = v end
347
- def globals; parser.globals end
348
- def extra_state; parser.extra_state end
349
-
350
- # Aborts a handler by raising {Handlers::HandlerAborted}.
351
- # An exception will only be logged in debugging mode for
352
- # this kind of handler exit.
353
- #
354
- # @since 0.8.4
355
- def abort!
356
- raise Handlers::HandlerAborted
357
- end
358
-
359
- # Executes a given block with specific state values for {#owner},
360
- # {#namespace} and {#scope}.
361
- #
362
- # @option opts [CodeObjects::NamespaceObject] :namespace (value of #namespace)
363
- # the namespace object that {#namespace} will be equal to for the
364
- # duration of the block.
365
- # @option opts [Symbol] :scope (:instance)
366
- # the scope for the duration of the block.
367
- # @option opts [CodeObjects::Base] :owner (value of #owner)
368
- # the owner object (method) for the duration of the block
369
- # @yield a block to execute with the given state values.
370
- def push_state(opts = {})
371
- opts = {
372
- :namespace => namespace,
373
- :scope => :instance,
374
- :owner => owner || namespace,
375
- :visibility => nil
376
- }.update(opts)
377
-
378
- ns = namespace
379
- vis = visibility
380
- sc = scope
381
- oo = owner
382
- self.namespace = opts[:namespace]
383
- self.visibility = opts[:visibility] || :public
384
- self.scope = opts[:scope]
385
- self.owner = opts[:owner]
386
-
387
- yield
388
-
389
- self.namespace = ns
390
- self.visibility = vis
391
- self.scope = sc
392
- self.owner = oo
393
- end
394
-
395
- # Do some post processing on a list of code objects.
396
- # Adds basic attributes to the list of objects like
397
- # the filename, line number, {CodeObjects::Base#dynamic},
398
- # source code and {CodeObjects::Base#docstring},
399
- # but only if they don't exist.
400
- #
401
- # @param [Array<CodeObjects::Base>] objects
402
- # the list of objects to post-process.
403
- #
404
- # @return [CodeObjects::Base, Array<CodeObjects::Base>]
405
- # returns whatever is passed in, for chainability.
406
- #
407
- def register(*objects)
408
- objects.flatten.each do |object|
409
- next unless object.is_a?(CodeObjects::Base)
410
- register_ensure_loaded(object)
411
- yield(object) if block_given?
412
- register_file_info(object)
413
- register_source(object)
414
- register_visibility(object)
415
- register_docstring(object)
416
- register_group(object)
417
- register_dynamic(object)
418
- register_module_function(object)
419
- end
420
- objects.size == 1 ? objects.first : objects
421
- end
422
-
423
- # Ensures that the object's namespace is loaded before attaching it
424
- # to the namespace.
425
- #
426
- # @param [CodeObjects::Base] object the object to register
427
- # @return [void]
428
- # @since 0.8.0
429
- def register_ensure_loaded(object)
430
- ensure_loaded!(object.namespace)
431
- object.namespace.children << object
432
- rescue NamespaceMissingError
433
- nil # noop
434
- end
435
-
436
- # Registers the file/line of the declaration with the object
437
- #
438
- # @param [CodeObjects::Base] object the object to register
439
- # @return [void]
440
- # @since 0.8.0
441
- def register_file_info(object, file = parser.file, line = statement.line, comments = statement.comments)
442
- object.add_file(file, line, comments)
443
- end
444
-
445
- # Registers any docstring found for the object and expands macros
446
- #
447
- # @param [CodeObjects::Base] object the object to register
448
- # @return [void]
449
- # @since 0.8.0
450
- def register_docstring(object, docstring = statement.comments, stmt = statement)
451
- docstring = docstring.join("\n") if Array === docstring
452
- parser = Docstring.parser
453
- parser.parse(docstring || "", object, self)
454
-
455
- if object && docstring
456
- object.docstring = parser.to_docstring
457
-
458
- # Add hash_flag/line_range
459
- if stmt
460
- object.docstring.hash_flag = stmt.comments_hash_flag
461
- object.docstring.line_range = stmt.comments_range
462
- end
463
- end
464
-
465
- register_transitive_tags(object)
466
- end
467
-
468
- # Registers the object as being inside a specific group
469
- #
470
- # @param [CodeObjects::Base] object the object to register
471
- # @return [void]
472
- # @since 0.8.0
473
- def register_group(object, group = extra_state.group)
474
- if group
475
- unless object.namespace.is_a?(Proxy)
476
- object.namespace.groups |= [group]
477
- end
478
- object.group = group
479
- end
480
- end
481
-
482
- # Registers any transitive tags from the namespace on the object
483
- #
484
- # @param [CodeObjects::Base, nil] object the object to register
485
- # @return [void]
486
- # @since 0.8.0
487
- def register_transitive_tags(object)
488
- return unless object && !object.namespace.is_a?(Proxy)
489
- Tags::Library.transitive_tags.each do |tag|
490
- next unless object.namespace.has_tag?(tag)
491
- next if object.has_tag?(tag)
492
- object.add_tag(*object.namespace.tags(tag))
493
- end
494
- end
495
-
496
- # @param [CodeObjects::Base] object the object to register
497
- # @return [void]
498
- # @since 0.8.0
499
- def register_source(object, source = statement, type = parser.parser_type)
500
- return unless object.is_a?(MethodObject)
501
- object.source ||= source
502
- object.source_type = type
503
- end
504
-
505
- # Registers visibility on a method object. If the object does not
506
- # respond to setting visibility, nothing is done.
507
- #
508
- # @param [#visibility=] object the object to register
509
- # @param [Symbol] visibility the visibility to set on the object
510
- # @since 0.8.0
511
- def register_visibility(object, visibility = self.visibility)
512
- return unless object.respond_to?(:visibility=)
513
- return if object.is_a?(NamespaceObject)
514
- object.visibility = visibility
515
- end
516
-
517
- # Registers the same method information on the module function, if
518
- # the object was defined as a module function.
519
- #
520
- # @param [CodeObjects::Base] object the possible module function object
521
- # to copy data for
522
- # @since 0.8.0
523
- def register_module_function(object)
524
- return unless object.is_a?(MethodObject)
525
- return unless object.module_function?
526
- modobj = MethodObject.new(object.namespace, object.name)
527
- object.copy_to(modobj)
528
- modobj.visibility = :private # rubocop:disable Lint/UselessSetterCall
529
- end
530
-
531
- # Registers the object as dynamic if the object is defined inside
532
- # a method or block (owner != namespace)
533
- #
534
- # @param [CodeObjects::Base] object the object to register
535
- # @return [void]
536
- # @since 0.8.0
537
- def register_dynamic(object)
538
- object.dynamic = true if owner != namespace
539
- end
540
-
541
- # Ensures that a specific +object+ has been parsed and loaded into the
542
- # registry. This is necessary when adding data to a namespace, for instance,
543
- # since the namespace may not have been processed yet (it can be located
544
- # in a file that has not been handled).
545
- #
546
- # Calling this method defers the handler until all other files have been
547
- # processed. If the object gets resolved, the rest of the handler continues,
548
- # otherwise an exception is raised.
549
- #
550
- # @example Adding a mixin to the String class programmatically
551
- # ensure_loaded! P('String')
552
- # # "String" is now guaranteed to be loaded
553
- # P('String').mixins << P('MyMixin')
554
- #
555
- # @param [Proxy, CodeObjects::Base] object the object to resolve.
556
- # @param [Integer] max_retries the number of times to defer the handler
557
- # before raising a +NamespaceMissingError+.
558
- # @raise [NamespaceMissingError] if the object is not resolved within
559
- # +max_retries+ attempts, this exception is raised and the handler
560
- # finishes processing.
561
- def ensure_loaded!(object, max_retries = 1)
562
- return if object.root?
563
- return object unless object.is_a?(Proxy)
564
-
565
- retries = 0
566
- while object.is_a?(Proxy)
567
- raise NamespaceMissingError, object if retries > max_retries
568
- log.debug "Missing object #{object} in file `#{parser.file}', moving it to the back of the line."
569
- parser.parse_remaining_files
570
- retries += 1
571
- end
572
- object
573
- end
574
-
575
- # @group Macro Support
576
-
577
- # @abstract Implement this method to return the parameters in a method call
578
- # statement. It should return an empty list if the statement is not a
579
- # method call.
580
- # @return [Array<String>] a list of argument names
581
- def call_params
582
- raise NotImplementedError
583
- end
584
-
585
- # @abstract Implement this method to return the method being called in
586
- # a method call. It should return nil if the statement is not a method
587
- # call.
588
- # @return [String] the method name being called
589
- # @return [nil] if the statement is not a method call
590
- def caller_method
591
- raise NotImplementedError
592
- end
593
- end
594
- end
595
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ module Handlers
4
+ # Raise this error when a handler should exit before completing.
5
+ # The exception will be silenced, allowing the next handler(s) in the
6
+ # queue to be executed.
7
+ # @since 0.8.4
8
+ class HandlerAborted < ::RuntimeError; end
9
+
10
+ # Raised during processing phase when a handler needs to perform
11
+ # an operation on an object's namespace but the namespace could
12
+ # not be resolved.
13
+ class NamespaceMissingError < Parser::UndocumentableError
14
+ # The object the error occurred on
15
+ # @return [CodeObjects::Base] a code object
16
+ attr_accessor :object
17
+
18
+ def initialize(object) @object = object end
19
+ end
20
+
21
+ # Handlers are pluggable semantic parsers for YARD's code generation
22
+ # phase. They allow developers to control what information gets
23
+ # generated by YARD, giving them the ability to, for instance, document
24
+ # any Ruby DSLs that a customized framework may use. A good example
25
+ # of this would be the ability to document and generate meta data for
26
+ # the 'describe' declaration of the RSpec testing framework by simply
27
+ # adding a handler for such a keyword. Similarly, any Ruby API that
28
+ # takes advantage of class level declarations could add these to the
29
+ # documentation in a very explicit format by treating them as first-
30
+ # class objects in any outputted documentation.
31
+ #
32
+ # == Overview of a Typical Handler Scenario
33
+ #
34
+ # Generally, a handler class will declare a set of statements which
35
+ # it will handle using the {handles} class declaration. It will then
36
+ # implement the {#process} method to do the work. The processing would
37
+ # usually involve the manipulation of the {#namespace}, {#owner}
38
+ # {CodeObjects::Base code objects} or the creation of new ones, in
39
+ # which case they should be registered by {#register}, a method that
40
+ # sets some basic attributes for the new objects.
41
+ #
42
+ # Handlers are usually simple and take up to a page of code to process
43
+ # and register a new object or add new attributes to the current +namespace+.
44
+ #
45
+ # == Setting up a Handler for Use
46
+ #
47
+ # A Handler is automatically registered when it is subclassed from the
48
+ # base class. The only other thing that needs to be done is to specify
49
+ # which statement the handler will process. This is done with the +handles+
50
+ # declaration, taking either a {Parser::Ruby::Legacy::RubyToken}, {String} or `Regexp`.
51
+ # Here is a simple example which processes module statements.
52
+ #
53
+ # class MyModuleHandler < YARD::Handlers::Base
54
+ # handles TkMODULE
55
+ #
56
+ # def process
57
+ # # do something
58
+ # end
59
+ # end
60
+ #
61
+ # == Processing Handler Data
62
+ #
63
+ # The goal of a specific handler is really up to the developer, and as
64
+ # such there is no real guideline on how to process the data. However,
65
+ # it is important to know where the data is coming from to be able to use
66
+ # it.
67
+ #
68
+ # === +statement+ Attribute
69
+ #
70
+ # The +statement+ attribute pertains to the {Parser::Ruby::Legacy::Statement} object
71
+ # containing a set of tokens parsed in by the parser. This is the main set
72
+ # of data to be analyzed and processed. The comments attached to the statement
73
+ # can be accessed by the {Parser::Ruby::Legacy::Statement#comments} method, but generally
74
+ # the data to be processed will live in the +tokens+ attribute. This list
75
+ # can be converted to a +String+ using +#to_s+ to parse the data with
76
+ # regular expressions (or other text processing mechanisms), if needed.
77
+ #
78
+ # === +namespace+ Attribute
79
+ #
80
+ # The +namespace+ attribute is a {CodeObjects::NamespaceObject namespace object}
81
+ # which represents the current namespace that the parser is in. For instance:
82
+ #
83
+ # module SomeModule
84
+ # class MyClass
85
+ # def mymethod; end
86
+ # end
87
+ # end
88
+ #
89
+ # If a handler was to parse the 'class MyClass' statement, it would
90
+ # be necessary to know that it belonged inside the SomeModule module.
91
+ # This is the value that +namespace+ would return when processing such
92
+ # a statement. If the class was then entered and another handler was
93
+ # called on the method, the +namespace+ would be set to the 'MyClass'
94
+ # code object.
95
+ #
96
+ # === +owner+ Attribute
97
+ #
98
+ # The +owner+ attribute is similar to the +namespace+ attribute in that
99
+ # it also follows the scope of the code during parsing. However, a namespace
100
+ # object is loosely defined as a module or class and YARD has the ability
101
+ # to parse beyond module and class blocks (inside methods, for instance),
102
+ # so the +owner+ attribute would not be limited to modules and classes.
103
+ #
104
+ # To put this into context, the example from above will be used. If a method
105
+ # handler was added to the mix and decided to parse inside the method body,
106
+ # the +owner+ would be set to the method object but the namespace would remain
107
+ # set to the class. This would allow the developer to process any method
108
+ # definitions set inside a method (def x; def y; 2 end end) by adding them
109
+ # to the correct namespace (the class, not the method).
110
+ #
111
+ # In summary, the distinction between +namespace+ and +owner+ can be thought
112
+ # of as the difference between first-class Ruby objects (namespaces) and
113
+ # second-class Ruby objects (methods).
114
+ #
115
+ # === +visibility+ and +scope+ Attributes
116
+ #
117
+ # Mainly needed for parsing methods, the +visibility+ and +scope+ attributes
118
+ # refer to the public/protected/private and class/instance values (respectively)
119
+ # of the current parsing position.
120
+ #
121
+ # == Parsing Blocks in Statements
122
+ #
123
+ # In addition to parsing a statement and creating new objects, some
124
+ # handlers may wish to continue parsing the code inside the statement's
125
+ # block (if there is one). In this context, a block means the inside
126
+ # of any statement, be it class definition, module definition, if
127
+ # statement or classic 'Ruby block'.
128
+ #
129
+ # For example, a class statement would be "class MyClass" and the block
130
+ # would be a list of statements including the method definitions inside
131
+ # the class. For a class handler, the programmer would execute the
132
+ # {#parse_block} method to continue parsing code inside the block, with
133
+ # the +namespace+ now pointing to the class object the handler created.
134
+ #
135
+ # YARD has the ability to continue into any block: class, module, method,
136
+ # even if statements. For this reason, the block parsing method must be
137
+ # invoked explicitly out of efficiency sake.
138
+ #
139
+ # @abstract Subclass this class to provide a handler for YARD to use
140
+ # during the processing phase.
141
+ #
142
+ # @see CodeObjects::Base
143
+ # @see CodeObjects::NamespaceObject
144
+ # @see handles
145
+ # @see #namespace
146
+ # @see #owner
147
+ # @see #register
148
+ # @see #parse_block
149
+ class Base
150
+ # For accessing convenience, eg. "MethodObject"
151
+ # instead of the full qualified namespace
152
+ include YARD::CodeObjects
153
+
154
+ include Parser
155
+
156
+ class << self
157
+ # Clear all registered subclasses. Testing purposes only
158
+ # @return [void]
159
+ def clear_subclasses
160
+ @@subclasses = []
161
+ end
162
+
163
+ # Returns all registered handler subclasses.
164
+ # @return [Array<Base>] a list of handlers
165
+ def subclasses
166
+ @@subclasses ||= []
167
+ end
168
+
169
+ def inherited(subclass)
170
+ @@subclasses ||= []
171
+ @@subclasses << subclass
172
+ end
173
+
174
+ # Declares the statement type which will be processed
175
+ # by this handler.
176
+ #
177
+ # A match need not be unique to a handler. Multiple
178
+ # handlers can process the same statement. However,
179
+ # in this case, care should be taken to make sure that
180
+ # {#parse_block} would only be executed by one of
181
+ # the handlers, otherwise the same code will be parsed
182
+ # multiple times and slow YARD down.
183
+ #
184
+ # @param [Parser::Ruby::Legacy::RubyToken, Symbol, String, Regexp] matches
185
+ # statements that match the declaration will be
186
+ # processed by this handler. A {String} match is
187
+ # equivalent to a +/\Astring/+ regular expression
188
+ # (match from the beginning of the line), and all
189
+ # token matches match only the first token of the
190
+ # statement.
191
+ #
192
+ def handles(*matches)
193
+ (@handlers ||= []).concat(matches)
194
+ end
195
+
196
+ # This class is implemented by {Ruby::Base} and {Ruby::Legacy::Base}.
197
+ # To implement a base handler class for another language, implement
198
+ # this method to return true if the handler should process the given
199
+ # statement object. Use {handlers} to enumerate the matchers declared
200
+ # for the handler class.
201
+ #
202
+ # @param statement a statement object or node (depends on language type)
203
+ # @return [Boolean] whether or not this handler object should process
204
+ # the given statement
205
+ def handles?(statement) # rubocop:disable Lint/UnusedMethodArgument
206
+ raise NotImplementedError, "override #handles? in a subclass"
207
+ end
208
+
209
+ # @return [Array] a list of matchers for the handler object.
210
+ # @see handles?
211
+ def handlers
212
+ @handlers ||= []
213
+ end
214
+
215
+ # Declares that the handler should only be called when inside a
216
+ # {CodeObjects::NamespaceObject}, not a method body.
217
+ #
218
+ # @return [void]
219
+ def namespace_only
220
+ @namespace_only = true
221
+ end
222
+
223
+ # @return [Boolean] whether the handler should only be processed inside
224
+ # a namespace.
225
+ def namespace_only?
226
+ @namespace_only ||= false
227
+ end
228
+
229
+ # Declares that a handler should only be called when inside a filename
230
+ # by its basename or a regex match for the full path.
231
+ #
232
+ # @param [String, Regexp] filename a matching filename or regex
233
+ # @return [void]
234
+ # @since 0.6.2
235
+ def in_file(filename)
236
+ (@in_files ||= []) << filename
237
+ end
238
+
239
+ # @return [Boolean] whether the filename matches the declared file
240
+ # match for a handler. If no file match is specified, returns true.
241
+ # @since 0.6.2
242
+ def matches_file?(filename)
243
+ @in_files ||= nil # avoid ruby warnings
244
+ return true unless @in_files
245
+ @in_files.any? do |in_file|
246
+ case in_file
247
+ when String
248
+ File.basename(filename) == in_file
249
+ when Regexp
250
+ filename =~ in_file
251
+ else
252
+ true
253
+ end
254
+ end
255
+ end
256
+
257
+ # Generates a +process+ method, equivalent to +def process; ... end+.
258
+ # Blocks defined with this syntax will be wrapped inside an anonymous
259
+ # module so that the handler class can be extended with mixins that
260
+ # override the +process+ method without alias chaining.
261
+ #
262
+ # @!macro yard.handlers.process
263
+ # @!method process
264
+ # Main processing callback
265
+ # @return [void]
266
+ # @see #process
267
+ # @return [void]
268
+ # @since 0.5.4
269
+ def process(&block)
270
+ mod = Module.new
271
+ mod.send(:define_method, :process, &block)
272
+ include mod
273
+ end
274
+ end
275
+
276
+ def initialize(source_parser, stmt)
277
+ @parser = source_parser
278
+ @statement = stmt
279
+ end
280
+
281
+ # The main handler method called by the parser on a statement
282
+ # that matches the {handles} declaration.
283
+ #
284
+ # Subclasses should override this method to provide the handling
285
+ # functionality for the class.
286
+ #
287
+ # @return [Array<CodeObjects::Base>, CodeObjects::Base, Object]
288
+ # If this method returns a code object (or a list of them),
289
+ # they are passed to the +#register+ method which adds basic
290
+ # attributes. It is not necessary to return any objects and in
291
+ # some cases you may want to explicitly avoid the returning of
292
+ # any objects for post-processing by the register method.
293
+ #
294
+ # @see handles
295
+ # @see #register
296
+ #
297
+ def process
298
+ raise NotImplementedError, "#{self} did not implement a #process method for handling."
299
+ end
300
+
301
+ # Parses the semantic "block" contained in the statement node.
302
+ #
303
+ # @abstract Subclasses should call {Processor#process parser.process}
304
+ def parse_block(*)
305
+ raise NotImplementedError, "#{self} did not implement a #parse_block method for handling"
306
+ end
307
+
308
+ # @return [Processor] the processor object that manages all global state
309
+ # during handling.
310
+ attr_reader :parser
311
+
312
+ # @return [Object] the statement object currently being processed. Usually
313
+ # refers to one semantic language statement, though the strict definition
314
+ # depends on the parser used.
315
+ attr_reader :statement
316
+
317
+ # (see Processor#owner)
318
+ attr_accessor :owner
319
+
320
+ # (see Processor#namespace)
321
+ attr_accessor :namespace
322
+
323
+ # (see Processor#visibility)
324
+ attr_accessor :visibility
325
+
326
+ # (see Processor#scope)
327
+ attr_accessor :scope
328
+
329
+ # (see Processor#globals)
330
+ attr_reader :globals
331
+
332
+ # (see Processor#extra_state)
333
+ attr_reader :extra_state
334
+
335
+ undef owner, owner=, namespace, namespace=
336
+ undef visibility, visibility=, scope, scope=
337
+ undef globals, extra_state
338
+
339
+ def owner; parser.owner end
340
+ def owner=(v) parser.owner = v end
341
+ def namespace; parser.namespace end
342
+ def namespace=(v); parser.namespace = v end
343
+ def visibility; parser.visibility end
344
+ def visibility=(v); parser.visibility = v end
345
+ def scope; parser.scope end
346
+ def scope=(v); parser.scope = v end
347
+ def globals; parser.globals end
348
+ def extra_state; parser.extra_state end
349
+
350
+ # Aborts a handler by raising {Handlers::HandlerAborted}.
351
+ # An exception will only be logged in debugging mode for
352
+ # this kind of handler exit.
353
+ #
354
+ # @since 0.8.4
355
+ def abort!
356
+ raise Handlers::HandlerAborted
357
+ end
358
+
359
+ # Executes a given block with specific state values for {#owner},
360
+ # {#namespace} and {#scope}.
361
+ #
362
+ # @option opts [CodeObjects::NamespaceObject] :namespace (value of #namespace)
363
+ # the namespace object that {#namespace} will be equal to for the
364
+ # duration of the block.
365
+ # @option opts [Symbol] :scope (:instance)
366
+ # the scope for the duration of the block.
367
+ # @option opts [CodeObjects::Base] :owner (value of #owner)
368
+ # the owner object (method) for the duration of the block
369
+ # @yield a block to execute with the given state values.
370
+ def push_state(opts = {})
371
+ opts = {
372
+ :namespace => namespace,
373
+ :scope => :instance,
374
+ :owner => owner || namespace,
375
+ :visibility => nil
376
+ }.update(opts)
377
+
378
+ ns = namespace
379
+ vis = visibility
380
+ sc = scope
381
+ oo = owner
382
+ self.namespace = opts[:namespace]
383
+ self.visibility = opts[:visibility] || :public
384
+ self.scope = opts[:scope]
385
+ self.owner = opts[:owner]
386
+
387
+ yield
388
+
389
+ self.namespace = ns
390
+ self.visibility = vis
391
+ self.scope = sc
392
+ self.owner = oo
393
+ end
394
+
395
+ # Do some post processing on a list of code objects.
396
+ # Adds basic attributes to the list of objects like
397
+ # the filename, line number, {CodeObjects::Base#dynamic},
398
+ # source code and {CodeObjects::Base#docstring},
399
+ # but only if they don't exist.
400
+ #
401
+ # @param [Array<CodeObjects::Base>] objects
402
+ # the list of objects to post-process.
403
+ #
404
+ # @return [CodeObjects::Base, Array<CodeObjects::Base>]
405
+ # returns whatever is passed in, for chainability.
406
+ #
407
+ def register(*objects)
408
+ objects.flatten.each do |object|
409
+ next unless object.is_a?(CodeObjects::Base)
410
+ register_ensure_loaded(object)
411
+ yield(object) if block_given?
412
+ register_file_info(object)
413
+ register_source(object)
414
+ register_visibility(object)
415
+ register_docstring(object)
416
+ register_group(object)
417
+ register_dynamic(object)
418
+ register_module_function(object)
419
+ end
420
+ objects.size == 1 ? objects.first : objects
421
+ end
422
+
423
+ # Ensures that the object's namespace is loaded before attaching it
424
+ # to the namespace.
425
+ #
426
+ # @param [CodeObjects::Base] object the object to register
427
+ # @return [void]
428
+ # @since 0.8.0
429
+ def register_ensure_loaded(object)
430
+ ensure_loaded!(object.namespace)
431
+ object.namespace.children << object
432
+ rescue NamespaceMissingError
433
+ nil # noop
434
+ end
435
+
436
+ # Registers the file/line of the declaration with the object
437
+ #
438
+ # @param [CodeObjects::Base] object the object to register
439
+ # @return [void]
440
+ # @since 0.8.0
441
+ def register_file_info(object, file = parser.file, line = statement.line, comments = statement.comments)
442
+ object.add_file(file, line, comments)
443
+ end
444
+
445
+ # Registers any docstring found for the object and expands macros
446
+ #
447
+ # @param [CodeObjects::Base] object the object to register
448
+ # @return [void]
449
+ # @since 0.8.0
450
+ def register_docstring(object, docstring = statement.comments, stmt = statement)
451
+ docstring = docstring.join("\n") if Array === docstring
452
+ parser = Docstring.parser
453
+ parser.parse(docstring || "", object, self)
454
+
455
+ if object && docstring
456
+ object.docstring = parser.to_docstring
457
+
458
+ # Add hash_flag/line_range
459
+ if stmt
460
+ object.docstring.hash_flag = stmt.comments_hash_flag
461
+ object.docstring.line_range = stmt.comments_range
462
+ end
463
+ end
464
+
465
+ register_transitive_tags(object)
466
+ end
467
+
468
+ # Registers the object as being inside a specific group
469
+ #
470
+ # @param [CodeObjects::Base] object the object to register
471
+ # @return [void]
472
+ # @since 0.8.0
473
+ def register_group(object, group = extra_state.group)
474
+ if group
475
+ unless object.namespace.is_a?(Proxy)
476
+ object.namespace.groups |= [group]
477
+ end
478
+ object.group = group
479
+ end
480
+ end
481
+
482
+ # Registers any transitive tags from the namespace on the object
483
+ #
484
+ # @param [CodeObjects::Base, nil] object the object to register
485
+ # @return [void]
486
+ # @since 0.8.0
487
+ def register_transitive_tags(object)
488
+ return unless object && !object.namespace.is_a?(Proxy)
489
+ Tags::Library.transitive_tags.each do |tag|
490
+ next unless object.namespace.has_tag?(tag)
491
+ next if object.has_tag?(tag)
492
+ object.add_tag(*object.namespace.tags(tag))
493
+ end
494
+ end
495
+
496
+ # @param [CodeObjects::Base] object the object to register
497
+ # @return [void]
498
+ # @since 0.8.0
499
+ def register_source(object, source = statement, type = parser.parser_type)
500
+ return unless object.is_a?(MethodObject)
501
+ object.source ||= source
502
+ object.source_type = type
503
+ end
504
+
505
+ # Registers visibility on a method object. If the object does not
506
+ # respond to setting visibility, nothing is done.
507
+ #
508
+ # @param [#visibility=] object the object to register
509
+ # @param [Symbol] visibility the visibility to set on the object
510
+ # @since 0.8.0
511
+ def register_visibility(object, visibility = self.visibility)
512
+ return unless object.respond_to?(:visibility=)
513
+ return if object.is_a?(NamespaceObject)
514
+ object.visibility = visibility
515
+ end
516
+
517
+ # Registers the same method information on the module function, if
518
+ # the object was defined as a module function.
519
+ #
520
+ # @param [CodeObjects::Base] object the possible module function object
521
+ # to copy data for
522
+ # @since 0.8.0
523
+ def register_module_function(object)
524
+ return unless object.is_a?(MethodObject)
525
+ return unless object.module_function?
526
+ modobj = MethodObject.new(object.namespace, object.name)
527
+ object.copy_to(modobj)
528
+ modobj.visibility = :private # rubocop:disable Lint/UselessSetterCall
529
+ end
530
+
531
+ # Registers the object as dynamic if the object is defined inside
532
+ # a method or block (owner != namespace)
533
+ #
534
+ # @param [CodeObjects::Base] object the object to register
535
+ # @return [void]
536
+ # @since 0.8.0
537
+ def register_dynamic(object)
538
+ object.dynamic = true if owner != namespace
539
+ end
540
+
541
+ # Ensures that a specific +object+ has been parsed and loaded into the
542
+ # registry. This is necessary when adding data to a namespace, for instance,
543
+ # since the namespace may not have been processed yet (it can be located
544
+ # in a file that has not been handled).
545
+ #
546
+ # Calling this method defers the handler until all other files have been
547
+ # processed. If the object gets resolved, the rest of the handler continues,
548
+ # otherwise an exception is raised.
549
+ #
550
+ # @example Adding a mixin to the String class programmatically
551
+ # ensure_loaded! P('String')
552
+ # # "String" is now guaranteed to be loaded
553
+ # P('String').mixins << P('MyMixin')
554
+ #
555
+ # @param [Proxy, CodeObjects::Base] object the object to resolve.
556
+ # @param [Integer] max_retries the number of times to defer the handler
557
+ # before raising a +NamespaceMissingError+.
558
+ # @raise [NamespaceMissingError] if the object is not resolved within
559
+ # +max_retries+ attempts, this exception is raised and the handler
560
+ # finishes processing.
561
+ def ensure_loaded!(object, max_retries = 1)
562
+ return if object.root?
563
+ return object unless object.is_a?(Proxy)
564
+
565
+ retries = 0
566
+ while object.is_a?(Proxy)
567
+ raise NamespaceMissingError, object if retries > max_retries
568
+ log.debug "Missing object #{object} in file `#{parser.file}', moving it to the back of the line."
569
+ parser.parse_remaining_files
570
+ retries += 1
571
+ end
572
+ object
573
+ end
574
+
575
+ # @group Macro Support
576
+
577
+ # @abstract Implement this method to return the parameters in a method call
578
+ # statement. It should return an empty list if the statement is not a
579
+ # method call.
580
+ # @return [Array<String>] a list of argument names
581
+ def call_params
582
+ raise NotImplementedError
583
+ end
584
+
585
+ # @abstract Implement this method to return the method being called in
586
+ # a method call. It should return nil if the statement is not a method
587
+ # call.
588
+ # @return [String] the method name being called
589
+ # @return [nil] if the statement is not a method call
590
+ def caller_method
591
+ raise NotImplementedError
592
+ end
593
+ end
594
+ end
595
+ end