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
@@ -0,0 +1,26 @@
1
+ class YARD::Handlers::C::ClassHandler < YARD::Handlers::C::Base
2
+ MATCH1 = /([\w\.]+)\s* = \s*(?:rb_define_class|boot_defclass)\s*
3
+ \(
4
+ \s*"([\w:]+)",
5
+ \s*(\w+|0)\s*
6
+ \)/mx
7
+
8
+ MATCH2 = /([\w\.]+)\s* = \s*rb_define_class_under\s*
9
+ \(
10
+ \s*(\w+),
11
+ \s*"(\w+)"(?:,
12
+ \s*([\w\*\s\(\)\.\->]+)\s*)? # for SWIG
13
+ \s*\)/mx
14
+ handles MATCH1
15
+ handles MATCH2
16
+ statement_class BodyStatement
17
+
18
+ process do
19
+ statement.source.scan(MATCH1) do |var_name, class_name, parent|
20
+ handle_class(var_name, class_name, parent)
21
+ end
22
+ statement.source.scan(MATCH2) do |var_name, in_module, class_name, parent|
23
+ handle_class(var_name, class_name, parent, in_module)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,12 @@
1
+ class YARD::Handlers::C::ConstantHandler < YARD::Handlers::C::Base
2
+ MATCH = %r{\brb_define_((?:readonly_)?variable|(?:global_)?const)
3
+ \s*\((?:\s*(\w+),)?\s*"(\w+)",\s*(.*?)\s*\)\s*;}xm
4
+ handles MATCH
5
+ statement_class BodyStatement
6
+
7
+ process do
8
+ statement.source.scan(MATCH) do |type, var_name, const_name, value|
9
+ handle_constants(type, var_name, const_name, value)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,165 @@
1
+ module YARD
2
+ module Handlers
3
+ module C
4
+ module HandlerMethods
5
+ include Parser::C
6
+ include CodeObjects
7
+
8
+ def handle_class(var_name, class_name, parent, in_module = nil)
9
+ parent = nil if parent == "0"
10
+ namespace = in_module ? namespace_for_variable(in_module) : Registry.root
11
+ register ClassObject.new(namespace, class_name) do |obj|
12
+ if parent
13
+ parent_class = namespace_for_variable(parent)
14
+ if parent_class.is_a?(Proxy)
15
+ obj.superclass = "::#{parent_class.path}"
16
+ obj.superclass.type = :class
17
+ else
18
+ obj.superclass = parent_class
19
+ end
20
+ end
21
+ namespaces[var_name] = obj
22
+ register_file_info(obj, statement.file, statement.line)
23
+ end
24
+ end
25
+
26
+ def handle_module(var_name, module_name, in_module = nil)
27
+ namespace = in_module ? namespace_for_variable(in_module) : Registry.root
28
+ register ModuleObject.new(namespace, module_name) do |obj|
29
+ namespaces[var_name] = obj
30
+ register_file_info(obj, statement.file, statement.line)
31
+ end
32
+ end
33
+
34
+ def handle_method(scope, var_name, name, func_name, source_file = nil)
35
+ visibility = :public
36
+ case scope
37
+ when "singleton_method"; scope = :class
38
+ when "module_function"; scope = :module
39
+ when "private_method"; scope = :instance; visibility = :private
40
+ else; scope = :instance
41
+ end
42
+
43
+ namespace = namespace_for_variable(var_name)
44
+ return if namespace.nil? # XXX: raise UndocumentableError might be too noisy.
45
+ register MethodObject.new(namespace, name, scope) do |obj|
46
+ register_visibility(obj, visibility)
47
+ find_method_body(obj, func_name)
48
+ obj.docstring.add_tag(Tags::Tag.new(:return, '', 'Boolean')) if name =~ /\?$/
49
+ end
50
+ end
51
+
52
+ def handle_attribute(var_name, name, read, write)
53
+ values = {:read => read.to_i, :write => write.to_i}
54
+ {:read => name, :write => "#{name}="}.each do |type, meth_name|
55
+ next unless values[type] > 0
56
+ obj = handle_method(:instance, var_name, meth_name, nil)
57
+ obj.namespace.attributes[:instance][name] ||= SymbolHash[:read => nil, :write => nil]
58
+ obj.namespace.attributes[:instance][name][type] = obj
59
+ end
60
+ end
61
+
62
+ def handle_alias(var_name, new_name, old_name)
63
+ namespace = namespace_for_variable(var_name)
64
+ new_meth, old_meth = new_name.to_sym, old_name.to_sym
65
+ old_obj = namespace.child(:name => old_meth, :scope => :instance)
66
+ new_obj = register MethodObject.new(namespace, new_meth, :instance) do |o|
67
+ register_visibility(o, visibility)
68
+ register_file_info(o, statement.file, statement.line)
69
+ end
70
+
71
+ if old_obj
72
+ new_obj.signature = old_obj.signature
73
+ new_obj.source = old_obj.source
74
+ new_obj.docstring = old_obj.docstring
75
+ new_obj.docstring.object = new_obj
76
+ else
77
+ new_obj.signature = "def #{new_meth}" # this is all we know.
78
+ end
79
+
80
+ namespace.aliases[new_obj] = old_meth
81
+ end
82
+
83
+ def handle_constants(type, var_name, const_name, value)
84
+ return unless type == 'const'
85
+ namespace = namespace_for_variable(var_name)
86
+ register ConstantObject.new(namespace, const_name) do |obj|
87
+ obj.source_type = :c
88
+ obj.value = value
89
+ register_file_info(obj, statement.file, statement.line)
90
+ find_constant_docstring(obj)
91
+ end
92
+ end
93
+
94
+ private
95
+
96
+ def find_constant_docstring(object)
97
+ comment = nil
98
+
99
+ # look inside overrides for declaration value
100
+ override_comments.each do |name, override_comment|
101
+ next unless override_comment.file == statement.file
102
+ just_const_name = name.gsub(/\A.+::/, '')
103
+ if object.path == name || object.name.to_s == just_const_name
104
+ comment = override_comment.source
105
+ stmt = override_comment
106
+ break
107
+ end
108
+ end
109
+
110
+ # use any comments on this statement as a last resort
111
+ if comment.nil? && statement.comments && statement.comments.source =~ /\S/
112
+ comment = statement.comments.source
113
+ stmt = statement.comments
114
+ end
115
+
116
+ # In the case of rb_define_const, the definition and comment are in
117
+ # "/* definition: comment */" form. The literal ':' and '\' characters
118
+ # can be escaped with a backslash.
119
+ if comment
120
+ comment.scan(/\A\s*(.*?[^\s\\]):\s*(.+)/m) do |new_value, new_comment|
121
+ object.value = new_value.gsub(/\\:/, ':')
122
+ comment = new_comment
123
+ end
124
+ register_docstring(object, comment, stmt)
125
+ end
126
+ end
127
+
128
+ def find_method_body(object, symbol)
129
+ file, in_file = statement.file, false
130
+ if statement.comments && statement.comments.source =~ /\A\s*in (\S+)\Z/
131
+ file, in_file = $1, true
132
+ process_file(file, object)
133
+ end
134
+
135
+ if src_stmt = symbols[symbol]
136
+ register_file_info(object, src_stmt.file, src_stmt.line, true)
137
+ register_source(object, src_stmt)
138
+ unless src_stmt.comments.nil? || src_stmt.comments.source.empty?
139
+ register_docstring(object, src_stmt.comments.source, src_stmt)
140
+ return # found docstring
141
+ end
142
+ end
143
+
144
+ # found source (possibly) but no docstring
145
+ # so look in overrides
146
+ override_comments.each do |name, override_comment|
147
+ next unless override_comment.file == file
148
+ name = name.gsub(/::([^:]+?)\Z/, '.\1')
149
+ just_method_name = name.gsub(/\A.+(#|::|\.)/, '')
150
+ just_method_name = 'initialize' if just_method_name == 'new'
151
+ if object.path == name || object.name.to_s == just_method_name
152
+ register_docstring(object, override_comment.source, override_comment)
153
+ return
154
+ end
155
+ end
156
+
157
+ # use any comments on this statement as a last resort
158
+ if !in_file && statement.comments && statement.comments.source =~ /\S/
159
+ register_docstring(object, statement.comments.source, statement)
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,16 @@
1
+ # Handles the Init_Libname() method
2
+ class YARD::Handlers::C::InitHandler < YARD::Handlers::C::Base
3
+ MATCH = %r{\A\s*(?:static\s+)?void\s+[Ii]nit_(\w+)\s*}
4
+ handles MATCH
5
+ statement_class ToplevelStatement
6
+
7
+ process do
8
+ parse_block
9
+ ns = namespace_for_variable(statement.declaration[MATCH, 1])
10
+ if ns.is_a?(YARD::CodeObjects::NamespaceObject) && ns.docstring.blank?
11
+ if statement.comments
12
+ register_docstring(ns, statement.comments.source, statement)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ class YARD::Handlers::C::MethodHandler < YARD::Handlers::C::Base
2
+ MATCH1 = %r{rb_define_
3
+ (
4
+ singleton_method |
5
+ method |
6
+ module_function |
7
+ private_method
8
+ )
9
+ \s*\(\s*([\w\.]+),
10
+ \s*"([^"]+)",
11
+ \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
12
+ \s*(-?\w+)\s*\)}xm
13
+ MATCH2 = %r{rb_define_global_function\s*\(
14
+ \s*"([^"]+)",
15
+ \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
16
+ \s*(-?\w+)\s*\)}xm
17
+ handles MATCH1
18
+ handles MATCH2
19
+ statement_class BodyStatement
20
+
21
+ process do
22
+ statement.source.scan(MATCH1) do |type, var_name, name, func_name, param_count|
23
+ break if var_name == "ruby_top_self"
24
+ break if var_name == "nstr"
25
+ break if var_name == "envtbl"
26
+
27
+ var_name = "rb_cObject" if var_name == "rb_mKernel"
28
+ handle_method(type, var_name, name, func_name)
29
+ end
30
+
31
+ statement.source.scan(MATCH2) do |name, func_name, param_count|
32
+ handle_method("method", "rb_mKernel", name, func_name)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,13 @@
1
+ class YARD::Handlers::C::MixinHandler < YARD::Handlers::C::Base
2
+ MATCH = /rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/
3
+ handles MATCH
4
+ statement_class BodyStatement
5
+
6
+ process do
7
+ statement.source.scan(MATCH) do |klass_var, mixin_var|
8
+ namespace = namespace_for_variable(klass_var)
9
+ ensure_loaded!(namespace)
10
+ namespace.mixins(:instance) << namespace_for_variable(mixin_var)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ class YARD::Handlers::C::ModuleHandler < YARD::Handlers::C::Base
2
+ MATCH1 = /([\w\.]+)\s* = \s*rb_define_module\s*\(\s*"([\w:]+)"\s*\)/mx
3
+ MATCH2 = /([\w\.]+)\s* = \s*rb_define_module_under\s*\(\s*(\w+),\s*"(\w+)"\s*\)/mx
4
+ handles MATCH1
5
+ handles MATCH2
6
+ statement_class BodyStatement
7
+
8
+ process do
9
+ statement.source.scan(MATCH1) do |var_name, module_name|
10
+ handle_module(var_name, module_name)
11
+ end
12
+ statement.source.scan(MATCH2) do |var_name, in_module, module_name|
13
+ handle_module(var_name, module_name, in_module)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ # Parses comments
2
+ class YARD::Handlers::C::OverrideCommentHandler < YARD::Handlers::C::Base
3
+ handles %r{.}
4
+ statement_class Comment
5
+
6
+ process do
7
+ return if statement.overrides.empty?
8
+ statement.overrides.each do |type, name|
9
+ override_comments << [name, statement]
10
+ obj = nil
11
+ case type
12
+ when :class
13
+ name, superclass = *name.split(/\s*<\s*/)
14
+ obj = YARD::CodeObjects::ClassObject.new(:root, name)
15
+ obj.superclass = "::#{superclass}" if superclass
16
+ when :module
17
+ obj = YARD::CodeObjects::ModuleObject.new(:root, name)
18
+ end
19
+ register_docstring(obj, statement.source, statement) if obj
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ class YARD::Handlers::C::PathHandler < YARD::Handlers::C::Base
2
+ MATCH = /([\w\.]+)\s* = \s*rb_path2class\s*\(\s*"([\w:]+)"\)/mx
3
+ handles MATCH
4
+
5
+ process do
6
+ statement.source.scan(MATCH) do |var_name, path|
7
+ namespaces[var_name] = P(path)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class YARD::Handlers::C::StructHandler < YARD::Handlers::C::Base
2
+ MATCH = /([\w\.]+)\s*=\s*(?:rb_struct_define_without_accessor)\s*
3
+ \(\s*"([\w:]+)"\s*,\s*(\w+)\s*/mx
4
+ handles MATCH
5
+ statement_class BodyStatement
6
+
7
+ process do
8
+ statement.source.scan(MATCH) do |var_name, class_name, parent|
9
+ handle_class(var_name, class_name, parent)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # Keeps track of function bodies for symbol lookup during Ruby method declarations
2
+ class YARD::Handlers::C::SymbolHandler < YARD::Handlers::C::Base
3
+ MATCH = %r{\A\s*(?:(?:static|SWIGINTERN)\s+)?(?:intern\s+)?VALUE\s+(\w+)\s*\(}
4
+ handles MATCH
5
+ statement_class ToplevelStatement
6
+ process { symbols[statement.source[MATCH, 1]] = statement }
7
+ end
@@ -35,6 +35,7 @@ module YARD
35
35
 
36
36
  register_handler_namespace :ruby, Ruby
37
37
  register_handler_namespace :ruby18, Ruby::Legacy
38
+ register_handler_namespace :c, C
38
39
 
39
40
  # @return [String] the filename
40
41
  attr_accessor :file
@@ -54,22 +55,19 @@ module YARD
54
55
  # is set as the owner, in case any extra method information is processed.
55
56
  attr_accessor :owner
56
57
 
57
- # @return [Boolean] whether or not {Parser::LoadOrderError} is raised
58
- attr_accessor :load_order_errors
59
-
60
58
  # @return [Symbol] the parser type (:ruby, :ruby18, :c)
61
59
  attr_accessor :parser_type
62
-
63
- # Handlers can share state for the entire post processing stage through
60
+
61
+ # Handlers can share state for the entire post processing stage through
64
62
  # this attribute. Note that post processing stage spans multiple files.
65
63
  # To share state only within a single file, use {#extra_state}
66
- #
64
+ #
67
65
  # @example Sharing state among two handlers
68
66
  # class Handler1 < YARD::Handlers::Ruby::Base
69
67
  # handles :class
70
68
  # process { globals.foo = :bar }
71
69
  # end
72
- #
70
+ #
73
71
  # class Handler2 < YARD::Handlers::Ruby::Base
74
72
  # handles :method
75
73
  # process { puts globals.foo }
@@ -77,41 +75,29 @@ module YARD
77
75
  # @return [OpenStruct] global shared state for post-processing stage
78
76
  # @see #extra_state
79
77
  attr_accessor :globals
80
-
78
+
81
79
  # Share state across different handlers inside of a file.
82
80
  # This attribute is similar to {#visibility}, {#scope}, {#namespace}
83
81
  # and {#owner}, in that they all maintain state across all handlers
84
82
  # for the entire source file. Use this attribute to store any data
85
83
  # your handler might need to save during the parsing of a file. If
86
84
  # you need to save state across files, see {#globals}.
87
- #
85
+ #
88
86
  # @return [OpenStruct] an open structure that can store arbitrary data
89
87
  # @see #globals
90
88
  attr_accessor :extra_state
91
89
 
92
90
  # Creates a new Processor for a +file+.
93
- #
94
- # @param [String] file the name of the file that is being processed.
95
- # uses '(stdin)' if file is nil.
96
- # @param [Boolean] load_order_error whether or not to raise {Parser::LoadOrderError}
97
- # when a file has unresolved references that need to be parsed first.
98
- # If these errors are raised, the processor will attempt to load all
99
- # other files before continuing to parse the file.
100
- # @param [Symbol] parser_type the parser type (:ruby, :ruby18, :c) from
101
- # the parser. Used to select the handler (since handlers are specific
102
- # to a parser type).
103
- # @param [OpenStruct] globals the object holding all state during the
104
- # post processing stage
105
- def initialize(file = nil, load_order_errors = false, parser_type = Parser::SourceParser.parser_type, globals = nil)
106
- @file = file || "(stdin)"
91
+ # @param [SourceParser] parser the parser used to initialize the processor
92
+ def initialize(parser)
93
+ @file = parser.file || "(stdin)"
107
94
  @namespace = YARD::Registry.root
108
95
  @visibility = :public
109
96
  @scope = :instance
110
97
  @owner = @namespace
111
- @load_order_errors = load_order_errors
112
- @parser_type = parser_type
98
+ @parser_type = parser.parser_type
113
99
  @handlers_loaded = {}
114
- @globals = globals || OpenStruct.new
100
+ @globals = parser.globals || OpenStruct.new
115
101
  @extra_state = OpenStruct.new
116
102
  load_handlers
117
103
  end
@@ -126,8 +112,6 @@ module YARD
126
112
  find_handlers(stmt).each do |handler|
127
113
  begin
128
114
  handler.new(self, stmt).process
129
- rescue Parser::LoadOrderError => loaderr
130
- raise # Pass this up
131
115
  rescue NamespaceMissingError => missingerr
132
116
  log.warn "The #{missingerr.object.type} #{missingerr.object.path} has not yet been recognized."
133
117
  log.warn "If this class/method is part of your source tree, this will affect your documentation results."
@@ -145,6 +129,19 @@ module YARD
145
129
  end
146
130
  end
147
131
 
132
+ # Continue parsing the remainder of the files in the +globals.ordered_parser+
133
+ # object. After the remainder of files are parsed, processing will continue
134
+ # on the current file.
135
+ #
136
+ # @return [void]
137
+ # @see Parser::OrderedParser
138
+ def parse_remaining_files
139
+ if globals.ordered_parser
140
+ globals.ordered_parser.parse
141
+ log.debug("Re-processing #{@file}...")
142
+ end
143
+ end
144
+
148
145
  # Searches for all handlers in {Base.subclasses} that match the +statement+
149
146
  #
150
147
  # @param statement the statement object to match.
@@ -153,12 +150,21 @@ module YARD
153
150
  Base.subclasses.find_all do |handler|
154
151
  handler_base_class > handler &&
155
152
  (handler.namespace_only? ? owner.is_a?(CodeObjects::NamespaceObject) : true) &&
156
- handler.matches_file?(file) && handler.handles?(statement)
153
+ handles?(handler, statement)
157
154
  end
158
155
  end
159
156
 
160
157
  private
161
158
 
159
+ def handles?(handler, statement)
160
+ return false unless handler.matches_file?(file)
161
+ if handler.method(:handles?).arity == 1
162
+ handler.handles?(statement)
163
+ elsif [-1, 2].include?(handler.method(:handles?).arity)
164
+ handler.handles?(statement, self)
165
+ end
166
+ end
167
+
162
168
  # Returns the handler base class
163
169
  # @return [Base] the base class
164
170
  def handler_base_class
@@ -179,7 +185,12 @@ module YARD
179
185
  # @return [void]
180
186
  def load_handlers
181
187
  return if @handlers_loaded[parser_type]
182
- handler_base_namespace.constants.each {|c| handler_base_namespace.const_get(c) }
188
+ handler_base_namespace.constants.each do |c|
189
+ const = handler_base_namespace.const_get(c)
190
+ unless Handlers::Base.subclasses.include?(const)
191
+ Handlers::Base.subclasses << const
192
+ end
193
+ end
183
194
  @handlers_loaded[parser_type] = true
184
195
  end
185
196
  end