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
@@ -233,6 +233,7 @@ module YARD
233
233
  # match for a handler. If no file match is specified, returns true.
234
234
  # @since 0.6.2
235
235
  def matches_file?(filename)
236
+ @in_files ||= nil # avoid ruby warnings
236
237
  return true unless @in_files
237
238
  @in_files.any? do |in_file|
238
239
  case in_file
@@ -251,8 +252,8 @@ module YARD
251
252
  # module so that the handler class can be extended with mixins that
252
253
  # override the +process+ method without alias chaining.
253
254
  #
254
- # @macro yard.handlers.process
255
- # @method process
255
+ # @!macro yard.handlers.process
256
+ # @!method process
256
257
  # Main processing callback
257
258
  # @return [void]
258
259
  # @see #process
@@ -297,8 +298,6 @@ module YARD
297
298
  raise NotImplementedError, "#{self} did not implement a #parse_block method for handling"
298
299
  end
299
300
 
300
- protected
301
-
302
301
  # @return [Processor] the processor object that manages all global state
303
302
  # during handling.
304
303
  attr_reader :parser
@@ -325,9 +324,10 @@ module YARD
325
324
 
326
325
  # (see Processor#extra_state)
327
326
  attr_reader :extra_state
328
-
327
+
329
328
  undef owner, owner=, namespace, namespace=
330
329
  undef visibility, visibility=, scope, scope=
330
+ undef globals, extra_state
331
331
 
332
332
  def owner; parser.owner end
333
333
  def owner=(v) parser.owner=(v) end
@@ -388,62 +388,136 @@ module YARD
388
388
  def register(*objects)
389
389
  objects.flatten.each do |object|
390
390
  next unless object.is_a?(CodeObjects::Base)
391
-
392
- begin
393
- ensure_loaded!(object.namespace)
394
- object.namespace.children << object
395
- rescue NamespaceMissingError
396
- end
397
-
398
- # Yield the object to the calling block because ruby will parse the syntax
399
- #
400
- # register obj = ClassObject.new {|o| ... }
401
- #
402
- # as the block for #register. We need to make sure this gets to the object.
391
+ register_ensure_loaded(object)
403
392
  yield(object) if block_given?
393
+ register_file_info(object)
394
+ register_source(object)
395
+ register_visibility(object)
396
+ register_docstring(object)
397
+ register_group(object)
398
+ register_dynamic(object)
399
+ register_module_function(object)
400
+ end
401
+ objects.size == 1 ? objects.first : objects
402
+ end
404
403
 
405
- object.add_file(parser.file, statement.line, statement.comments)
404
+ # Ensures that the object's namespace is loaded before attaching it
405
+ # to the namespace.
406
+ #
407
+ # @param [CodeObjects::Base] object the object to register
408
+ # @return [void]
409
+ # @since 0.8.0
410
+ def register_ensure_loaded(object)
411
+ begin
412
+ ensure_loaded!(object.namespace)
413
+ object.namespace.children << object
414
+ rescue NamespaceMissingError
415
+ end
416
+ end
406
417
 
407
- # Add docstring if there is one.
408
- if statement.comments
409
- object.docstring = Docstring.new(statement.comments, object)
410
- end
418
+ # Registers the file/line of the declaration with the object
419
+ #
420
+ # @param [CodeObjects::Base] object the object to register
421
+ # @return [void]
422
+ # @since 0.8.0
423
+ def register_file_info(object, file = parser.file, line = statement.line, comments = statement.comments)
424
+ object.add_file(file, line, comments)
425
+ end
411
426
 
412
- # Expand/create any @macro tags
413
- expand_macro(object, find_or_create_macro(object))
427
+ # Registers any docstring found for the object and expands macros
428
+ #
429
+ # @param [CodeObjects::Base] object the object to register
430
+ # @return [void]
431
+ # @since 0.8.0
432
+ def register_docstring(object, docstring = statement.comments, stmt = statement)
433
+ docstring = docstring.join("\n") if Array === docstring
434
+ parser = DocstringParser.new
435
+ parser.parse(docstring || "", object, self)
414
436
 
