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,13 +1,13 @@
1
- # frozen_string_literal: true
2
- module YARD
3
- module Tags
4
- class DefaultTag < Tag
5
- attr_reader :defaults
6
-
7
- def initialize(tag_name, text, types = nil, name = nil, defaults = nil)
8
- super(tag_name, text, types, name)
9
- @defaults = defaults
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+ module YARD
3
+ module Tags
4
+ class DefaultTag < Tag
5
+ attr_reader :defaults
6
+
7
+ def initialize(tag_name, text, types = nil, name = nil, defaults = nil)
8
+ super(tag_name, text, types, name)
9
+ @defaults = defaults
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,616 +1,616 @@
1
- # frozen_string_literal: true
2
- require 'ostruct'
3
-
4
- module YARD
5
- module Tags
6
- # The base directive class. Subclass this class to create a custom
7
- # directive, registering it with {Library.define_directive}. Directive
8
- # classes are executed via the {#call} method, which perform all directive
9
- # processing on the object.
10
- #
11
- # If processing occurs within a handler, the {#handler} attribute is
12
- # available to access more information about parsing context and state.
13
- # Handlers are only available when parsing from {Parser::SourceParser},
14
- # not when parsing directly from {DocstringParser}. If the docstring is
15
- # attached to an object declaration, {#object} will be set and available
16
- # to modify the generated code object directly. Note that both of these
17
- # attributes may be nil, and directives should test their existence
18
- # before attempting to use them.
19
- #
20
- # @abstract Subclasses should implement {#call}.
21
- # @see Library.define_directive
22
- # @since 0.8.0
23
- class Directive
24
- # @return [Tag] the meta-data tag containing data input to the directive
25
- attr_accessor :tag
26
-
27
- # Set this field to replace the directive definition inside of a docstring
28
- # with arbitrary text. For instance, the {MacroDirective} uses this field
29
- # to expand its macro data in place of the call to a +@!macro+.
30
- #
31
- # @return [String] the text to expand in the original docstring in place
32
- # of this directive definition.
33
- # @return [nil] if no expansion should take place for this directive
34
- attr_accessor :expanded_text
35
-
36
- # @return [DocstringParser] the parser that is parsing all tag
37
- # information out of the docstring
38
- attr_accessor :parser
39
-
40
- # @!attribute [r] object
41
- # @return [CodeObjects::Base, nil] the object the parent docstring is
42
- # attached to. May be nil.
43
- def object; parser.object end
44
-
45
- # @!attribute [r] handler
46
- # @return [Handlers::Base, nil] the handler object the docstring parser
47
- # might be attached to. May be nil. Only available when parsing
48
- # through {Parser::SourceParser}.
49
- def handler; parser.handler end
50
-
51
- # @!endgroup
52
-
53
- # @param [Tag] tag the meta-data tag containing all input to the docstring
54
- # @param [DocstringParser] parser the docstring parser object
55
- def initialize(tag, parser)
56
- self.tag = tag
57
- self.parser = parser
58
- self.expanded_text = nil
59
- end
60
-
61
- # @!group Parser callbacks
62
-
63
- # Called when processing the directive. Subclasses should implement
64
- # this method to perform all functionality of the directive.
65
- #
66
- # @abstract implement this method to perform all data processing for
67
- # the directive.
68
- # @return [void]
69
- def call; raise NotImplementedError end
70
-
71
- # Called after parsing all directives and tags in the docstring. Used
72
- # to perform any cleanup after all directives perform their main task.
73
- # @return [void]
74
- def after_parse; end
75
-
76
- protected :parser
77
- end
78
-
79
- # Ends a group listing definition. Group definition automatically end
80
- # when class or module blocks are closed, and defining a new group overrides
81
- # the last group definition, but occasionally you need to end the current
82
- # group to return to the default listing. Use {tag:!group} to begin a
83
- # group listing.
84
- #
85
- # @example
86
- # class Controller
87
- # # @!group Callbacks
88
- #
89
- # def before_filter; end
90
- # def after_filter; end
91
- #
92
- # # @!endgroup
93
- #
94
- # def index; end
95
- # end
96
- # @see tag:!group
97
- # @since 0.6.0
98
- class EndGroupDirective < Directive
99
- def call
100
- return unless handler
101
- handler.extra_state.group = nil
102
- end
103
- end
104
-
105
- # Defines a group listing. All methods (and attributes) seen after this
106
- # directive are placed into a group with the given description as the
107
- # group name. The group listing is used by templates to organize methods
108
- # and attributes into respective logical groups. To end a group listing
109
- # use {tag:!endgroup}.
110
- #
111
- # @note A group definition only applies to the scope it is defined in.
112
- # If a new class or module is opened after the directive, this directive
113
- # will not apply to methods in that class or module.
114
- # @example
115
- # # @!group Callbacks
116
- #
117
- # def before_filter; end
118
- # def after_filter; end
119
- # @see tag:!endgroup
120
- # @since 0.6.0
121
- class GroupDirective < Directive
122
- def call
123
- return unless handler
124
- handler.extra_state.group = tag.text
125
- end
126
- end
127
-
128
- # Defines a block of text to be expanded whenever the macro is called by name
129
- # in subsequent docstrings. The macro data can be any arbitrary text data, be
130
- # it regular documentation, meta-data tags or directives.
131
- #
132
- # == Defining a Macro
133
- #
134
- # A macro must first be defined in order to be used. Note that a macro is also
135
- # expanded upon definition if it defined on an object (the docstring of a
136
- # method, class, module or constant object as opposed to a free standing
137
- # comment). To define a macro, use the "new" or "attach" identifier in the
138
- # types specifier list. A macro will also automatically be created if an
139
- # indented macro data block is given, so the keywords are not strictly needed.
140
- #
141
- # === Anonymous Macros
142
- #
143
- # In addition to standard named macros, macros can be defined anonymously if
144
- # no name is given. In this case, they can not be re-used in future docstrings,
145
- # but they will expand in the first definition. This is useful when needing
146
- # to take advantage of the macro expansion variables (described below).
147
- #
148
- # == Using a Macro
149
- #
150
- # To re-use a macro in another docstring after it is defined, simply use
151
- # <tt>@!macro the_name</tt> with no indented block of macro data. The resulting
152
- # data will be expanded in place.
153
- #
154
- # == Attaching a Macro to a DSL Method
155
- #
156
- # Macros can be defined to auto-expand on DSL-style class method calls. To
157
- # define a macro to be auto expanded in this way, use the "attach" keyword
158
- # in the type specifier list ("new" is implied).
159
- #
160
- # Attached macros can also be attached directly on the class method declaration
161
- # that provides the DSL method to its subclasses. The syntax in either case
162
- # is the same.
163
- #
164
- # == Macro Expansion Variables
165
- #
166
- # In the case of using macros on DSL-style method calls, a number of expansion
167
- # variables can be used for interpolation inside of the macro data. The variables,
168
- # similar in syntax to Ruby's global variables, are as follows:
169
- #
170
- # * $0 - the method name being called
171
- # * $1, $2, $3, ... - the Nth argument in the method call
172
- # * $& - the full source line
173
- #
174
- # The following example shows what the expansion variables might hold for a given
175
- # DSL method call:
176
- #
177
- # property :foo, :a, :b, :c, String
178
- # # $0 => "property"
179
- # # $1 => "foo"
180
- # # $2 => "a"
181
- # # $& => "property :foo, :a, :b, :c, String"
182
- #
183
- # === Ranges
184
- #
185
- # Ranges are also acceptable with the syntax <tt>${N-M}</tt>. Negative values
186
- # on either N or M are valid, and refer to indexes from the end of the list.
187
- # Consider a DSL method that creates a method using the first argument with
188
- # argument names following, ending with the return type of the method. This
189
- # could be documented as:
190
- #
191
- # # @!macro dsl_method
192
- # # @!method $1(${2--2})
193
- # # @return [${-1}] the return value of $0
194
- # create_method_with_args :foo, :a, :b, :c, String
195
- #
196
- # As described, the method is using the signature <tt>foo(a, b, c)</tt> and the return
197
- # type from the last argument, +String+. When using ranges, tokens are joined
198
- # with commas. Note that this includes using $0:
199
- #
200
- # !!!plain
201
- # $0-1 # => Interpolates to "create_method_with_args, foo"
202
- #
203
- # If you want to separate them with spaces, use <tt>$1 $2 $3 $4 ...</tt>. Note that
204
- # if the token cannot be expanded, it will return the empty string (not an error),
205
- # so it would be safe to list <tt>$1 $2 ... $10</tt>, for example.
206
- #
207
- # === Escaping Interpolation
208
- #
209
- # Interpolation can be escaped by prefixing the +$+ with +\\\+, like so:
210
- #
211
- # # @!macro foo
212
- # # I have \$2.00 USD.
213
- #
214
- # @example Defining a simple macro
215
- # # @!macro [new] returnself
216
- # # @return [self] returns itself
217
- # @example Using a simple macro in multiple docstrings
218
- # # Documentation for map
219
- # # ...
220
- # # @macro returnself
221
- # def map; end
222
- #
223
- # # Documentation for filter
224
- # # ...
225
- # # @macro returnself
226
- # def filter; end
227
- # @example Attaching a macro to a class method (for DSL usage)
228
- # class Resource
229
- # # Defines a new property
230
- # # @param [String] name the property name
231
- # # @param [Class] type the property's type
232
- # # @!macro [attach] property
233
- # # @return [$2] the $1 property
234
- # def self.property(name, type) end
235
- # end
236
- #
237
- # class Post < Resource
238
- # property :title, String
239
- # property :view_count, Integer
240
- # end
241
- # @example Attaching a macro directly to a DSL method
242
- # class Post < Resource
243
- # # @!macro [attach] property
244
- # # @return [$2] the $1 property
245
- # property :title, String
246
- #
247
- # # Macro will expand on this definition too
248
- # property :view_count, Integer
249
- # end
250
- # @since 0.7.0
251
- class MacroDirective < Directive
252
- def call
253
- raise TagFormatError if tag.name.nil? && tag.text.to_s.empty?
254
- macro_data = find_or_create
255
- unless macro_data
256
- warn
257
- return
258
- end
259
-
260
- self.expanded_text = expand(macro_data)
261
- end
262
-
263
- private
264
-
265
- def new?
266
- (tag.types && tag.types.include?('new')) ||
267
- (tag.text && !tag.text.strip.empty?)
268
- end
269
-
270
- def attach?
271
- new? && # must have data or there is nothing to attach
272
- class_method? || # always attach to class methods
273
- (tag.types && tag.types.include?('attach'))
274
- end
275
-
276
- def class_method?
277
- object && object.is_a?(CodeObjects::MethodObject) &&
278
- object.scope == :class
279
- end
280
-
281
- def anonymous?
282
- tag.name.nil? || tag.name.empty?
283
- end
284
-
285
- def expand(macro_data)
286
- return if attach? && class_method?
287
- return if !anonymous? && new? &&
288
- (!handler || handler.statement.source.empty?)
289
- call_params = []
290
- caller_method = nil
291
- full_source = ''
292
- if handler
293
- call_params = handler.call_params
294
- caller_method = handler.caller_method
295
- full_source = handler.statement.source
296
- end
297
- all_params = ([caller_method] + call_params).compact
298
- CodeObjects::MacroObject.expand(macro_data, all_params, full_source)
299
- end
300
-
301
- def find_or_create
302
- if new? || attach?
303
- if handler && attach?
304
- if object && object.is_a?(CodeObjects::NamespaceObject)
305
- log.warn "Attaching macros to non-methods is unsupported, ignoring: " \
306
- "#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
307
- obj = nil
308
- else
309
- obj = object ? object :
310
- P("#{handler.namespace}.#{handler.caller_method}")
311
- end
312
- else
313
- obj = nil
314
- end
315
-
316
- return tag.text || "" if anonymous? # anonymous macro
317
- macro = CodeObjects::MacroObject.create(tag.name, tag.text, obj)
318
- else
319
- macro = CodeObjects::MacroObject.find(tag.name)
320
- end
321
-
322
- macro ? macro.macro_data : nil
323
- end
324
-
325
- def warn
326
- if object && handler
327
- log.warn "Invalid/missing macro name for " \
328
- "#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
329
- end
330
- end
331
- end
332
-
333
- # Defines a method object with a given method signature, using indented
334
- # block data as the method's docstring. The signature is similar to the
335
- # {tag:overload} tag. The comment containing this directive does not need
336
- # to be attached to any source, but if it is, that source code will be
337
- # used as the method's source.
338
- #
339
- # To define an attribute method, see {tag:!attribute}
340
- #
341
- # @note This directive should only be used if there is no explicit
342
- # declaration for the method in any source files (i.e., the method
343
- # is declared dynamically via meta-programming). In all other cases, add
344
- # documentation to the method definition itself.
345
- # @note For backwards compatibility support, you do not need to indent
346
- # the method's docstring text. If a +@!method+ directive is seen with
347
- # no indented block, the entire docstring is used as the new method's
348
- # docstring text.
349
- # @example Defining a simple method
350
- # # @!method quit(username, message = "Quit")
351
- # # Sends a quit message to the server for a +username+.
352
- # # @param [String] username the username to quit
353
- # # @param [String] message the quit message
354
- # quit_message_method
355
- # @example Attaching multiple methods to the same source
356
- # # @!method method1
357
- # # @!method method2
358
- # create_methods :method1, :method2
359
- # @see tag:!attribute
360
- # @since 0.7.0
361
- class MethodDirective < Directive
362
- SCOPE_MATCH = /\A\s*self\s*\.\s*/
363
-
364
- def call; end
365
-
366
- def after_parse
367
- return unless handler
368
- use_indented_text
369
- create_object
370
- end
371
-
372
- protected
373
-
374
- def method_name
375
- sig = sanitized_tag_signature
376
- if sig && sig =~ /^#{CodeObjects::METHODNAMEMATCH}(\s|\(|$)/
377
- sig[/\A\s*([^\(; \t]+)/, 1]
378
- else
379
- handler.call_params.first
380
- end
381
- end
382
-
383
- def method_signature
384
- "def #{sanitized_tag_signature || method_name}"
385
- end
386
-
387
- def sanitized_tag_signature
388
- if tag.name && tag.name =~ SCOPE_MATCH
389
- parser.state.scope = :class
390
- $'
391
- else
392
- tag.name
393
- end
394
- end
395
-
396
- def use_indented_text
397
- return if tag.text.empty?
398
- handler = parser.handler
399
- object = parser.object
400
- self.parser = parser.class.new(parser.library)
401
- parser.state.inside_directive = true
402
- parser.parse(tag.text, object, handler)
403
- parser.state.inside_directive = false
404
- end
405
-
406
- def create_object
407
- name = method_name
408
- scope = parser.state.scope || handler.scope
409
- visibility = parser.state.visibility || handler.visibility
410
- ns = CodeObjects::NamespaceObject === object ? object : handler.namespace
411
- obj = CodeObjects::MethodObject.new(ns, name, scope)
412
- handler.register_file_info(obj)
413
- handler.register_source(obj)
414
- handler.register_visibility(obj, visibility)
415
- handler.register_group(obj)
416
- obj.signature = method_signature
417
- obj.parameters = OverloadTag.new(:overload, method_signature).parameters
418
- obj.docstring = Docstring.new!(parser.text, parser.tags, obj,
419
- parser.raw_text, parser.reference)
420
- handler.register_module_function(obj)
421
- old_obj = parser.object
422
- parser.object = obj
423
- parser.post_process
424
- parser.object = old_obj
425
- obj
426
- end
427
- end
428
-
429
- # Defines an attribute with a given name, using indented block data as the
430
- # attribute's docstring. If the type specifier is supplied with "r", "w", or
431
- # "rw", the attribute is made readonly, writeonly or readwrite respectively.
432
- # A readwrite attribute is the default, if no type is specified. The comment
433
- # containing this directive does not need to be attached to any source, but
434
- # if it is, that source code will be used as the method's source.
435
- #
436
- # To define a regular method, see {tag:!method}
437
- #
438
- # @note This directive should only be used if there is no explicit +attr_*+
439
- # declaration for the attribute in any source files (i.e., the attribute
440
- # is declared dynamically via meta-programming). In all other cases, add
441
- # documentation to the attribute declaration itself.
442
- # @note For backwards compatibility support, you do not need to indent
443
- # the attribute's docstring text. If an +@!attribute+ directive is seen with
444
- # no indented block, the entire docstring is used as the new attribute's
445
- # docstring text.
446
- # @example Defining a simple readonly attribute
447
- # # @!attribute [r] count
448
- # # @return [Fixnum] the size of the list
449
- # @example Defining a simple readwrite attribute
450
- # # @!attribute name
451
- # # @return [String] the name of the user
452
- # @see tag:!method
453
- # @since 0.7.0
454
- class AttributeDirective < MethodDirective
455
- def after_parse
456
- return unless handler
457
- use_indented_text
458
- create_attribute_data(create_object)
459
- end
460
-
461
- protected
462
-
463
- def method_name
464
- name = sanitized_tag_signature || handler.call_params.first
465
- name += '=' unless readable?
466
- name
467
- end
468
-
469
- def method_signature
470
- if readable?
471
- "def #{method_name}"
472
- else
473
- "def #{method_name}(value)"
474
- end
475
- end
476
-
477
- private
478
-
479
- def create_attribute_data(object)
480
- return unless object
481
- clean_name = object.name.to_s.sub(/=$/, '')
482
- attrs = object.namespace.attributes[object.scope]
483
- attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil]
484
- attrs[clean_name][:read] = object if readable?
485
- if writable?
486
- if object.name.to_s[-1, 1] == '='
487
- writer = object
488
- writer.parameters = [['value', nil]]
489
- else
490
- writer = CodeObjects::MethodObject.new(object.namespace,
491
- object.name.to_s + '=', object.scope)
492
- writer.signature = "def #{object.name}=(value)"
493
- writer.visibility = object.visibility
494
- writer.dynamic = object.dynamic
495
- writer.source = object.source
496
- writer.group = object.group
497
- writer.parameters = [['value', nil]]
498
- writer.docstring = object.base_docstring
499
- handler.register_file_info(writer)
500
- end
501
- attrs[clean_name][:write] = writer
502
- end
503
- end
504
-
505
- def writable?
506
- !tag.types || tag.types.join.include?('w')
507
- end
508
-
509
- def readable?
510
- !tag.types || tag.types.join =~ /(?!w)r/
511
- end
512
- end
513
-
514
- # Parses a block of code as if it were present in the source file at that
515
- # location. This directive is useful if a class has dynamic meta-programmed
516
- # behaviour that cannot be recognized by YARD.
517
- #
518
- # You can specify the language of the code block using the types
519
- # specification list. By default, the code language is "ruby".
520
- #
521
- # @example Documenting dynamic module inclusion
522
- # class User
523
- # # includes "UserMixin" and extends "UserMixin::ClassMethods"
524
- # # using the UserMixin.included callback.
525
- # # @!parse include UserMixin
526
- # # @!parse extend UserMixin::ClassMethods
527
- # end
528
- # @example Declaring a method as an attribute
529
- # # This should really be an attribute
530
- # # @!parse attr_reader :foo
531
- # def object; @parent.object end
532
- # @example Parsing C code
533
- # # @!parse [c]
534
- # # void Init_Foo() {
535
- # # rb_define_method(rb_cFoo, "method", method, 0);
536
- # # }
537
- # @since 0.8.0
538
- class ParseDirective < Directive
539
- def call
540
- lang = tag.types ? tag.types.first.to_sym :
541
- (handler ? handler.parser.parser_type : :ruby)
542
- if handler && lang == handler.parser.parser_type
543
- pclass = Parser::SourceParser.parser_types[handler.parser.parser_type]
544
- pobj = pclass.new(tag.text, handler.parser.file)
545
- pobj.parse
546
- handler.parser.process(pobj.enumerator)
547
- else # initialize a new parse chain
548
- src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil)
549
- src_parser.file = handler.parser.file if handler
550
- src_parser.parse(StringIO.new(tag.text))
551
- end
552
- end
553
- end
554
-
555
- # Modifies the current parsing scope (class or instance). If this
556
- # directive is defined on a docstring attached to an object definition,
557
- # it is applied only to that object. Otherwise, it applies the scope
558
- # to all future objects in the namespace.
559
- #
560
- # @example Modifying the scope of a DSL method
561
- # # @!scope class
562
- # cattr_accessor :subclasses
563
- # @example Modifying the scope of a set of methods
564
- # # @!scope class
565
- #
566
- # # Documentation for method1
567
- # def method1; end
568
- #
569
- # # Documentation for method2
570
- # def method2; end
571
- # @since 0.7.0
572
- class ScopeDirective < Directive
573
- def call
574
- if %w(class instance module).include?(tag.text)
575
- if object.is_a?(CodeObjects::MethodObject)
576
- object.scope = tag.text.to_sym
577
- else
578
- parser.state.scope = tag.text.to_sym
579
- end
580
- end
581
- end
582
- end
583
-
584
- # Modifies the current parsing visibility (public, protected, or private).
585
- # If this directive is defined on a docstring attached to an object
586
- # definition, it is applied only to that object. Otherwise, it applies
587
- # the visibility to all future objects in the namespace.
588
- #
589
- # @example Modifying the visibility of a DSL method
590
- # # @!visibility private
591
- # cattr_accessor :subclasses
592
- # @example Modifying the visibility of a set of methods
593
- # # Note that Ruby's "protected" is recommended over this directive
594
- # # @!visibility protected
595
- #
596
- # # Documentation for method1
597
- # def method1; end
598
- #
599
- # # Documentation for method2
600
- # def method2; end
601
- # @since 0.7.0
602
- class VisibilityDirective < Directive
603
- def call
604
- if %w(public protected private).include?(tag.text)
605
- if object.is_a?(CodeObjects::Base)
606
- object.visibility = tag.text.to_sym
607
- elsif handler && !parser.state.inside_directive
608
- handler.visibility = tag.text.to_sym
609
- else
610
- parser.state.visibility = tag.text.to_sym
611
- end
612
- end
613
- end
614
- end
615
- end
616
- end
1
+ # frozen_string_literal: true
2
+ require 'ostruct'
3
+
4
+ module YARD
5
+ module Tags
6
+ # The base directive class. Subclass this class to create a custom
7
+ # directive, registering it with {Library.define_directive}. Directive
8
+ # classes are executed via the {#call} method, which perform all directive
9
+ # processing on the object.
10
+ #
11
+ # If processing occurs within a handler, the {#handler} attribute is
12
+ # available to access more information about parsing context and state.
13
+ # Handlers are only available when parsing from {Parser::SourceParser},
14
+ # not when parsing directly from {DocstringParser}. If the docstring is
15
+ # attached to an object declaration, {#object} will be set and available
16
+ # to modify the generated code object directly. Note that both of these
17
+ # attributes may be nil, and directives should test their existence
18
+ # before attempting to use them.
19
+ #
20
+ # @abstract Subclasses should implement {#call}.
21
+ # @see Library.define_directive
22
+ # @since 0.8.0
23
+ class Directive
24
+ # @return [Tag] the meta-data tag containing data input to the directive
25
+ attr_accessor :tag
26
+
27
+ # Set this field to replace the directive definition inside of a docstring
28
+ # with arbitrary text. For instance, the {MacroDirective} uses this field
29
+ # to expand its macro data in place of the call to a +@!macro+.
30
+ #
31
+ # @return [String] the text to expand in the original docstring in place
32
+ # of this directive definition.
33
+ # @return [nil] if no expansion should take place for this directive
34
+ attr_accessor :expanded_text
35
+
36
+ # @return [DocstringParser] the parser that is parsing all tag
37
+ # information out of the docstring
38
+ attr_accessor :parser
39
+
40
+ # @!attribute [r] object
41
+ # @return [CodeObjects::Base, nil] the object the parent docstring is
42
+ # attached to. May be nil.
43
+ def object; parser.object end
44
+
45
+ # @!attribute [r] handler
46
+ # @return [Handlers::Base, nil] the handler object the docstring parser
47
+ # might be attached to. May be nil. Only available when parsing
48
+ # through {Parser::SourceParser}.
49
+ def handler; parser.handler end
50
+
51
+ # @!endgroup
52
+
53
+ # @param [Tag] tag the meta-data tag containing all input to the docstring
54
+ # @param [DocstringParser] parser the docstring parser object
55
+ def initialize(tag, parser)
56
+ self.tag = tag
57
+ self.parser = parser
58
+ self.expanded_text = nil
59
+ end
60
+
61
+ # @!group Parser callbacks
62
+
63
+ # Called when processing the directive. Subclasses should implement
64
+ # this method to perform all functionality of the directive.
65
+ #
66
+ # @abstract implement this method to perform all data processing for
67
+ # the directive.
68
+ # @return [void]
69
+ def call; raise NotImplementedError end
70
+
71
+ # Called after parsing all directives and tags in the docstring. Used
72
+ # to perform any cleanup after all directives perform their main task.
73
+ # @return [void]
74
+ def after_parse; end
75
+
76
+ protected :parser
77
+ end
78
+
79
+ # Ends a group listing definition. Group definition automatically end
80
+ # when class or module blocks are closed, and defining a new group overrides
81
+ # the last group definition, but occasionally you need to end the current
82
+ # group to return to the default listing. Use {tag:!group} to begin a
83
+ # group listing.
84
+ #
85
+ # @example
86
+ # class Controller
87
+ # # @!group Callbacks
88
+ #
89
+ # def before_filter; end
90
+ # def after_filter; end
91
+ #
92
+ # # @!endgroup
93
+ #
94
+ # def index; end
95
+ # end
96
+ # @see tag:!group
97
+ # @since 0.6.0
98
+ class EndGroupDirective < Directive
99
+ def call
100
+ return unless handler
101
+ handler.extra_state.group = nil
102
+ end
103
+ end
104
+
105
+ # Defines a group listing. All methods (and attributes) seen after this
106
+ # directive are placed into a group with the given description as the
107
+ # group name. The group listing is used by templates to organize methods
108
+ # and attributes into respective logical groups. To end a group listing
109
+ # use {tag:!endgroup}.
110
+ #
111
+ # @note A group definition only applies to the scope it is defined in.
112
+ # If a new class or module is opened after the directive, this directive
113
+ # will not apply to methods in that class or module.
114
+ # @example
115
+ # # @!group Callbacks
116
+ #
117
+ # def before_filter; end
118
+ # def after_filter; end
119
+ # @see tag:!endgroup
120
+ # @since 0.6.0
121
+ class GroupDirective < Directive
122
+ def call
123
+ return unless handler
124
+ handler.extra_state.group = tag.text
125
+ end
126
+ end
127
+
128
+ # Defines a block of text to be expanded whenever the macro is called by name
129
+ # in subsequent docstrings. The macro data can be any arbitrary text data, be
130
+ # it regular documentation, meta-data tags or directives.
131
+ #
132
+ # == Defining a Macro
133
+ #
134
+ # A macro must first be defined in order to be used. Note that a macro is also
135
+ # expanded upon definition if it defined on an object (the docstring of a
136
+ # method, class, module or constant object as opposed to a free standing
137
+ # comment). To define a macro, use the "new" or "attach" identifier in the
138
+ # types specifier list. A macro will also automatically be created if an
139
+ # indented macro data block is given, so the keywords are not strictly needed.
140
+ #
141
+ # === Anonymous Macros
142
+ #
143
+ # In addition to standard named macros, macros can be defined anonymously if
144
+ # no name is given. In this case, they can not be re-used in future docstrings,
145
+ # but they will expand in the first definition. This is useful when needing
146
+ # to take advantage of the macro expansion variables (described below).
147
+ #
148
+ # == Using a Macro
149
+ #
150
+ # To re-use a macro in another docstring after it is defined, simply use
151
+ # <tt>@!macro the_name</tt> with no indented block of macro data. The resulting
152
+ # data will be expanded in place.
153
+ #
154
+ # == Attaching a Macro to a DSL Method
155
+ #
156
+ # Macros can be defined to auto-expand on DSL-style class method calls. To
157
+ # define a macro to be auto expanded in this way, use the "attach" keyword
158
+ # in the type specifier list ("new" is implied).
159
+ #
160
+ # Attached macros can also be attached directly on the class method declaration
161
+ # that provides the DSL method to its subclasses. The syntax in either case
162
+ # is the same.
163
+ #
164
+ # == Macro Expansion Variables
165
+ #
166
+ # In the case of using macros on DSL-style method calls, a number of expansion
167
+ # variables can be used for interpolation inside of the macro data. The variables,
168
+ # similar in syntax to Ruby's global variables, are as follows:
169
+ #
170
+ # * $0 - the method name being called
171
+ # * $1, $2, $3, ... - the Nth argument in the method call
172
+ # * $& - the full source line
173
+ #
174
+ # The following example shows what the expansion variables might hold for a given
175
+ # DSL method call:
176
+ #
177
+ # property :foo, :a, :b, :c, String
178
+ # # $0 => "property"
179
+ # # $1 => "foo"
180
+ # # $2 => "a"
181
+ # # $& => "property :foo, :a, :b, :c, String"
182
+ #
183
+ # === Ranges
184
+ #
185
+ # Ranges are also acceptable with the syntax <tt>${N-M}</tt>. Negative values
186
+ # on either N or M are valid, and refer to indexes from the end of the list.
187
+ # Consider a DSL method that creates a method using the first argument with
188
+ # argument names following, ending with the return type of the method. This
189
+ # could be documented as:
190
+ #
191
+ # # @!macro dsl_method
192
+ # # @!method $1(${2--2})
193
+ # # @return [${-1}] the return value of $0
194
+ # create_method_with_args :foo, :a, :b, :c, String
195
+ #
196
+ # As described, the method is using the signature <tt>foo(a, b, c)</tt> and the return
197
+ # type from the last argument, +String+. When using ranges, tokens are joined
198
+ # with commas. Note that this includes using $0:
199
+ #
200
+ # !!!plain
201
+ # $0-1 # => Interpolates to "create_method_with_args, foo"
202
+ #
203
+ # If you want to separate them with spaces, use <tt>$1 $2 $3 $4 ...</tt>. Note that
204
+ # if the token cannot be expanded, it will return the empty string (not an error),
205
+ # so it would be safe to list <tt>$1 $2 ... $10</tt>, for example.
206
+ #
207
+ # === Escaping Interpolation
208
+ #
209
+ # Interpolation can be escaped by prefixing the +$+ with +\\\+, like so:
210
+ #
211
+ # # @!macro foo
212
+ # # I have \$2.00 USD.
213
+ #
214
+ # @example Defining a simple macro
215
+ # # @!macro [new] returnself
216
+ # # @return [self] returns itself
217
+ # @example Using a simple macro in multiple docstrings
218
+ # # Documentation for map
219
+ # # ...
220
+ # # @macro returnself
221
+ # def map; end
222
+ #
223
+ # # Documentation for filter
224
+ # # ...
225
+ # # @macro returnself
226
+ # def filter; end
227
+ # @example Attaching a macro to a class method (for DSL usage)
228
+ # class Resource
229
+ # # Defines a new property
230
+ # # @param [String] name the property name
231
+ # # @param [Class] type the property's type
232
+ # # @!macro [attach] property
233
+ # # @return [$2] the $1 property
234
+ # def self.property(name, type) end
235
+ # end
236
+ #
237
+ # class Post < Resource
238
+ # property :title, String
239
+ # property :view_count, Integer
240
+ # end
241
+ # @example Attaching a macro directly to a DSL method
242
+ # class Post < Resource
243
+ # # @!macro [attach] property
244
+ # # @return [$2] the $1 property
245
+ # property :title, String
246
+ #
247
+ # # Macro will expand on this definition too
248
+ # property :view_count, Integer
249
+ # end
250
+ # @since 0.7.0
251
+ class MacroDirective < Directive
252
+ def call
253
+ raise TagFormatError if tag.name.nil? && tag.text.to_s.empty?
254
+ macro_data = find_or_create
255
+ unless macro_data
256
+ warn
257
+ return
258
+ end
259
+
260
+ self.expanded_text = expand(macro_data)
261
+ end
262
+
263
+ private
264
+
265
+ def new?
266
+ (tag.types && tag.types.include?('new')) ||
267
+ (tag.text && !tag.text.strip.empty?)
268
+ end
269
+
270
+ def attach?
271
+ new? && # must have data or there is nothing to attach
272
+ class_method? || # always attach to class methods
273
+ (tag.types && tag.types.include?('attach'))
274
+ end
275
+
276
+ def class_method?
277
+ object && object.is_a?(CodeObjects::MethodObject) &&
278
+ object.scope == :class
279
+ end
280
+
281
+ def anonymous?
282
+ tag.name.nil? || tag.name.empty?
283
+ end
284
+
285
+ def expand(macro_data)
286
+ return if attach? && class_method?
287
+ return if !anonymous? && new? &&
288
+ (!handler || handler.statement.source.empty?)
289
+ call_params = []
290
+ caller_method = nil
291
+ full_source = ''
292
+ if handler
293
+ call_params = handler.call_params
294
+ caller_method = handler.caller_method
295
+ full_source = handler.statement.source
296
+ end
297
+ all_params = ([caller_method] + call_params).compact
298
+ CodeObjects::MacroObject.expand(macro_data, all_params, full_source)
299
+ end
300
+
301
+ def find_or_create
302
+ if new? || attach?
303
+ if handler && attach?
304
+ if object && object.is_a?(CodeObjects::NamespaceObject)
305
+ log.warn "Attaching macros to non-methods is unsupported, ignoring: " \
306
+ "#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
307
+ obj = nil
308
+ else
309
+ obj = object ? object :
310
+ P("#{handler.namespace}.#{handler.caller_method}")
311
+ end
312
+ else
313
+ obj = nil
314
+ end
315
+
316
+ return tag.text || "" if anonymous? # anonymous macro
317
+ macro = CodeObjects::MacroObject.create(tag.name, tag.text, obj)
318
+ else
319
+ macro = CodeObjects::MacroObject.find(tag.name)
320
+ end
321
+
322
+ macro ? macro.macro_data : nil
323
+ end
324
+
325
+ def warn
326
+ if object && handler
327
+ log.warn "Invalid/missing macro name for " \
328
+ "#{object.path} (#{handler.parser.file}:#{handler.statement.line})"
329
+ end
330
+ end
331
+ end
332
+
333
+ # Defines a method object with a given method signature, using indented
334
+ # block data as the method's docstring. The signature is similar to the
335
+ # {tag:overload} tag. The comment containing this directive does not need
336
+ # to be attached to any source, but if it is, that source code will be
337
+ # used as the method's source.
338
+ #
339
+ # To define an attribute method, see {tag:!attribute}
340
+ #
341
+ # @note This directive should only be used if there is no explicit
342
+ # declaration for the method in any source files (i.e., the method
343
+ # is declared dynamically via meta-programming). In all other cases, add
344
+ # documentation to the method definition itself.
345
+ # @note For backwards compatibility support, you do not need to indent
346
+ # the method's docstring text. If a +@!method+ directive is seen with
347
+ # no indented block, the entire docstring is used as the new method's
348
+ # docstring text.
349
+ # @example Defining a simple method
350
+ # # @!method quit(username, message = "Quit")
351
+ # # Sends a quit message to the server for a +username+.
352
+ # # @param [String] username the username to quit
353
+ # # @param [String] message the quit message
354
+ # quit_message_method
355
+ # @example Attaching multiple methods to the same source
356
+ # # @!method method1
357
+ # # @!method method2
358
+ # create_methods :method1, :method2
359
+ # @see tag:!attribute
360
+ # @since 0.7.0
361
+ class MethodDirective < Directive
362
+ SCOPE_MATCH = /\A\s*self\s*\.\s*/
363
+
364
+ def call; end
365
+
366
+ def after_parse
367
+ return unless handler
368
+ use_indented_text
369
+ create_object
370
+ end
371
+
372
+ protected
373
+
374
+ def method_name
375
+ sig = sanitized_tag_signature
376
+ if sig && sig =~ /^#{CodeObjects::METHODNAMEMATCH}(\s|\(|$)/
377
+ sig[/\A\s*([^\(; \t]+)/, 1]
378
+ else
379
+ handler.call_params.first
380
+ end
381
+ end
382
+
383
+ def method_signature
384
+ "def #{sanitized_tag_signature || method_name}"
385
+ end
386
+
387
+ def sanitized_tag_signature
388
+ if tag.name && tag.name =~ SCOPE_MATCH
389
+ parser.state.scope = :class
390
+ $'
391
+ else
392
+ tag.name
393
+ end
394
+ end
395
+
396
+ def use_indented_text
397
+ return if tag.text.empty?
398
+ handler = parser.handler
399
+ object = parser.object
400
+ self.parser = parser.class.new(parser.library)
401
+ parser.state.inside_directive = true
402
+ parser.parse(tag.text, object, handler)
403
+ parser.state.inside_directive = false
404
+ end
405
+
406
+ def create_object
407
+ name = method_name
408
+ scope = parser.state.scope || handler.scope
409
+ visibility = parser.state.visibility || handler.visibility
410
+ ns = CodeObjects::NamespaceObject === object ? object : handler.namespace
411
+ obj = CodeObjects::MethodObject.new(ns, name, scope)
412
+ handler.register_file_info(obj)
413
+ handler.register_source(obj)
414
+ handler.register_visibility(obj, visibility)
415
+ handler.register_group(obj)
416
+ obj.signature = method_signature
417
+ obj.parameters = OverloadTag.new(:overload, method_signature).parameters
418
+ obj.docstring = Docstring.new!(parser.text, parser.tags, obj,
419
+ parser.raw_text, parser.reference)
420
+ handler.register_module_function(obj)
421
+ old_obj = parser.object
422
+ parser.object = obj
423
+ parser.post_process
424
+ parser.object = old_obj
425
+ obj
426
+ end
427
+ end
428
+
429
+ # Defines an attribute with a given name, using indented block data as the
430
+ # attribute's docstring. If the type specifier is supplied with "r", "w", or
431
+ # "rw", the attribute is made readonly, writeonly or readwrite respectively.
432
+ # A readwrite attribute is the default, if no type is specified. The comment
433
+ # containing this directive does not need to be attached to any source, but
434
+ # if it is, that source code will be used as the method's source.
435
+ #
436
+ # To define a regular method, see {tag:!method}
437
+ #
438
+ # @note This directive should only be used if there is no explicit +attr_*+
439
+ # declaration for the attribute in any source files (i.e., the attribute
440
+ # is declared dynamically via meta-programming). In all other cases, add
441
+ # documentation to the attribute declaration itself.
442
+ # @note For backwards compatibility support, you do not need to indent
443
+ # the attribute's docstring text. If an +@!attribute+ directive is seen with
444
+ # no indented block, the entire docstring is used as the new attribute's
445
+ # docstring text.
446
+ # @example Defining a simple readonly attribute
447
+ # # @!attribute [r] count
448
+ # # @return [Fixnum] the size of the list
449
+ # @example Defining a simple readwrite attribute
450
+ # # @!attribute name
451
+ # # @return [String] the name of the user
452
+ # @see tag:!method
453
+ # @since 0.7.0
454
+ class AttributeDirective < MethodDirective
455
+ def after_parse
456
+ return unless handler
457
+ use_indented_text
458
+ create_attribute_data(create_object)
459
+ end
460
+
461
+ protected
462
+
463
+ def method_name
464
+ name = sanitized_tag_signature || handler.call_params.first
465
+ name += '=' unless readable?
466
+ name
467
+ end
468
+
469
+ def method_signature
470
+ if readable?
471
+ "def #{method_name}"
472
+ else
473
+ "def #{method_name}(value)"
474
+ end
475
+ end
476
+
477
+ private
478
+
479
+ def create_attribute_data(object)
480
+ return unless object
481
+ clean_name = object.name.to_s.sub(/=$/, '')
482
+ attrs = object.namespace.attributes[object.scope]
483
+ attrs[clean_name] ||= SymbolHash[:read => nil, :write => nil]
484
+ attrs[clean_name][:read] = object if readable?
485
+ if writable?
486
+ if object.name.to_s[-1, 1] == '='
487
+ writer = object
488
+ writer.parameters = [['value', nil]]
489
+ else
490
+ writer = CodeObjects::MethodObject.new(object.namespace,
491
+ object.name.to_s + '=', object.scope)
492
+ writer.signature = "def #{object.name}=(value)"
493
+ writer.visibility = object.visibility
494
+ writer.dynamic = object.dynamic
495
+ writer.source = object.source
496
+ writer.group = object.group
497
+ writer.parameters = [['value', nil]]
498
+ writer.docstring = object.base_docstring
499
+ handler.register_file_info(writer)
500
+ end
501
+ attrs[clean_name][:write] = writer
502
+ end
503
+ end
504
+
505
+ def writable?
506
+ !tag.types || tag.types.join.include?('w')
507
+ end
508
+
509
+ def readable?
510
+ !tag.types || tag.types.join =~ /(?!w)r/
511
+ end
512
+ end
513
+
514
+ # Parses a block of code as if it were present in the source file at that
515
+ # location. This directive is useful if a class has dynamic meta-programmed
516
+ # behaviour that cannot be recognized by YARD.
517
+ #
518
+ # You can specify the language of the code block using the types
519
+ # specification list. By default, the code language is "ruby".
520
+ #
521
+ # @example Documenting dynamic module inclusion
522
+ # class User
523
+ # # includes "UserMixin" and extends "UserMixin::ClassMethods"
524
+ # # using the UserMixin.included callback.
525
+ # # @!parse include UserMixin
526
+ # # @!parse extend UserMixin::ClassMethods
527
+ # end
528
+ # @example Declaring a method as an attribute
529
+ # # This should really be an attribute
530
+ # # @!parse attr_reader :foo
531
+ # def object; @parent.object end
532
+ # @example Parsing C code
533
+ # # @!parse [c]
534
+ # # void Init_Foo() {
535
+ # # rb_define_method(rb_cFoo, "method", method, 0);
536
+ # # }
537
+ # @since 0.8.0
538
+ class ParseDirective < Directive
539
+ def call
540
+ lang = tag.types ? tag.types.first.to_sym :
541
+ (handler ? handler.parser.parser_type : :ruby)
542
+ if handler && lang == handler.parser.parser_type
543
+ pclass = Parser::SourceParser.parser_types[handler.parser.parser_type]
544
+ pobj = pclass.new(tag.text, handler.parser.file)
545
+ pobj.parse
546
+ handler.parser.process(pobj.enumerator)
547
+ else # initialize a new parse chain
548
+ src_parser = Parser::SourceParser.new(lang, handler ? handler.globals : nil)
549
+ src_parser.file = handler.parser.file if handler
550
+ src_parser.parse(StringIO.new(tag.text))
551
+ end
552
+ end
553
+ end
554
+
555
+ # Modifies the current parsing scope (class or instance). If this
556
+ # directive is defined on a docstring attached to an object definition,
557
+ # it is applied only to that object. Otherwise, it applies the scope
558
+ # to all future objects in the namespace.
559
+ #
560
+ # @example Modifying the scope of a DSL method
561
+ # # @!scope class
562
+ # cattr_accessor :subclasses
563
+ # @example Modifying the scope of a set of methods
564
+ # # @!scope class
565
+ #
566
+ # # Documentation for method1
567
+ # def method1; end
568
+ #
569
+ # # Documentation for method2
570
+ # def method2; end
571
+ # @since 0.7.0
572
+ class ScopeDirective < Directive
573
+ def call
574
+ if %w(class instance module).include?(tag.text)
575
+ if object.is_a?(CodeObjects::MethodObject)
576
+ object.scope = tag.text.to_sym
577
+ else
578
+ parser.state.scope = tag.text.to_sym
579
+ end
580
+ end
581
+ end
582
+ end
583
+
584
+ # Modifies the current parsing visibility (public, protected, or private).
585
+ # If this directive is defined on a docstring attached to an object
586
+ # definition, it is applied only to that object. Otherwise, it applies
587
+ # the visibility to all future objects in the namespace.
588
+ #
589
+ # @example Modifying the visibility of a DSL method
590
+ # # @!visibility private
591
+ # cattr_accessor :subclasses
592
+ # @example Modifying the visibility of a set of methods
593
+ # # Note that Ruby's "protected" is recommended over this directive
594
+ # # @!visibility protected
595
+ #
596
+ # # Documentation for method1
597
+ # def method1; end
598
+ #
599
+ # # Documentation for method2
600
+ # def method2; end
601
+ # @since 0.7.0
602
+ class VisibilityDirective < Directive
603
+ def call
604
+ if %w(public protected private).include?(tag.text)
605
+ if object.is_a?(CodeObjects::Base)
606
+ object.visibility = tag.text.to_sym
607
+ elsif handler && !parser.state.inside_directive
608
+ handler.visibility = tag.text.to_sym
609
+ else
610
+ parser.state.visibility = tag.text.to_sym
611
+ end
612
+ end
613
+ end
614
+ end
615
+ end
616
+ end