yard 0.9.17 → 0.9.22

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

Potentially problematic release.


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

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