yard 0.7.5 → 0.8.0

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 (339) hide show
  1. data/.yardopts +10 -2
  2. data/ChangeLog +1263 -38
  3. data/LEGAL +5 -5
  4. data/LICENSE +1 -1
  5. data/README.md +91 -82
  6. data/Rakefile +6 -6
  7. data/benchmarks/builtins_vs_eval.rb +1 -1
  8. data/benchmarks/erb_vs_erubis.rb +4 -4
  9. data/benchmarks/generation.rb +5 -5
  10. data/benchmarks/parsing.rb +2 -2
  11. data/benchmarks/registry_store_types.rb +48 -0
  12. data/bin/yard +9 -1
  13. data/bin/yardoc +9 -1
  14. data/bin/yri +10 -2
  15. data/docs/CodeObjects.md +10 -10
  16. data/docs/GettingStarted.md +85 -83
  17. data/docs/Handlers.md +21 -21
  18. data/docs/Overview.md +7 -7
  19. data/docs/Parser.md +30 -30
  20. data/docs/Tags.md +250 -554
  21. data/docs/TagsArch.md +123 -0
  22. data/docs/Templates.md +58 -80
  23. data/docs/WhatsNew.md +378 -133
  24. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  25. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  26. data/docs/templates/default/layout/html/setup.rb +8 -0
  27. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  28. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  29. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  30. data/docs/templates/plugin.rb +65 -0
  31. data/lib/yard.rb +1 -10
  32. data/lib/yard/autoload.rb +75 -27
  33. data/lib/yard/cli/command.rb +5 -2
  34. data/lib/yard/cli/command_parser.rb +3 -2
  35. data/lib/yard/cli/diff.rb +1 -1
  36. data/lib/yard/cli/i18n.rb +69 -0
  37. data/lib/yard/cli/list.rb +1 -1
  38. data/lib/yard/cli/server.rb +30 -7
  39. data/lib/yard/cli/stats.rb +5 -6
  40. data/lib/yard/cli/yardoc.rb +95 -45
  41. data/lib/yard/cli/yri.rb +24 -3
  42. data/lib/yard/code_objects/base.rb +35 -4
  43. data/lib/yard/code_objects/extra_file_object.rb +1 -1
  44. data/lib/yard/code_objects/macro_object.rb +56 -99
  45. data/lib/yard/code_objects/method_object.rb +44 -6
  46. data/lib/yard/config.rb +18 -8
  47. data/lib/yard/core_ext/symbol_hash.rb +1 -1
  48. data/lib/yard/docstring.rb +45 -85
  49. data/lib/yard/docstring_parser.rb +269 -0
  50. data/lib/yard/handlers/base.rb +129 -118
  51. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  52. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  53. data/lib/yard/handlers/c/base.rb +110 -0
  54. data/lib/yard/handlers/c/class_handler.rb +26 -0
  55. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  56. data/lib/yard/handlers/c/handler_methods.rb +165 -0
  57. data/lib/yard/handlers/c/init_handler.rb +16 -0
  58. data/lib/yard/handlers/c/method_handler.rb +35 -0
  59. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  60. data/lib/yard/handlers/c/module_handler.rb +16 -0
  61. data/lib/yard/handlers/c/override_comment_handler.rb +22 -0
  62. data/lib/yard/handlers/c/path_handler.rb +10 -0
  63. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  64. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  65. data/lib/yard/handlers/processor.rb +41 -30
  66. data/lib/yard/handlers/ruby/alias_handler.rb +0 -2
  67. data/lib/yard/handlers/ruby/attribute_handler.rb +16 -17
  68. data/lib/yard/handlers/ruby/base.rb +10 -6
  69. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  70. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  71. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +71 -0
  72. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +0 -3
  73. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +16 -17
  74. data/lib/yard/handlers/ruby/legacy/base.rb +28 -6
  75. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  76. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  77. data/lib/yard/handlers/ruby/legacy/method_handler.rb +0 -2
  78. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +1 -1
  79. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  80. data/lib/yard/handlers/ruby/method_handler.rb +10 -15
  81. data/lib/yard/handlers/ruby/mixin_handler.rb +1 -1
  82. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  83. data/lib/yard/handlers/ruby/struct_handler_methods.rb +3 -2
  84. data/lib/yard/i18n/pot_generator.rb +281 -0
  85. data/lib/yard/i18n/text.rb +72 -0
  86. data/lib/yard/logging.rb +3 -7
  87. data/lib/yard/options.rb +216 -0
  88. data/lib/yard/parser/c/c_parser.rb +225 -0
  89. data/lib/yard/parser/c/comment_parser.rb +131 -0
  90. data/lib/yard/parser/c/statement.rb +63 -0
  91. data/lib/yard/parser/ruby/ast_node.rb +91 -1
  92. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +1 -0
  93. data/lib/yard/parser/ruby/legacy/statement.rb +7 -2
  94. data/lib/yard/parser/ruby/legacy/statement_list.rb +13 -22
  95. data/lib/yard/parser/ruby/ruby_parser.rb +87 -26
  96. data/lib/yard/parser/source_parser.rb +89 -88
  97. data/lib/yard/rake/yardoc_task.rb +1 -1
  98. data/lib/yard/registry.rb +21 -10
  99. data/lib/yard/registry_store.rb +48 -0
  100. data/lib/yard/serializers/file_system_serializer.rb +18 -20
  101. data/lib/yard/serializers/yardoc_serializer.rb +1 -0
  102. data/lib/yard/server/adapter.rb +2 -2
  103. data/lib/yard/server/commands/base.rb +1 -1
  104. data/lib/yard/server/commands/display_object_command.rb +13 -6
  105. data/lib/yard/server/commands/frames_command.rb +4 -21
  106. data/lib/yard/server/commands/library_command.rb +57 -11
  107. data/lib/yard/server/commands/list_command.rb +10 -34
  108. data/lib/yard/server/commands/search_command.rb +8 -2
  109. data/lib/yard/server/doc_server_helper.rb +34 -0
  110. data/lib/yard/server/rack_adapter.rb +5 -1
  111. data/lib/yard/server/router.rb +4 -10
  112. data/lib/yard/server/static_caching.rb +2 -2
  113. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +2 -2
  114. data/lib/yard/server/templates/default/fulldoc/html/js/live.js +0 -15
  115. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +3 -3
  116. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  117. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +1 -1
  118. data/lib/yard/server/templates/doc_server/search/html/setup.rb +1 -1
  119. data/lib/yard/tags/default_factory.rb +31 -4
  120. data/lib/yard/tags/directives.rb +593 -0
  121. data/lib/yard/tags/library.rb +437 -35
  122. data/lib/yard/templates/engine.rb +17 -12
  123. data/lib/yard/templates/helpers/base_helper.rb +8 -2
  124. data/lib/yard/templates/helpers/html_helper.rb +57 -14
  125. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +1 -1
  126. data/lib/yard/templates/helpers/markup_helper.rb +9 -9
  127. data/lib/yard/templates/helpers/text_helper.rb +2 -2
  128. data/lib/yard/templates/template.rb +42 -13
  129. data/lib/yard/templates/template_options.rb +81 -0
  130. data/spec/cli/command_parser_spec.rb +4 -4
  131. data/spec/cli/command_spec.rb +3 -3
  132. data/spec/cli/config_spec.rb +13 -13
  133. data/spec/cli/diff_spec.rb +13 -10
  134. data/spec/cli/gems_spec.rb +12 -12
  135. data/spec/cli/help_spec.rb +2 -2
  136. data/spec/cli/i18n_spec.rb +111 -0
  137. data/spec/cli/server_spec.rb +66 -18
  138. data/spec/cli/stats_spec.rb +15 -15
  139. data/spec/cli/yardoc_spec.rb +124 -97
  140. data/spec/cli/yri_spec.rb +14 -12
  141. data/spec/code_objects/base_spec.rb +104 -46
  142. data/spec/code_objects/class_object_spec.rb +33 -33
  143. data/spec/code_objects/code_object_list_spec.rb +5 -5
  144. data/spec/code_objects/constants_spec.rb +4 -3
  145. data/spec/code_objects/extra_file_object_spec.rb +19 -19
  146. data/spec/code_objects/macro_object_spec.rb +31 -37
  147. data/spec/code_objects/method_object_spec.rb +46 -23
  148. data/spec/code_objects/module_object_spec.rb +16 -16
  149. data/spec/code_objects/namespace_object_spec.rb +6 -6
  150. data/spec/code_objects/proxy_spec.rb +19 -19
  151. data/spec/config_spec.rb +33 -24
  152. data/spec/core_ext/array_spec.rb +1 -1
  153. data/spec/core_ext/file_spec.rb +8 -8
  154. data/spec/core_ext/hash_spec.rb +1 -1
  155. data/spec/core_ext/insertion_spec.rb +3 -3
  156. data/spec/core_ext/module_spec.rb +1 -1
  157. data/spec/core_ext/string_spec.rb +6 -6
  158. data/spec/core_ext/symbol_hash_spec.rb +11 -11
  159. data/spec/docstring_parser_spec.rb +207 -0
  160. data/spec/docstring_spec.rb +33 -146
  161. data/spec/handlers/alias_handler_spec.rb +14 -14
  162. data/spec/handlers/attribute_handler_spec.rb +20 -20
  163. data/spec/handlers/base_spec.rb +16 -16
  164. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  165. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  166. data/spec/handlers/c/class_handler_spec.rb +64 -0
  167. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  168. data/spec/handlers/c/init_handler_spec.rb +36 -0
  169. data/spec/handlers/c/method_handler_spec.rb +228 -0
  170. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  171. data/spec/handlers/c/module_handler_spec.rb +38 -0
  172. data/spec/handlers/c/override_comment_handler_spec.rb +43 -0
  173. data/spec/handlers/c/path_handler_spec.rb +35 -0
  174. data/spec/handlers/c/spec_helper.rb +11 -0
  175. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  176. data/spec/handlers/class_condition_handler_spec.rb +10 -10
  177. data/spec/handlers/class_handler_spec.rb +38 -38
  178. data/spec/handlers/class_variable_handler_spec.rb +1 -1
  179. data/spec/handlers/constant_handler_spec.rb +7 -7
  180. data/spec/handlers/{macro_handler_spec.rb → dsl_handler_spec.rb} +72 -53
  181. data/spec/handlers/examples/alias_handler_001.rb.txt +5 -5
  182. data/spec/handlers/examples/class_condition_handler_001.rb.txt +9 -9
  183. data/spec/handlers/examples/class_handler_001.rb.txt +1 -1
  184. data/spec/handlers/examples/dsl_handler_001.rb.txt +110 -0
  185. data/spec/handlers/examples/exception_handler_001.rb.txt +14 -14
  186. data/spec/handlers/examples/method_condition_handler_001.rb.txt +2 -2
  187. data/spec/handlers/examples/method_handler_001.rb.txt +16 -16
  188. data/spec/handlers/examples/mixin_handler_001.rb.txt +8 -4
  189. data/spec/handlers/examples/private_constant_handler_001.rb.txt +1 -1
  190. data/spec/handlers/examples/visibility_handler_001.rb.txt +3 -3
  191. data/spec/handlers/examples/yield_handler_001.rb.txt +13 -14
  192. data/spec/handlers/exception_handler_spec.rb +9 -9
  193. data/spec/handlers/extend_handler_spec.rb +2 -2
  194. data/spec/handlers/legacy_base_spec.rb +34 -34
  195. data/spec/handlers/method_condition_handler_spec.rb +2 -2
  196. data/spec/handlers/method_handler_spec.rb +33 -33
  197. data/spec/handlers/mixin_handler_spec.rb +13 -9
  198. data/spec/handlers/module_function_handler_spec.rb +82 -0
  199. data/spec/handlers/module_handler_spec.rb +6 -6
  200. data/spec/handlers/private_constant_handler_spec.rb +3 -3
  201. data/spec/handlers/processor_spec.rb +5 -5
  202. data/spec/handlers/ruby/base_spec.rb +10 -6
  203. data/spec/handlers/ruby/legacy/base_spec.rb +11 -7
  204. data/spec/handlers/spec_helper.rb +2 -3
  205. data/spec/handlers/visibility_handler_spec.rb +6 -6
  206. data/spec/handlers/yield_handler_spec.rb +8 -8
  207. data/spec/i18n/pot_generator_spec.rb +244 -0
  208. data/spec/i18n/text_spec.rb +69 -0
  209. data/spec/options_spec.rb +160 -0
  210. data/spec/parser/base_spec.rb +3 -3
  211. data/spec/parser/c_parser_spec.rb +31 -257
  212. data/spec/parser/examples/array.c.txt +187 -187
  213. data/spec/parser/examples/extrafile.c.txt +1 -1
  214. data/spec/parser/examples/override.c.txt +1 -1
  215. data/spec/parser/ruby/ast_node_spec.rb +1 -1
  216. data/spec/parser/ruby/legacy/statement_list_spec.rb +24 -24
  217. data/spec/parser/ruby/legacy/token_list_spec.rb +7 -7
  218. data/spec/parser/ruby/ruby_parser_spec.rb +56 -34
  219. data/spec/parser/source_parser_spec.rb +125 -65
  220. data/spec/parser/tag_parsing_spec.rb +4 -4
  221. data/spec/rake/yardoc_task_spec.rb +10 -8
  222. data/spec/registry_spec.rb +65 -36
  223. data/spec/registry_store_spec.rb +90 -40
  224. data/spec/serializers/file_system_serializer_spec.rb +12 -12
  225. data/spec/serializers/yardoc_serializer_spec.rb +2 -2
  226. data/spec/server/adapter_spec.rb +3 -3
  227. data/spec/server/commands/base_spec.rb +8 -8
  228. data/spec/server/commands/library_command_spec.rb +3 -3
  229. data/spec/server/commands/static_file_command_spec.rb +7 -7
  230. data/spec/server/doc_server_helper_spec.rb +1 -1
  231. data/spec/server/doc_server_serializer_spec.rb +6 -6
  232. data/spec/server/rack_adapter_spec.rb +3 -3
  233. data/spec/server/router_spec.rb +19 -19
  234. data/spec/server/static_caching_spec.rb +4 -4
  235. data/spec/spec_helper.rb +7 -7
  236. data/spec/tags/default_factory_spec.rb +24 -16
  237. data/spec/tags/directives_spec.rb +422 -0
  238. data/spec/tags/library_spec.rb +15 -4
  239. data/spec/tags/overload_tag_spec.rb +6 -6
  240. data/spec/tags/ref_tag_list_spec.rb +8 -8
  241. data/spec/templates/class_spec.rb +7 -7
  242. data/spec/templates/constant_spec.rb +7 -7
  243. data/spec/templates/engine_spec.rb +28 -36
  244. data/spec/templates/examples/class001.html +108 -108
  245. data/spec/templates/examples/class002.html +17 -17
  246. data/spec/templates/examples/constant001.txt +1 -1
  247. data/spec/templates/examples/method001.html +45 -45
  248. data/spec/templates/examples/method002.html +25 -25
  249. data/spec/templates/examples/method003.html +60 -60
  250. data/spec/templates/examples/method004.html +7 -7
  251. data/spec/templates/examples/method005.html +28 -28
  252. data/spec/templates/examples/module001.html +321 -321
  253. data/spec/templates/examples/module001.txt +1 -1
  254. data/spec/templates/examples/module002.html +130 -130
  255. data/spec/templates/examples/module003.html +74 -74
  256. data/spec/templates/examples/module004.html +388 -0
  257. data/spec/templates/helpers/base_helper_spec.rb +32 -32
  258. data/spec/templates/helpers/html_helper_spec.rb +87 -68
  259. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +9 -9
  260. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +16 -16
  261. data/spec/templates/helpers/markup_helper_spec.rb +31 -28
  262. data/spec/templates/helpers/method_helper_spec.rb +7 -7
  263. data/spec/templates/helpers/shared_signature_examples.rb +9 -7
  264. data/spec/templates/helpers/text_helper_spec.rb +3 -3
  265. data/spec/templates/method_spec.rb +13 -13
  266. data/spec/templates/module_spec.rb +70 -24
  267. data/spec/templates/onefile_spec.rb +32 -15
  268. data/spec/templates/section_spec.rb +23 -23
  269. data/spec/templates/spec_helper.rb +31 -1
  270. data/spec/templates/tag_spec.rb +5 -5
  271. data/spec/templates/template_spec.rb +54 -46
  272. data/spec/verifier_spec.rb +5 -5
  273. data/templates/default/class/setup.rb +2 -2
  274. data/templates/default/docstring/html/abstract.erb +1 -1
  275. data/templates/default/docstring/html/note.erb +1 -1
  276. data/templates/default/docstring/html/private.erb +1 -1
  277. data/templates/default/docstring/html/todo.erb +1 -1
  278. data/templates/default/docstring/setup.rb +2 -2
  279. data/templates/default/fulldoc/html/css/full_list.css +4 -2
  280. data/templates/default/fulldoc/html/css/style.css +50 -44
  281. data/templates/default/fulldoc/html/frames.erb +21 -6
  282. data/templates/default/fulldoc/html/full_list.erb +5 -3
  283. data/templates/default/fulldoc/html/{full_list_files.erb → full_list_file.erb} +0 -0
  284. data/templates/default/fulldoc/html/js/app.js +29 -26
  285. data/templates/default/fulldoc/html/js/full_list.js +9 -9
  286. data/templates/default/fulldoc/html/js/jquery.js +4 -16
  287. data/templates/default/fulldoc/html/setup.rb +42 -38
  288. data/templates/default/layout/dot/header.erb +1 -1
  289. data/templates/default/layout/html/breadcrumb.erb +6 -6
  290. data/templates/default/layout/html/files.erb +1 -1
  291. data/templates/default/layout/html/footer.erb +1 -1
  292. data/templates/default/layout/html/headers.erb +3 -6
  293. data/templates/default/layout/html/index.erb +1 -1
  294. data/templates/default/layout/html/layout.erb +3 -7
  295. data/templates/default/layout/html/objects.erb +1 -1
  296. data/templates/default/layout/html/script_setup.erb +5 -0
  297. data/templates/default/layout/html/search.erb +4 -1
  298. data/templates/default/layout/html/setup.rb +8 -8
  299. data/templates/default/method_details/html/method_signature.erb +10 -3
  300. data/templates/default/method_details/setup.rb +1 -0
  301. data/templates/default/module/dot/info.erb +1 -1
  302. data/templates/default/module/dot/setup.rb +2 -2
  303. data/templates/default/module/html/attribute_details.erb +1 -1
  304. data/templates/default/module/html/children.erb +1 -1
  305. data/templates/default/module/html/defines.erb +1 -1
  306. data/templates/default/module/html/inherited_methods.erb +5 -4
  307. data/templates/default/module/html/item_summary.erb +15 -5
  308. data/templates/default/module/html/method_details_list.erb +2 -2
  309. data/templates/default/module/setup.rb +25 -12
  310. data/templates/default/module/text/setup.rb +1 -1
  311. data/templates/default/onefile/html/layout.erb +1 -1
  312. data/templates/default/onefile/html/setup.rb +2 -2
  313. data/templates/default/tags/html/example.erb +4 -2
  314. data/templates/default/tags/html/option.erb +1 -1
  315. data/templates/default/tags/html/overload.erb +1 -1
  316. data/templates/default/tags/html/see.erb +1 -1
  317. data/templates/default/tags/html/tag.erb +1 -1
  318. data/templates/default/tags/setup.rb +4 -3
  319. data/templates/guide/fulldoc/html/css/style.css +8 -8
  320. data/templates/guide/fulldoc/html/js/app.js +6 -6
  321. data/templates/guide/fulldoc/html/setup.rb +12 -12
  322. data/templates/guide/layout/html/layout.erb +11 -11
  323. data/templates/guide/layout/html/setup.rb +9 -9
  324. data/templates/guide/method/html/header.erb +2 -2
  325. data/templates/guide/method/html/setup.rb +1 -1
  326. metadata +68 -18
  327. data/bin/yard-graph +0 -4
  328. data/bin/yard-server +0 -4
  329. data/docs/Glossary.md +0 -12
  330. data/lib/yard/handlers/ruby/legacy/macro_handler.rb +0 -39
  331. data/lib/yard/handlers/ruby/macro_handler.rb +0 -40
  332. data/lib/yard/handlers/ruby/macro_handler_methods.rb +0 -131
  333. data/lib/yard/parser/c_parser.rb +0 -497
  334. data/lib/yard/server/templates/default/layout/html/headers.erb +0 -16
  335. data/lib/yard/server/templates/doc_server/frames/html/frames.erb +0 -13
  336. data/lib/yard/server/templates/doc_server/frames/html/setup.rb +0 -3
  337. data/lib/yard/server/templates/doc_server/full_list/html/full_list.erb +0 -34
  338. data/lib/yard/server/templates/doc_server/full_list/html/setup.rb +0 -20
  339. data/spec/handlers/examples/macro_handler_001.rb.txt +0 -83