415
- # Add hash_flag/line_range
416
- if statement.comments
417
- object.docstring.hash_flag = statement.comments_hash_flag
418
- object.docstring.line_range = statement.comments_range
419
- end
437
+ if object && docstring
438
+ object.docstring = parser.to_docstring
420
439
 
421
- # Add group information
422
- if statement.group
423
- unless object.namespace.is_a?(Proxy)
424
- object.namespace.groups |= [statement.group]
425
- end
426
- object.group = statement.group
440
+ # Add hash_flag/line_range
441
+ if stmt
442
+ object.docstring.hash_flag = stmt.comments_hash_flag
443
+ object.docstring.line_range = stmt.comments_range
427
444
  end
445
+ end
428
446
 
429
- # Add transitive tags
430
- Tags::Library.transitive_tags.each do |tag|
431
- next if object.namespace.is_a?(Proxy)
432
- next unless object.namespace.has_tag?(tag)
433
- next if object.has_tag?(tag)
434
- object.docstring.add_tag(*object.namespace.tags(tag))
435
- end
447
+ register_transitive_tags(object)
448
+ end
436
449
 
437
- # Add source only to non-class non-module objects
438
- unless object.is_a?(NamespaceObject)
439
- object.source ||= statement
450
+ # Registers the object as being inside a specific group
451
+ #
452
+ # @param [CodeObjects::Base] object the object to register
453
+ # @return [void]
454
+ # @since 0.8.0
455
+ def register_group(object, group = extra_state.group)
456
+ if group
457
+ unless object.namespace.is_a?(Proxy)
458
+ object.namespace.groups |= [group]
440
459
  end
460
+ object.group = group
461
+ end
462
+ end
441
463
 
442
- # Make it dynamic if its owner is not its namespace.
443
- # This generally means it was defined in a method (or block of some sort)
444
- object.dynamic = true if owner != namespace
464
+ # Registers any transitive tags from the namespace on the object
465
+ #
466
+ # @param [CodeObjects::Base, nil] object the object to register
467
+ # @return [void]
468
+ # @since 0.8.0
469
+ def register_transitive_tags(object)
470
+ return unless object
471
+ Tags::Library.transitive_tags.each do |tag|
472
+ next if object.namespace.is_a?(Proxy)
473
+ next unless object.namespace.has_tag?(tag)
474
+ next if object.has_tag?(tag)
475
+ object.docstring.add_tag(*object.namespace.tags(tag))
445
476
  end
446
- objects.size == 1 ? objects.first : objects
477
+ end
478
+
479
+ # @param [CodeObjects::Base] object the object to register
480
+ # @return [void]
481
+ # @since 0.8.0
482
+ def register_source(object, source = statement, type = parser.parser_type)
483
+ return unless object.is_a?(MethodObject)
484
+ object.source ||= source
485
+ object.source_type = type
486
+ end
487
+
488
+ # Registers visibility on a method object. If the object does not
489
+ # respond to setting visibility, nothing is done.
490
+ #
491
+ # @param [#visibility=] object the object to register
492
+ # @param [Symbol] visibility the visibility to set on the object
493
+ # @since 0.8.0
494
+ def register_visibility(object, visibility = self.visibility)
495
+ return unless object.respond_to?(:visibility=)
496
+ object.visibility = visibility
497
+ end
498
+
499
+ # Registers the same method information on the module function, if
500
+ # the object was defined as a module function.
501
+ #
502
+ # @param [CodeObjects::Base] object the possible module function object
503
+ # to copy data for
504
+ # @since 0.8.0
505
+ def register_module_function(object)
506
+ return unless object.is_a?(MethodObject)
507
+ return unless object.module_function?
508
+ modobj = MethodObject.new(object.namespace, object.name)
509
+ object.copy_to(modobj)
510
+ modobj.visibility = :private
511
+ end
512
+
513
+ # Registers the object as dynamic if the object is defined inside
514
+ # a method or block (owner != namespace)
515
+ #
516
+ # @param [CodeObjects::Base] object the object to register
517
+ # @return [void]
518
+ # @since 0.8.0
519
+ def register_dynamic(object)
520
+ object.dynamic = true if owner != namespace
447
521
  end
448
522
 
449
523
  # Ensures that a specific +object+ has been parsed and loaded into the
@@ -469,36 +543,22 @@ module YARD
469
543
  def ensure_loaded!(object, max_retries = 1)
