yard 0.9.16 → 0.9.17

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

Potentially problematic release.


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

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