@@ -22,8 +22,6 @@ class YARD::Handlers::Ruby::AliasHandler < YARD::Handlers::Ruby::Base
22
22
  new_meth, old_meth = names[0].to_sym, names[1].to_sym
23
23
  old_obj = namespace.child(:name => old_meth, :scope => scope)
24
24
  new_obj = register MethodObject.new(namespace, new_meth, scope) do |o|
25
- o.visibility = visibility
26
- o.scope = scope
27
25
  o.add_file(parser.file, statement.line)
28
26
  end
29
27
 
@@ -33,25 +33,24 @@ class YARD::Handlers::Ruby::AttributeHandler < YARD::Handlers::Ruby::Base
33
33
  # Show their methods as well
34
34
  {:read => name, :write => "#{name}="}.each do |type, meth|
35
35
  if (type == :read ? read : write)
36
- namespace.attributes[scope][name][type] = MethodObject.new(namespace, meth, scope) do |o|
37
- if type == :write
38
- o.parameters = [['value', nil]]
39
- src = "def #{meth}(value)"
40
- full_src = "#{src}\n @#{name} = value\nend"
41
- doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to."
42
- else
43
- src = "def #{meth}"
44
- full_src = "#{src}\n @#{name}\nend"
45
- doc = "Returns the value of attribute #{name}"
46
- end
47
- o.source ||= full_src
48
- o.signature ||= src
49
- o.docstring = statement.comments.to_s.empty? ? doc : statement.comments
50
- o.visibility = visibility
36
+ o = MethodObject.new(namespace, meth, scope)
37
+ if type == :write
38
+ o.parameters = [['value', nil]]
39
+ src = "def #{meth}(value)"
40
+ full_src = "#{src}\n @#{name} = value\nend"
41
+ doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to."
42
+ else
43
+ src = "def #{meth}"
44
+ full_src = "#{src}\n @#{name}\nend"
45
+ doc = "Returns the value of attribute #{name}"
51
46
  end
