docspring 3.0.0 → 3.1.0

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 (523) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/Gemfile.lock +4 -4
  4. data/README.md +11 -5
  5. data/docs/CreateHtmlSubmissionData.md +3 -1
  6. data/docs/CreatePdfSubmissionData.md +3 -1
  7. data/docs/PDFApi.md +156 -10
  8. data/docs/PublishVersionData.md +20 -0
  9. data/docs/RestoreVersionData.md +18 -0
  10. data/docs/Submission.md +4 -0
  11. data/docs/SubmissionPreview.md +4 -0
  12. data/docs/Template.md +15 -1
  13. data/docs/TemplateDeleteResponse.md +24 -0
  14. data/docs/TemplatePreview.md +13 -1
  15. data/docs/TemplatePublishVersionResponse.md +22 -0
  16. data/lib/docspring/api/pdf_api.rb +152 -5
  17. data/lib/docspring/api_client.rb +1 -1
  18. data/lib/docspring/models/combined_submission_action.rb +1 -5
  19. data/lib/docspring/models/create_html_submission_data.rb +13 -4
  20. data/lib/docspring/models/create_pdf_submission_data.rb +13 -4
  21. data/lib/docspring/models/publish_version_data.rb +230 -0
  22. data/lib/docspring/models/restore_version_data.rb +221 -0
  23. data/lib/docspring/models/submission.rb +41 -1
  24. data/lib/docspring/models/submission_data_request_event.rb +1 -5
  25. data/lib/docspring/models/submission_preview.rb +41 -1
  26. data/lib/docspring/models/template.rb +106 -4
  27. data/lib/docspring/models/template_delete_response.rb +287 -0
  28. data/lib/docspring/models/template_preview.rb +88 -4
  29. data/lib/docspring/models/template_publish_version_response.rb +282 -0
  30. data/lib/docspring/version.rb +1 -1
  31. data/lib/docspring.rb +4 -0
  32. data/spec/api/pdf_api_spec.rb +27 -2
  33. data/spec/models/create_html_submission_data_spec.rb +6 -0
  34. data/spec/models/create_pdf_submission_data_spec.rb +6 -0
  35. data/spec/models/publish_version_data_spec.rb +42 -0
  36. data/spec/models/restore_version_data_spec.rb +36 -0
  37. data/spec/models/submission_preview_spec.rb +16 -0
  38. data/spec/models/submission_spec.rb +16 -0
  39. data/spec/models/template_delete_response_spec.rb +58 -0
  40. data/spec/models/template_preview_spec.rb +40 -0
  41. data/spec/models/template_publish_version_response_spec.rb +52 -0
  42. data/spec/models/template_spec.rb +46 -0
  43. data/vendor/bundle/ruby/3.3.0/bin/irb +29 -0
  44. data/vendor/bundle/ruby/3.3.0/bin/rdbg +29 -0
  45. data/vendor/bundle/ruby/3.3.0/bin/rdoc +29 -0
  46. data/vendor/bundle/ruby/3.3.0/bin/ri +29 -0
  47. data/vendor/bundle/ruby/3.3.0/cache/ast-2.4.3.gem +0 -0
  48. data/vendor/bundle/ruby/3.3.0/cache/debug-1.10.0.gem +0 -0
  49. data/vendor/bundle/ruby/3.3.0/cache/io-console-0.8.0.gem +0 -0
  50. data/vendor/bundle/ruby/3.3.0/cache/irb-1.15.1.gem +0 -0
  51. data/vendor/bundle/ruby/3.3.0/cache/parser-3.3.7.2.gem +0 -0
  52. data/vendor/bundle/ruby/3.3.0/cache/pp-0.6.2.gem +0 -0
  53. data/vendor/bundle/ruby/3.3.0/cache/prettyprint-0.2.0.gem +0 -0
  54. data/vendor/bundle/ruby/3.3.0/cache/rdoc-6.12.0.gem +0 -0
  55. data/vendor/bundle/ruby/3.3.0/cache/reline-0.6.0.gem +0 -0
  56. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/debug-1.10.0/debug/debug.bundle +0 -0
  57. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/debug-1.10.0/gem.build_complete +0 -0
  58. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/debug-1.10.0/gem_make.out +19 -0
  59. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/io-console-0.8.0/gem.build_complete +0 -0
  60. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/io-console-0.8.0/gem_make.out +31 -0
  61. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/io-console-0.8.0/io/console.bundle +0 -0
  62. data/vendor/bundle/ruby/3.3.0/extensions/arm64-darwin-24/3.3.0/io-console-0.8.0/mkmf.log +447 -0
  63. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/LICENSE.MIT +20 -0
  64. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/README.YARD.md +12 -0
  65. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/lib/ast/node.rb +268 -0
  66. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/lib/ast/processor/mixin.rb +288 -0
  67. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/lib/ast/processor.rb +12 -0
  68. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/lib/ast/sexp.rb +30 -0
  69. data/vendor/bundle/ruby/3.3.0/gems/ast-2.4.3/lib/ast.rb +17 -0
  70. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/CONTRIBUTING.md +573 -0
  71. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/Gemfile +10 -0
  72. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/LICENSE.txt +22 -0
  73. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/README.md +970 -0
  74. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/Rakefile +57 -0
  75. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/TODO.md +23 -0
  76. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/debug.gemspec +33 -0
  77. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/exe/rdbg +53 -0
  78. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/ext/debug/Makefile +270 -0
  79. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/ext/debug/debug.c +228 -0
  80. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/ext/debug/debug_version.h +1 -0
  81. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/ext/debug/extconf.rb +27 -0
  82. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/ext/debug/iseq_collector.c +93 -0
  83. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/abbrev_command.rb +77 -0
  84. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/breakpoint.rb +556 -0
  85. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/client.rb +263 -0
  86. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/color.rb +123 -0
  87. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/config.rb +590 -0
  88. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/console.rb +213 -0
  89. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/dap_custom/traceInspector.rb +336 -0
  90. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/debug.bundle +0 -0
  91. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/frame_info.rb +188 -0
  92. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/irb_integration.rb +37 -0
  93. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/local.rb +115 -0
  94. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/open.rb +13 -0
  95. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/open_nonstop.rb +15 -0
  96. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/prelude.rb +50 -0
  97. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/server.rb +534 -0
  98. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/server_cdp.rb +1348 -0
  99. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/server_dap.rb +1108 -0
  100. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/session.rb +2659 -0
  101. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/source_repository.rb +150 -0
  102. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/start.rb +5 -0
  103. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/thread_client.rb +1455 -0
  104. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/tracer.rb +241 -0
  105. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug/version.rb +5 -0
  106. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/lib/debug.rb +9 -0
  107. data/vendor/bundle/ruby/3.3.0/gems/debug-1.10.0/misc/README.md.erb +636 -0
  108. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/.document +5 -0
  109. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/BSDL +22 -0
  110. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/COPYING +56 -0
  111. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/README.md +46 -0
  112. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/ext/io/console/Makefile +272 -0
  113. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/ext/io/console/console.c +1969 -0
  114. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/ext/io/console/extconf.rb +61 -0
  115. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/ext/io/console/win32_vk.inc +1390 -0
  116. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/lib/io/console/size.rb +23 -0
  117. data/vendor/bundle/ruby/3.3.0/gems/io-console-0.8.0/lib/io/console.bundle +0 -0
  118. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/Gemfile +29 -0
  119. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/LICENSE.txt +22 -0
  120. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/README.md +125 -0
  121. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/Rakefile +52 -0
  122. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/bin/console +6 -0
  123. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/bin/setup +6 -0
  124. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/doc/irb/irb-tools.rd.ja +184 -0
  125. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/doc/irb/irb.rd.ja +425 -0
  126. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/exe/irb +9 -0
  127. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/irb.gemspec +46 -0
  128. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/cmd/nop.rb +4 -0
  129. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/color.rb +263 -0
  130. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/color_printer.rb +56 -0
  131. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/backtrace.rb +17 -0
  132. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/base.rb +60 -0
  133. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/break.rb +17 -0
  134. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/catch.rb +17 -0
  135. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/cd.rb +51 -0
  136. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/chws.rb +40 -0
  137. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/context.rb +16 -0
  138. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/continue.rb +17 -0
  139. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/copy.rb +73 -0
  140. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/debug.rb +73 -0
  141. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/delete.rb +17 -0
  142. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/disable_irb.rb +19 -0
  143. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/edit.rb +63 -0
  144. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/exit.rb +18 -0
  145. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/finish.rb +17 -0
  146. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/force_exit.rb +18 -0
  147. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/help.rb +83 -0
  148. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/history.rb +45 -0
  149. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/info.rb +17 -0
  150. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/internal_helpers.rb +27 -0
  151. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/irb_info.rb +33 -0
  152. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/load.rb +91 -0
  153. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/ls.rb +167 -0
  154. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/measure.rb +49 -0
  155. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/next.rb +17 -0
  156. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/pushws.rb +65 -0
  157. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/show_doc.rb +51 -0
  158. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/show_source.rb +74 -0
  159. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/step.rb +17 -0
  160. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/subirb.rb +123 -0
  161. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command/whereami.rb +23 -0
  162. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/command.rb +23 -0
  163. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/completion.rb +504 -0
  164. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/context.rb +751 -0
  165. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/debug/ui.rb +101 -0
  166. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/debug.rb +127 -0
  167. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/default_commands.rb +279 -0
  168. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/easter-egg.rb +152 -0
  169. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/change-ws.rb +37 -0
  170. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/eval_history.rb +149 -0
  171. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/loader.rb +127 -0
  172. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/multi-irb.rb +258 -0
  173. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/tracer.rb +39 -0
  174. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/use-loader.rb +67 -0
  175. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ext/workspaces.rb +36 -0
  176. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/frame.rb +80 -0
  177. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/help.rb +28 -0
  178. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/helper_method/base.rb +16 -0
  179. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/helper_method/conf.rb +11 -0
  180. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/helper_method.rb +29 -0
  181. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/history.rb +116 -0
  182. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/init.rb +540 -0
  183. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/input-method.rb +515 -0
  184. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/inspector.rb +136 -0
  185. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/lc/error.rb +52 -0
  186. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/lc/help-message +55 -0
  187. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/lc/ja/error.rb +53 -0
  188. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/lc/ja/help-message +58 -0
  189. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/locale.rb +153 -0
  190. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/nesting_parser.rb +239 -0
  191. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/notifier.rb +230 -0
  192. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/output-method.rb +80 -0
  193. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/pager.rb +213 -0
  194. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ruby-lex.rb +476 -0
  195. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ruby_logo.aa +118 -0
  196. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/source_finder.rb +138 -0
  197. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/statement.rb +101 -0
  198. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/version.rb +11 -0
  199. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/workspace.rb +171 -0
  200. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/ws-for-case-2.rb +9 -0
  201. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb/xmp.rb +164 -0
  202. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/lib/irb.rb +736 -0
  203. data/vendor/bundle/ruby/3.3.0/gems/irb-1.15.1/man/irb.1 +292 -0
  204. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/LICENSE.txt +26 -0
  205. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/bin/ruby-parse +7 -0
  206. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/bin/ruby-rewrite +7 -0
  207. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/gauntlet_parser.rb +123 -0
  208. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/all.rb +17 -0
  209. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ast/node.rb +40 -0
  210. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ast/processor.rb +293 -0
  211. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/base.rb +291 -0
  212. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/builders/default.rb +2338 -0
  213. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/clobbering_error.rb +13 -0
  214. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/color.rb +32 -0
  215. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/context.rb +51 -0
  216. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/current.rb +137 -0
  217. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/current_arg_stack.rb +46 -0
  218. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/deprecation.rb +13 -0
  219. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/diagnostic/engine.rb +104 -0
  220. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/diagnostic.rb +163 -0
  221. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer/dedenter.rb +88 -0
  222. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer/explanation.rb +55 -0
  223. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer/literal.rb +284 -0
  224. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer/stack_state.rb +49 -0
  225. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer-F0.rb +12922 -0
  226. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer-F1.rb +14875 -0
  227. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/lexer-strings.rb +5424 -0
  228. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/macruby.rb +9634 -0
  229. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/max_numparam_stack.rb +56 -0
  230. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/messages.rb +125 -0
  231. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/meta.rb +48 -0
  232. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/rewriter.rb +105 -0
  233. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby18.rb +9272 -0
  234. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby19.rb +9558 -0
  235. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby20.rb +10229 -0
  236. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby21.rb +10203 -0
  237. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby22.rb +10302 -0
  238. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby23.rb +10322 -0
  239. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby24.rb +10454 -0
  240. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby25.rb +10374 -0
  241. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby26.rb +10352 -0
  242. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby27.rb +11947 -0
  243. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby30.rb +12243 -0
  244. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby31.rb +12716 -0
  245. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby32.rb +12704 -0
  246. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby33.rb +12589 -0
  247. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/ruby34.rb +12596 -0
  248. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/rubymotion.rb +9515 -0
  249. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/runner/ruby_parse.rb +157 -0
  250. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/runner/ruby_rewrite.rb +101 -0
  251. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/runner.rb +299 -0
  252. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/buffer.rb +369 -0
  253. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/comment/associator.rb +233 -0
  254. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/comment.rb +134 -0
  255. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/collection.rb +18 -0
  256. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/condition.rb +21 -0
  257. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/constant.rb +32 -0
  258. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/definition.rb +23 -0
  259. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/for.rb +19 -0
  260. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/heredoc.rb +19 -0
  261. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/index.rb +33 -0
  262. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/keyword.rb +20 -0
  263. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/method_definition.rb +25 -0
  264. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/objc_kwarg.rb +19 -0
  265. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/operator.rb +17 -0
  266. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/rescue_body.rb +21 -0
  267. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/send.rb +36 -0
  268. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/ternary.rb +18 -0
  269. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map/variable.rb +31 -0
  270. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/map.rb +186 -0
  271. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/range.rb +326 -0
  272. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/rewriter/action.rb +44 -0
  273. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/rewriter.rb +513 -0
  274. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/tree_rewriter/action.rb +243 -0
  275. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/source/tree_rewriter.rb +431 -0
  276. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/static_environment.rb +134 -0
  277. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/syntax_error.rb +21 -0
  278. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/tree_rewriter.rb +133 -0
  279. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/unknown_encoding_in_magic_comment_error.rb +15 -0
  280. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/variables_stack.rb +36 -0
  281. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser/version.rb +5 -0
  282. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/lib/parser.rb +91 -0
  283. data/vendor/bundle/ruby/3.3.0/gems/parser-3.3.7.2/parser.gemspec +43 -0
  284. data/vendor/bundle/ruby/3.3.0/gems/pp-0.6.2/BSDL +22 -0
  285. data/vendor/bundle/ruby/3.3.0/gems/pp-0.6.2/COPYING +56 -0
  286. data/vendor/bundle/ruby/3.3.0/gems/pp-0.6.2/lib/pp.rb +699 -0
  287. data/vendor/bundle/ruby/3.3.0/gems/pp-0.6.2/pp.gemspec +35 -0
  288. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/.github/dependabot.yml +6 -0
  289. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/.github/workflows/test.yml +41 -0
  290. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/.gitignore +8 -0
  291. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/Gemfile +4 -0
  292. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/LICENSE.txt +22 -0
  293. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/README.md +43 -0
  294. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/Rakefile +10 -0
  295. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/bin/console +14 -0
  296. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/bin/setup +8 -0
  297. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/lib/prettyprint.rb +558 -0
  298. data/vendor/bundle/ruby/3.3.0/gems/prettyprint-0.2.0/prettyprint.gemspec +29 -0
  299. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/CONTRIBUTING.rdoc +219 -0
  300. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/CVE-2013-0256.rdoc +49 -0
  301. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/ExampleMarkdown.md +39 -0
  302. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/ExampleRDoc.rdoc +210 -0
  303. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/History.rdoc +1668 -0
  304. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/LEGAL.rdoc +50 -0
  305. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/LICENSE.rdoc +59 -0
  306. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/README.rdoc +142 -0
  307. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/RI.md +842 -0
  308. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/TODO.rdoc +60 -0
  309. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/exe/rdoc +43 -0
  310. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/exe/ri +12 -0
  311. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/alias.rb +111 -0
  312. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/anon_class.rb +10 -0
  313. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/any_method.rb +379 -0
  314. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/attr.rb +175 -0
  315. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/class_module.rb +871 -0
  316. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/constant.rb +186 -0
  317. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/context/section.rb +175 -0
  318. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/context.rb +1264 -0
  319. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/extend.rb +9 -0
  320. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/ghost_method.rb +6 -0
  321. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/include.rb +9 -0
  322. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/meta_method.rb +6 -0
  323. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/method_attr.rb +430 -0
  324. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/mixin.rb +120 -0
  325. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/normal_class.rb +92 -0
  326. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/normal_module.rb +73 -0
  327. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/require.rb +51 -0
  328. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/single_class.rb +30 -0
  329. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object/top_level.rb +291 -0
  330. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_object.rb +426 -0
  331. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/code_objects.rb +5 -0
  332. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/comment.rb +239 -0
  333. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/cross_reference.rb +228 -0
  334. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/encoding.rb +120 -0
  335. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/erb_partial.rb +18 -0
  336. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/erbio.rb +37 -0
  337. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/darkfish.rb +824 -0
  338. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/json_index.rb +300 -0
  339. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/markup.rb +159 -0
  340. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/pot/message_extractor.rb +68 -0
  341. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/pot/po.rb +84 -0
  342. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/pot/po_entry.rb +141 -0
  343. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/pot.rb +99 -0
  344. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/ri.rb +30 -0
  345. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
  346. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_head.rhtml +43 -0
  347. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
  348. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +34 -0
  349. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
  350. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
  351. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
  352. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
  353. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +21 -0
  354. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
  355. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +32 -0
  356. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +6 -0
  357. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
  358. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
  359. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +39 -0
  360. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml +3 -0
  361. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/class.rhtml +206 -0
  362. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
  363. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/css/rdoc.css +668 -0
  364. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
  365. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
  366. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
  367. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
  368. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  369. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  370. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
  371. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
  372. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/brick.png +0 -0
  373. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/brick_link.png +0 -0
  374. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/bug.png +0 -0
  375. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/bullet_black.png +0 -0
  376. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png +0 -0
  377. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png +0 -0
  378. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/date.png +0 -0
  379. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
  380. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/find.png +0 -0
  381. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif +0 -0
  382. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png +0 -0
  383. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/package.png +0 -0
  384. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/page_green.png +0 -0
  385. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/page_white_text.png +0 -0
  386. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/page_white_width.png +0 -0
  387. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/plugin.png +0 -0
  388. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/ruby.png +0 -0
  389. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
  390. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/tag_green.png +0 -0
  391. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
  392. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/wrench.png +0 -0
  393. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/wrench_orange.png +0 -0
  394. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/images/zoom.png +0 -0
  395. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/index.rhtml +23 -0
  396. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/js/darkfish.js +120 -0
  397. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
  398. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
  399. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +20 -0
  400. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +65 -0
  401. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +70 -0
  402. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
  403. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
  404. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/generator.rb +51 -0
  405. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/i18n/locale.rb +102 -0
  406. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/i18n/text.rb +126 -0
  407. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/i18n.rb +10 -0
  408. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/known_classes.rb +74 -0
  409. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markdown/entities.rb +2131 -0
  410. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markdown/literals.kpeg +21 -0
  411. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markdown/literals.rb +454 -0
  412. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markdown.kpeg +1244 -0
  413. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markdown.rb +16793 -0
  414. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/attr_changer.rb +22 -0
  415. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/attr_span.rb +35 -0
  416. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/attribute_manager.rb +405 -0
  417. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/attributes.rb +70 -0
  418. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/blank_line.rb +27 -0
  419. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/block_quote.rb +14 -0
  420. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/document.rb +164 -0
  421. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/formatter.rb +272 -0
  422. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/hard_break.rb +31 -0
  423. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/heading.rb +78 -0
  424. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/include.rb +42 -0
  425. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/indented_paragraph.rb +47 -0
  426. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/list.rb +101 -0
  427. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/list_item.rb +99 -0
  428. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/paragraph.rb +28 -0
  429. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/parser.rb +585 -0
  430. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/pre_process.rb +318 -0
  431. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/raw.rb +69 -0
  432. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/regexp_handling.rb +40 -0
  433. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/rule.rb +20 -0
  434. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/table.rb +56 -0
  435. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_ansi.rb +93 -0
  436. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_bs.rb +102 -0
  437. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_html.rb +452 -0
  438. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_html_crossref.rb +226 -0
  439. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_html_snippet.rb +287 -0
  440. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_joined_paragraph.rb +46 -0
  441. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_label.rb +74 -0
  442. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_markdown.rb +191 -0
  443. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_rdoc.rb +352 -0
  444. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_table_of_contents.rb +88 -0
  445. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_test.rb +69 -0
  446. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/to_tt_only.rb +120 -0
  447. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup/verbatim.rb +83 -0
  448. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/markup.rb +240 -0
  449. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/options.rb +1397 -0
  450. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/c.rb +1260 -0
  451. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/changelog.rb +350 -0
  452. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/markdown.rb +22 -0
  453. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/prism_ruby.rb +1099 -0
  454. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/rd.rb +22 -0
  455. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/ripper_state_lex.rb +302 -0
  456. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/ruby.rb +2381 -0
  457. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/ruby_tools.rb +165 -0
  458. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/simple.rb +61 -0
  459. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser/text.rb +11 -0
  460. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/parser.rb +297 -0
  461. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd/block_parser.rb +1706 -0
  462. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd/block_parser.ry +643 -0
  463. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd/inline.rb +71 -0
  464. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd/inline_parser.rb +1854 -0
  465. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd/inline_parser.ry +593 -0
  466. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rd.rb +99 -0
  467. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rdoc.rb +566 -0
  468. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri/driver.rb +1558 -0
  469. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri/formatter.rb +6 -0
  470. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri/paths.rb +171 -0
  471. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri/store.rb +6 -0
  472. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri/task.rb +71 -0
  473. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/ri.rb +20 -0
  474. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/rubygems_hook.rb +330 -0
  475. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/servlet.rb +451 -0
  476. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/stats/normal.rb +58 -0
  477. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/stats/quiet.rb +59 -0
  478. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/stats/verbose.rb +44 -0
  479. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/stats.rb +461 -0
  480. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/store.rb +1001 -0
  481. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/task.rb +354 -0
  482. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/text.rb +322 -0
  483. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/token_stream.rb +118 -0
  484. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/tom_doc.rb +257 -0
  485. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc/version.rb +10 -0
  486. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rdoc.rb +211 -0
  487. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/lib/rubygems_plugin.rb +23 -0
  488. data/vendor/bundle/ruby/3.3.0/gems/rdoc-6.12.0/man/ri.1 +247 -0
  489. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/BSDL +22 -0
  490. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/COPYING +56 -0
  491. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/README.md +94 -0
  492. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/config.rb +373 -0
  493. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/face.rb +199 -0
  494. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/history.rb +76 -0
  495. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/io/ansi.rb +325 -0
  496. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/io/dumb.rb +120 -0
  497. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/io/windows.rb +530 -0
  498. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/io.rb +55 -0
  499. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor/base.rb +37 -0
  500. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor/composite.rb +17 -0
  501. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor/emacs.rb +517 -0
  502. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor/vi_command.rb +518 -0
  503. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor/vi_insert.rb +517 -0
  504. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_actor.rb +8 -0
  505. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/key_stroke.rb +119 -0
  506. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/kill_ring.rb +125 -0
  507. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/line_editor.rb +2382 -0
  508. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/unicode/east_asian_width.rb +1267 -0
  509. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/unicode.rb +415 -0
  510. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline/version.rb +3 -0
  511. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/lib/reline.rb +519 -0
  512. data/vendor/bundle/ruby/3.3.0/gems/reline-0.6.0/license_of_rb-readline +25 -0
  513. data/vendor/bundle/ruby/3.3.0/plugins/rdoc_plugin.rb +1 -0
  514. data/vendor/bundle/ruby/3.3.0/specifications/ast-2.4.3.gemspec +29 -0
  515. data/vendor/bundle/ruby/3.3.0/specifications/debug-1.10.0.gemspec +32 -0
  516. data/vendor/bundle/ruby/3.3.0/specifications/io-console-0.8.0.gemspec +25 -0
  517. data/vendor/bundle/ruby/3.3.0/specifications/irb-1.15.1.gemspec +31 -0
  518. data/vendor/bundle/ruby/3.3.0/specifications/parser-3.3.7.2.gemspec +37 -0
  519. data/vendor/bundle/ruby/3.3.0/specifications/pp-0.6.2.gemspec +27 -0
  520. data/vendor/bundle/ruby/3.3.0/specifications/prettyprint-0.2.0.gemspec +23 -0
  521. data/vendor/bundle/ruby/3.3.0/specifications/rdoc-6.12.0.gemspec +31 -0
  522. data/vendor/bundle/ruby/3.3.0/specifications/reline-0.6.0.gemspec +26 -0
  523. metadata +499 -3