470
544
  return if object.root?
471
545
  return object unless object.is_a?(Proxy)
472
- unless parser.load_order_errors
473
- if object.is_a?(Proxy)
474
- raise NamespaceMissingError, object
475
- else
476
- nil
477
- end
478
- end
479
-
480
- unless CONTINUATIONS_SUPPORTED
481
- log.warn_no_continuations
482
- raise NamespaceMissingError, object
483
- end
484
546
 
485
547
  retries = 0
486
- context = callcc {|c| c }
487
- retries += 1
488
-
489
- if object.is_a?(Proxy)
548
+ while object.is_a?(Proxy)
490
549
  if retries <= max_retries
491
550
  log.debug "Missing object #{object} in file `#{parser.file}', moving it to the back of the line."
492
- raise Parser::LoadOrderError.new(context)
551
+ parser.parse_remaining_files
493
552
  else
494
553
  raise NamespaceMissingError, object
495
554
  end
555
+ retries += 1
496
556
  end
497
557
  object
498
558
  end
499
-
559
+
500
560
  # @group Macro Support
501
-
561
+
502
562
  # @abstract Implement this method to return the parameters in a method call
503
563
  # statement. It should return an empty list if the statement is not a
504
564
  # method call.
@@ -506,7 +566,7 @@ module YARD
506
566
  def call_params
507
567
  raise NotImplementedError
508
568
  end
509
-
569
+
510
570
  # @abstract Implement this method to return the method being called in
511
571
  # a method call. It should return nil if the statement is not a method
512
572
  # call.
@@ -515,55 +575,6 @@ module YARD
515
575
  def caller_method
516
576
  raise NotImplementedError
517
577
  end
518
-
519
- # Attempts to find or create a macro if a +@macro+ tag is found in the
520
- # docstring (or the object's docstring).
521
- #
522
- # @param [Docstring, CodeObjects::Base] object_or_docstring the docstring
523
- # or it's object with which to check for a macro
524
- # @return [CodeObjects::MacroObject] the newly created macro
525
- # @return [nil] if the docstring does not create or reference a macro
526
- def find_or_create_macro(object_or_docstring)
527
- if object_or_docstring.is_a?(Docstring)
528
- object, docstring = nil, object_or_docstring
529
- else
530
- object, docstring = object_or_docstring, object_or_docstring.docstring
531
- end
532
- return unless macro_tag = docstring.tag(:macro)
533
- unless macro_tag.name
534
- if object
535
- log.warn "Invalid/missing macro name for #{object.path} (#{parser.file}:#{statement.line})"
536
- return nil
537
- else
538
- raise UndocumentableError, 'method/attribute, missing macro name'
539
- end
540
- end
541
- caller_obj = caller_method ? P(namespace, caller_method) : nil
542
- if macro = MacroObject.find_or_create(docstring, caller_obj)
543
- attached_method_name = caller_method
544
- if object && object.is_a?(MethodObject) && object.scope == :class
545
- macro.method_object = object
546
- attached_method_name = object.name.to_s
547
- end
548
- if macro.attached?
549
- globals.__attached_macros ||= {}
550
- globals.__attached_macros[attached_method_name] ||= []
551
- globals.__attached_macros[attached_method_name] |= [macro]
552
- end
553
- end
554
- macro
555
- end
556
-
557
- # Sets the docstring on +object+ to the expanded macro.
558
- # @param [CodeObjects::Base] object the object to expand the macro on
559
- # @param [CodeObjects::MacroObject] macro the macro object to expand
560
- # @return [void]
561
- def expand_macro(object, macro)
562
- return unless macro
563
- all_params = ([caller_method] + call_params).compact
564
- data = MacroObject.apply_macro(macro, object.docstring, all_params, statement.source)
565
- object.docstring = Docstring.new(data, object)
566
- end
567
578
  end
568
579
  end
569
580
  end