47
+ o.source ||= full_src
48
+ o.signature ||= src
49
+ register(o)
50
+ o.docstring = doc if o.docstring.blank?(false)
52
51
 
53
- # Register the objects explicitly
54
- register namespace.attributes[scope][name][type]
52
+ # Regsiter the object explicitly
53
+ namespace.attributes[scope][name][type] = o
55
54
  elsif obj = namespace.children.find {|o| o.name == meth.to_sym && o.scope == scope }
56
55
  # register an existing method as attribute
57
56
  namespace.attributes[scope][name][type] = obj
@@ -135,21 +135,25 @@ module YARD
135
135
  parser.process(nodes)
136
136
  end
137
137
  end
138
-
138
+
139
139
  # @group Macro Handling
140
140
 
141
141
  def call_params
142
142
  return [] unless statement.respond_to?(:parameters)
143
- statement.parameters(false).map do |param|
144
- param.jump(:ident, :tstring_content).source
145
- end
143
+ statement.parameters(false).compact.map do |param|
144
+ if param.type == :list
145
+ param.map {|n| n.jump(:ident, :kw, :tstring_content).source }
146
+ else
147
+ param.jump(:ident, :kw, :tstring_content).source
148
+ end
149
+ end.flatten
146
150
  end
147
151
 
148
152
  def caller_method
