yard 0.9.18 → 0.9.19

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