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,225 @@
1
+ module YARD
2
+ module Parser
3
+ module C
4
+ class CParser < Base
5
+ def initialize(source, file = '(stdin)')
6
+ @file = file
7
+ @namespaces = {}
8
+ @content = source
9
+ @index = 0
10
+ @line = 1
11
+ @state = nil
12
+ @newline = true
13
+ @statements = []
14
+ @last_comment = nil
15
+ @last_statement = nil
16
+ end
17
+
18
+ def parse
19
+ parse_toplevel
20
+ enumerator
21
+ end
22
+
23
+ def enumerator
24
+ @statements
25
+ end
26
+
27
+ def tokenize
28
+ raise NotImplementedError, "no tokenization support for C/C++ files"
29
+ end
30
+
31
+ private
32
+
33
+ def parse_toplevel
34
+ advance_loop do
35
+ case char
36
+ when /['"]/; consume_quote(char)
37
+ when '#'; consume_directive
38
+ when '/'; consume_comment
39
+ when /\s/; consume_whitespace
40
+ else consume_toplevel_statement
41
+ end
42
+ end
43
+ end
44
+
45
+ def consume_quote(type = '"')
46
+ advance
47
+ advance_loop do
48
+ case char
49
+ when "\n"; advance; nextline
50
+ when '\\'; advance(2)
51
+ when type; advance; return
52
+ else advance
53
+ end
54
+ end
55
+ end
56
+
57
+ def consume_directive
58
+ return unless @newline
59
+ @last_comment = nil
60
+ @last_statement = nil
61
+ advance_loop do
62
+ if char == '\\' && nextchar =~ /[\r\n]/
63
+ advance_loop { advance; break(nextline) if char == "\n" }
64
+ elsif char == "\n"
65
+ return
66
+ end
67
+ advance
68
+ end
69
+ end
70
+
71
+ def consume_toplevel_statement
72
+ @newline = false
73
+ start = @index
74
+ line = @line
75
+ decl = consume_until(/[{;]/)
76
+ return nil if decl =~ /\A\s*\Z/
77
+ statement = ToplevelStatement.new(nil, @file, line)
78
+ @statements << statement
79
+ attach_comment(statement)
80
+ stmts = nil
81
+ if prevchar == '{'
82
+ stmts = consume_body_statements
83
+ consume_until(';') if decl =~ /\A(typedef|enum|class|struct|union)\b/
84
+ end
85
+ statement.source = @content[start..@index]
86
+ statement.block = stmts
87
+ statement.declaration = decl
88
+ end
89
+
90
+ def consume_body_statements
91
+ stmts = []
92
+ brace_level = 1
93
+ while true
94
+ strip_non_statement_data
95
+ start, line = @index, @line
96
+ consume_until(/[{};]/)
97
+ brace_level += 1 if prevchar == '{'
98
+ brace_level -= 1 if prevchar == '}'
99
+
100
+ break if prevchar.empty? || (brace_level <= 0 && prevchar == '}')
101
+ end_chr = @index
102
+ end_chr -= 1 if prevchar == '}'
103
+ src = @content[start...@index]
104
+ if src && src !~ /\A\s*\Z|\A\}\Z/
105
+ stmt = BodyStatement.new(src, @file, line)
106
+ attach_comment(stmt)
107
+ stmts << stmt
108
+ end
109
+ end
110
+ stmts
111
+ end
112
+
113
+ def strip_non_statement_data
114
+ start = @index
115
+ begin
116
+ start = @index
117
+ case char
118
+ when /\s/; consume_whitespace
119
+ when '#'; consume_directive
120
+ when '/'; consume_comment
121
+ end
122
+ end until start == @index
123
+ end
124
+
125
+ def consume_whitespace
126
+ advance_loop { nextline if char == "\n"; break if char =~ /\S/; advance }
127
+ end
128
+
129
+ def consume_comment(add_comment = true)
130
+ return(advance) unless nextchar == '*' || nextchar == '/'
131
+ line = @line
132
+ type = nextchar == '*' ? :multi : :line
133
+ advance(2)
134
+ comment = ""
135
+ advance_loop do
136
+ comment << char
137
+ if type == :multi
138
+ nextline if char == "\n"
139
+ if char(2) == '*/'
140
+ if add_comment
141
+ comment << '/'
142
+ stmt = Comment.new(comment, @file, line)
143
+ stmt.type = type
144
+ attach_comment(stmt)
145
+ @statements << stmt
146
+ end
147
+ return advance(2)
148
+ end
149
+ elsif char == "\n"
150
+ if add_comment
151
+ stmt = Comment.new(comment[0...-1], @file, line)
152
+ stmt.type = type
153
+ attach_comment(stmt)
154
+ @statements << stmt
155
+ end
156
+ return
157
+ end
158
+ advance
159
+ end
160
+ end
161
+
162
+ def consume_until(end_char, bracket_level = 0, brace_level = 0, add_comment = true)
163
+ end_char = /#{end_char}/ if end_char.is_a?(String)
164
+ start = @index
165
+ advance_loop do
166
+ chr = char
167
+ case chr
168
+ when /\s/; consume_whitespace
169
+ when /['"]/; consume_quote(char)
170
+ when '#'; consume_directive
171
+ when '/'; consume_comment(add_comment)
172
+ when '{'; advance; brace_level += 1
173
+ when '}'; advance; brace_level -= 1
174
+ when '('; advance; bracket_level += 1
175
+ when ')'; advance; bracket_level -= 1
176
+ else advance
177
+ end
178
+ @newline = false if chr !~ /\s/
179
+
180
+ if chr =~ end_char && (chr == '{' || chr == '(')
181
+ break
182
+ elsif chr =~ end_char && bracket_level <= 0 && brace_level <= 0
183
+ break
184
+ end
185
+ end
186
+ return @content[start...@index]
187
+ end
188
+
189
+ def attach_comment(statement)
190
+ if Comment === statement
191
+ if @last_statement && @last_statement.line == statement.line
192
+ @last_statement.comments = statement
193
+ statement.statement = @last_statement
194
+ end
195
+ @last_comment = statement
196
+ @last_statement = nil
197
+ else
198
+ if @last_comment
199
+ statement.comments = @last_comment
200
+ @last_comment.statement = statement
201
+ end
202
+ @last_statement = statement
203
+ @last_comment = nil
204
+ end
205
+ end
206
+
207
+ def advance(num = 1) @index += num end
208
+ def back(num = 1) @index -= num end
209
+
210
+ def advance_loop(&block)
211
+ while @index <= @content.size; yield end
212
+ end
213
+
214
+ def nextline
215
+ @line += 1
216
+ @newline = true
217
+ end
218
+
219
+ def char(num = 1) @content[@index, num] end
220
+ def prevchar(num = 1) @content[@index - 1, num] end
221
+ def nextchar(num = 1) @content[@index + 1, num] end
222
+ end
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,131 @@
1
+ module YARD
2
+ module Parser
3
+ module C
4
+ module CommentParser
5
+ protected
6
+
7
+ def parse_comments(comments)
8
+ @overrides = []
9
+ spaces = nil
10
+ comments = remove_private_comments(comments)
11
+ comments = comments.split(/\r?\n/).map do |line|
12
+ line.gsub!(%r{^\s*/?\*/?}, '')
13
+ line.gsub!(%r{\*/\s*$}, '')
14
+ if line =~ /^\s*$/
15
+ next if spaces.nil?
16
+ next ""
17
+ end
18
+ spaces = (line[/^(\s+)/, 1] || "").size if spaces.nil?
19
+ line.gsub(/^\s{0,#{spaces}}/, '').rstrip
20
+ end.compact
21
+
22
+ comments = parse_overrides(comments)
23
+ comments = parse_callseq(comments)
24
+ comments.join("\n")
25
+ end
26
+
27
+ private
28
+
29
+ def parse_overrides(comments)
30
+ comments.map do |line|
31
+ type, name = *line.scan(/^\s*Document-(class|module|method|const):\s*(\S.*)\s*$/).first
32
+ if type
33
+ @overrides << [type.to_sym, name]
34
+ nil
35
+ else
36
+ line
37
+ end
38
+ end.compact
39
+ end
40
+
41
+ def parse_callseq(comments)
42
+ return comments unless comments[0] =~ /\Acall-seq:\s*(\S.+)?/
43
+ if $1
44
+ comments[0] = " #{$1}"
45
+ else
46
+ comments.shift
47
+ end
48
+ overloads = []
49
+ seen_data = false
50
+ while comments.first =~ /^\s+(\S.+)/ || comments.first =~ /^\s*$/
51
+ line = comments.shift.strip
52
+ break if line.empty? && seen_data
53
+ next if line.empty?
54
+ seen_data = true
55
+ line.sub!(/^\w+[\.#]/, '')
56
+ signature, types = *line.split(/ [-=]> /)
57
+ types = parse_types(types)
58
+ if signature.sub!(/\[?\s*(\{(?:\s*\|(.+?)\|)?.*\})\s*\]?\s*$/, '') && $1
59
+ blk, blkparams = $1, $2
60
+ else
61
+ blk, blkparams = nil, nil
62
+ end
63
+ case signature
64
+ when /^(\w+)\s*=\s+(\w+)/
65
+ signature = "#{$1}=(#{$2})"
66
+ when /^\w+\s+\S/
67
+ signature = signature.split(/\s+/)
68
+ signature = "#{signature[1]}#{signature[2] ? '(' + signature[2..-1].join(' ') + ')' : ''}"
69
+ when /^\w+\[(.+?)\]\s*(=)?/
70
+ signature = "[]#{$2}(#{$1})"
71
+ when /^\w+\s+(#{CodeObjects::METHODMATCH})\s+(\w+)/
72
+ signature = "#{$1}(#{$2})"
73
+ end
74
+ break unless signature =~ /^#{CodeObjects::METHODNAMEMATCH}/
75
+ signature = signature.rstrip
76
+ overloads << "@overload #{signature}"
77
+ overloads << " @yield [#{blkparams}]" if blk
78
+ overloads << " @return [#{types.join(', ')}]" unless types.empty?
79
+ end
80
+
81
+ comments + [""] + overloads
82
+ end
83
+
84
+ def parse_types(types)
85
+ if types =~ /true or false/
86
+ ["Boolean"]
87
+ else
88
+ (types||"").split(/,| or /).map do |t|
89
+ case t.strip.gsub(/^an?_/, '')
90
+ when "class"; "Class"
91
+ when "obj", "object", "anObject"; "Object"
92
+ when "arr", "array", "anArray", /^\[/; "Array"
93
+ when /^char\s*\*/, "char", "str", "string", "new_str"; "String"
94
+ when "enum", "anEnumerator"; "Enumerator"
95
+ when "exc", "exception"; "Exception"
96
+ when "proc", "proc_obj", "prc"; "Proc"
97
+ when "binding"; "Binding"
98
+ when "hsh", "hash", "aHash"; "Hash"
99
+ when "ios", "io"; "IO"
100
+ when "file"; "File"
101
+ when "float"; "Float"
102
+ when "time", "new_time"; "Time"
103
+ when "dir", "aDir"; "Dir"
104
+ when "regexp", "new_regexp"; "Regexp"
105
+ when "matchdata"; "MatchData"
106
+ when "encoding"; "Encoding"
107
+ when "fixnum", "fix"; "Fixnum"
108
+ when /^(?:un)?signed$/, /^(?:(?:un)?signed\s*)?(?:short|int|long|long\s+long)$/, "integer", "Integer"; "Integer"
109
+ when "num", "numeric", "Numeric", "number"; "Numeric"
110
+ when "aBignum"; "Bignum"
111
+ when "nil"; "nil"
112
+ when "true"; "true"
113
+ when "false"; "false"
114
+ when "bool", "boolean", "Boolean"; "Boolean"
115
+ when "self"; "self"
116
+ when /^[-+]?\d/; t
117
+ when /[A-Z][_a-z0-9]+/; t
118
+ end
119
+ end.compact
120
+ end
121
+ end
122
+
123
+ def remove_private_comments(comment)
124
+ comment = comment.gsub(/\/?\*--\n(.*?)\/?\*\+\+/m, '')
125
+ comment = comment.sub(/\/?\*--\n.*/m, '')
126
+ comment
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,63 @@
1
+ module YARD
2
+ module Parser
3
+ module C
4
+ class Statement
5
+ attr_accessor :source
6
+ attr_accessor :line
7
+ attr_accessor :file
8
+
9
+ # @deprecated Groups are now defined by directives
10
+ # @see Tags::GroupDirective
11
+ attr_accessor :group
12
+
13
+ attr_accessor :comments_hash_flag
14
+
15
+ def initialize(source, file = nil, line = nil)
16
+ @source = source
17
+ @file = file
18
+ @line = line
19
+ end
20
+
21
+ def line_range
22
+ line...(line + source.count("\n"))
23
+ end
24
+
25
+ def comments_range
26
+ comments.line_range
27
+ end
28
+
29
+ def first_line
30
+ source.split(/\n/).first
31
+ end
32
+
33
+ def show
34
+ "\t#{line}: #{first_line}"
35
+ end
36
+ end
37
+
38
+ class BodyStatement < Statement
39
+ attr_accessor :comments
40
+ end
41
+
42
+ class ToplevelStatement < Statement
43
+ attr_accessor :block
44
+ attr_accessor :declaration
45
+ attr_accessor :comments
46
+ end
47
+
48
+ class Comment < Statement
49
+ include CommentParser
50
+
51
+ attr_accessor :type
52
+ attr_accessor :overrides
53
+ attr_accessor :statement
54
+
55
+ def initialize(source, file = nil, line = nil)
56
+ super(parse_comments(source), file, line)
57
+ end
58
+
59
+ def comments; self end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -39,7 +39,12 @@ module YARD
39
39
  # the AstNode children of the node, use {#children}.
40
40
  class AstNode < Array
41
41
  attr_accessor :docstring_hash_flag
42
- attr_accessor :docstring, :docstring_range, :source, :group
42
+ attr_accessor :docstring, :docstring_range, :source
43
+
44
+ # @deprecated Groups are now defined by directives
45
+ # @see Tags::GroupDirective
46
+ attr_accessor :group
47
+
43
48
  attr_writer :source_range, :line_range, :file, :full_source
44
49
  alias comments docstring
45
50
  alias comments_range docstring_range
@@ -110,6 +115,14 @@ module YARD
110
115
  MethodCallNode
111
116
  when :if, :elsif, :if_mod, :unless, :unless_mod
112
117
  ConditionalNode
118
+ when :for, :while, :while_mod, :until, :until_mod
119
+ LoopNode
120
+ when :def, :defs
121
+ MethodDefinitionNode
122
+ when :class, :sclass
123
+ ClassNode
124
+ when :module
125
+ ModuleNode
113
126
  else
114
127
  if type.to_s =~ /_ref\Z/
115
128
  ReferenceNode
@@ -226,11 +239,26 @@ module YARD
226
239
  false
227
240
  end
228
241
 
242
+ # @return [Boolean] whether the node is a method definition
243
+ def def?
244
+ false
245
+ end
246
+
229
247
  # @return [Boolean] whether the node is a if/elsif/else condition
230
248
  def condition?
231
249
  false
232
250
  end
233
251
 
252
+ # @return [Boolean] whether the node is a loop
253
+ def loop?
254
+ false
255
+ end
256
+
257
+ # @return [Boolean] whether the node has a block
258
+ def block?
259
+ respond_to?(:block) || condition?
260
+ end
261
+
234
262
  # @group Getting Line Information
235
263
 
236
264
  # @return [Boolean] whether the node has a {#line_range} set
@@ -296,6 +324,13 @@ module YARD
296
324
  's(' + typeinfo + map(&:inspect).join(", ") + ')'
297
325
  end
298
326
 
327
+ # @group Managing node state
328
+
329
+ # Resets node state in tree
330
+ def unfreeze
331
+ @children = nil
332
+ end
333
+
299
334
  # @endgroup
300
335
 
301
336
  private
@@ -367,6 +402,9 @@ module YARD
367
402
  end
368
403
 
369
404
  def block_param; parameters.last end
405
+ def block
406
+ last.type == :do_block || last.type == :brace_block ? last : nil
407
+ end
370
408
 
371
409
  private
372
410
 
@@ -379,6 +417,31 @@ module YARD
379
417
  end
380
418
  end
381
419
 
420
+ class MethodDefinitionNode < AstNode
421
+ def kw?; true end
422
+ def def?; true end
423
+ def namespace; first if index_adjust > 0 end
424
+
425
+ def method_name(name_only = false)
426
+ name = self[index_adjust]
427
+ name_only ? name.jump(:ident).first.to_sym : name
428
+ end
429
+
430
+ def parameters(include_block_param = true)
431
+ params = self[1 + index_adjust]
432
+ params = params[0] if params.type == :paren
433
+ include_block_param ? params : params[0...-1]
434
+ end
435
+
436
+ alias block last
437
+
438
+ private
439
+
440
+ def index_adjust
441
+ type == :defs ? 2 : 0
442
+ end
443
+ end
444
+
382
445
  class ConditionalNode < KeywordNode
383
446
  def condition?; true end
384
447
  def condition; first end
@@ -394,6 +457,33 @@ module YARD
394
457
 
395
458
  def cmod?; type =~ /_mod$/ end
396
459
  end
460
+
461
+ class ClassNode < KeywordNode
462
+ def class_name; first end
463
+ def superclass; type == :sclass ? nil : self[1] end
464
+ def block; last end
465
+ end
466
+
467
+ class ModuleNode < KeywordNode
468
+ def module_name; first end
469
+ def block; last end
470
+ end
471
+
472
+ class LoopNode < KeywordNode
473
+ def loop?; true end
474
+ def condition; type == :for ? s(self[0], self[1]) : first end
475
+ def block; last end
476
+ end
477
+
478
+ # Represents a lone comment block in source
479
+ class CommentNode < AstNode
480
+ def docstring; first end
481
+ def docstring=(value) end
482
+ alias comments docstring
483
+
484
+ def source; "" end
485
+ def first_line; "" end
486
+ end
397
487
  end
398
488
  end
399
489
  end