@@ -0,0 +1,15 @@
1
+ class YARD::Handlers::C::AliasHandler < YARD::Handlers::C::Base
2
+ MATCH = %r{rb_define_alias
3
+ \s*\(\s*([\w\.]+),
4
+ \s*"([^"]+)",
5
+ \s*"([^"]+)"\s*\)}xm
6
+ handles MATCH
7
+ statement_class BodyStatement
8
+
9
+ process do
10
+ statement.source.scan(MATCH) do |var_name, new_name, old_name|
11
+ var_name = "rb_cObject" if var_name == "rb_mKernel"
12
+ handle_alias(var_name, new_name, old_name)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ class YARD::Handlers::C::AttributeHandler < YARD::Handlers::C::Base
2
+ MATCH = %r{rb_define_attr\s*\(\s*([\w\.]+),\s*"([^"]+)",\s*(0|1)\s*,\s*(0|1)\s*\)}
3
+ handles MATCH
4
+
5
+ process do
6
+ return if ToplevelStatement == statement
7
+ return if Comment === statement && statement.type != :multi
8
+ statement.source.scan(MATCH) do |var_name, name, read, write|
9
+ handle_attribute(var_name, name, read, write)
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,110 @@
1
+ module YARD
2
+ module Handlers
3
+ module C
4
+ class Base < Handlers::Base
5
+ include YARD::Parser::C
6
+ include HandlerMethods
7
+
8
+ # @return [Boolean] whether the handler handles this statement
9
+ def self.handles?(statement, processor)
10
+ processor.globals.cruby_processed_files ||= {}
11
+ processor.globals.cruby_processed_files[processor.file] = true
12
+
13
+ if statement.respond_to? :declaration
14
+ src = statement.declaration
15
+ else
16
+ src = statement.source
17
+ end
18
+
19
+ handlers.any? do |a_handler|
20
+ statement_class >= statement.class &&
21
+ case a_handler
22
+ when String
23
+ src == a_handler
24
+ when Regexp
25
+ src =~ a_handler
26
+ end
27
+ end
28
+ end
29
+
30
+ def self.statement_class(type = nil)
31
+ type ? @statement_class = type : (@statement_class || Statement)
32
+ end
33
+
34
+ # @group Registering objects
35
+
36
+ def register_docstring(object, docstring = nil, stmt = nil)
37
+ super(object, docstring, stmt) if docstring
38
+ end
39
+
40
+ def register_file_info(object, file = nil, line = nil, comments = nil)
41
+ super(object, file, line, comments) if file
42
+ end
43
+
44
+ def register_source(object, source = nil, type = nil)
45
+ super(object, source, type) if source
46
+ end
47
+
48
+ def register_visibility(object, visibility = nil)
49
+ super(object, visibility) if visibility
50
+ end
51
+
52
+ # @group Looking up Symbol and Var Values
53
+
54
+ def symbols
55
+ globals.cruby_symbols ||= {}
56
+ end
57
+
58
+ def override_comments
59
+ globals.cruby_override_comments ||= []
60
+ end
61
+
62
+ def namespace_for_variable(var)
63
+ return namespaces[var] if namespaces[var]
64
+ var = remove_var_prefix(var)
65
+ var.empty? ? nil : P(var)
66
+ end
67
+
68
+ def namespaces
69
+ globals.cruby_namespaces ||= {}
70
+ end
71
+
72
+ def processed_files
73
+ globals.cruby_processed_files ||= {}
74
+ end
75
+
76
+ # @group Parsing an Inner Block
77
+
78
+ def parse_block(opts = {})
79
+ return if !statement.block || statement.block.empty?
80
+ push_state(opts) do
81
+ parser.process(statement.block)
82
+ end
83
+ end
84
+
85
+ # @group Processing other files
86
+
87
+ def process_file(file, object)
88
+ file = File.cleanpath(File.relative_path(statement.file, file))
89
+ return if processed_files[file]
90
+ processed_files[file] = file
91
+ begin
92
+ log.debug "Processing embedded call to C source #{file}..."
93
+ globals.ordered_parser.files.delete(file) if globals.ordered_parser
94
+ parser.process(Parser::C::CParser.new(File.read(file), file).parse)
95
+ rescue Errno::ENOENT
96
+ log.warn "Missing source file `#{file}' when parsing #{object}"
97
+ end
98
+ end
99
+
100
+ # @endgroup
101
+
102
+ private
103
+
104
+ def remove_var_prefix(var)
105
+ var.gsub(/^rb_[mc]|^[a-z_]+/, '')
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end