deg-yard 0.8.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. data/.travis.yml +39 -0
  2. data/.yardopts +25 -0
  3. data/.yardopts_guide +19 -0
  4. data/.yardopts_i18n +22 -0
  5. data/Gemfile +35 -0
  6. data/LEGAL +66 -0
  7. data/LICENSE +22 -0
  8. data/README.md +609 -0
  9. data/Rakefile +66 -0
  10. data/benchmarks/builtins_vs_eval.rb +23 -0
  11. data/benchmarks/concat_vs_join.rb +12 -0
  12. data/benchmarks/erb_vs_erubis.rb +53 -0
  13. data/benchmarks/format_args.rb +46 -0
  14. data/benchmarks/generation.rb +37 -0
  15. data/benchmarks/marshal_vs_dbm.rb +63 -0
  16. data/benchmarks/parsing.rb +46 -0
  17. data/benchmarks/pathname_vs_string.rb +50 -0
  18. data/benchmarks/rdoc_vs_yardoc.rb +10 -0
  19. data/benchmarks/registry_store_types.rb +48 -0
  20. data/benchmarks/ri_vs_yri.rb +18 -0
  21. data/benchmarks/ripper_parser.rb +12 -0
  22. data/benchmarks/splat_vs_flatten.rb +12 -0
  23. data/benchmarks/template_erb.rb +22 -0
  24. data/benchmarks/template_format.rb +6 -0
  25. data/benchmarks/template_profile.rb +17 -0
  26. data/benchmarks/yri_cache.rb +19 -0
  27. data/bin/yard +12 -0
  28. data/bin/yardoc +12 -0
  29. data/bin/yri +12 -0
  30. data/docs/CodeObjects.md +115 -0
  31. data/docs/GettingStarted.md +592 -0
  32. data/docs/Handlers.md +152 -0
  33. data/docs/Overview.md +61 -0
  34. data/docs/Parser.md +191 -0
  35. data/docs/Tags.md +282 -0
  36. data/docs/TagsArch.md +123 -0
  37. data/docs/Templates.md +496 -0
  38. data/docs/WhatsNew.md +1244 -0
  39. data/docs/images/code-objects-class-diagram.png +0 -0
  40. data/docs/images/handlers-class-diagram.png +0 -0
  41. data/docs/images/overview-class-diagram.png +0 -0
  42. data/docs/images/parser-class-diagram.png +0 -0
  43. data/docs/images/tags-class-diagram.png +0 -0
  44. data/docs/templates/default/fulldoc/html/full_list_tag.erb +7 -0
  45. data/docs/templates/default/fulldoc/html/setup.rb +6 -0
  46. data/docs/templates/default/layout/html/setup.rb +8 -0
  47. data/docs/templates/default/layout/html/tag_list.erb +11 -0
  48. data/docs/templates/default/yard_tags/html/list.erb +18 -0
  49. data/docs/templates/default/yard_tags/html/setup.rb +27 -0
  50. data/docs/templates/plugin.rb +65 -0
  51. data/lib/rubygems_plugin.rb +4 -0
  52. data/lib/yard/autoload.rb +290 -0
  53. data/lib/yard/cli/command.rb +84 -0
  54. data/lib/yard/cli/command_parser.rb +92 -0
  55. data/lib/yard/cli/config.rb +136 -0
  56. data/lib/yard/cli/diff.rb +270 -0
  57. data/lib/yard/cli/display.rb +68 -0
  58. data/lib/yard/cli/gems.rb +83 -0
  59. data/lib/yard/cli/graph.rb +126 -0
  60. data/lib/yard/cli/help.rb +18 -0
  61. data/lib/yard/cli/i18n.rb +69 -0
  62. data/lib/yard/cli/list.rb +22 -0
  63. data/lib/yard/cli/markup_types.rb +33 -0
  64. data/lib/yard/cli/server.rb +253 -0
  65. data/lib/yard/cli/stats.rb +213 -0
  66. data/lib/yard/cli/yardoc.rb +752 -0
  67. data/lib/yard/cli/yardopts_command.rb +109 -0
  68. data/lib/yard/cli/yri.rb +214 -0
  69. data/lib/yard/code_objects/base.rb +585 -0
  70. data/lib/yard/code_objects/class_object.rb +143 -0
  71. data/lib/yard/code_objects/class_variable_object.rb +8 -0
  72. data/lib/yard/code_objects/constant_object.rb +13 -0
  73. data/lib/yard/code_objects/extended_method_object.rb +23 -0
  74. data/lib/yard/code_objects/extra_file_object.rb +128 -0
  75. data/lib/yard/code_objects/macro_object.rb +172 -0
  76. data/lib/yard/code_objects/method_object.rb +191 -0
  77. data/lib/yard/code_objects/module_object.rb +18 -0
  78. data/lib/yard/code_objects/namespace_object.rb +200 -0
  79. data/lib/yard/code_objects/proxy.rb +258 -0
  80. data/lib/yard/code_objects/root_object.rb +17 -0
  81. data/lib/yard/config.rb +269 -0
  82. data/lib/yard/core_ext/array.rb +15 -0
  83. data/lib/yard/core_ext/file.rb +65 -0
  84. data/lib/yard/core_ext/hash.rb +15 -0
  85. data/lib/yard/core_ext/insertion.rb +60 -0
  86. data/lib/yard/core_ext/module.rb +19 -0
  87. data/lib/yard/core_ext/string.rb +67 -0
  88. data/lib/yard/core_ext/symbol_hash.rb +73 -0
  89. data/lib/yard/docstring.rb +362 -0
  90. data/lib/yard/docstring_parser.rb +321 -0
  91. data/lib/yard/globals.rb +18 -0
  92. data/lib/yard/handlers/base.rb +597 -0
  93. data/lib/yard/handlers/c/alias_handler.rb +15 -0
  94. data/lib/yard/handlers/c/attribute_handler.rb +13 -0
  95. data/lib/yard/handlers/c/base.rb +110 -0
  96. data/lib/yard/handlers/c/class_handler.rb +26 -0
  97. data/lib/yard/handlers/c/constant_handler.rb +12 -0
  98. data/lib/yard/handlers/c/handler_methods.rb +166 -0
  99. data/lib/yard/handlers/c/init_handler.rb +18 -0
  100. data/lib/yard/handlers/c/method_handler.rb +35 -0
  101. data/lib/yard/handlers/c/mixin_handler.rb +13 -0
  102. data/lib/yard/handlers/c/module_handler.rb +16 -0
  103. data/lib/yard/handlers/c/override_comment_handler.rb +30 -0
  104. data/lib/yard/handlers/c/path_handler.rb +10 -0
  105. data/lib/yard/handlers/c/struct_handler.rb +12 -0
  106. data/lib/yard/handlers/c/symbol_handler.rb +7 -0
  107. data/lib/yard/handlers/processor.rb +201 -0
  108. data/lib/yard/handlers/ruby/alias_handler.rb +41 -0
  109. data/lib/yard/handlers/ruby/attribute_handler.rb +82 -0
  110. data/lib/yard/handlers/ruby/base.rb +164 -0
  111. data/lib/yard/handlers/ruby/class_condition_handler.rb +86 -0
  112. data/lib/yard/handlers/ruby/class_handler.rb +121 -0
  113. data/lib/yard/handlers/ruby/class_variable_handler.rb +16 -0
  114. data/lib/yard/handlers/ruby/comment_handler.rb +9 -0
  115. data/lib/yard/handlers/ruby/constant_handler.rb +45 -0
  116. data/lib/yard/handlers/ruby/dsl_handler.rb +14 -0
  117. data/lib/yard/handlers/ruby/dsl_handler_methods.rb +77 -0
  118. data/lib/yard/handlers/ruby/exception_handler.rb +26 -0
  119. data/lib/yard/handlers/ruby/extend_handler.rb +21 -0
  120. data/lib/yard/handlers/ruby/legacy/alias_handler.rb +34 -0
  121. data/lib/yard/handlers/ruby/legacy/attribute_handler.rb +60 -0
  122. data/lib/yard/handlers/ruby/legacy/base.rb +250 -0
  123. data/lib/yard/handlers/ruby/legacy/class_condition_handler.rb +83 -0
  124. data/lib/yard/handlers/ruby/legacy/class_handler.rb +111 -0
  125. data/lib/yard/handlers/ruby/legacy/class_variable_handler.rb +14 -0
  126. data/lib/yard/handlers/ruby/legacy/comment_handler.rb +9 -0
  127. data/lib/yard/handlers/ruby/legacy/constant_handler.rb +28 -0
  128. data/lib/yard/handlers/ruby/legacy/dsl_handler.rb +16 -0
  129. data/lib/yard/handlers/ruby/legacy/exception_handler.rb +12 -0
  130. data/lib/yard/handlers/ruby/legacy/extend_handler.rb +20 -0
  131. data/lib/yard/handlers/ruby/legacy/method_handler.rb +85 -0
  132. data/lib/yard/handlers/ruby/legacy/mixin_handler.rb +39 -0
  133. data/lib/yard/handlers/ruby/legacy/module_function_handler.rb +18 -0
  134. data/lib/yard/handlers/ruby/legacy/module_handler.rb +11 -0
  135. data/lib/yard/handlers/ruby/legacy/private_constant_handler.rb +21 -0
  136. data/lib/yard/handlers/ruby/legacy/visibility_handler.rb +16 -0
  137. data/lib/yard/handlers/ruby/legacy/yield_handler.rb +28 -0
  138. data/lib/yard/handlers/ruby/method_condition_handler.rb +8 -0
  139. data/lib/yard/handlers/ruby/method_handler.rb +92 -0
  140. data/lib/yard/handlers/ruby/mixin_handler.rb +36 -0
  141. data/lib/yard/handlers/ruby/module_function_handler.rb +26 -0
  142. data/lib/yard/handlers/ruby/module_handler.rb +11 -0
  143. data/lib/yard/handlers/ruby/private_constant_handler.rb +36 -0
  144. data/lib/yard/handlers/ruby/struct_handler_methods.rb +141 -0
  145. data/lib/yard/handlers/ruby/visibility_handler.rb +24 -0
  146. data/lib/yard/handlers/ruby/yield_handler.rb +30 -0
  147. data/lib/yard/i18n/locale.rb +74 -0
  148. data/lib/yard/i18n/message.rb +56 -0
  149. data/lib/yard/i18n/messages.rb +55 -0
  150. data/lib/yard/i18n/pot_generator.rb +280 -0
  151. data/lib/yard/i18n/text.rb +173 -0
  152. data/lib/yard/logging.rb +190 -0
  153. data/lib/yard/options.rb +216 -0
  154. data/lib/yard/parser/base.rb +56 -0
  155. data/lib/yard/parser/c/c_parser.rb +231 -0
  156. data/lib/yard/parser/c/comment_parser.rb +131 -0
  157. data/lib/yard/parser/c/statement.rb +63 -0
  158. data/lib/yard/parser/ruby/ast_node.rb +496 -0
  159. data/lib/yard/parser/ruby/legacy/ruby_lex.rb +1378 -0
  160. data/lib/yard/parser/ruby/legacy/ruby_parser.rb +31 -0
  161. data/lib/yard/parser/ruby/legacy/statement.rb +65 -0
  162. data/lib/yard/parser/ruby/legacy/statement_list.rb +384 -0
  163. data/lib/yard/parser/ruby/legacy/token_list.rb +71 -0
  164. data/lib/yard/parser/ruby/ruby_parser.rb +625 -0
  165. data/lib/yard/parser/source_parser.rb +517 -0
  166. data/lib/yard/rake/yardoc_task.rb +74 -0
  167. data/lib/yard/registry.rb +438 -0
  168. data/lib/yard/registry_store.rb +319 -0
  169. data/lib/yard/rubygems/backports/LICENSE.txt +57 -0
  170. data/lib/yard/rubygems/backports/MIT.txt +20 -0
  171. data/lib/yard/rubygems/backports/gem.rb +9 -0
  172. data/lib/yard/rubygems/backports/source_index.rb +370 -0
  173. data/lib/yard/rubygems/backports.rb +8 -0
  174. data/lib/yard/rubygems/doc_manager.rb +88 -0
  175. data/lib/yard/rubygems/specification.rb +41 -0
  176. data/lib/yard/serializers/base.rb +80 -0
  177. data/lib/yard/serializers/file_system_serializer.rb +90 -0
  178. data/lib/yard/serializers/process_serializer.rb +24 -0
  179. data/lib/yard/serializers/stdout_serializer.rb +32 -0
  180. data/lib/yard/serializers/yardoc_serializer.rb +124 -0
  181. data/lib/yard/server/adapter.rb +100 -0
  182. data/lib/yard/server/commands/base.rb +192 -0
  183. data/lib/yard/server/commands/display_file_command.rb +24 -0
  184. data/lib/yard/server/commands/display_object_command.rb +58 -0
  185. data/lib/yard/server/commands/frames_command.rb +15 -0
  186. data/lib/yard/server/commands/library_command.rb +148 -0
  187. data/lib/yard/server/commands/library_index_command.rb +24 -0
  188. data/lib/yard/server/commands/list_command.rb +24 -0
  189. data/lib/yard/server/commands/search_command.rb +78 -0
  190. data/lib/yard/server/commands/static_file_command.rb +57 -0
  191. data/lib/yard/server/doc_server_helper.rb +76 -0
  192. data/lib/yard/server/doc_server_serializer.rb +33 -0
  193. data/lib/yard/server/library_version.rb +227 -0
  194. data/lib/yard/server/rack_adapter.rb +88 -0
  195. data/lib/yard/server/router.rb +176 -0
  196. data/lib/yard/server/static_caching.rb +45 -0
  197. data/lib/yard/server/templates/default/fulldoc/html/css/custom.css +78 -0
  198. data/lib/yard/server/templates/default/fulldoc/html/images/processing.gif +0 -0
  199. data/lib/yard/server/templates/default/fulldoc/html/js/autocomplete.js +12 -0
  200. data/lib/yard/server/templates/default/layout/html/breadcrumb.erb +46 -0
  201. data/lib/yard/server/templates/default/layout/html/script_setup.erb +8 -0
  202. data/lib/yard/server/templates/default/layout/html/setup.rb +7 -0
  203. data/lib/yard/server/templates/default/method_details/html/permalink.erb +4 -0
  204. data/lib/yard/server/templates/default/method_details/html/setup.rb +4 -0
  205. data/lib/yard/server/templates/doc_server/library_list/html/contents.erb +13 -0
  206. data/lib/yard/server/templates/doc_server/library_list/html/headers.erb +26 -0
  207. data/lib/yard/server/templates/doc_server/library_list/html/library_list.erb +12 -0
  208. data/lib/yard/server/templates/doc_server/library_list/html/setup.rb +3 -0
  209. data/lib/yard/server/templates/doc_server/library_list/html/title.erb +2 -0
  210. data/lib/yard/server/templates/doc_server/processing/html/processing.erb +51 -0
  211. data/lib/yard/server/templates/doc_server/processing/html/setup.rb +3 -0
  212. data/lib/yard/server/templates/doc_server/search/html/search.erb +18 -0
  213. data/lib/yard/server/templates/doc_server/search/html/setup.rb +8 -0
  214. data/lib/yard/server/webrick_adapter.rb +43 -0
  215. data/lib/yard/server.rb +11 -0
  216. data/lib/yard/tags/default_factory.rb +176 -0
  217. data/lib/yard/tags/default_tag.rb +12 -0
  218. data/lib/yard/tags/directives.rb +599 -0
  219. data/lib/yard/tags/library.rb +630 -0
  220. data/lib/yard/tags/option_tag.rb +12 -0
  221. data/lib/yard/tags/overload_tag.rb +66 -0
  222. data/lib/yard/tags/ref_tag.rb +7 -0
  223. data/lib/yard/tags/ref_tag_list.rb +27 -0
  224. data/lib/yard/tags/tag.rb +57 -0
  225. data/lib/yard/tags/tag_format_error.rb +6 -0
  226. data/lib/yard/templates/engine.rb +185 -0
  227. data/lib/yard/templates/erb_cache.rb +22 -0
  228. data/lib/yard/templates/helpers/base_helper.rb +212 -0
  229. data/lib/yard/templates/helpers/filter_helper.rb +26 -0
  230. data/lib/yard/templates/helpers/html_helper.rb +599 -0
  231. data/lib/yard/templates/helpers/html_syntax_highlight_helper.rb +59 -0
  232. data/lib/yard/templates/helpers/markup/rdoc_markdown.rb +22 -0
  233. data/lib/yard/templates/helpers/markup/rdoc_markup.rb +106 -0
  234. data/lib/yard/templates/helpers/markup_helper.rb +169 -0
  235. data/lib/yard/templates/helpers/method_helper.rb +74 -0
  236. data/lib/yard/templates/helpers/module_helper.rb +19 -0
  237. data/lib/yard/templates/helpers/text_helper.rb +95 -0
  238. data/lib/yard/templates/helpers/uml_helper.rb +46 -0
  239. data/lib/yard/templates/section.rb +106 -0
  240. data/lib/yard/templates/template.rb +407 -0
  241. data/lib/yard/templates/template_options.rb +88 -0
  242. data/lib/yard/verifier.rb +148 -0
  243. data/lib/yard/version.rb +3 -0
  244. data/lib/yard.rb +71 -0
  245. data/po/ja.po +31118 -0
  246. data/spec/cli/command_parser_spec.rb +43 -0
  247. data/spec/cli/command_spec.rb +36 -0
  248. data/spec/cli/config_spec.rb +92 -0
  249. data/spec/cli/diff_spec.rb +260 -0
  250. data/spec/cli/display_spec.rb +30 -0
  251. data/spec/cli/gems_spec.rb +81 -0
  252. data/spec/cli/graph_spec.rb +17 -0
  253. data/spec/cli/help_spec.rb +22 -0
  254. data/spec/cli/i18n_spec.rb +111 -0
  255. data/spec/cli/list_spec.rb +8 -0
  256. data/spec/cli/markup_types_spec.rb +22 -0
  257. data/spec/cli/server_spec.rb +327 -0
  258. data/spec/cli/stats_spec.rb +90 -0
  259. data/spec/cli/yardoc_spec.rb +804 -0
  260. data/spec/cli/yri_spec.rb +99 -0
  261. data/spec/code_objects/base_spec.rb +438 -0
  262. data/spec/code_objects/class_object_spec.rb +225 -0
  263. data/spec/code_objects/code_object_list_spec.rb +33 -0
  264. data/spec/code_objects/constants_spec.rb +82 -0
  265. data/spec/code_objects/extra_file_object_spec.rb +147 -0
  266. data/spec/code_objects/macro_object_spec.rb +148 -0
  267. data/spec/code_objects/method_object_spec.rb +175 -0
  268. data/spec/code_objects/module_object_spec.rb +141 -0
  269. data/spec/code_objects/namespace_object_spec.rb +170 -0
  270. data/spec/code_objects/proxy_spec.rb +140 -0
  271. data/spec/code_objects/spec_helper.rb +3 -0
  272. data/spec/config_spec.rb +176 -0
  273. data/spec/core_ext/array_spec.rb +14 -0
  274. data/spec/core_ext/file_spec.rb +68 -0
  275. data/spec/core_ext/hash_spec.rb +14 -0
  276. data/spec/core_ext/insertion_spec.rb +37 -0
  277. data/spec/core_ext/module_spec.rb +15 -0
  278. data/spec/core_ext/string_spec.rb +42 -0
  279. data/spec/core_ext/symbol_hash_spec.rb +86 -0
  280. data/spec/docstring_parser_spec.rb +228 -0
  281. data/spec/docstring_spec.rb +335 -0
  282. data/spec/handlers/alias_handler_spec.rb +80 -0
  283. data/spec/handlers/attribute_handler_spec.rb +94 -0
  284. data/spec/handlers/base_spec.rb +206 -0
  285. data/spec/handlers/c/alias_handler_spec.rb +33 -0
  286. data/spec/handlers/c/attribute_handler_spec.rb +40 -0
  287. data/spec/handlers/c/class_handler_spec.rb +63 -0
  288. data/spec/handlers/c/constant_handler_spec.rb +68 -0
  289. data/spec/handlers/c/init_handler_spec.rb +47 -0
  290. data/spec/handlers/c/method_handler_spec.rb +229 -0
  291. data/spec/handlers/c/mixin_handler_spec.rb +27 -0
  292. data/spec/handlers/c/module_handler_spec.rb +38 -0
  293. data/spec/handlers/c/override_comment_handler_spec.rb +46 -0
  294. data/spec/handlers/c/path_handler_spec.rb +35 -0
  295. data/spec/handlers/c/spec_helper.rb +13 -0
  296. data/spec/handlers/c/struct_handler_spec.rb +15 -0
  297. data/spec/handlers/class_condition_handler_spec.rb +67 -0
  298. data/spec/handlers/class_handler_spec.rb +246 -0
  299. data/spec/handlers/class_variable_handler_spec.rb +11 -0
  300. data/spec/handlers/constant_handler_spec.rb +64 -0
  301. data/spec/handlers/dsl_handler_spec.rb +197 -0
  302. data/spec/handlers/examples/alias_handler_001.rb.txt +44 -0
  303. data/spec/handlers/examples/attribute_handler_001.rb.txt +32 -0
  304. data/spec/handlers/examples/class_condition_handler_001.rb.txt +69 -0
  305. data/spec/handlers/examples/class_handler_001.rb.txt +120 -0
  306. data/spec/handlers/examples/class_variable_handler_001.rb.txt +10 -0
  307. data/spec/handlers/examples/constant_handler_001.rb.txt +25 -0
  308. data/spec/handlers/examples/dsl_handler_001.rb.txt +125 -0
  309. data/spec/handlers/examples/exception_handler_001.rb.txt +59 -0
  310. data/spec/handlers/examples/extend_handler_001.rb.txt +16 -0
  311. data/spec/handlers/examples/method_condition_handler_001.rb.txt +10 -0
  312. data/spec/handlers/examples/method_handler_001.rb.txt +126 -0
  313. data/spec/handlers/examples/mixin_handler_001.rb.txt +37 -0
  314. data/spec/handlers/examples/module_handler_001.rb.txt +29 -0
  315. data/spec/handlers/examples/private_constant_handler_001.rb.txt +8 -0
  316. data/spec/handlers/examples/process_handler_001.rb.txt +11 -0
  317. data/spec/handlers/examples/visibility_handler_001.rb.txt +32 -0
  318. data/spec/handlers/examples/yield_handler_001.rb.txt +54 -0
  319. data/spec/handlers/exception_handler_spec.rb +48 -0
  320. data/spec/handlers/extend_handler_spec.rb +23 -0
  321. data/spec/handlers/legacy_base_spec.rb +128 -0
  322. data/spec/handlers/method_condition_handler_spec.rb +14 -0
  323. data/spec/handlers/method_handler_spec.rb +184 -0
  324. data/spec/handlers/mixin_handler_spec.rb +55 -0
  325. data/spec/handlers/module_function_handler_spec.rb +105 -0
  326. data/spec/handlers/module_handler_spec.rb +34 -0
  327. data/spec/handlers/private_constant_handler_spec.rb +24 -0
  328. data/spec/handlers/processor_spec.rb +34 -0
  329. data/spec/handlers/ruby/base_spec.rb +94 -0
  330. data/spec/handlers/ruby/legacy/base_spec.rb +82 -0
  331. data/spec/handlers/spec_helper.rb +33 -0
  332. data/spec/handlers/visibility_handler_spec.rb +39 -0
  333. data/spec/handlers/yield_handler_spec.rb +51 -0
  334. data/spec/i18n/locale_spec.rb +68 -0
  335. data/spec/i18n/message_spec.rb +52 -0
  336. data/spec/i18n/messages_spec.rb +67 -0
  337. data/spec/i18n/pot_generator_spec.rb +262 -0
  338. data/spec/i18n/text_spec.rb +180 -0
  339. data/spec/logging_spec.rb +35 -0
  340. data/spec/options_spec.rb +171 -0
  341. data/spec/parser/base_spec.rb +24 -0
  342. data/spec/parser/c_parser_spec.rb +171 -0
  343. data/spec/parser/examples/array.c.txt +3887 -0
  344. data/spec/parser/examples/example1.rb.txt +8 -0
  345. data/spec/parser/examples/extrafile.c.txt +8 -0
  346. data/spec/parser/examples/multifile.c.txt +22 -0
  347. data/spec/parser/examples/override.c.txt +424 -0
  348. data/spec/parser/examples/parse_in_order_001.rb.txt +2 -0
  349. data/spec/parser/examples/parse_in_order_002.rb.txt +2 -0
  350. data/spec/parser/examples/tag_handler_001.rb.txt +8 -0
  351. data/spec/parser/ruby/ast_node_spec.rb +33 -0
  352. data/spec/parser/ruby/legacy/statement_list_spec.rb +299 -0
  353. data/spec/parser/ruby/legacy/token_list_spec.rb +77 -0
  354. data/spec/parser/ruby/ruby_parser_spec.rb +334 -0
  355. data/spec/parser/source_parser_spec.rb +717 -0
  356. data/spec/parser/tag_parsing_spec.rb +18 -0
  357. data/spec/rake/yardoc_task_spec.rb +101 -0
  358. data/spec/registry_spec.rb +393 -0
  359. data/spec/registry_store_spec.rb +315 -0
  360. data/spec/rubygems/doc_manager_spec.rb +112 -0
  361. data/spec/serializers/data/serialized_yardoc/checksums +1 -0
  362. data/spec/serializers/data/serialized_yardoc/objects/Foo/bar_i.dat +0 -0
  363. data/spec/serializers/data/serialized_yardoc/objects/Foo/baz_i.dat +0 -0
  364. data/spec/serializers/data/serialized_yardoc/objects/Foo.dat +0 -0
  365. data/spec/serializers/data/serialized_yardoc/objects/root.dat +0 -0
  366. data/spec/serializers/data/serialized_yardoc/proxy_types +2 -0
  367. data/spec/serializers/file_system_serializer_spec.rb +124 -0
  368. data/spec/serializers/spec_helper.rb +2 -0
  369. data/spec/serializers/yardoc_serializer_spec.rb +46 -0
  370. data/spec/server/adapter_spec.rb +38 -0
  371. data/spec/server/commands/base_spec.rb +87 -0
  372. data/spec/server/commands/library_command_spec.rb +39 -0
  373. data/spec/server/commands/static_file_command_spec.rb +84 -0
  374. data/spec/server/doc_server_helper_spec.rb +53 -0
  375. data/spec/server/doc_server_serializer_spec.rb +45 -0
  376. data/spec/server/rack_adapter_spec.rb +20 -0
  377. data/spec/server/router_spec.rb +122 -0
  378. data/spec/server/spec_helper.rb +17 -0
  379. data/spec/server/static_caching_spec.rb +39 -0
  380. data/spec/server/webrick_servlet_spec.rb +20 -0
  381. data/spec/server_spec.rb +10 -0
  382. data/spec/spec_helper.rb +128 -0
  383. data/spec/tags/default_factory_spec.rb +152 -0
  384. data/spec/tags/default_tag_spec.rb +11 -0
  385. data/spec/tags/directives_spec.rb +453 -0
  386. data/spec/tags/library_spec.rb +34 -0
  387. data/spec/tags/overload_tag_spec.rb +53 -0
  388. data/spec/tags/ref_tag_list_spec.rb +53 -0
  389. data/spec/templates/class_spec.rb +44 -0
  390. data/spec/templates/constant_spec.rb +40 -0
  391. data/spec/templates/engine_spec.rb +121 -0
  392. data/spec/templates/examples/class001.html +280 -0
  393. data/spec/templates/examples/class001.txt +36 -0
  394. data/spec/templates/examples/class002.html +35 -0
  395. data/spec/templates/examples/constant001.txt +25 -0
  396. data/spec/templates/examples/constant002.txt +7 -0
  397. data/spec/templates/examples/constant003.txt +11 -0
  398. data/spec/templates/examples/method001.html +130 -0
  399. data/spec/templates/examples/method001.txt +35 -0
  400. data/spec/templates/examples/method002.html +86 -0
  401. data/spec/templates/examples/method002.txt +20 -0
  402. data/spec/templates/examples/method003.html +159 -0
  403. data/spec/templates/examples/method003.txt +45 -0
  404. data/spec/templates/examples/method004.html +44 -0
  405. data/spec/templates/examples/method004.txt +10 -0
  406. data/spec/templates/examples/method005.html +99 -0
  407. data/spec/templates/examples/method005.txt +33 -0
  408. data/spec/templates/examples/module001.dot +33 -0
  409. data/spec/templates/examples/module001.html +825 -0
  410. data/spec/templates/examples/module001.txt +33 -0
  411. data/spec/templates/examples/module002.html +318 -0
  412. data/spec/templates/examples/module003.html +185 -0
  413. data/spec/templates/examples/module004.html +387 -0
  414. data/spec/templates/examples/tag001.txt +82 -0
  415. data/spec/templates/helpers/base_helper_spec.rb +175 -0
  416. data/spec/templates/helpers/html_helper_spec.rb +612 -0
  417. data/spec/templates/helpers/html_syntax_highlight_helper_spec.rb +48 -0
  418. data/spec/templates/helpers/markup/rdoc_markup_spec.rb +93 -0
  419. data/spec/templates/helpers/markup_helper_spec.rb +135 -0
  420. data/spec/templates/helpers/method_helper_spec.rb +82 -0
  421. data/spec/templates/helpers/shared_signature_examples.rb +123 -0
  422. data/spec/templates/helpers/text_helper_spec.rb +44 -0
  423. data/spec/templates/method_spec.rb +102 -0
  424. data/spec/templates/module_spec.rb +181 -0
  425. data/spec/templates/onefile_spec.rb +64 -0
  426. data/spec/templates/section_spec.rb +146 -0
  427. data/spec/templates/spec_helper.rb +73 -0
  428. data/spec/templates/tag_spec.rb +51 -0
  429. data/spec/templates/template_spec.rb +409 -0
  430. data/spec/verifier_spec.rb +106 -0
  431. data/templates/default/class/dot/setup.rb +6 -0
  432. data/templates/default/class/dot/superklass.erb +3 -0
  433. data/templates/default/class/html/constructor_details.erb +8 -0
  434. data/templates/default/class/html/setup.rb +1 -0
  435. data/templates/default/class/html/subclasses.erb +4 -0
  436. data/templates/default/class/setup.rb +36 -0
  437. data/templates/default/class/text/setup.rb +11 -0
  438. data/templates/default/class/text/subclasses.erb +5 -0
  439. data/templates/default/constant/text/header.erb +11 -0
  440. data/templates/default/constant/text/setup.rb +3 -0
  441. data/templates/default/docstring/html/abstract.erb +4 -0
  442. data/templates/default/docstring/html/deprecated.erb +1 -0
  443. data/templates/default/docstring/html/index.erb +5 -0
  444. data/templates/default/docstring/html/note.erb +6 -0
  445. data/templates/default/docstring/html/private.erb +4 -0
  446. data/templates/default/docstring/html/returns_void.erb +1 -0
  447. data/templates/default/docstring/html/text.erb +1 -0
  448. data/templates/default/docstring/html/todo.erb +6 -0
  449. data/templates/default/docstring/setup.rb +51 -0
  450. data/templates/default/docstring/text/abstract.erb +2 -0
  451. data/templates/default/docstring/text/deprecated.erb +2 -0
  452. data/templates/default/docstring/text/index.erb +2 -0
  453. data/templates/default/docstring/text/note.erb +4 -0
  454. data/templates/default/docstring/text/private.erb +2 -0
  455. data/templates/default/docstring/text/returns_void.erb +1 -0
  456. data/templates/default/docstring/text/text.erb +1 -0
  457. data/templates/default/docstring/text/todo.erb +4 -0
  458. data/templates/default/fulldoc/html/css/common.css +1 -0
  459. data/templates/default/fulldoc/html/css/full_list.css +57 -0
  460. data/templates/default/fulldoc/html/css/style.css +338 -0
  461. data/templates/default/fulldoc/html/frames.erb +28 -0
  462. data/templates/default/fulldoc/html/full_list.erb +40 -0
  463. data/templates/default/fulldoc/html/full_list_class.erb +2 -0
  464. data/templates/default/fulldoc/html/full_list_file.erb +5 -0
  465. data/templates/default/fulldoc/html/full_list_method.erb +8 -0
  466. data/templates/default/fulldoc/html/js/app.js +214 -0
  467. data/templates/default/fulldoc/html/js/full_list.js +178 -0
  468. data/templates/default/fulldoc/html/js/jquery.js +4 -0
  469. data/templates/default/fulldoc/html/setup.rb +199 -0
  470. data/templates/default/layout/dot/header.erb +6 -0
  471. data/templates/default/layout/dot/setup.rb +14 -0
  472. data/templates/default/layout/html/breadcrumb.erb +13 -0
  473. data/templates/default/layout/html/files.erb +11 -0
  474. data/templates/default/layout/html/footer.erb +5 -0
  475. data/templates/default/layout/html/headers.erb +14 -0
  476. data/templates/default/layout/html/index.erb +2 -0
  477. data/templates/default/layout/html/layout.erb +20 -0
  478. data/templates/default/layout/html/listing.erb +4 -0
  479. data/templates/default/layout/html/objects.erb +32 -0
  480. data/templates/default/layout/html/script_setup.erb +5 -0
  481. data/templates/default/layout/html/search.erb +8 -0
  482. data/templates/default/layout/html/setup.rb +71 -0
  483. data/templates/default/method/html/header.erb +16 -0
  484. data/templates/default/method/setup.rb +3 -0
  485. data/templates/default/method/text/header.erb +1 -0
  486. data/templates/default/method_details/html/header.erb +3 -0
  487. data/templates/default/method_details/html/method_signature.erb +25 -0
  488. data/templates/default/method_details/html/source.erb +10 -0
  489. data/templates/default/method_details/setup.rb +10 -0
  490. data/templates/default/method_details/text/header.erb +10 -0
  491. data/templates/default/method_details/text/method_signature.erb +12 -0
  492. data/templates/default/method_details/text/setup.rb +10 -0
  493. data/templates/default/module/dot/child.erb +1 -0
  494. data/templates/default/module/dot/dependencies.erb +3 -0
  495. data/templates/default/module/dot/header.erb +6 -0
  496. data/templates/default/module/dot/info.erb +14 -0
  497. data/templates/default/module/dot/setup.rb +14 -0
  498. data/templates/default/module/html/attribute_details.erb +10 -0
  499. data/templates/default/module/html/attribute_summary.erb +8 -0
  500. data/templates/default/module/html/box_info.erb +37 -0
  501. data/templates/default/module/html/children.erb +8 -0
  502. data/templates/default/module/html/constant_summary.erb +13 -0
  503. data/templates/default/module/html/defines.erb +3 -0
  504. data/templates/default/module/html/header.erb +5 -0
  505. data/templates/default/module/html/inherited_attributes.erb +14 -0
  506. data/templates/default/module/html/inherited_constants.erb +8 -0
  507. data/templates/default/module/html/inherited_methods.erb +19 -0
  508. data/templates/default/module/html/item_summary.erb +40 -0
  509. data/templates/default/module/html/method_details_list.erb +9 -0
  510. data/templates/default/module/html/method_summary.erb +14 -0
  511. data/templates/default/module/html/methodmissing.erb +12 -0
  512. data/templates/default/module/html/pre_docstring.erb +1 -0
  513. data/templates/default/module/setup.rb +164 -0
  514. data/templates/default/module/text/children.erb +10 -0
  515. data/templates/default/module/text/class_meths_list.erb +8 -0
  516. data/templates/default/module/text/extends.erb +8 -0
  517. data/templates/default/module/text/header.erb +7 -0
  518. data/templates/default/module/text/includes.erb +8 -0
  519. data/templates/default/module/text/instance_meths_list.erb +8 -0
  520. data/templates/default/module/text/setup.rb +12 -0
  521. data/templates/default/onefile/html/files.erb +5 -0
  522. data/templates/default/onefile/html/headers.erb +6 -0
  523. data/templates/default/onefile/html/layout.erb +17 -0
  524. data/templates/default/onefile/html/readme.erb +3 -0
  525. data/templates/default/onefile/html/setup.rb +61 -0
  526. data/templates/default/root/dot/child.erb +3 -0
  527. data/templates/default/root/dot/setup.rb +5 -0
  528. data/templates/default/root/html/setup.rb +1 -0
  529. data/templates/default/tags/html/example.erb +11 -0
  530. data/templates/default/tags/html/index.erb +3 -0
  531. data/templates/default/tags/html/option.erb +24 -0
  532. data/templates/default/tags/html/overload.erb +14 -0
  533. data/templates/default/tags/html/see.erb +8 -0
  534. data/templates/default/tags/html/tag.erb +20 -0
  535. data/templates/default/tags/setup.rb +55 -0
  536. data/templates/default/tags/text/example.erb +12 -0
  537. data/templates/default/tags/text/index.erb +1 -0
  538. data/templates/default/tags/text/option.erb +20 -0
  539. data/templates/default/tags/text/overload.erb +19 -0
  540. data/templates/default/tags/text/see.erb +11 -0
  541. data/templates/default/tags/text/tag.erb +13 -0
  542. data/templates/guide/class/html/setup.rb +1 -0
  543. data/templates/guide/docstring/html/setup.rb +1 -0
  544. data/templates/guide/fulldoc/html/css/style.css +108 -0
  545. data/templates/guide/fulldoc/html/js/app.js +33 -0
  546. data/templates/guide/fulldoc/html/setup.rb +73 -0
  547. data/templates/guide/layout/html/layout.erb +81 -0
  548. data/templates/guide/layout/html/setup.rb +28 -0
  549. data/templates/guide/method/html/header.erb +18 -0
  550. data/templates/guide/method/html/setup.rb +21 -0
  551. data/templates/guide/module/html/header.erb +7 -0
  552. data/templates/guide/module/html/method_list.erb +5 -0
  553. data/templates/guide/module/html/setup.rb +26 -0
  554. data/templates/guide/onefile/html/files.erb +4 -0
  555. data/templates/guide/onefile/html/setup.rb +5 -0
  556. data/templates/guide/onefile/html/toc.erb +3 -0
  557. data/templates/guide/tags/html/setup.rb +8 -0
  558. metadata +689 -0