149
- if statement.call?
153
+ if statement.call? || statement.def?
150
154
  statement.method_name(true).to_s
151
155
  elsif statement.type == :var_ref || statement.type == :vcall
152
- statement[0].jump(:ident).source
156
+ statement[0].jump(:ident, :kw).source
153
157
  else
154
158
  nil
155
159
  end
@@ -0,0 +1,9 @@
1
+ # Handles any lone comment statement in a Ruby file
2
+ class YARD::Handlers::Ruby::CommentHandler < YARD::Handlers::Ruby::Base
3
+ handles :comment, :void_stmt
4
+ namespace_only
5
+
6
+ process do
7
+ register_docstring(nil)
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ # Handles automatic detection of dsl-style methods
5
+ class DSLHandler < Base
6
+ include CodeObjects
7
+ include DSLHandlerMethods
8
+ handles method_call
9
+ namespace_only
10
+ process { handle_comments }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,71 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ module DSLHandlerMethods
5
+ include CodeObjects
6
+ include Parser
7
+
8
+ IGNORE_METHODS = Hash[*%w(alias alias_method autoload attr attr_accessor
9
+ attr_reader attr_writer extend include public private protected
10
+ private_constant).map {|n| [n, true] }.flatten]
11
+
12
+ def handle_comments
13
+ return if IGNORE_METHODS[caller_method]
14
+
15
+ @docstring = statement.comments || ""
16
+ @docstring = @docstring.join("\n") if @docstring.is_a?(Array)
17
+ if macro = find_attached_macro
18
+ @docstring += "\n" +
19
+ macro.expand([caller_method, *call_params], statement.source)
20
+ elsif !statement.comments_hash_flag && !implicit_docstring?
21
+ return register_docstring(nil)
22
+ end
23
+
24
+ # ignore DSL definitions if @method/@attribute directive is used
25
+ if @docstring =~ /^@!?(method|attribute)\b/
26
+ return register_docstring(nil)
27
+ end
28
+
29
+ object = MethodObject.new(namespace, method_name, scope)
30
+ object.signature = method_signature
31
+ register(object)
32
+ end
33
+
34
+ def register_docstring(object, docstring = @docstring, stmt = statement)
35
+ super
36
+ end
37
+
38
+ private
39
+
40
+ def implicit_docstring?
41
+ tags = %w(method attribute overload visibility scope return)
42
+ tags.any? {|tag| @docstring =~ /^@!?#{tag}\b/ }
43
+ end
44
+
45
+ def method_name
46
+ name = call_params.first || ""
47
+ if name =~ /^#{CodeObjects::METHODNAMEMATCH}$/
48
+ name
49
+ else
50
+ raise UndocumentableError, "method, missing name"
51
+ end
52
+ end
53
+
54
+ def method_signature
55
+ "def #{method_name}"
56
+ end
57
+
58
+ def find_attached_macro
59
+ Registry.all(:macro).each do |macro|
60
+ next unless macro.method_object
61
+ next unless macro.method_object.name.to_s == caller_method.to_s
62
+ (namespace.inheritance_tree + [P('Object')]).each do |obj|
63
+ return macro if obj == macro.method_object.namespace
64
+ end
65
+ end
66
+ nil
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -15,10 +15,7 @@ class YARD::Handlers::Ruby::Legacy::AliasHandler < YARD::Handlers::Ruby::Legacy:
15
15
  new_meth, old_meth = names[0].to_sym, names[1].to_sym
16
16
  old_obj = namespace.child(:name => old_meth, :scope => scope)
17
17
  new_obj = register MethodObject.new(namespace, new_meth, scope) do |o|
18
- o.visibility = visibility
19
- o.scope = scope
20
18
  o.add_file(parser.file, statement.tokens.first.line_no, statement.comments)
21
- o.docstring = statement.comments
22
19
  end
23
20
 
24
21
  if old_obj
@@ -32,25 +32,24 @@ class YARD::Handlers::Ruby::Legacy::AttributeHandler < YARD::Handlers::Ruby::Leg
32
32
  # Show their methods as well
33
33
  {:read => name, :write => "#{name}="}.each do |type, meth|
34
34
  if (type == :read ? read : write)
35
- namespace.attributes[scope][name][type] = MethodObject.new(namespace, meth, scope) do |o|
36
- if type == :write
37
- o.parameters = [['value', nil]]
38
- src = "def #{meth}(value)"
39
- full_src = "#{src}\n @#{name} = value\nend"
40
- doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to."
41
- else
42
- src = "def #{meth}"
43
- full_src = "#{src}\n @#{name}\nend"
44
- doc = "Returns the value of attribute #{name}"
45
- end
46
- o.source ||= full_src
47
- o.signature ||= src
48
- o.docstring = statement.comments.to_s.empty? ? doc : statement.comments
49
- o.visibility = visibility
35
+ o = MethodObject.new(namespace, meth, scope)
36
+ if type == :write
37
+ o.parameters = [['value', nil]]
38
+ src = "def #{meth}(value)"
39
+ full_src = "#{src}\n @#{name} = value\nend"
40
+ doc = "Sets the attribute #{name}\n@param value the value to set the attribute #{name} to."
41
+ else
42
+ src = "def #{meth}"
43
+ full_src = "#{src}\n @#{name}\nend"
44
+ doc = "Returns the value of attribute #{name}"
50
45
  end
46
+ o.source ||= full_src
47
+ o.signature ||= src
48
+ register(o)
49
+ o.docstring = doc if o.docstring.blank?(false)
51
50
 
52
- # Register the objects explicitly
53
- register namespace.attributes[scope][name][type]
51
+ # Regsiter the object explicitly
52
+ namespace.attributes[scope][name][type] = o
54
53
  elsif obj = namespace.children.find {|o| o.name == meth.to_sym && o.scope == scope }
55
54
  # register an existing method as attribute
56
55
  namespace.attributes[scope][name][type] = obj
@@ -24,8 +24,6 @@ module YARD
24
24
  end
25
25
  end
26
26
 
27
- protected
28
-
29
27
  # Parses a statement's block with a set of state values. If the
30
28
  # statement has no block, nothing happens. A description of state
31
29
  # values can be found at {Handlers::Base#push_state}
@@ -41,17 +39,23 @@ module YARD
41
39
  end
42
40
  end
43
41
  end
44
-
42
+
45
43
  def call_params
46
- tokens = statement.tokens[1..-1]
47
- tokval_list(tokens, :attr, :identifier, TkId).map do |value|
48
- value.to_s
44
+ if statement.tokens.first.is_a?(TkDEF)
45
+ extract_method_details.last.map {|param| param.first }
46
+ else
47
+ tokens = statement.tokens[1..-1]
48
+ tokval_list(tokens, :attr, :identifier, TkId).map do |value|
49
+ value.to_s
50
+ end
49
51
  end
50
52
  end
51
53
 
52
54
  def caller_method
53
55
  if statement.tokens.first.is_a?(TkIDENTIFIER)
54
56
  statement.tokens.first.text
57
+ elsif statement.tokens.first.is_a?(TkDEF)
58
+ extract_method_details.first
55
59
  else
56
60
  nil
57
61
  end
@@ -59,6 +63,24 @@ module YARD
59
63
 
60
64
  private
61
65
 
66
+ # Extracts method information for macro expansion only
67
+ #
68
+ # @todo This is a duplicate implementation of {MethodHandler}. Refactor.
69
+ # @return [Array<String,Array<Array<String>>>] the method name followed by method
70
+ # arguments (name and optional value)
71
+ def extract_method_details
72
+ if statement.tokens.to_s =~ /^def\s+(#{METHODMATCH})(?:(?:\s+|\s*\()(.*)(?:\)\s*$)?)?/m
73
+ meth, args = $1, $2
74
+ meth.gsub!(/\s+/,'')
75
+ args = tokval_list(Parser::Ruby::Legacy::TokenList.new(args), :all)
76
+ args.map! {|a| k, v = *a.split('=', 2); [k.strip, (v ? v.strip : nil)] } if args
77
+ if meth =~ /(?:#{NSEPQ}|#{CSEPQ})([^#{NSEP}#{CSEPQ}]+)$/
78
+ meth = $`
79
+ end
80
+ return meth, args
81
+ end
82
+ end
83
+
62
84
  # The string value of a token. For example, the return value for the symbol :sym
63
85
  # would be :sym. The return value for a string +"foo #{ bar}"+ would be the literal
64
86
  # +"foo #{ bar}"+ without any interpolation. The return value of the identifier
@@ -0,0 +1,9 @@
1
+ # (see Ruby::CommentHandler)
2
+ class YARD::Handlers::Ruby::Legacy::CommentHandler < YARD::Handlers::Ruby::Legacy::Base
3
+ handles TkCOMMENT
4
+ namespace_only
5
+
6
+ process do
7
+ register_docstring(nil)
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ module YARD
2
+ module Handlers
3
+ module Ruby
4
+ module Legacy
5
+ # (see Ruby::DSLHandler)
6
+ class DSLHandler < Base
7
+ include CodeObjects
8
+ include DSLHandlerMethods
9
+ handles TkIDENTIFIER
10
+ namespace_only
11
+ process { handle_comments }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -26,8 +26,6 @@ class YARD::Handlers::Ruby::Legacy::MethodHandler < YARD::Handlers::Ruby::Legacy
26
26
 
27
27
  nobj = P(namespace, nobj.value) while nobj.type == :constant
28
28
  obj = register MethodObject.new(nobj, meth, mscope) do |o|
29
- o.visibility = visibility
30
- o.source = statement
31
29
  o.explicit = true
32
30
  o.parameters = args
33
31
  end
@@ -5,7 +5,7 @@ class YARD::Handlers::Ruby::Legacy::MixinHandler < YARD::Handlers::Ruby::Legacy:
5
5
 
6
6
  process do
7
7
  errors = []
8
- statement.tokens[1..-1].to_s.split(/\s*,\s*/).each do |mixin|
8
+ statement.tokens[1..-1].to_s.split(/\s*,\s*/).reverse.each do |mixin|
9
9
  mixin = mixin.strip
10
10
  begin
11
11
  process_mixin(mixin)
@@ -0,0 +1,18 @@
1
+ # (see Ruby::ModuleFunctionHandler)
2
+ class YARD::Handlers::Ruby::Legacy::ModuleFunctionHandler < YARD::Handlers::Ruby::Legacy::Base
3
+ handles /\A(module_function)(\s|\(|$)/
4
+ namespace_only
5
+
6
+ process do
7
+ if statement.tokens.size == 1
8
+ self.scope = :module
9
+ else
10
+ tokval_list(statement.tokens[2..-1], :attr).each do |name|
11
+ instance_method = MethodObject.new(namespace, name)
12
+ class_method = MethodObject.new(namespace, name, :module)
13
+ instance_method.copy_to(class_method)
14
+ class_method.visibility = :public
15
+ end
16
+ end
17
+ end
18
+ end
@@ -3,28 +3,22 @@ class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base
3
3
  handles :def, :defs
4
4
 
5
5
  process do
6
+ meth = statement.method_name(true).to_s
7
+ args = format_args
8
+ blk = statement.block
6
9
  nobj = namespace
7
10
  mscope = scope
8
11
  if statement.type == :defs
9
12
  if statement[0][0].type == :ident
10
13
  raise YARD::Parser::UndocumentableError, 'method defined on object instance'
11
14
  end
12
- meth = statement[2][0]
13
15
  nobj = P(namespace, statement[0].source) if statement[0][0].type == :const
14
- args = format_args(statement[3])
15
- blk = statement[4]
16
16
  mscope = :class
17
- else
18
- meth = statement[0][0]
19
- args = format_args(statement[1])
20
- blk = statement[2]
21
17
  end
22
18
 
23
19
  nobj = P(namespace, nobj.value) while nobj.type == :constant
24
20
  obj = register MethodObject.new(nobj, meth, mscope) do |o|
25
- o.visibility = visibility
26
- o.source = statement.source
27
- o.signature = method_signature(meth)
21
+ o.signature = method_signature
28
22
  o.explicit = true
29
23
  o.parameters = args
30
24
  end
@@ -75,8 +69,8 @@ class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base
75
69
  parse_block(blk, :owner => obj) # mainly for yield/exceptions
76
70
  end
77
71
 
78
- def format_args(args)
79
- args = args.jump(:params)
72
+ def format_args
73
+ args = statement.parameters
80
74
  params = []
81
75
  params += args.required_params.map {|a| [a.source, nil] } if args.required_params
82
76
  params += args.optional_params.map {|a| [a[0].source, a[1].source] } if args.optional_params
@@ -86,9 +80,10 @@ class YARD::Handlers::Ruby::MethodHandler < YARD::Handlers::Ruby::Base
86
80
  params
87
81
  end
88
82
 
89
- def method_signature(method_name)
90
- if statement[1]
91
- "def #{method_name}(#{statement[1].jump(:params).source})"
83
+ def method_signature
84
+ method_name = statement.method_name(true)
85
+ if statement.parameters.any? {|e| e }
86
+ "def #{method_name}(#{statement.parameters.source})"
92
87
  else
93
88
  "def #{method_name}"
94
89
  end
@@ -5,7 +5,7 @@ class YARD::Handlers::Ruby::MixinHandler < YARD::Handlers::Ruby::Base
5
5
 
6
6
  process do
7
7
  errors = []
8
- statement.parameters(false).each do |mixin|
8
+ statement.parameters(false).reverse.each do |mixin|
9
9
  begin
10
10
  process_mixin(mixin)
11
11
  rescue YARD::Parser::UndocumentableError => err
@@ -0,0 +1,26 @@
1
+ # Handles module_function calls to turn methods into public class methods.
2
+ # Also creates a private instance copy of the method.
3
+ class YARD::Handlers::Ruby::ModuleFunctionHandler < YARD::Handlers::Ruby::Base
4
+ handles method_call(:module_function)
5
+ namespace_only
6
+
7
+ process do
8
+ return if (ident = statement.jump(:ident)) == statement
9
+ case statement.type
10
+ when :var_ref, :vcall
11
+ self.scope = :module
12
+ when :fcall, :command
13
+ statement[1].traverse do |node|
14
+ case node.type
15
+ when :symbol; name = node.first.source
16
+ when :string_content; name = node.source
17
+ else next
18
+ end
19
+ instance_method = MethodObject.new(namespace, name)
20
+ class_method = MethodObject.new(namespace, name, :module)
21
+ instance_method.copy_to(class_method)
22
+ class_method.visibility = :public
23
+ end
24
+ end
25
+ end
26
+ end