@@ -0,0 +1,2338 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Parser
4
+
5
+ ##
6
+ # Default AST builder. Uses {AST::Node}s.
7
+ #
8
+ class Builders::Default
9
+ class << self
10
+ ##
11
+ # AST compatibility attribute; since `-> {}` is not semantically
12
+ # equivalent to `lambda {}`, all new code should set this attribute
13
+ # to true.
14
+ #
15
+ # If set to false (the default), `-> {}` is emitted as
16
+ # `s(:block, s(:send, nil, :lambda), s(:args), nil)`.
17
+ #
18
+ # If set to true, `-> {}` is emitted as
19
+ # `s(:block, s(:lambda), s(:args), nil)`.
20
+ #
21
+ # @return [Boolean]
22
+ attr_accessor :emit_lambda
23
+ end
24
+
25
+ @emit_lambda = false
26
+
27
+ class << self
28
+ ##
29
+ # AST compatibility attribute; block arguments of `m { |a| }` are
30
+ # not semantically equivalent to block arguments of `m { |a,| }` or `m { |a, b| }`,
31
+ # all new code should set this attribute to true.
32
+ #
33
+ # If set to false (the default), arguments of `m { |a| }` are emitted as
34
+ # `s(:args, s(:arg, :a))`.
35
+ #
36
+ # If set to true, arguments of `m { |a| }` are emitted as
37
+ # `s(:args, s(:procarg0, :a)).
38
+ #
39
+ # @return [Boolean]
40
+ attr_accessor :emit_procarg0
41
+ end
42
+
43
+ @emit_procarg0 = false
44
+
45
+ class << self
46
+ ##
47
+ # AST compatibility attribute; locations of `__ENCODING__` are not the same
48
+ # as locations of `Encoding::UTF_8` causing problems during rewriting,
49
+ # all new code should set this attribute to true.
50
+ #
51
+ # If set to false (the default), `__ENCODING__` is emitted as
52
+ # ` s(:const, s(:const, nil, :Encoding), :UTF_8)`.
53
+ #
54
+ # If set to true, `__ENCODING__` is emitted as
55
+ # `s(:__ENCODING__)`.
56
+ #
57
+ # @return [Boolean]
58
+ attr_accessor :emit_encoding
59
+ end
60
+
61
+ @emit_encoding = false
62
+
63
+ class << self
64
+ ##
65
+ # AST compatibility attribute; indexed assignment, `x[] = 1`, is not
66
+ # semantically equivalent to calling the method directly, `x.[]=(1)`.
67
+ # Specifically, in the former case, the expression's value is always 1,
68
+ # and in the latter case, the expression's value is the return value
69
+ # of the `[]=` method.
70
+ #
71
+ # If set to false (the default), `self[1]` is emitted as
72
+ # `s(:send, s(:self), :[], s(:int, 1))`, and `self[1] = 2` is
73
+ # emitted as `s(:send, s(:self), :[]=, s(:int, 1), s(:int, 2))`.
74
+ #
75
+ # If set to true, `self[1]` is emitted as
76
+ # `s(:index, s(:self), s(:int, 1))`, and `self[1] = 2` is
77
+ # emitted as `s(:indexasgn, s(:self), s(:int, 1), s(:int, 2))`.
78
+ #
79
+ # @return [Boolean]
80
+ attr_accessor :emit_index
81
+ end
82
+
83
+ @emit_index = false
84
+
85
+ class << self
86
+ ##
87
+ # AST compatibility attribute; causes a single non-mlhs
88
+ # block argument to be wrapped in s(:procarg0).
89
+ #
90
+ # If set to false (the default), block arguments `|a|` are emitted as
91
+ # `s(:args, s(:procarg0, :a))`
92
+ #
93
+ # If set to true, block arguments `|a|` are emitted as
94
+ # `s(:args, s(:procarg0, s(:arg, :a))`
95
+ #
96
+ # @return [Boolean]
97
+ attr_accessor :emit_arg_inside_procarg0
98
+ end
99
+
100
+ @emit_arg_inside_procarg0 = false
101
+
102
+ class << self
103
+ ##
104
+ # AST compatibility attribute; arguments forwarding initially
105
+ # didn't have support for leading arguments
106
+ # (i.e. `def m(a, ...); end` was a syntax error). However, Ruby 3.0
107
+ # added support for any number of arguments in front of the `...`.
108
+ #
109
+ # If set to false (the default):
110
+ # 1. `def m(...) end` is emitted as
111
+ # s(:def, :m, s(:forward_args), nil)
112
+ # 2. `def m(a, b, ...) end` is emitted as
113
+ # s(:def, :m,
114
+ # s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
115
+ #
116
+ # If set to true it uses a single format:
117
+ # 1. `def m(...) end` is emitted as
118
+ # s(:def, :m, s(:args, s(:forward_arg)))
119
+ # 2. `def m(a, b, ...) end` is emitted as
120
+ # s(:def, :m, s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
121
+ #
122
+ # It does't matter that much on 2.7 (because there can't be any leading arguments),
123
+ # but on 3.0 it should be better enabled to use a single AST format.
124
+ #
125
+ # @return [Boolean]
126
+ attr_accessor :emit_forward_arg
127
+ end
128
+
129
+ @emit_forward_arg = false
130
+
131
+ class << self
132
+ ##
133
+ # AST compatibility attribute; Starting from Ruby 2.7 keyword arguments
134
+ # of method calls that are passed explicitly as a hash (i.e. with curly braces)
135
+ # are treated as positional arguments and Ruby 2.7 emits a warning on such method
136
+ # call. Ruby 3.0 given an ArgumentError.
137
+ #
138
+ # If set to false (the default) the last hash argument is emitted as `hash`:
139
+ #
140
+ # ```
141
+ # (send nil :foo
142
+ # (hash
143
+ # (pair
144
+ # (sym :bar)
145
+ # (int 42))))
146
+ # ```
147
+ #
148
+ # If set to true it is emitted as `kwargs`:
149
+ #
150
+ # ```
151
+ # (send nil :foo
152
+ # (kwargs
153
+ # (pair
154
+ # (sym :bar)
155
+ # (int 42))))
156
+ # ```
157
+ #
158
+ # Note that `kwargs` node is just a replacement for `hash` argument,
159
+ # so if there's are multiple arguments (or a `kwsplat`) all of them
160
+ # are wrapped into `kwargs` instead of `hash`:
161
+ #
162
+ # ```
163
+ # (send nil :foo
164
+ # (kwargs
165
+ # (pair
166
+ # (sym :a)
167
+ # (int 42))
168
+ # (kwsplat
169
+ # (send nil :b))
170
+ # (pair
171
+ # (sym :c)
172
+ # (int 10))))
173
+ # ```
174
+ attr_accessor :emit_kwargs
175
+ end
176
+
177
+ @emit_kwargs = false
178
+
179
+ class << self
180
+ ##
181
+ # AST compatibility attribute; Starting from 3.0 Ruby returns
182
+ # true/false from single-line pattern matching with `in` keyword.
183
+ #
184
+ # Before 3.0 there was an exception if given value doesn't match pattern.
185
+ #
186
+ # NOTE: This attribute affects only Ruby 2.7 grammar.
187
+ # 3.0 grammar always emits `match_pattern`/`match_pattern_p`
188
+ #
189
+ # If compatibility attribute set to false `foo in bar` is emitted as `in_match`:
190
+ #
191
+ # ```
192
+ # (in-match
193
+ # (send nil :foo)
194
+ # (match-var :bar))
195
+ # ```
196
+ #
197
+ # If set to true it's emitted as `match_pattern_p`:
198
+ # ```
199
+ # (match-pattern-p
200
+ # (send nil :foo)
201
+ # (match-var :bar))
202
+ # ```
203
+ attr_accessor :emit_match_pattern
204
+ end
205
+
206
+ @emit_match_pattern = false
207
+
208
+ class << self
209
+ ##
210
+ # @api private
211
+ def modernize
212
+ @emit_lambda = true
213
+ @emit_procarg0 = true
214
+ @emit_encoding = true
215
+ @emit_index = true
216
+ @emit_arg_inside_procarg0 = true
217
+ @emit_forward_arg = true
218
+ @emit_kwargs = true
219
+ @emit_match_pattern = true
220
+ end
221
+ end
222
+
223
+ ##
224
+ # @api private
225
+ attr_accessor :parser
226
+
227
+ ##
228
+ # If set to true (the default), `__FILE__` and `__LINE__` are transformed to
229
+ # literal nodes. For example, `s(:str, "lib/foo.rb")` and `s(:int, 10)`.
230
+ #
231
+ # If set to false, `__FILE__` and `__LINE__` are emitted as-is,
232
+ # i.e. as `s(:__FILE__)` and `s(:__LINE__)` nodes.
233
+ #
234
+ # Source maps are identical in both cases.
235
+ #
236
+ # @return [Boolean]
237
+ attr_accessor :emit_file_line_as_literals
238
+
239
+ ##
240
+ # Initializes attributes:
241
+ #
242
+ # * `emit_file_line_as_literals`: `true`
243
+ def initialize
244
+ @emit_file_line_as_literals = true
245
+ end
246
+
247
+ # @!parse private
248
+
249
+ #
250
+ # Literals
251
+ #
252
+
253
+ # Singletons
254
+
255
+ def nil(nil_t)
256
+ n0(:nil,
257
+ token_map(nil_t))
258
+ end
259
+
260
+ def true(true_t)
261
+ n0(:true,
262
+ token_map(true_t))
263
+ end
264
+
265
+ def false(false_t)
266
+ n0(:false,
267
+ token_map(false_t))
268
+ end
269
+
270
+ # Numerics
271
+
272
+ def integer(integer_t)
273
+ numeric(:int, integer_t)
274
+ end
275
+
276
+ def float(float_t)
277
+ numeric(:float, float_t)
278
+ end
279
+
280
+ def rational(rational_t)
281
+ numeric(:rational, rational_t)
282
+ end
283
+
284
+ def complex(complex_t)
285
+ numeric(:complex, complex_t)
286
+ end
287
+
288
+ def numeric(kind, token)
289
+ n(kind, [ value(token) ],
290
+ Source::Map::Operator.new(nil, loc(token)))
291
+ end
292
+ private :numeric
293
+
294
+ def unary_num(unary_t, numeric)
295
+ value, = *numeric
296
+ operator_loc = loc(unary_t)
297
+
298
+ case value(unary_t)
299
+ when '+'
300
+ value = +value
301
+ when '-'
302
+ value = -value
303
+ end
304
+
305
+ numeric.updated(nil, [ value ],
306
+ :location =>
307
+ Source::Map::Operator.new(
308
+ operator_loc,
309
+ operator_loc.join(numeric.loc.expression)))
310
+ end
311
+
312
+ def __LINE__(__LINE__t)
313
+ n0(:__LINE__,
314
+ token_map(__LINE__t))
315
+ end
316
+
317
+ # Strings
318
+
319
+ def string(string_t)
320
+ n(:str, [ string_value(string_t) ],
321
+ delimited_string_map(string_t))
322
+ end
323
+
324
+ def string_internal(string_t)
325
+ n(:str, [ string_value(string_t) ],
326
+ unquoted_map(string_t))
327
+ end
328
+
329
+ def string_compose(begin_t, parts, end_t)
330
+ if collapse_string_parts?(parts)
331
+ if begin_t.nil? && end_t.nil?
332
+ parts.first
333
+ else
334
+ n(:str, parts.first.children,
335
+ string_map(begin_t, parts, end_t))
336
+ end
337
+ else
338
+ n(:dstr, [ *parts ],
339
+ string_map(begin_t, parts, end_t))
340
+ end
341
+ end
342
+
343
+ def character(char_t)
344
+ n(:str, [ string_value(char_t) ],
345
+ prefix_string_map(char_t))
346
+ end
347
+
348
+ def __FILE__(__FILE__t)
349
+ n0(:__FILE__,
350
+ token_map(__FILE__t))
351
+ end
352
+
353
+ # Symbols
354
+
355
+ def symbol(symbol_t)
356
+ n(:sym, [ string_value(symbol_t).to_sym ],
357
+ prefix_string_map(symbol_t))
358
+ end
359
+
360
+ def symbol_internal(symbol_t)
361
+ n(:sym, [ string_value(symbol_t).to_sym ],
362
+ unquoted_map(symbol_t))
363
+ end
364
+
365
+ def symbol_compose(begin_t, parts, end_t)
366
+ if collapse_string_parts?(parts)
367
+ str = parts.first
368
+
369
+ n(:sym, [ str.children.first.to_sym ],
370
+ collection_map(begin_t, str.loc.expression, end_t))
371
+ elsif @parser.version == 18 && parts.empty?
372
+ diagnostic :error, :empty_symbol, nil, loc(begin_t).join(loc(end_t))
373
+ else
374
+ n(:dsym, [ *parts ],
375
+ collection_map(begin_t, parts, end_t))
376
+ end
377
+ end
378
+
379
+ # Executable strings
380
+
381
+ def xstring_compose(begin_t, parts, end_t)
382
+ n(:xstr, [ *parts ],
383
+ string_map(begin_t, parts, end_t))
384
+ end
385
+
386
+ # Indented (interpolated, noninterpolated, executable) strings
387
+
388
+ def dedent_string(node, dedent_level)
389
+ if !dedent_level.nil?
390
+ dedenter = Lexer::Dedenter.new(dedent_level)
391
+
392
+ case node.type
393
+ when :str
394
+ str = node.children.first
395
+ dedenter.dedent(str)
396
+ when :dstr, :xstr
397
+ children = node.children.map do |str_node|
398
+ if str_node.type == :str
399
+ str = str_node.children.first
400
+ dedenter.dedent(str)
401
+ next nil if str.empty?
402
+ else
403
+ dedenter.interrupt
404
+ end
405
+ str_node
406
+ end
407
+
408
+ node = node.updated(nil, children.compact)
409
+ end
410
+ end
411
+
412
+ node
413
+ end
414
+
415
+ # Regular expressions
416
+
417
+ def regexp_options(regopt_t)
418
+ options = value(regopt_t).
419
+ each_char.sort.uniq.
420
+ map(&:to_sym)
421
+
422
+ n(:regopt, options,
423
+ token_map(regopt_t))
424
+ end
425
+
426
+ def regexp_compose(begin_t, parts, end_t, options)
427
+ begin
428
+ static_regexp(parts, options)
429
+ rescue RegexpError, Encoding::UndefinedConversionError => e
430
+ diagnostic :error, :invalid_regexp, { :message => e.message },
431
+ loc(begin_t).join(loc(end_t))
432
+ end
433
+
434
+ n(:regexp, (parts << options),
435
+ regexp_map(begin_t, end_t, options))
436
+ end
437
+
438
+ # Arrays
439
+
440
+ def array(begin_t, elements, end_t)
441
+ n(:array, elements,
442
+ collection_map(begin_t, elements, end_t))
443
+ end
444
+
445
+ def splat(star_t, arg=nil)
446
+ if arg.nil?
447
+ n0(:splat,
448
+ unary_op_map(star_t))
449
+ else
450
+ n(:splat, [ arg ],
451
+ unary_op_map(star_t, arg))
452
+ end
453
+ end
454
+
455
+ def word(parts)
456
+ if collapse_string_parts?(parts)
457
+ parts.first
458
+ else
459
+ n(:dstr, [ *parts ],
460
+ collection_map(nil, parts, nil))
461
+ end
462
+ end
463
+
464
+ def words_compose(begin_t, parts, end_t)
465
+ n(:array, [ *parts ],
466
+ collection_map(begin_t, parts, end_t))
467
+ end
468
+
469
+ def symbols_compose(begin_t, parts, end_t)
470
+ parts = parts.map do |part|
471
+ case part.type
472
+ when :str
473
+ value, = *part
474
+ part.updated(:sym, [ value.to_sym ])
475
+ when :dstr
476
+ part.updated(:dsym)
477
+ else
478
+ part
479
+ end
480
+ end
481
+
482
+ n(:array, [ *parts ],
483
+ collection_map(begin_t, parts, end_t))
484
+ end
485
+
486
+ # Hashes
487
+
488
+ def pair(key, assoc_t, value)
489
+ n(:pair, [ key, value ],
490
+ binary_op_map(key, assoc_t, value))
491
+ end
492
+
493
+ def pair_list_18(list)
494
+ if list.size % 2 != 0
495
+ diagnostic :error, :odd_hash, nil, list.last.loc.expression
496
+ else
497
+ list.
498
+ each_slice(2).map do |key, value|
499
+ n(:pair, [ key, value ],
500
+ binary_op_map(key, nil, value))
501
+ end
502
+ end
503
+ end
504
+
505
+ def pair_keyword(key_t, value)
506
+ key_map, pair_map = pair_keyword_map(key_t, value)
507
+
508
+ key = n(:sym, [ value(key_t).to_sym ], key_map)
509
+
510
+ n(:pair, [ key, value ], pair_map)
511
+ end
512
+
513
+ def pair_quoted(begin_t, parts, end_t, value)
514
+ end_t, pair_map = pair_quoted_map(begin_t, end_t, value)
515
+
516
+ key = symbol_compose(begin_t, parts, end_t)
517
+
518
+ n(:pair, [ key, value ], pair_map)
519
+ end
520
+
521
+ def pair_label(key_t)
522
+ key_l = loc(key_t)
523
+ value_l = key_l.adjust(end_pos: -1)
524
+
525
+ label = value(key_t)
526
+ value =
527
+ if label =~ /\A[[:upper:]]/
528
+ n(:const, [ nil, label.to_sym ], Source::Map::Constant.new(nil, value_l, value_l))
529
+ else
530
+ n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l))
531
+ end
532
+ pair_keyword(key_t, accessible(value))
533
+ end
534
+
535
+ def kwsplat(dstar_t, arg)
536
+ n(:kwsplat, [ arg ],
537
+ unary_op_map(dstar_t, arg))
538
+ end
539
+
540
+ def associate(begin_t, pairs, end_t)
541
+ key_set = Set.new
542
+
543
+ pairs.each do |pair|
544
+ next unless pair.type.eql?(:pair)
545
+
546
+ key, = *pair
547
+
548
+ case key.type
549
+ when :sym, :str, :int, :float
550
+ when :rational, :complex, :regexp
551
+ next unless @parser.version >= 31
552
+ else
553
+ next
554
+ end
555
+
556
+ unless key_set.add?(key)
557
+ diagnostic :warning, :duplicate_hash_key, nil, key.loc.expression
558
+ end
559
+ end
560
+
561
+ n(:hash, [ *pairs ],
562
+ collection_map(begin_t, pairs, end_t))
563
+ end
564
+
565
+ # Ranges
566
+
567
+ def range_inclusive(lhs, dot2_t, rhs)
568
+ n(:irange, [ lhs, rhs ],
569
+ range_map(lhs, dot2_t, rhs))
570
+ end
571
+
572
+ def range_exclusive(lhs, dot3_t, rhs)
573
+ n(:erange, [ lhs, rhs ],
574
+ range_map(lhs, dot3_t, rhs))
575
+ end
576
+
577
+ #
578
+ # Access
579
+ #
580
+
581
+ def self(token)
582
+ n0(:self,
583
+ token_map(token))
584
+ end
585
+
586
+ def ident(token)
587
+ n(:ident, [ value(token).to_sym ],
588
+ variable_map(token))
589
+ end
590
+
591
+ def ivar(token)
592
+ n(:ivar, [ value(token).to_sym ],
593
+ variable_map(token))
594
+ end
595
+
596
+ def gvar(token)
597
+ gvar_name = value(token)
598
+
599
+ if gvar_name.start_with?('$0') && gvar_name.length > 2
600
+ diagnostic :error, :gvar_name, { :name => gvar_name }, loc(token)
601
+ end
602
+
603
+ n(:gvar, [ gvar_name.to_sym ],
604
+ variable_map(token))
605
+ end
606
+
607
+ def cvar(token)
608
+ n(:cvar, [ value(token).to_sym ],
609
+ variable_map(token))
610
+ end
611
+
612
+ def back_ref(token)
613
+ n(:back_ref, [ value(token).to_sym ],
614
+ token_map(token))
615
+ end
616
+
617
+ def nth_ref(token)
618
+ n(:nth_ref, [ value(token) ],
619
+ token_map(token))
620
+ end
621
+
622
+ def accessible(node)
623
+ case node.type
624
+ when :__FILE__
625
+ if @emit_file_line_as_literals
626
+ n(:str, [ node.loc.expression.source_buffer.name ],
627
+ node.loc.dup)
628
+ else
629
+ node
630
+ end
631
+
632
+ when :__LINE__
633
+ if @emit_file_line_as_literals
634
+ n(:int, [ node.loc.expression.line ],
635
+ node.loc.dup)
636
+ else
637
+ node
638
+ end
639
+
640
+ when :__ENCODING__
641
+ if !self.class.emit_encoding
642
+ n(:const, [ n(:const, [ nil, :Encoding], nil), :UTF_8 ],
643
+ node.loc.dup)
644
+ else
645
+ node
646
+ end
647
+
648
+ when :ident
649
+ name, = *node
650
+
651
+ if %w[? !].any? { |c| name.to_s.end_with?(c) }
652
+ diagnostic :error, :invalid_id_to_get,
653
+ { :identifier => name.to_s }, node.loc.expression
654
+ end
655
+
656
+ # Numbered parameters are not declared anywhere,
657
+ # so they take precedence over method calls in numblock contexts
658
+ if @parser.version >= 27 && @parser.try_declare_numparam(node)
659
+ return node.updated(:lvar)
660
+ end
661
+
662
+ unless @parser.static_env.declared?(name)
663
+ if @parser.version == 33 &&
664
+ name == :it &&
665
+ @parser.context.in_block &&
666
+ !@parser.max_numparam_stack.has_ordinary_params?
667
+ diagnostic :warning, :ambiguous_it_call, nil, node.loc.expression
668
+ end
669
+
670
+ return n(:send, [ nil, name ],
671
+ var_send_map(node))
672
+ end
673
+
674
+ if name.to_s == parser.current_arg_stack.top
675
+ diagnostic :error, :circular_argument_reference,
676
+ { :var_name => name.to_s }, node.loc.expression
677
+ end
678
+
679
+ node.updated(:lvar)
680
+
681
+ else
682
+ node
683
+ end
684
+ end
685
+
686
+ def const(name_t)
687
+ n(:const, [ nil, value(name_t).to_sym ],
688
+ constant_map(nil, nil, name_t))
689
+ end
690
+
691
+ def const_global(t_colon3, name_t)
692
+ cbase = n0(:cbase, token_map(t_colon3))
693
+
694
+ n(:const, [ cbase, value(name_t).to_sym ],
695
+ constant_map(cbase, t_colon3, name_t))
696
+ end
697
+
698
+ def const_fetch(scope, t_colon2, name_t)
699
+ n(:const, [ scope, value(name_t).to_sym ],
700
+ constant_map(scope, t_colon2, name_t))
701
+ end
702
+
703
+ def __ENCODING__(__ENCODING__t)
704
+ n0(:__ENCODING__,
705
+ token_map(__ENCODING__t))
706
+ end
707
+
708
+ #
709
+ # Assignment
710
+ #
711
+
712
+ def assignable(node)
713
+ case node.type
714
+ when :cvar
715
+ node.updated(:cvasgn)
716
+
717
+ when :ivar
718
+ node.updated(:ivasgn)
719
+
720
+ when :gvar
721
+ node.updated(:gvasgn)
722
+
723
+ when :const
724
+ if @parser.context.in_def
725
+ diagnostic :error, :dynamic_const, nil, node.loc.expression
726
+ end
727
+
728
+ node.updated(:casgn)
729
+
730
+ when :ident
731
+ name, = *node
732
+
733
+ var_name = node.children[0].to_s
734
+ name_loc = node.loc.expression
735
+
736
+ check_assignment_to_numparam(var_name, name_loc)
737
+ check_reserved_for_numparam(var_name, name_loc)
738
+
739
+ @parser.static_env.declare(name)
740
+
741
+ node.updated(:lvasgn)
742
+
743
+ when :match_var
744
+ name, = *node
745
+
746
+ var_name = node.children[0].to_s
747
+ name_loc = node.loc.expression
748
+
749
+ check_assignment_to_numparam(var_name, name_loc)
750
+ check_reserved_for_numparam(var_name, name_loc)
751
+
752
+ node
753
+
754
+ when :nil, :self, :true, :false,
755
+ :__FILE__, :__LINE__, :__ENCODING__
756
+ diagnostic :error, :invalid_assignment, nil, node.loc.expression
757
+
758
+ when :back_ref, :nth_ref
759
+ diagnostic :error, :backref_assignment, nil, node.loc.expression
760
+ end
761
+ end
762
+
763
+ def const_op_assignable(node)
764
+ node.updated(:casgn)
765
+ end
766
+
767
+ def assign(lhs, eql_t, rhs)
768
+ (lhs << rhs).updated(nil, nil,
769
+ :location => lhs.loc.
770
+ with_operator(loc(eql_t)).
771
+ with_expression(join_exprs(lhs, rhs)))
772
+ end
773
+
774
+ def op_assign(lhs, op_t, rhs)
775
+ case lhs.type
776
+ when :gvasgn, :ivasgn, :lvasgn, :cvasgn, :casgn, :send, :csend, :index
777
+ operator = value(op_t)[0..-1].to_sym
778
+ source_map = lhs.loc.
779
+ with_operator(loc(op_t)).
780
+ with_expression(join_exprs(lhs, rhs))
781
+
782
+ if lhs.type == :index
783
+ lhs = lhs.updated(:indexasgn)
784
+ end
785
+
786
+ case operator
787
+ when :'&&'
788
+ n(:and_asgn, [ lhs, rhs ], source_map)
789
+ when :'||'
790
+ n(:or_asgn, [ lhs, rhs ], source_map)
791
+ else
792
+ n(:op_asgn, [ lhs, operator, rhs ], source_map)
793
+ end
794
+
795
+ when :back_ref, :nth_ref
796
+ diagnostic :error, :backref_assignment, nil, lhs.loc.expression
797
+ end
798
+ end
799
+
800
+ def multi_lhs(begin_t, items, end_t)
801
+ n(:mlhs, [ *items ],
802
+ collection_map(begin_t, items, end_t))
803
+ end
804
+
805
+ def multi_assign(lhs, eql_t, rhs)
806
+ n(:masgn, [ lhs, rhs ],
807
+ binary_op_map(lhs, eql_t, rhs))
808
+ end
809
+
810
+ #
811
+ # Class and module definition
812
+ #
813
+
814
+ def def_class(class_t, name,
815
+ lt_t, superclass,
816
+ body, end_t)
817
+ n(:class, [ name, superclass, body ],
818
+ module_definition_map(class_t, name, lt_t, end_t))
819
+ end
820
+
821
+ def def_sclass(class_t, lshft_t, expr,
822
+ body, end_t)
823
+ n(:sclass, [ expr, body ],
824
+ module_definition_map(class_t, nil, lshft_t, end_t))
825
+ end
826
+
827
+ def def_module(module_t, name,
828
+ body, end_t)
829
+ n(:module, [ name, body ],
830
+ module_definition_map(module_t, name, nil, end_t))
831
+ end
832
+
833
+ #
834
+ # Method (un)definition
835
+ #
836
+
837
+ def def_method(def_t, name_t, args,
838
+ body, end_t)
839
+ check_reserved_for_numparam(value(name_t), loc(name_t))
840
+
841
+ n(:def, [ value(name_t).to_sym, args, body ],
842
+ definition_map(def_t, nil, name_t, end_t))
843
+ end
844
+
845
+ def def_endless_method(def_t, name_t, args,
846
+ assignment_t, body)
847
+ check_reserved_for_numparam(value(name_t), loc(name_t))
848
+
849
+ n(:def, [ value(name_t).to_sym, args, body ],
850
+ endless_definition_map(def_t, nil, name_t, assignment_t, body))
851
+ end
852
+
853
+ def def_singleton(def_t, definee, dot_t,
854
+ name_t, args,
855
+ body, end_t)
856
+ validate_definee(definee)
857
+ check_reserved_for_numparam(value(name_t), loc(name_t))
858
+
859
+ n(:defs, [ definee, value(name_t).to_sym, args, body ],
860
+ definition_map(def_t, dot_t, name_t, end_t))
861
+ end
862
+
863
+ def def_endless_singleton(def_t, definee, dot_t,
864
+ name_t, args,
865
+ assignment_t, body)
866
+ validate_definee(definee)
867
+ check_reserved_for_numparam(value(name_t), loc(name_t))
868
+
869
+ n(:defs, [ definee, value(name_t).to_sym, args, body ],
870
+ endless_definition_map(def_t, dot_t, name_t, assignment_t, body))
871
+ end
872
+
873
+ def undef_method(undef_t, names)
874
+ n(:undef, [ *names ],
875
+ keyword_map(undef_t, nil, names, nil))
876
+ end
877
+
878
+ def alias(alias_t, to, from)
879
+ n(:alias, [ to, from ],
880
+ keyword_map(alias_t, nil, [to, from], nil))
881
+ end
882
+
883
+ #
884
+ # Formal arguments
885
+ #
886
+
887
+ def args(begin_t, args, end_t, check_args=true)
888
+ args = check_duplicate_args(args) if check_args
889
+ validate_no_forward_arg_after_restarg(args)
890
+
891
+ map = collection_map(begin_t, args, end_t)
892
+ if !self.class.emit_forward_arg && args.length == 1 && args[0].type == :forward_arg
893
+ n(:forward_args, [], map)
894
+ else
895
+ n(:args, args, map)
896
+ end
897
+ end
898
+
899
+ def numargs(max_numparam)
900
+ n(:numargs, [ max_numparam ], nil)
901
+ end
902
+
903
+ def forward_only_args(begin_t, dots_t, end_t)
904
+ if self.class.emit_forward_arg
905
+ arg = forward_arg(dots_t)
906
+ n(:args, [ arg ],
907
+ collection_map(begin_t, [ arg ], end_t))
908
+ else
909
+ n(:forward_args, [], collection_map(begin_t, token_map(dots_t), end_t))
910
+ end
911
+ end
912
+
913
+ def forward_arg(dots_t)
914
+ n(:forward_arg, [], token_map(dots_t))
915
+ end
916
+
917
+ def arg(name_t)
918
+ check_reserved_for_numparam(value(name_t), loc(name_t))
919
+
920
+ n(:arg, [ value(name_t).to_sym ],
921
+ variable_map(name_t))
922
+ end
923
+
924
+ def optarg(name_t, eql_t, value)
925
+ check_reserved_for_numparam(value(name_t), loc(name_t))
926
+
927
+ n(:optarg, [ value(name_t).to_sym, value ],
928
+ variable_map(name_t).
929
+ with_operator(loc(eql_t)).
930
+ with_expression(loc(name_t).join(value.loc.expression)))
931
+ end
932
+
933
+ def restarg(star_t, name_t=nil)
934
+ if name_t
935
+ check_reserved_for_numparam(value(name_t), loc(name_t))
936
+ n(:restarg, [ value(name_t).to_sym ],
937
+ arg_prefix_map(star_t, name_t))
938
+ else
939
+ n0(:restarg,
940
+ arg_prefix_map(star_t))
941
+ end
942
+ end
943
+
944
+ def kwarg(name_t)
945
+ check_reserved_for_numparam(value(name_t), loc(name_t))
946
+
947
+ n(:kwarg, [ value(name_t).to_sym ],
948
+ kwarg_map(name_t))
949
+ end
950
+
951
+ def kwoptarg(name_t, value)
952
+ check_reserved_for_numparam(value(name_t), loc(name_t))
953
+
954
+ n(:kwoptarg, [ value(name_t).to_sym, value ],
955
+ kwarg_map(name_t, value))
956
+ end
957
+
958
+ def kwrestarg(dstar_t, name_t=nil)
959
+ if name_t
960
+ check_reserved_for_numparam(value(name_t), loc(name_t))
961
+
962
+ n(:kwrestarg, [ value(name_t).to_sym ],
963
+ arg_prefix_map(dstar_t, name_t))
964
+ else
965
+ n0(:kwrestarg,
966
+ arg_prefix_map(dstar_t))
967
+ end
968
+ end
969
+
970
+ def kwnilarg(dstar_t, nil_t)
971
+ n0(:kwnilarg,
972
+ arg_prefix_map(dstar_t, nil_t))
973
+ end
974
+
975
+ def shadowarg(name_t)
976
+ check_reserved_for_numparam(value(name_t), loc(name_t))
977
+
978
+ n(:shadowarg, [ value(name_t).to_sym ],
979
+ variable_map(name_t))
980
+ end
981
+
982
+ def blockarg(amper_t, name_t)
983
+ if !name_t.nil?
984
+ check_reserved_for_numparam(value(name_t), loc(name_t))
985
+ end
986
+
987
+ arg_name = name_t ? value(name_t).to_sym : nil
988
+ n(:blockarg, [ arg_name ],
989
+ arg_prefix_map(amper_t, name_t))
990
+ end
991
+
992
+ def procarg0(arg)
993
+ if self.class.emit_procarg0
994
+ if arg.type == :arg && self.class.emit_arg_inside_procarg0
995
+ n(:procarg0, [ arg ],
996
+ Source::Map::Collection.new(nil, nil, arg.location.expression))
997
+ else
998
+ arg.updated(:procarg0)
999
+ end
1000
+ else
1001
+ arg
1002
+ end
1003
+ end
1004
+
1005
+ # Ruby 1.8 block arguments
1006
+
1007
+ def arg_expr(expr)
1008
+ if expr.type == :lvasgn
1009
+ expr.updated(:arg)
1010
+ else
1011
+ n(:arg_expr, [ expr ],
1012
+ expr.loc.dup)
1013
+ end
1014
+ end
1015
+
1016
+ def restarg_expr(star_t, expr=nil)
1017
+ if expr.nil?
1018
+ n0(:restarg, token_map(star_t))
1019
+ elsif expr.type == :lvasgn
1020
+ expr.updated(:restarg)
1021
+ else
1022
+ n(:restarg_expr, [ expr ],
1023
+ expr.loc.dup)
1024
+ end
1025
+ end
1026
+
1027
+ def blockarg_expr(amper_t, expr)
1028
+ if expr.type == :lvasgn
1029
+ expr.updated(:blockarg)
1030
+ else
1031
+ n(:blockarg_expr, [ expr ],
1032
+ expr.loc.dup)
1033
+ end
1034
+ end
1035
+
1036
+ # MacRuby Objective-C arguments
1037
+
1038
+ def objc_kwarg(kwname_t, assoc_t, name_t)
1039
+ kwname_l = loc(kwname_t)
1040
+ if assoc_t.nil? # a: b, not a => b
1041
+ kwname_l = kwname_l.resize(kwname_l.size - 1)
1042
+ operator_l = kwname_l.end.resize(1)
1043
+ else
1044
+ operator_l = loc(assoc_t)
1045
+ end
1046
+
1047
+ n(:objc_kwarg, [ value(kwname_t).to_sym, value(name_t).to_sym ],
1048
+ Source::Map::ObjcKwarg.new(kwname_l, operator_l, loc(name_t),
1049
+ kwname_l.join(loc(name_t))))
1050
+ end
1051
+
1052
+ def objc_restarg(star_t, name=nil)
1053
+ if name.nil?
1054
+ n0(:restarg, arg_prefix_map(star_t))
1055
+ elsif name.type == :arg # regular restarg
1056
+ name.updated(:restarg, nil,
1057
+ { :location => name.loc.with_operator(loc(star_t)) })
1058
+ else # restarg with objc_kwarg inside
1059
+ n(:objc_restarg, [ name ],
1060
+ unary_op_map(star_t, name))
1061
+ end
1062
+ end
1063
+
1064
+ #
1065
+ # Method calls
1066
+ #
1067
+
1068
+ def call_type_for_dot(dot_t)
1069
+ if !dot_t.nil? && value(dot_t) == :anddot
1070
+ :csend
1071
+ else
1072
+ # This case is a bit tricky. ruby23.y returns the token tDOT with
1073
+ # the value :dot, and the token :tANDDOT with the value :anddot.
1074
+ #
1075
+ # But, ruby{18..22}.y (which unconditionally expect tDOT) just
1076
+ # return "." there, since they are to be kept close to the corresponding
1077
+ # Ruby MRI grammars.
1078
+ #
1079
+ # Thankfully, we don't have to care.
1080
+ :send
1081
+ end
1082
+ end
1083
+
1084
+ def forwarded_args(dots_t)
1085
+ n(:forwarded_args, [], token_map(dots_t))
1086
+ end
1087
+
1088
+ def forwarded_restarg(star_t)
1089
+ n(:forwarded_restarg, [], token_map(star_t))
1090
+ end
1091
+
1092
+ def forwarded_kwrestarg(dstar_t)
1093
+ n(:forwarded_kwrestarg, [], token_map(dstar_t))
1094
+ end
1095
+
1096
+ def call_method(receiver, dot_t, selector_t,
1097
+ lparen_t=nil, args=[], rparen_t=nil)
1098
+ type = call_type_for_dot(dot_t)
1099
+
1100
+ if self.class.emit_kwargs
1101
+ rewrite_hash_args_to_kwargs(args)
1102
+ end
1103
+
1104
+ if selector_t.nil?
1105
+ n(type, [ receiver, :call, *args ],
1106
+ send_map(receiver, dot_t, nil, lparen_t, args, rparen_t))
1107
+ else
1108
+ n(type, [ receiver, value(selector_t).to_sym, *args ],
1109
+ send_map(receiver, dot_t, selector_t, lparen_t, args, rparen_t))
1110
+ end
1111
+ end
1112
+
1113
+ def call_lambda(lambda_t)
1114
+ if self.class.emit_lambda
1115
+ n0(:lambda, expr_map(loc(lambda_t)))
1116
+ else
1117
+ n(:send, [ nil, :lambda ],
1118
+ send_map(nil, nil, lambda_t))
1119
+ end
1120
+ end
1121
+
1122
+ def block(method_call, begin_t, args, body, end_t)
1123
+ _receiver, _selector, *call_args = *method_call
1124
+
1125
+ if method_call.type == :yield
1126
+ diagnostic :error, :block_given_to_yield, nil, method_call.loc.keyword, [loc(begin_t)]
1127
+ end
1128
+
1129
+ last_arg = call_args.last
1130
+ if last_arg && (last_arg.type == :block_pass || last_arg.type == :forwarded_args)
1131
+ diagnostic :error, :block_and_blockarg, nil, last_arg.loc.expression, [loc(begin_t)]
1132
+ end
1133
+
1134
+ if args.type == :numargs
1135
+ block_type = :numblock
1136
+ args = args.children[0]
1137
+ else
1138
+ block_type = :block
1139
+ end
1140
+
1141
+ if [:send, :csend, :index, :super, :zsuper, :lambda].include?(method_call.type)
1142
+ n(block_type, [ method_call, args, body ],
1143
+ block_map(method_call.loc.expression, begin_t, end_t))
1144
+ else
1145
+ # Code like "return foo 1 do end" is reduced in a weird sequence.
1146
+ # Here, method_call is actually (return).
1147
+ actual_send, = *method_call
1148
+ block =
1149
+ n(block_type, [ actual_send, args, body ],
1150
+ block_map(actual_send.loc.expression, begin_t, end_t))
1151
+
1152
+ n(method_call.type, [ block ],
1153
+ method_call.loc.with_expression(join_exprs(method_call, block)))
1154
+ end
1155
+ end
1156
+
1157
+ def block_pass(amper_t, arg)
1158
+ n(:block_pass, [ arg ],
1159
+ unary_op_map(amper_t, arg))
1160
+ end
1161
+
1162
+ def objc_varargs(pair, rest_of_varargs)
1163
+ value, first_vararg = *pair
1164
+ vararg_array = array(nil, [ first_vararg, *rest_of_varargs ], nil).
1165
+ updated(:objc_varargs)
1166
+ pair.updated(nil, [ value, vararg_array ],
1167
+ { :location => pair.loc.with_expression(
1168
+ pair.loc.expression.join(vararg_array.loc.expression)) })
1169
+ end
1170
+
1171
+ def attr_asgn(receiver, dot_t, selector_t)
1172
+ method_name = (value(selector_t) + '=').to_sym
1173
+ type = call_type_for_dot(dot_t)
1174
+
1175
+ # Incomplete method call.
1176
+ n(type, [ receiver, method_name ],
1177
+ send_map(receiver, dot_t, selector_t))
1178
+ end
1179
+
1180
+ def index(receiver, lbrack_t, indexes, rbrack_t)
1181
+ if self.class.emit_kwargs
1182
+ rewrite_hash_args_to_kwargs(indexes)
1183
+ end
1184
+
1185
+ if self.class.emit_index
1186
+ n(:index, [ receiver, *indexes ],
1187
+ index_map(receiver, lbrack_t, rbrack_t))
1188
+ else
1189
+ n(:send, [ receiver, :[], *indexes ],
1190
+ send_index_map(receiver, lbrack_t, rbrack_t))
1191
+ end
1192
+ end
1193
+
1194
+ def index_asgn(receiver, lbrack_t, indexes, rbrack_t)
1195
+ if self.class.emit_index
1196
+ n(:indexasgn, [ receiver, *indexes ],
1197
+ index_map(receiver, lbrack_t, rbrack_t))
1198
+ else
1199
+ # Incomplete method call.
1200
+ n(:send, [ receiver, :[]=, *indexes ],
1201
+ send_index_map(receiver, lbrack_t, rbrack_t))
1202
+ end
1203
+ end
1204
+
1205
+ def binary_op(receiver, operator_t, arg)
1206
+ source_map = send_binary_op_map(receiver, operator_t, arg)
1207
+
1208
+ if @parser.version == 18
1209
+ operator = value(operator_t)
1210
+
1211
+ if operator == '!='
1212
+ method_call = n(:send, [ receiver, :==, arg ], source_map)
1213
+ elsif operator == '!~'
1214
+ method_call = n(:send, [ receiver, :=~, arg ], source_map)
1215
+ end
1216
+
1217
+ if %w(!= !~).include?(operator)
1218
+ return n(:not, [ method_call ],
1219
+ expr_map(source_map.expression))
1220
+ end
1221
+ end
1222
+
1223
+ n(:send, [ receiver, value(operator_t).to_sym, arg ],
1224
+ source_map)
1225
+ end
1226
+
1227
+ def match_op(receiver, match_t, arg)
1228
+ source_map = send_binary_op_map(receiver, match_t, arg)
1229
+
1230
+ if (regexp = static_regexp_node(receiver))
1231
+ regexp.names.each do |name|
1232
+ @parser.static_env.declare(name)
1233
+ end
1234
+
1235
+ n(:match_with_lvasgn, [ receiver, arg ],
1236
+ source_map)
1237
+ else
1238
+ n(:send, [ receiver, :=~, arg ],
1239
+ source_map)
1240
+ end
1241
+ end
1242
+
1243
+ def unary_op(op_t, receiver)
1244
+ case value(op_t)
1245
+ when '+', '-'
1246
+ method = value(op_t) + '@'
1247
+ else
1248
+ method = value(op_t)
1249
+ end
1250
+
1251
+ n(:send, [ receiver, method.to_sym ],
1252
+ send_unary_op_map(op_t, receiver))
1253
+ end
1254
+
1255
+ def not_op(not_t, begin_t=nil, receiver=nil, end_t=nil)
1256
+ if @parser.version == 18
1257
+ n(:not, [ check_condition(receiver) ],
1258
+ unary_op_map(not_t, receiver))
1259
+ else
1260
+ if receiver.nil?
1261
+ nil_node = n0(:begin, collection_map(begin_t, nil, end_t))
1262
+
1263
+ n(:send, [
1264
+ nil_node, :'!'
1265
+ ], send_unary_op_map(not_t, nil_node))
1266
+ else
1267
+ n(:send, [ check_condition(receiver), :'!' ],
1268
+ send_map(nil, nil, not_t, begin_t, [receiver], end_t))
1269
+ end
1270
+ end
1271
+ end
1272
+
1273
+ #
1274
+ # Control flow
1275
+ #
1276
+
1277
+ # Logical operations: and, or
1278
+
1279
+ def logical_op(type, lhs, op_t, rhs)
1280
+ n(type, [ lhs, rhs ],
1281
+ binary_op_map(lhs, op_t, rhs))
1282
+ end
1283
+
1284
+ # Conditionals
1285
+
1286
+ def condition(cond_t, cond, then_t,
1287
+ if_true, else_t, if_false, end_t)
1288
+ n(:if, [ check_condition(cond), if_true, if_false ],
1289
+ condition_map(cond_t, cond, then_t, if_true, else_t, if_false, end_t))
1290
+ end
1291
+
1292
+ def condition_mod(if_true, if_false, cond_t, cond)
1293
+ n(:if, [ check_condition(cond), if_true, if_false ],
1294
+ keyword_mod_map(if_true || if_false, cond_t, cond))
1295
+ end
1296
+
1297
+ def ternary(cond, question_t, if_true, colon_t, if_false)
1298
+ n(:if, [ check_condition(cond), if_true, if_false ],
1299
+ ternary_map(cond, question_t, if_true, colon_t, if_false))
1300
+ end
1301
+
1302
+ # Case matching
1303
+
1304
+ def when(when_t, patterns, then_t, body)
1305
+ children = patterns << body
1306
+ n(:when, children,
1307
+ keyword_map(when_t, then_t, children, nil))
1308
+ end
1309
+
1310
+ def case(case_t, expr, when_bodies, else_t, else_body, end_t)
1311
+ n(:case, [ expr, *(when_bodies << else_body)],
1312
+ condition_map(case_t, expr, nil, nil, else_t, else_body, end_t))
1313
+ end
1314
+
1315
+ # Loops
1316
+
1317
+ def loop(type, keyword_t, cond, do_t, body, end_t)
1318
+ n(type, [ check_condition(cond), body ],
1319
+ keyword_map(keyword_t, do_t, nil, end_t))
1320
+ end
1321
+
1322
+ def loop_mod(type, body, keyword_t, cond)
1323
+ if body.type == :kwbegin
1324
+ type = :"#{type}_post"
1325
+ end
1326
+
1327
+ n(type, [ check_condition(cond), body ],
1328
+ keyword_mod_map(body, keyword_t, cond))
1329
+ end
1330
+
1331
+ def for(for_t, iterator, in_t, iteratee,
1332
+ do_t, body, end_t)
1333
+ n(:for, [ iterator, iteratee, body ],
1334
+ for_map(for_t, in_t, do_t, end_t))
1335
+ end
1336
+
1337
+ # Keywords
1338
+
1339
+ def keyword_cmd(type, keyword_t, lparen_t=nil, args=[], rparen_t=nil)
1340
+ if type == :yield && args.count > 0
1341
+ last_arg = args.last
1342
+ if last_arg.type == :block_pass
1343
+ diagnostic :error, :block_given_to_yield, nil, loc(keyword_t), [last_arg.loc.expression]
1344
+ end
1345
+ end
1346
+
1347
+ if %i[yield super].include?(type) && self.class.emit_kwargs
1348
+ rewrite_hash_args_to_kwargs(args)
1349
+ end
1350
+
1351
+ n(type, args,
1352
+ keyword_map(keyword_t, lparen_t, args, rparen_t))
1353
+ end
1354
+
1355
+ # BEGIN, END
1356
+
1357
+ def preexe(preexe_t, lbrace_t, compstmt, rbrace_t)
1358
+ n(:preexe, [ compstmt ],
1359
+ keyword_map(preexe_t, lbrace_t, [], rbrace_t))
1360
+ end
1361
+
1362
+ def postexe(postexe_t, lbrace_t, compstmt, rbrace_t)
1363
+ n(:postexe, [ compstmt ],
1364
+ keyword_map(postexe_t, lbrace_t, [], rbrace_t))
1365
+ end
1366
+
1367
+ # Exception handling
1368
+
1369
+ def rescue_body(rescue_t,
1370
+ exc_list, assoc_t, exc_var,
1371
+ then_t, compound_stmt)
1372
+ n(:resbody, [ exc_list, exc_var, compound_stmt ],
1373
+ rescue_body_map(rescue_t, exc_list, assoc_t,
1374
+ exc_var, then_t, compound_stmt))
1375
+ end
1376
+
1377
+ def begin_body(compound_stmt, rescue_bodies=[],
1378
+ else_t=nil, else_=nil,
1379
+ ensure_t=nil, ensure_=nil)
1380
+ if rescue_bodies.any?
1381
+ if else_t
1382
+ compound_stmt =
1383
+ n(:rescue,
1384
+ [ compound_stmt, *(rescue_bodies + [ else_ ]) ],
1385
+ eh_keyword_map(compound_stmt, nil, rescue_bodies, else_t, else_))
1386
+ else
1387
+ compound_stmt =
1388
+ n(:rescue,
1389
+ [ compound_stmt, *(rescue_bodies + [ nil ]) ],
1390
+ eh_keyword_map(compound_stmt, nil, rescue_bodies, nil, nil))
1391
+ end
1392
+ elsif else_t
1393
+ statements = []
1394
+ if !compound_stmt.nil?
1395
+ if compound_stmt.type == :begin
1396
+ statements += compound_stmt.children
1397
+ else
1398
+ statements.push(compound_stmt)
1399
+ end
1400
+ end
1401
+ statements.push(
1402
+ n(:begin, [ else_ ],
1403
+ collection_map(else_t, [ else_ ], nil)))
1404
+ compound_stmt =
1405
+ n(:begin, statements,
1406
+ collection_map(nil, statements, nil))
1407
+ end
1408
+
1409
+ if ensure_t
1410
+ compound_stmt =
1411
+ n(:ensure,
1412
+ [ compound_stmt, ensure_ ],
1413
+ eh_keyword_map(compound_stmt, ensure_t, [ ensure_ ], nil, nil))
1414
+ end
1415
+
1416
+ compound_stmt
1417
+ end
1418
+
1419
+ #
1420
+ # Expression grouping
1421
+ #
1422
+
1423
+ def compstmt(statements)
1424
+ case
1425
+ when statements.none?
1426
+ nil
1427
+ when statements.one?
1428
+ statements.first
1429
+ else
1430
+ n(:begin, statements,
1431
+ collection_map(nil, statements, nil))
1432
+ end
1433
+ end
1434
+
1435
+ def begin(begin_t, body, end_t)
1436
+ if body.nil?
1437
+ # A nil expression: `()'.
1438
+ n0(:begin,
1439
+ collection_map(begin_t, nil, end_t))
1440
+ elsif body.type == :mlhs ||
1441
+ (body.type == :begin &&
1442
+ body.loc.begin.nil? && body.loc.end.nil?)
1443
+ # Synthesized (begin) from compstmt "a; b" or (mlhs)
1444
+ # from multi_lhs "(a, b) = *foo".
1445
+ n(body.type, body.children,
1446
+ collection_map(begin_t, body.children, end_t))
1447
+ else
1448
+ n(:begin, [ body ],
1449
+ collection_map(begin_t, [ body ], end_t))
1450
+ end
1451
+ end
1452
+
1453
+ def begin_keyword(begin_t, body, end_t)
1454
+ if body.nil?
1455
+ # A nil expression: `begin end'.
1456
+ n0(:kwbegin,
1457
+ collection_map(begin_t, nil, end_t))
1458
+ elsif (body.type == :begin &&
1459
+ body.loc.begin.nil? && body.loc.end.nil?)
1460
+ # Synthesized (begin) from compstmt "a; b".
1461
+ n(:kwbegin, body.children,
1462
+ collection_map(begin_t, body.children, end_t))
1463
+ else
1464
+ n(:kwbegin, [ body ],
1465
+ collection_map(begin_t, [ body ], end_t))
1466
+ end
1467
+ end
1468
+
1469
+ #
1470
+ # PATTERN MATCHING
1471
+ #
1472
+
1473
+ def case_match(case_t, expr, in_bodies, else_t, else_body, end_t)
1474
+ else_body = n(:empty_else, nil, token_map(else_t)) if else_t && !else_body
1475
+ n(:case_match, [ expr, *(in_bodies << else_body)],
1476
+ condition_map(case_t, expr, nil, nil, else_t, else_body, end_t))
1477
+ end
1478
+
1479
+ def in_match(lhs, in_t, rhs)
1480
+ n(:in_match, [lhs, rhs],
1481
+ binary_op_map(lhs, in_t, rhs))
1482
+ end
1483
+
1484
+ def match_pattern(lhs, match_t, rhs)
1485
+ n(:match_pattern, [lhs, rhs],
1486
+ binary_op_map(lhs, match_t, rhs))
1487
+ end
1488
+
1489
+ def match_pattern_p(lhs, match_t, rhs)
1490
+ n(:match_pattern_p, [lhs, rhs],
1491
+ binary_op_map(lhs, match_t, rhs))
1492
+ end
1493
+
1494
+ def in_pattern(in_t, pattern, guard, then_t, body)
1495
+ children = [pattern, guard, body]
1496
+ n(:in_pattern, children,
1497
+ keyword_map(in_t, then_t, children.compact, nil))
1498
+ end
1499
+
1500
+ def if_guard(if_t, if_body)
1501
+ n(:if_guard, [if_body], guard_map(if_t, if_body))
1502
+ end
1503
+
1504
+ def unless_guard(unless_t, unless_body)
1505
+ n(:unless_guard, [unless_body], guard_map(unless_t, unless_body))
1506
+ end
1507
+
1508
+ def match_var(name_t)
1509
+ name = value(name_t).to_sym
1510
+ name_l = loc(name_t)
1511
+
1512
+ check_lvar_name(name, name_l)
1513
+ check_duplicate_pattern_variable(name, name_l)
1514
+ @parser.static_env.declare(name)
1515
+
1516
+ n(:match_var, [ name ],
1517
+ variable_map(name_t))
1518
+ end
1519
+
1520
+ def match_hash_var(name_t)
1521
+ name = value(name_t).to_sym
1522
+
1523
+ expr_l = loc(name_t)
1524
+ name_l = expr_l.adjust(end_pos: -1)
1525
+
1526
+ check_lvar_name(name, name_l)
1527
+ check_duplicate_pattern_variable(name, name_l)
1528
+ @parser.static_env.declare(name)
1529
+
1530
+ n(:match_var, [ name ],
1531
+ Source::Map::Variable.new(name_l, expr_l))
1532
+ end
1533
+
1534
+ def match_hash_var_from_str(begin_t, strings, end_t)
1535
+ if strings.length > 1
1536
+ diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t))
1537
+ end
1538
+
1539
+ string = strings[0]
1540
+
1541
+ case string.type
1542
+ when :str
1543
+ # MRI supports plain strings in hash pattern matching
1544
+ name, = *string
1545
+ name_l = string.loc.expression
1546
+
1547
+ check_lvar_name(name, name_l)
1548
+ check_duplicate_pattern_variable(name, name_l)
1549
+
1550
+ @parser.static_env.declare(name)
1551
+
1552
+ if (begin_l = string.loc.begin)
1553
+ # exclude beginning of the string from the location of the variable
1554
+ name_l = name_l.adjust(begin_pos: begin_l.length)
1555
+ end
1556
+
1557
+ if (end_l = string.loc.end)
1558
+ # exclude end of the string from the location of the variable
1559
+ name_l = name_l.adjust(end_pos: -end_l.length)
1560
+ end
1561
+
1562
+ expr_l = loc(begin_t).join(string.loc.expression).join(loc(end_t))
1563
+ n(:match_var, [ name.to_sym ],
1564
+ Source::Map::Variable.new(name_l, expr_l))
1565
+ when :begin
1566
+ match_hash_var_from_str(begin_t, string.children, end_t)
1567
+ else
1568
+ # we only can get here if there is an interpolation, e.g., ``in "#{ a }":`
1569
+ diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t))
1570
+ end
1571
+ end
1572
+
1573
+ def match_rest(star_t, name_t = nil)
1574
+ if name_t.nil?
1575
+ n0(:match_rest,
1576
+ unary_op_map(star_t))
1577
+ else
1578
+ name = match_var(name_t)
1579
+ n(:match_rest, [ name ],
1580
+ unary_op_map(star_t, name))
1581
+ end
1582
+ end
1583
+
1584
+ def hash_pattern(lbrace_t, kwargs, rbrace_t)
1585
+ args = check_duplicate_args(kwargs)
1586
+ n(:hash_pattern, args,
1587
+ collection_map(lbrace_t, args, rbrace_t))
1588
+ end
1589
+
1590
+ def array_pattern(lbrack_t, elements, rbrack_t)
1591
+ return n(:array_pattern, nil, collection_map(lbrack_t, [], rbrack_t)) if elements.nil?
1592
+
1593
+ trailing_comma = false
1594
+
1595
+ node_elements = elements.map do |element|
1596
+ if element.type == :match_with_trailing_comma
1597
+ trailing_comma = true
1598
+ element.children.first
1599
+ else
1600
+ trailing_comma = false
1601
+ element
1602
+ end
1603
+ end
1604
+
1605
+ node_type = trailing_comma ? :array_pattern_with_tail : :array_pattern
1606
+
1607
+ n(node_type, node_elements,
1608
+ collection_map(lbrack_t, elements, rbrack_t))
1609
+ end
1610
+
1611
+ def find_pattern(lbrack_t, elements, rbrack_t)
1612
+ n(:find_pattern, elements,
1613
+ collection_map(lbrack_t, elements, rbrack_t))
1614
+ end
1615
+
1616
+ def match_with_trailing_comma(match, comma_t)
1617
+ n(:match_with_trailing_comma, [ match ], expr_map(match.loc.expression.join(loc(comma_t))))
1618
+ end
1619
+
1620
+ def const_pattern(const, ldelim_t, pattern, rdelim_t)
1621
+ n(:const_pattern, [const, pattern],
1622
+ Source::Map::Collection.new(
1623
+ loc(ldelim_t), loc(rdelim_t),
1624
+ const.loc.expression.join(loc(rdelim_t))
1625
+ )
1626
+ )
1627
+ end
1628
+
1629
+ def pin(pin_t, var)
1630
+ n(:pin, [ var ],
1631
+ send_unary_op_map(pin_t, var))
1632
+ end
1633
+
1634
+ def match_alt(left, pipe_t, right)
1635
+ source_map = binary_op_map(left, pipe_t, right)
1636
+
1637
+ n(:match_alt, [ left, right ],
1638
+ source_map)
1639
+ end
1640
+
1641
+ def match_as(value, assoc_t, as)
1642
+ source_map = binary_op_map(value, assoc_t, as)
1643
+
1644
+ n(:match_as, [ value, as ],
1645
+ source_map)
1646
+ end
1647
+
1648
+ def match_nil_pattern(dstar_t, nil_t)
1649
+ n0(:match_nil_pattern,
1650
+ arg_prefix_map(dstar_t, nil_t))
1651
+ end
1652
+
1653
+ def match_pair(label_type, label, value)
1654
+ if label_type == :label
1655
+ check_duplicate_pattern_key(label[0], label[1])
1656
+ pair_keyword(label, value)
1657
+ else
1658
+ begin_t, parts, end_t = label
1659
+ label_loc = loc(begin_t).join(loc(end_t))
1660
+
1661
+ # quoted label like "label": value
1662
+ if (var_name = static_string(parts))
1663
+ check_duplicate_pattern_key(var_name, label_loc)
1664
+ else
1665
+ diagnostic :error, :pm_interp_in_var_name, nil, label_loc
1666
+ end
1667
+
1668
+ pair_quoted(begin_t, parts, end_t, value)
1669
+ end
1670
+ end
1671
+
1672
+ def match_label(label_type, label)
1673
+ if label_type == :label
1674
+ match_hash_var(label)
1675
+ else
1676
+ # quoted label like "label": value
1677
+ begin_t, strings, end_t = label
1678
+ match_hash_var_from_str(begin_t, strings, end_t)
1679
+ end
1680
+ end
1681
+
1682
+ private
1683
+
1684
+ #
1685
+ # VERIFICATION
1686
+ #
1687
+
1688
+ def check_condition(cond)
1689
+ case cond.type
1690
+ when :masgn
1691
+ if @parser.version <= 23
1692
+ diagnostic :error, :masgn_as_condition, nil, cond.loc.expression
1693
+ else
1694
+ cond
1695
+ end
1696
+
1697
+ when :begin
1698
+ if cond.children.count == 1
1699
+ cond.updated(nil, [
1700
+ check_condition(cond.children.last)
1701
+ ])
1702
+ else
1703
+ cond
1704
+ end
1705
+
1706
+ when :and, :or
1707
+ lhs, rhs = *cond
1708
+
1709
+ if @parser.version == 18
1710
+ cond
1711
+ else
1712
+ cond.updated(cond.type, [
1713
+ check_condition(lhs),
1714
+ check_condition(rhs)
1715
+ ])
1716
+ end
1717
+
1718
+ when :irange, :erange
1719
+ lhs, rhs = *cond
1720
+
1721
+ type = case cond.type
1722
+ when :irange then :iflipflop
1723
+ when :erange then :eflipflop
1724
+ end
1725
+
1726
+ lhs_condition = check_condition(lhs) unless lhs.nil?
1727
+ rhs_condition = check_condition(rhs) unless rhs.nil?
1728
+
1729
+ return cond.updated(type, [
1730
+ lhs_condition,
1731
+ rhs_condition
1732
+ ])
1733
+
1734
+ when :regexp
1735
+ n(:match_current_line, [ cond ], expr_map(cond.loc.expression))
1736
+
1737
+ else
1738
+ cond
1739
+ end
1740
+ end
1741
+
1742
+ def check_duplicate_args(args, map={})
1743
+ args.each do |this_arg|
1744
+ case this_arg.type
1745
+ when :arg, :optarg, :restarg, :blockarg,
1746
+ :kwarg, :kwoptarg, :kwrestarg,
1747
+ :shadowarg
1748
+
1749
+ check_duplicate_arg(this_arg, map)
1750
+
1751
+ when :procarg0
1752
+
1753
+ if this_arg.children[0].is_a?(Symbol)
1754
+ # s(:procarg0, :a)
1755
+ check_duplicate_arg(this_arg, map)
1756
+ else
1757
+ # s(:procarg0, s(:arg, :a), ...)
1758
+ check_duplicate_args(this_arg.children, map)
1759
+ end
1760
+
1761
+ when :mlhs
1762
+ check_duplicate_args(this_arg.children, map)
1763
+ end
1764
+ end
1765
+ end
1766
+
1767
+ def check_duplicate_arg(this_arg, map={})
1768
+ this_name, = *this_arg
1769
+
1770
+ that_arg = map[this_name]
1771
+ that_name, = *that_arg
1772
+
1773
+ if that_arg.nil?
1774
+ map[this_name] = this_arg
1775
+ elsif arg_name_collides?(this_name, that_name)
1776
+ diagnostic :error, :duplicate_argument, nil,
1777
+ this_arg.loc.name, [ that_arg.loc.name ]
1778
+ end
1779
+ end
1780
+
1781
+ def validate_no_forward_arg_after_restarg(args)
1782
+ restarg = nil
1783
+ forward_arg = nil
1784
+ args.each do |arg|
1785
+ case arg.type
1786
+ when :restarg then restarg = arg
1787
+ when :forward_arg then forward_arg = arg
1788
+ end
1789
+ end
1790
+
1791
+ if !forward_arg.nil? && !restarg.nil?
1792
+ diagnostic :error, :forward_arg_after_restarg, nil, forward_arg.loc.expression, [restarg.loc.expression]
1793
+ end
1794
+ end
1795
+
1796
+ def check_assignment_to_numparam(name, loc)
1797
+ # MRI < 2.7 treats numbered parameters as regular variables
1798
+ # and so it's allowed to perform assignments like `_1 = 42`.
1799
+ return if @parser.version < 27
1800
+
1801
+ assigning_to_numparam =
1802
+ @parser.context.in_dynamic_block? &&
1803
+ name =~ /\A_([1-9])\z/ &&
1804
+ @parser.max_numparam_stack.has_numparams?
1805
+
1806
+ if assigning_to_numparam
1807
+ diagnostic :error, :cant_assign_to_numparam, { :name => name }, loc
1808
+ end
1809
+ end
1810
+
1811
+ def check_reserved_for_numparam(name, loc)
1812
+ # MRI < 3.0 accepts assignemnt to variables like _1
1813
+ # if it's not a numbered parameter. MRI 3.0 and newer throws an error.
1814
+ return if @parser.version < 30
1815
+
1816
+ if name =~ /\A_([1-9])\z/
1817
+ diagnostic :error, :reserved_for_numparam, { :name => name }, loc
1818
+ end
1819
+ end
1820
+
1821
+ def arg_name_collides?(this_name, that_name)
1822
+ case @parser.version
1823
+ when 18
1824
+ this_name == that_name
1825
+ when 19
1826
+ # Ignore underscore.
1827
+ this_name != :_ &&
1828
+ this_name == that_name
1829
+ else
1830
+ # Ignore everything beginning with underscore.
1831
+ this_name && this_name[0] != '_' &&
1832
+ this_name == that_name
1833
+ end
1834
+ end
1835
+
1836
+ def check_lvar_name(name, loc)
1837
+ if name =~ /\A[[[:lower:]]_][[[:alnum:]]_]*\z/
1838
+ # OK
1839
+ else
1840
+ diagnostic :error, :lvar_name, { name: name }, loc
1841
+ end
1842
+ end
1843
+
1844
+ def check_duplicate_pattern_variable(name, loc)
1845
+ return if name.to_s.start_with?('_')
1846
+
1847
+ if @parser.pattern_variables.declared?(name)
1848
+ diagnostic :error, :duplicate_variable_name, { name: name.to_s }, loc
1849
+ end
1850
+
1851
+ @parser.pattern_variables.declare(name)
1852
+ end
1853
+
1854
+ def check_duplicate_pattern_key(name, loc)
1855
+ if @parser.pattern_hash_keys.declared?(name)
1856
+ diagnostic :error, :duplicate_pattern_key, { name: name.to_s }, loc
1857
+ end
1858
+
1859
+ @parser.pattern_hash_keys.declare(name)
1860
+ end
1861
+
1862
+ #
1863
+ # SOURCE MAPS
1864
+ #
1865
+
1866
+ def n(type, children, source_map)
1867
+ AST::Node.new(type, children, :location => source_map)
1868
+ end
1869
+
1870
+ def n0(type, source_map)
1871
+ n(type, [], source_map)
1872
+ end
1873
+
1874
+ def join_exprs(left_expr, right_expr)
1875
+ left_expr.loc.expression.
1876
+ join(right_expr.loc.expression)
1877
+ end
1878
+
1879
+ def token_map(token)
1880
+ Source::Map.new(loc(token))
1881
+ end
1882
+
1883
+ def delimited_string_map(string_t)
1884
+ str_range = loc(string_t)
1885
+
1886
+ begin_l = str_range.with(end_pos: str_range.begin_pos + 1)
1887
+
1888
+ end_l = str_range.with(begin_pos: str_range.end_pos - 1)
1889
+
1890
+ Source::Map::Collection.new(begin_l, end_l,
1891
+ loc(string_t))
1892
+ end
1893
+
1894
+ def prefix_string_map(symbol)
1895
+ str_range = loc(symbol)
1896
+
1897
+ begin_l = str_range.with(end_pos: str_range.begin_pos + 1)
1898
+
1899
+ Source::Map::Collection.new(begin_l, nil,
1900
+ loc(symbol))
1901
+ end
1902
+
1903
+ def unquoted_map(token)
1904
+ Source::Map::Collection.new(nil, nil,
1905
+ loc(token))
1906
+ end
1907
+
1908
+ def pair_keyword_map(key_t, value_e)
1909
+ key_range = loc(key_t)
1910
+
1911
+ key_l = key_range.adjust(end_pos: -1)
1912
+
1913
+ colon_l = key_range.with(begin_pos: key_range.end_pos - 1)
1914
+
1915
+ [ # key map
1916
+ Source::Map::Collection.new(nil, nil,
1917
+ key_l),
1918
+ # pair map
1919
+ Source::Map::Operator.new(colon_l,
1920
+ key_range.join(value_e.loc.expression)) ]
1921
+ end
1922
+
1923
+ def pair_quoted_map(begin_t, end_t, value_e)
1924
+ end_l = loc(end_t)
1925
+
1926
+ quote_l = end_l.with(begin_pos: end_l.end_pos - 2,
1927
+ end_pos: end_l.end_pos - 1)
1928
+
1929
+ colon_l = end_l.with(begin_pos: end_l.end_pos - 1)
1930
+
1931
+ [ # modified end token
1932
+ [ value(end_t), quote_l ],
1933
+ # pair map
1934
+ Source::Map::Operator.new(colon_l,
1935
+ loc(begin_t).join(value_e.loc.expression)) ]
1936
+ end
1937
+
1938
+ def expr_map(loc)
1939
+ Source::Map.new(loc)
1940
+ end
1941
+
1942
+ def collection_map(begin_t, parts, end_t)
1943
+ if begin_t.nil? || end_t.nil?
1944
+ if parts.any?
1945
+ expr_l = join_exprs(parts.first, parts.last)
1946
+ elsif !begin_t.nil?
1947
+ expr_l = loc(begin_t)
1948
+ elsif !end_t.nil?
1949
+ expr_l = loc(end_t)
1950
+ end
1951
+ else
1952
+ expr_l = loc(begin_t).join(loc(end_t))
1953
+ end
1954
+
1955
+ Source::Map::Collection.new(loc(begin_t), loc(end_t), expr_l)
1956
+ end
1957
+
1958
+ def string_map(begin_t, parts, end_t)
1959
+ if begin_t && value(begin_t).start_with?('<<')
1960
+ if parts.any?
1961
+ expr_l = join_exprs(parts.first, parts.last)
1962
+ else
1963
+ expr_l = loc(end_t).begin
1964
+ end
1965
+
1966
+ Source::Map::Heredoc.new(loc(begin_t), expr_l, loc(end_t))
1967
+ else
1968
+ collection_map(begin_t, parts, end_t)
1969
+ end
1970
+ end
1971
+
1972
+ def regexp_map(begin_t, end_t, options_e)
1973
+ Source::Map::Collection.new(loc(begin_t), loc(end_t),
1974
+ loc(begin_t).join(options_e.loc.expression))
1975
+ end
1976
+
1977
+ def constant_map(scope, colon2_t, name_t)
1978
+ if scope.nil?
1979
+ expr_l = loc(name_t)
1980
+ else
1981
+ expr_l = scope.loc.expression.join(loc(name_t))
1982
+ end
1983
+
1984
+ Source::Map::Constant.new(loc(colon2_t), loc(name_t), expr_l)
1985
+ end
1986
+
1987
+ def variable_map(name_t)
1988
+ Source::Map::Variable.new(loc(name_t))
1989
+ end
1990
+
1991
+ def binary_op_map(left_e, op_t, right_e)
1992
+ Source::Map::Operator.new(loc(op_t), join_exprs(left_e, right_e))
1993
+ end
1994
+
1995
+ def unary_op_map(op_t, arg_e=nil)
1996
+ if arg_e.nil?
1997
+ expr_l = loc(op_t)
1998
+ else
1999
+ expr_l = loc(op_t).join(arg_e.loc.expression)
2000
+ end
2001
+
2002
+ Source::Map::Operator.new(loc(op_t), expr_l)
2003
+ end
2004
+
2005
+ def range_map(start_e, op_t, end_e)
2006
+ if start_e && end_e
2007
+ expr_l = join_exprs(start_e, end_e)
2008
+ elsif start_e
2009
+ expr_l = start_e.loc.expression.join(loc(op_t))
2010
+ elsif end_e
2011
+ expr_l = loc(op_t).join(end_e.loc.expression)
2012
+ end
2013
+
2014
+ Source::Map::Operator.new(loc(op_t), expr_l)
2015
+ end
2016
+
2017
+ def arg_prefix_map(op_t, name_t=nil)
2018
+ if name_t.nil?
2019
+ expr_l = loc(op_t)
2020
+ else
2021
+ expr_l = loc(op_t).join(loc(name_t))
2022
+ end
2023
+
2024
+ Source::Map::Variable.new(loc(name_t), expr_l)
2025
+ end
2026
+
2027
+ def kwarg_map(name_t, value_e=nil)
2028
+ label_range = loc(name_t)
2029
+ name_range = label_range.adjust(end_pos: -1)
2030
+
2031
+ if value_e
2032
+ expr_l = loc(name_t).join(value_e.loc.expression)
2033
+ else
2034
+ expr_l = loc(name_t)
2035
+ end
2036
+
2037
+ Source::Map::Variable.new(name_range, expr_l)
2038
+ end
2039
+
2040
+ def module_definition_map(keyword_t, name_e, operator_t, end_t)
2041
+ if name_e
2042
+ name_l = name_e.loc.expression
2043
+ end
2044
+
2045
+ Source::Map::Definition.new(loc(keyword_t),
2046
+ loc(operator_t), name_l,
2047
+ loc(end_t))
2048
+ end
2049
+
2050
+ def definition_map(keyword_t, operator_t, name_t, end_t)
2051
+ Source::Map::MethodDefinition.new(loc(keyword_t),
2052
+ loc(operator_t), loc(name_t),
2053
+ loc(end_t), nil, nil)
2054
+ end
2055
+
2056
+ def endless_definition_map(keyword_t, operator_t, name_t, assignment_t, body_e)
2057
+ body_l = body_e.loc.expression
2058
+
2059
+ Source::Map::MethodDefinition.new(loc(keyword_t),
2060
+ loc(operator_t), loc(name_t), nil,
2061
+ loc(assignment_t), body_l)
2062
+ end
2063
+
2064
+ def send_map(receiver_e, dot_t, selector_t, begin_t=nil, args=[], end_t=nil)
2065
+ if receiver_e
2066
+ begin_l = receiver_e.loc.expression
2067
+ elsif selector_t
2068
+ begin_l = loc(selector_t)
2069
+ end
2070
+
2071
+ if end_t
2072
+ end_l = loc(end_t)
2073
+ elsif args.any?
2074
+ end_l = args.last.loc.expression
2075
+ elsif selector_t
2076
+ end_l = loc(selector_t)
2077
+ end
2078
+
2079
+ Source::Map::Send.new(loc(dot_t), loc(selector_t),
2080
+ loc(begin_t), loc(end_t),
2081
+ begin_l.join(end_l))
2082
+ end
2083
+
2084
+ def var_send_map(variable_e)
2085
+ Source::Map::Send.new(nil, variable_e.loc.expression,
2086
+ nil, nil,
2087
+ variable_e.loc.expression)
2088
+ end
2089
+
2090
+ def send_binary_op_map(lhs_e, selector_t, rhs_e)
2091
+ Source::Map::Send.new(nil, loc(selector_t),
2092
+ nil, nil,
2093
+ join_exprs(lhs_e, rhs_e))
2094
+ end
2095
+
2096
+ def send_unary_op_map(selector_t, arg_e)
2097
+ if arg_e.nil?
2098
+ expr_l = loc(selector_t)
2099
+ else
2100
+ expr_l = loc(selector_t).join(arg_e.loc.expression)
2101
+ end
2102
+
2103
+ Source::Map::Send.new(nil, loc(selector_t),
2104
+ nil, nil,
2105
+ expr_l)
2106
+ end
2107
+
2108
+ def index_map(receiver_e, lbrack_t, rbrack_t)
2109
+ Source::Map::Index.new(loc(lbrack_t), loc(rbrack_t),
2110
+ receiver_e.loc.expression.join(loc(rbrack_t)))
2111
+ end
2112
+
2113
+ def send_index_map(receiver_e, lbrack_t, rbrack_t)
2114
+ Source::Map::Send.new(nil, loc(lbrack_t).join(loc(rbrack_t)),
2115
+ nil, nil,
2116
+ receiver_e.loc.expression.join(loc(rbrack_t)))
2117
+ end
2118
+
2119
+ def block_map(receiver_l, begin_t, end_t)
2120
+ Source::Map::Collection.new(loc(begin_t), loc(end_t),
2121
+ receiver_l.join(loc(end_t)))
2122
+ end
2123
+
2124
+ def keyword_map(keyword_t, begin_t, args, end_t)
2125
+ args ||= []
2126
+
2127
+ if end_t
2128
+ end_l = loc(end_t)
2129
+ elsif args.any? && !args.last.nil?
2130
+ end_l = args.last.loc.expression
2131
+ elsif args.any? && args.count > 1
2132
+ end_l = args[-2].loc.expression
2133
+ else
2134
+ end_l = loc(keyword_t)
2135
+ end
2136
+
2137
+ Source::Map::Keyword.new(loc(keyword_t), loc(begin_t), loc(end_t),
2138
+ loc(keyword_t).join(end_l))
2139
+ end
2140
+
2141
+ def keyword_mod_map(pre_e, keyword_t, post_e)
2142
+ Source::Map::Keyword.new(loc(keyword_t), nil, nil,
2143
+ join_exprs(pre_e, post_e))
2144
+ end
2145
+
2146
+ def condition_map(keyword_t, cond_e, begin_t, body_e, else_t, else_e, end_t)
2147
+ if end_t
2148
+ end_l = loc(end_t)
2149
+ elsif else_e && else_e.loc.expression
2150
+ end_l = else_e.loc.expression
2151
+ elsif loc(else_t)
2152
+ end_l = loc(else_t)
2153
+ elsif body_e && body_e.loc.expression
2154
+ end_l = body_e.loc.expression
2155
+ elsif loc(begin_t)
2156
+ end_l = loc(begin_t)
2157
+ else
2158
+ end_l = cond_e.loc.expression
2159
+ end
2160
+
2161
+ Source::Map::Condition.new(loc(keyword_t),
2162
+ loc(begin_t), loc(else_t), loc(end_t),
2163
+ loc(keyword_t).join(end_l))
2164
+ end
2165
+
2166
+ def ternary_map(begin_e, question_t, mid_e, colon_t, end_e)
2167
+ Source::Map::Ternary.new(loc(question_t), loc(colon_t),
2168
+ join_exprs(begin_e, end_e))
2169
+ end
2170
+
2171
+ def for_map(keyword_t, in_t, begin_t, end_t)
2172
+ Source::Map::For.new(loc(keyword_t), loc(in_t),
2173
+ loc(begin_t), loc(end_t),
2174
+ loc(keyword_t).join(loc(end_t)))
2175
+ end
2176
+
2177
+ def rescue_body_map(keyword_t, exc_list_e, assoc_t,
2178
+ exc_var_e, then_t,
2179
+ compstmt_e)
2180
+ end_l = compstmt_e.loc.expression if compstmt_e
2181
+ end_l = loc(then_t) if end_l.nil? && then_t
2182
+ end_l = exc_var_e.loc.expression if end_l.nil? && exc_var_e
2183
+ end_l = exc_list_e.loc.expression if end_l.nil? && exc_list_e
2184
+ end_l = loc(keyword_t) if end_l.nil?
2185
+
2186
+ Source::Map::RescueBody.new(loc(keyword_t), loc(assoc_t), loc(then_t),
2187
+ loc(keyword_t).join(end_l))
2188
+ end
2189
+
2190
+ def eh_keyword_map(compstmt_e, keyword_t, body_es,
2191
+ else_t, else_e)
2192
+ if compstmt_e.nil?
2193
+ if keyword_t.nil?
2194
+ begin_l = body_es.first.loc.expression
2195
+ else
2196
+ begin_l = loc(keyword_t)
2197
+ end
2198
+ else
2199
+ begin_l = compstmt_e.loc.expression
2200
+ end
2201
+
2202
+ if else_t
2203
+ if else_e.nil?
2204
+ end_l = loc(else_t)
2205
+ else
2206
+ end_l = else_e.loc.expression
2207
+ end
2208
+ elsif !body_es.last.nil?
2209
+ end_l = body_es.last.loc.expression
2210
+ else
2211
+ end_l = loc(keyword_t)
2212
+ end
2213
+
2214
+ Source::Map::Condition.new(loc(keyword_t), nil, loc(else_t), nil,
2215
+ begin_l.join(end_l))
2216
+ end
2217
+
2218
+ def guard_map(keyword_t, guard_body_e)
2219
+ keyword_l = loc(keyword_t)
2220
+ guard_body_l = guard_body_e.loc.expression
2221
+
2222
+ Source::Map::Keyword.new(keyword_l, nil, nil, keyword_l.join(guard_body_l))
2223
+ end
2224
+
2225
+ #
2226
+ # HELPERS
2227
+ #
2228
+
2229
+ # Extract a static string from e.g. a regular expression,
2230
+ # honoring the fact that MRI expands interpolations like #{""}
2231
+ # at parse time.
2232
+ def static_string(nodes)
2233
+ nodes.map do |node|
2234
+ case node.type
2235
+ when :str
2236
+ node.children[0]
2237
+ when :begin
2238
+ if (string = static_string(node.children))
2239
+ string
2240
+ else
2241
+ return nil
2242
+ end
2243
+ else
2244
+ return nil
2245
+ end
2246
+ end.join
2247
+ end
2248
+
2249
+ def static_regexp(parts, options)
2250
+ source = static_string(parts)
2251
+ return nil if source.nil?
2252
+
2253
+ source = case
2254
+ when options.children.include?(:u)
2255
+ source.encode(Encoding::UTF_8)
2256
+ when options.children.include?(:e)
2257
+ source.encode(Encoding::EUC_JP)
2258
+ when options.children.include?(:s)
2259
+ source.encode(Encoding::WINDOWS_31J)
2260
+ when options.children.include?(:n)
2261
+ source.encode(Encoding::BINARY)
2262
+ else
2263
+ source
2264
+ end
2265
+
2266
+ Regexp.new(source, (Regexp::EXTENDED if options.children.include?(:x)))
2267
+ end
2268
+
2269
+ def static_regexp_node(node)
2270
+ if node.type == :regexp
2271
+ if @parser.version >= 33 && node.children[0..-2].any? { |child| child.type != :str }
2272
+ return nil
2273
+ end
2274
+
2275
+ parts, options = node.children[0..-2], node.children[-1]
2276
+ static_regexp(parts, options)
2277
+ end
2278
+ end
2279
+
2280
+ def collapse_string_parts?(parts)
2281
+ parts.one? &&
2282
+ [:str, :dstr].include?(parts.first.type)
2283
+ end
2284
+
2285
+ def value(token)
2286
+ token[0]
2287
+ end
2288
+
2289
+ def string_value(token)
2290
+ unless token[0].valid_encoding?
2291
+ diagnostic(:error, :invalid_encoding, nil, token[1])
2292
+ end
2293
+
2294
+ token[0]
2295
+ end
2296
+
2297
+ def loc(token)
2298
+ # Pass through `nil`s and return nil for tNL.
2299
+ token[1] if token && token[0]
2300
+ end
2301
+
2302
+ def diagnostic(type, reason, arguments, location, highlights=[])
2303
+ @parser.diagnostics.process(
2304
+ Diagnostic.new(type, reason, arguments, location, highlights))
2305
+
2306
+ if type == :error
2307
+ @parser.send :yyerror
2308
+ end
2309
+ end
2310
+
2311
+ def validate_definee(definee)
2312
+ case definee.type
2313
+ when :int, :str, :dstr, :sym, :dsym,
2314
+ :regexp, :array, :hash
2315
+
2316
+ diagnostic :error, :singleton_literal, nil, definee.loc.expression
2317
+ false
2318
+ else
2319
+ true
2320
+ end
2321
+ end
2322
+
2323
+ def rewrite_hash_args_to_kwargs(args)
2324
+ if args.any? && kwargs?(args.last)
2325
+ # foo(..., bar: baz)
2326
+ args[args.length - 1] = args[args.length - 1].updated(:kwargs)
2327
+ elsif args.length > 1 && args.last.type == :block_pass && kwargs?(args[args.length - 2])
2328
+ # foo(..., bar: baz, &blk)
2329
+ args[args.length - 2] = args[args.length - 2].updated(:kwargs)
2330
+ end
2331
+ end
2332
+
2333
+ def kwargs?(node)
2334
+ node.type == :hash && node.loc.begin.nil? && node.loc.end.nil?
2335
+ end
2336
+ end
2337
+
2338
+ end