@@ -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
@@ -0,0 +1,496 @@
1
+ module YARD
2
+ module Parser
3
+ module Ruby
4
+ # Builds and s-expression by creating {AstNode} objects with
5
+ # the type provided by the first argument.
6
+ #
7
+ # @example An implicit list of keywords
8
+ # ast = s(s(:kw, "if"), s(:kw, "else"))
9
+ # ast.type # => :list
10
+ # @example A method call
11
+ # s(:command, s(:var_ref, "mymethod"))
12
+ #
13
+ # @overload s(*nodes, opts = {})
14
+ # @param [Array<AstNode>] nodes a list of nodes.
15
+ # @param [Hash] opts any extra options (docstring, file, source) to
16
+ # set on the object
17
+ # @return [AstNode] an implicit node where node.type == +:list+
18
+ # @overload s(type, *children, opts = {})
19
+ # @param [Symbol] type the node type
20
+ # @param [Array<AstNode>] children any child nodes inside this one
21
+ # @param [Hash] opts any extra options to set on the object
22
+ # @return [AstNode] a node of type +type+.
23
+ # @see AstNode#initialize
24
+ def s(*args)
25
+ type = Symbol === args.first ? args.shift : :list
26
+ opts = Hash === args.last ? args.pop : {}
27
+ AstNode.node_class_for(type).new(type, args, opts)
28
+ end
29
+
30
+ # An AST node is characterized by a type and a list of children. It
31
+ # is most easily represented by the s-expression {#s} such as:
32
+ # # AST for "if true; 5 end":
33
+ # s(s(:if, s(:var_ref, s(:kw, "true")), s(s(:int, "5")), nil))
34
+ #
35
+ # The node type is not considered part of the list, only its children.
36
+ # So +ast[0]+ does not refer to the type, but rather the first child
37
+ # (or object). Items that are not +AstNode+ objects can be part of the
38
+ # list, like Strings or Symbols representing names. To return only
39
+ # the AstNode children of the node, use {#children}.
40
+ class AstNode < Array
41
+ attr_accessor :docstring_hash_flag
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
+
48
+ attr_writer :source_range, :line_range, :file, :full_source
49
+ alias comments docstring
50
+ alias comments_range docstring_range
51
+ alias comments_hash_flag docstring_hash_flag
52
+ alias to_s source
53
+
54
+ # @return [Symbol] the node's unique symbolic type
55
+ attr_accessor :type
56
+
57
+ # @return [AstNode, nil] the node's parent or nil if it is a root node.
58
+ attr_accessor :parent
59
+
60
+ # @return [Range] the character range in {#full_source} represented
61
+ # by the node
62
+ def source_range
63
+ reset_line_info unless @source_range
64
+ @source_range
65
+ end
66
+
67
+ # @return [Range] the line range in {#full_source} represented
68
+ # by the node
69
+ def line_range
70
+ reset_line_info unless @line_range
71
+ @line_range
72
+ end
73
+
74
+ # @return [String] the filename the node was parsed from
75
+ def file
76
+ return parent.file if parent
77
+ @file
78
+ end
79
+
80
+ # @return [String] the full source that the node was parsed from
81
+ def full_source
82
+ return parent.full_source if parent
83
+ return @full_source if @full_source
84
+ return IO.read(@file) if file && File.exist?(file)
85
+ end
86
+
87
+ # @return [String] the parse of {#full_source} that the node represents
88
+ def source
89
+ return parent.full_source[source_range] if parent
90
+ full_source
91
+ end
92
+
93
+ # List of all known keywords
94
+ # @return [Hash]
95
+ KEYWORDS = { :class => true, :alias => true, :lambda => true, :do_block => true,
96
+ :def => true, :defs => true, :begin => true, :rescue => true, :rescue_mod => true,
97
+ :if => true, :if_mod => true, :else => true, :elsif => true, :case => true,
98
+ :when => true, :next => true, :break => true, :retry => true, :redo => true,
99
+ :return => true, :throw => true, :catch => true, :until => true, :until_mod => true,
100
+ :while => true, :while_mod => true, :yield => true, :yield0 => true, :zsuper => true,
101
+ :unless => true, :unless_mod => true, :for => true, :super => true, :return0 => true }
102
+
103
+ # @group Creating an AstNode
104
+
105
+ # Finds the node subclass that should be instantiated for a specific
106
+ # node type
107
+ #
108
+ # @param [Symbol] type the node type to find a subclass for
109
+ # @return [Class] a subclass of AstNode to instantiate the node with.
110
+ def self.node_class_for(type)
111
+ case type
112
+ when :params
113
+ ParameterNode
114
+ when :call, :fcall, :vcall, :command, :command_call
115
+ MethodCallNode
116
+ when :if, :elsif, :if_mod, :unless, :unless_mod
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
126
+ else
127
+ if type.to_s =~ /_ref\Z/
128
+ ReferenceNode
129
+ elsif type.to_s =~ /_literal\Z/
130
+ LiteralNode
131
+ elsif KEYWORDS.has_key?(type)
132
+ KeywordNode
133
+ else
134
+ AstNode
135
+ end
136
+ end
137
+ end
138
+
139
+ # Creates a new AST node
140
+ #
141
+ # @param [Symbol] type the type of node being created
142
+ # @param [Array<AstNode>] arr the child nodes
143
+ # @param [Hash] opts any extra line options
144
+ # @option opts [Fixnum] :line (nil) the line the node starts on in source
145
+ # @option opts [String] :char (nil) the character number the node starts on
146
+ # in source
147
+ # @option opts [Fixnum] :listline (nil) a special key like :line but for
148
+ # list nodes
149
+ # @option opts [Fixnum] :listchar (nil) a special key like :char but for
150
+ # list nodes
151
+ # @option opts [Boolean] :token (nil) whether the node represents a token
152
+ def initialize(type, arr, opts = {})
153
+ super(arr)
154
+ self.type = type
155
+ self.line_range = opts[:line]
156
+ self.source_range = opts[:char]
157
+ @fallback_line = opts[:listline]
158
+ @fallback_source = opts[:listchar]
159
+ @token = true if opts[:token]
160
+ end
161
+
162
+ # @return [Boolean] whether the node is equal to another by checking
163
+ # the list and type
164
+ # @private
165
+ def ==(ast)
166
+ super && type == ast.type
167
+ end
168
+
169
+ # @group Traversing a Node
170
+
171
+ # Searches through the node and all descendants and returns the
172
+ # first node with a type matching any of +node_types+, otherwise
173
+ # returns the original node (self).
174
+ #
175
+ # @example Returns the first method definition in a block of code
176
+ # ast = YARD.parse_string("if true; def x; end end").ast
177
+ # ast.jump(:def)
178
+ # # => s(:def, s(:ident, "x"), s(:params, nil, nil, nil, nil,
179
+ # # nil), s(s(:void_stmt, )))
180
+ # @example Returns first 'def' or 'class' statement
181
+ # ast = YARD.parse_string("class X; def y; end end")
182
+ # ast.jump(:def, :class).first
183
+ # # =>
184
+ # @example If the node types are not present in the AST
185
+ # ast = YARD.parse("def x; end")
186
+ # ast.jump(:def)
187
+ #
188
+ # @param [Array<Symbol>] node_types a set of node types to match
189
+ # @return [AstNode] the matching node, if one was found
190
+ # @return [self] if no node was found
191
+ def jump(*node_types)
192
+ traverse {|child| return(child) if node_types.include?(child.type) }
193
+ self
194
+ end
195
+
196
+ # @return [Array<AstNode>] the {AstNode} children inside the node
197
+ def children
198
+ @children ||= select {|e| AstNode === e }
199
+ end
200
+
201
+ # Traverses the object and yields each node (including descendants) in order.
202
+ #
203
+ # @yield each descendant node in order
204
+ # @yieldparam [AstNode] self, or a child/descendant node
205
+ # @return [void]
206
+ def traverse
207
+ nodes = [self]
208
+ nodes.each.with_index do |node, index|
209
+ yield node
210
+ nodes.insert index+1, *node.children
211
+ end
212
+ end
213
+
214
+ # @group Node Meta Types
215
+
216
+ # @return [Boolean] whether the node is a token
217
+ def token?
218
+ @token
219
+ end
220
+
221
+ # @return [Boolean] whether the node is a reference (variable,
222
+ # constant name)
223
+ def ref?
224
+ false
225
+ end
226
+
227
+ # @return [Boolean] whether the node is a literal value
228
+ def literal?
229
+ false
230
+ end
231
+
232
+ # @return [Boolean] whether the node is a keyword
233
+ def kw?
234
+ false
235
+ end
236
+
237
+ # @return [Boolean] whether the node is a method call
238
+ def call?
239
+ false
240
+ end
241
+
242
+ # @return [Boolean] whether the node is a method definition
243
+ def def?
244
+ false
245
+ end
246
+
247
+ # @return [Boolean] whether the node is a if/elsif/else condition
248
+ def condition?
249
+ false
250
+ end
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
+
262
+ # @group Getting Line Information
263
+
264
+ # @return [Boolean] whether the node has a {#line_range} set
265
+ def has_line?
266
+ @line_range ? true : false
267
+ end
268
+
269
+ # @return [Fixnum] the starting line number of the node
270
+ def line
271
+ line_range && line_range.first
272
+ end
273
+
274
+ # @return [String] the first line of source represented by the node.
275
+ def first_line
276
+ full_source.split(/\r?\n/)[line - 1].strip
277
+ end
278
+
279
+ # @group Printing a Node
280
+
281
+ # @return [String] the first line of source the node represents
282
+ def show
283
+ "\t#{line}: #{first_line}"
284
+ end
285
+
286
+ # @return [nil] pretty prints the node
287
+ def pretty_print(q)
288
+ objs = self.dup + [:__last__]
289
+ objs.unshift(type) if type && type != :list
290
+
291
+ options = []
292
+ if @docstring
293
+ options << ['docstring', docstring]
294
+ end
295
+ if @source_range || @line_range
296
+ options << ['line', line_range]
297
+ options << ['source', source_range]
298
+ end
299
+ objs.pop if options.size == 0
300
+
301
+ q.group(3, 's(', ')') do
302
+ q.seplist(objs, nil, :each) do |v|
303
+ if v == :__last__
304
+ q.seplist(options, nil, :each) do |arr|
305
+ k, v2 = *arr
306
+ q.group(3) do
307
+ q.text k
308
+ q.group(3) do
309
+ q.text ': '
310
+ q.pp v2
311
+ end
312
+ end
313
+ end
314
+ else
315
+ q.pp v
316
+ end
317
+ end
318
+ end
319
+ end
320
+
321
+ # @return [String] inspects the object
322
+ def inspect
323
+ typeinfo = type && type != :list ? ':' + type.to_s + ', ' : ''
324
+ 's(' + typeinfo + map(&:inspect).join(", ") + ')'
325
+ end
326
+
327
+ # @group Managing node state
328
+
329
+ # Resets node state in tree
330
+ def unfreeze
331
+ @children = nil
332
+ end
333
+
334
+ # @endgroup
335
+
336
+ private
337
+
338
+ # Resets line information
339
+ # @return [void]
340
+ def reset_line_info
341
+ if size == 0
342
+ self.line_range = @fallback_line
343
+ self.source_range = @fallback_source
344
+ elsif children.size > 0
345
+ f, l = children.first, children.last
346
+ self.line_range = Range.new(f.line_range.first, l.line_range.last)
347
+ self.source_range = Range.new(f.source_range.first, l.source_range.last)
348
+ elsif @fallback_line || @fallback_source
349
+ self.line_range = @fallback_line
350
+ self.source_range = @fallback_source
351
+ else
352
+ self.line_range = 0...0
353
+ self.source_range = 0...0
354
+ end
355
+ end
356
+ end
357
+
358
+ class ReferenceNode < AstNode
359
+ def ref?; true end
360
+
361
+ def path
362
+ Array.new flatten
363
+ end
364
+
365
+ def namespace
366
+ Array.new flatten[0...-1]
367
+ end
368
+ end
369
+
370
+ class LiteralNode < AstNode
371
+ def literal?; true end
372
+ end
373
+
374
+ class KeywordNode < AstNode
375
+ def kw?; true end
376
+ end
377
+
378
+ class ParameterNode < AstNode
379
+ def required_params; self[0] end
380
+ def required_end_params; self[3] end
381
+ def splat_param; self[2] ? self[2][0] : nil end
382
+ def block_param; self[-1] ? self[-1][0] : nil end
383
+ def optional_params
384
+ optional = self[1] || []
385
+ if self[-3] && self[-3][0] && self[-3][0].type == :default_arg
386
+ optional += self[-3]
387
+ end
388
+ optional.empty? ? nil : optional
389
+ end
390
+ def keyword_param; YARD.ruby2? ? self[-2] : nil end
391
+ end
392
+
393
+ class MethodCallNode < AstNode
394
+ def call?; true end
395
+ def namespace; first if index_adjust > 0 end
396
+
397
+ def method_name(name_only = false)
398
+ name = self[index_adjust]
399
+ name_only ? name.jump(:ident).first.to_sym : name
400
+ end
401
+
402
+ def parameters(include_block_param = true)
403
+ return [] if type == :vcall
404
+ params = self[1 + index_adjust]
405
+ return [] unless params
406
+ params = call_has_paren? ? params.first : params
407
+ return [] unless params
408
+ include_block_param ? params : params[0...-1]
409
+ end
410
+
411
+ def block_param; parameters.last end
412
+ def block
413
+ last.type == :do_block || last.type == :brace_block ? last : nil
414
+ end
415
+
416
+ private
417
+
418
+ def index_adjust
419
+ [:call, :command_call].include?(type) ? 2 : 0
420
+ end
421
+
422
+ def call_has_paren?
423
+ [:fcall, :call].include?(type)
424
+ end
425
+ end
426
+
427
+ class MethodDefinitionNode < AstNode
428
+ def kw?; true end
429
+ def def?; true end
430
+ def namespace; first if index_adjust > 0 end
431
+
432
+ def method_name(name_only = false)
433
+ name = self[index_adjust]
434
+ name_only ? name.jump(:ident).first.to_sym : name
435
+ end
436
+
437
+ def parameters(include_block_param = true)
438
+ params = self[1 + index_adjust]
439
+ params = params[0] if params.type == :paren
440
+ include_block_param ? params : params[0...-1]
441
+ end
442
+
443
+ alias block last
444
+
445
+ private
446
+
447
+ def index_adjust
448
+ type == :defs ? 2 : 0
449
+ end
450
+ end
451
+
452
+ class ConditionalNode < KeywordNode
453
+ def condition?; true end
454
+ def condition; first end
455
+ def then_block; self[1] end
456
+
457
+ def else_block
458
+ if self[2] && !cmod?
459
+ self[2].type == :elsif ? self[2] : self[2][0]
460
+ end
461
+ end
462
+
463
+ private
464
+
465
+ def cmod?; type =~ /_mod$/ end
466
+ end
467
+
468
+ class ClassNode < KeywordNode
469
+ def class_name; first end
470
+ def superclass; type == :sclass ? nil : self[1] end
471
+ def block; last end
472
+ end
473
+
474
+ class ModuleNode < KeywordNode
475
+ def module_name; first end
476
+ def block; last end
477
+ end
478
+
479
+ class LoopNode < KeywordNode
480
+ def loop?; true end
481
+ def condition; type == :for ? s(self[0], self[1]) : first end
482
+ def block; last end
483
+ end
484
+
485
+ # Represents a lone comment block in source
486
+ class CommentNode < AstNode
487
+ def docstring; first end
488
+ def docstring=(value) end
489
+ alias comments docstring
490
+
491
+ def source; "" end
492
+ def first_line; "" end
493
+ end
494
+ end
495
+ end
496
+ end