zuora_connect_ui 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (449) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/zuora_connect_ui.js +1 -0
  3. data/app/assets/javascripts/zuora_connect_ui/util.js +51 -0
  4. data/app/assets/stylesheets/_zuora_connect_ui.scss +4 -6
  5. data/app/assets/stylesheets/zuora_connect_ui/datatables.scss +3 -3
  6. data/app/helpers/zuora_connect_ui/application_helper.rb +28 -4
  7. data/app/views/partials/_table.html.erb +16 -7
  8. data/lib/zuora_connect_ui/version.rb +1 -1
  9. data/vendor/ruby/2.6.0/cache/autoprefixer-rails-9.6.1.1.gem +0 -0
  10. data/vendor/ruby/2.6.0/cache/parser-2.6.4.1.gem +0 -0
  11. data/vendor/ruby/2.6.0/cache/sassc-2.2.0.gem +0 -0
  12. data/vendor/ruby/2.6.0/cache/zeitwerk-2.1.10.gem +0 -0
  13. data/vendor/ruby/2.6.0/extensions/x86_64-linux/2.6.0/sassc-2.2.0/gem.build_complete +0 -0
  14. data/vendor/ruby/2.6.0/extensions/x86_64-linux/2.6.0/sassc-2.2.0/gem_make.out +75 -0
  15. data/vendor/ruby/2.6.0/extensions/x86_64-linux/2.6.0/sassc-2.2.0/sassc/libsass.so +0 -0
  16. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/CHANGELOG.md +1085 -0
  17. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/Gemfile +10 -0
  18. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/LICENSE +20 -0
  19. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/README.md +237 -0
  20. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/Rakefile +53 -0
  21. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/autoprefixer-rails.gemspec +32 -0
  22. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails.rb +41 -0
  23. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails/processor.rb +194 -0
  24. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails/railtie.rb +50 -0
  25. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails/result.rb +24 -0
  26. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails/sprockets.rb +62 -0
  27. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/autoprefixer-rails/version.rb +3 -0
  28. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/lib/rake/autoprefixer_tasks.rb +28 -0
  29. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/Rakefile +2 -0
  30. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/config/manifest.js +0 -0
  31. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/stylesheets/evaluate.css.erb +1 -0
  32. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/stylesheets/loaded.sass +2 -0
  33. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/stylesheets/sass.sass +1 -0
  34. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/stylesheets/test.css +3 -0
  35. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/assets/stylesheets/wrong.css +2 -0
  36. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/controllers/application_controller.rb +2 -0
  37. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/app/controllers/css_controller.rb +6 -0
  38. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config.ru +2 -0
  39. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/application.rb +16 -0
  40. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/autoprefixer.yml +2 -0
  41. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/boot.rb +2 -0
  42. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/environment.rb +3 -0
  43. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/environments/test.rb +9 -0
  44. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/initializers/secret_token.rb +1 -0
  45. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/app/config/routes.rb +3 -0
  46. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/autoprefixer_spec.rb +121 -0
  47. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/processor_spec.rb +25 -0
  48. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/rails_spec.rb +40 -0
  49. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/railtie_spec.rb +29 -0
  50. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/spec/spec_helper.rb +16 -0
  51. data/vendor/ruby/2.6.0/gems/autoprefixer-rails-9.6.1.1/vendor/autoprefixer.js +67195 -0
  52. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/CHANGELOG.md +909 -0
  53. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/CONTRIBUTING.md +17 -0
  54. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/Gemfile +10 -0
  55. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/LICENSE.txt +25 -0
  56. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/README.md +301 -0
  57. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/Rakefile +166 -0
  58. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/bin/ruby-parse +7 -0
  59. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/bin/ruby-rewrite +7 -0
  60. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/ci/run_rubocop_specs +14 -0
  61. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/doc/AST_FORMAT.md +1816 -0
  62. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/doc/CUSTOMIZATION.md +37 -0
  63. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/doc/INTERNALS.md +21 -0
  64. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/doc/css/common.css +68 -0
  65. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/gauntlet_parser.rb +123 -0
  66. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser.rb +82 -0
  67. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/all.rb +12 -0
  68. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ast/node.rb +40 -0
  69. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ast/processor.rb +264 -0
  70. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/base.rb +270 -0
  71. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/builders/default.rb +1741 -0
  72. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/clobbering_error.rb +13 -0
  73. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/color.rb +32 -0
  74. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/context.rb +59 -0
  75. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/current.rb +92 -0
  76. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/deprecation.rb +13 -0
  77. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/diagnostic.rb +163 -0
  78. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/diagnostic/engine.rb +105 -0
  79. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer.rb +23546 -0
  80. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer.rl +2503 -0
  81. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer/dedenter.rb +79 -0
  82. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer/explanation.rb +55 -0
  83. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer/literal.rb +269 -0
  84. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer/max_numparam_stack.rb +42 -0
  85. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/lexer/stack_state.rb +49 -0
  86. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/macruby.rb +6124 -0
  87. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/macruby.y +2198 -0
  88. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/messages.rb +90 -0
  89. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/meta.rb +33 -0
  90. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/rewriter.rb +105 -0
  91. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby18.rb +5661 -0
  92. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby18.y +1934 -0
  93. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby19.rb +6084 -0
  94. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby19.y +2175 -0
  95. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby20.rb +6511 -0
  96. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby20.y +2353 -0
  97. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby21.rb +6570 -0
  98. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby21.y +2357 -0
  99. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby22.rb +6605 -0
  100. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby22.y +2364 -0
  101. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby23.rb +6624 -0
  102. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby23.y +2370 -0
  103. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby24.rb +6689 -0
  104. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby24.y +2408 -0
  105. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby25.rb +6656 -0
  106. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby25.y +2405 -0
  107. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby26.rb +6670 -0
  108. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby26.y +2413 -0
  109. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby27.rb +6893 -0
  110. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/ruby27.y +2470 -0
  111. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/rubymotion.rb +6078 -0
  112. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/rubymotion.y +2182 -0
  113. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/runner.rb +253 -0
  114. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/runner/ruby_parse.rb +157 -0
  115. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/runner/ruby_rewrite.rb +101 -0
  116. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/buffer.rb +330 -0
  117. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/comment.rb +121 -0
  118. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/comment/associator.rb +210 -0
  119. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map.rb +186 -0
  120. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/collection.rb +18 -0
  121. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/condition.rb +21 -0
  122. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/constant.rb +32 -0
  123. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/definition.rb +23 -0
  124. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/for.rb +19 -0
  125. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/heredoc.rb +19 -0
  126. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/index.rb +33 -0
  127. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/keyword.rb +20 -0
  128. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/objc_kwarg.rb +19 -0
  129. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/operator.rb +17 -0
  130. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/rescue_body.rb +21 -0
  131. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/send.rb +36 -0
  132. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/ternary.rb +18 -0
  133. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/map/variable.rb +31 -0
  134. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/range.rb +310 -0
  135. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/rewriter.rb +513 -0
  136. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/rewriter/action.rb +44 -0
  137. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/tree_rewriter.rb +301 -0
  138. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/source/tree_rewriter/action.rb +133 -0
  139. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/static_environment.rb +46 -0
  140. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/syntax_error.rb +21 -0
  141. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/tree_rewriter.rb +134 -0
  142. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/lib/parser/version.rb +5 -0
  143. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/parser.gemspec +51 -0
  144. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/bug_163/fixtures/input.rb +5 -0
  145. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/bug_163/fixtures/output.rb +5 -0
  146. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/bug_163/rewriter.rb +20 -0
  147. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/helper.rb +59 -0
  148. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/parse_helper.rb +316 -0
  149. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/racc_coverage_helper.rb +133 -0
  150. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_base.rb +31 -0
  151. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_current.rb +29 -0
  152. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_diagnostic.rb +96 -0
  153. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_diagnostic_engine.rb +62 -0
  154. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_encoding.rb +99 -0
  155. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_lexer.rb +3659 -0
  156. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_lexer_stack_state.rb +78 -0
  157. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_parse_helper.rb +80 -0
  158. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_parser.rb +7579 -0
  159. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_runner_parse.rb +35 -0
  160. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_runner_rewrite.rb +47 -0
  161. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_buffer.rb +162 -0
  162. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_comment.rb +36 -0
  163. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_comment_associator.rb +367 -0
  164. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_map.rb +15 -0
  165. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_range.rb +172 -0
  166. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_rewriter.rb +541 -0
  167. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_rewriter_action.rb +46 -0
  168. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_source_tree_rewriter.rb +173 -0
  169. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/test_static_environment.rb +45 -0
  170. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/using_tree_rewriter/fixtures/input.rb +3 -0
  171. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/using_tree_rewriter/fixtures/output.rb +3 -0
  172. data/vendor/ruby/2.6.0/gems/parser-2.6.4.1/test/using_tree_rewriter/using_tree_rewriter.rb +9 -0
  173. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/CHANGELOG.md +77 -0
  174. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/CODE_OF_CONDUCT.md +10 -0
  175. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/Gemfile +2 -0
  176. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/LICENSE.txt +22 -0
  177. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/README.md +68 -0
  178. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/Rakefile +53 -0
  179. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/Makefile +271 -0
  180. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/SharedPtr.o +0 -0
  181. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast.o +0 -0
  182. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast2c.o +0 -0
  183. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_fwd_decl.o +0 -0
  184. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_sel_cmp.o +0 -0
  185. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_sel_unify.o +0 -0
  186. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_selectors.o +0 -0
  187. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_supports.o +0 -0
  188. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/ast_values.o +0 -0
  189. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/backtrace.o +0 -0
  190. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/base64vlq.o +0 -0
  191. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/bind.o +0 -0
  192. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/c2ast.o +0 -0
  193. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/c99func.o +0 -0
  194. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/cencode.o +0 -0
  195. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/check_nesting.o +0 -0
  196. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/color_maps.o +0 -0
  197. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/constants.o +0 -0
  198. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/context.o +0 -0
  199. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/cssize.o +0 -0
  200. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/depend +4 -0
  201. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/emitter.o +0 -0
  202. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/environment.o +0 -0
  203. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/error_handling.o +0 -0
  204. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/eval.o +0 -0
  205. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/expand.o +0 -0
  206. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/extconf.rb +84 -0
  207. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/extend.o +0 -0
  208. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/file.o +0 -0
  209. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_colors.o +0 -0
  210. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_lists.o +0 -0
  211. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_maps.o +0 -0
  212. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_miscs.o +0 -0
  213. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_numbers.o +0 -0
  214. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_selectors.o +0 -0
  215. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_strings.o +0 -0
  216. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/fn_utils.o +0 -0
  217. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/inspect.o +0 -0
  218. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/json.o +0 -0
  219. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/lexer.o +0 -0
  220. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass.so +0 -0
  221. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/VERSION +1 -0
  222. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/contrib/plugin.cpp +60 -0
  223. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass.h +15 -0
  224. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass/base.h +96 -0
  225. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass/context.h +170 -0
  226. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass/functions.h +139 -0
  227. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass/values.h +145 -0
  228. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass/version.h +12 -0
  229. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/include/sass2scss.h +120 -0
  230. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast.cpp +963 -0
  231. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast.hpp +905 -0
  232. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast2c.cpp +80 -0
  233. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast2c.hpp +39 -0
  234. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_def_macros.hpp +132 -0
  235. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_fwd_decl.cpp +30 -0
  236. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_fwd_decl.hpp +341 -0
  237. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_sel_cmp.cpp +909 -0
  238. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_sel_unify.cpp +280 -0
  239. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_selectors.cpp +1475 -0
  240. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_selectors.hpp +568 -0
  241. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_supports.cpp +130 -0
  242. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_supports.hpp +121 -0
  243. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_values.cpp +967 -0
  244. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/ast_values.hpp +489 -0
  245. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/b64/cencode.h +32 -0
  246. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/b64/encode.h +79 -0
  247. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/backtrace.cpp +50 -0
  248. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/backtrace.hpp +29 -0
  249. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/base64vlq.cpp +47 -0
  250. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/base64vlq.hpp +30 -0
  251. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/bind.cpp +312 -0
  252. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/bind.hpp +15 -0
  253. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/c2ast.cpp +64 -0
  254. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/c2ast.hpp +14 -0
  255. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/c99func.c +54 -0
  256. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/cencode.c +108 -0
  257. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/check_nesting.cpp +394 -0
  258. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/check_nesting.hpp +66 -0
  259. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/color_maps.cpp +651 -0
  260. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/color_maps.hpp +331 -0
  261. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/constants.cpp +194 -0
  262. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/constants.hpp +194 -0
  263. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/context.cpp +890 -0
  264. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/context.hpp +152 -0
  265. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/cssize.cpp +604 -0
  266. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/cssize.hpp +77 -0
  267. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/debug.hpp +43 -0
  268. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/debugger.hpp +807 -0
  269. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/emitter.cpp +298 -0
  270. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/emitter.hpp +103 -0
  271. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/environment.cpp +260 -0
  272. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/environment.hpp +119 -0
  273. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/error_handling.cpp +212 -0
  274. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/error_handling.hpp +229 -0
  275. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/eval.cpp +1657 -0
  276. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/eval.hpp +112 -0
  277. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/expand.cpp +822 -0
  278. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/expand.hpp +78 -0
  279. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/extend.cpp +2132 -0
  280. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/extend.hpp +86 -0
  281. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/file.cpp +522 -0
  282. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/file.hpp +133 -0
  283. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_colors.cpp +594 -0
  284. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_colors.hpp +85 -0
  285. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_lists.cpp +284 -0
  286. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_lists.hpp +34 -0
  287. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_maps.cpp +94 -0
  288. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_maps.hpp +30 -0
  289. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_miscs.cpp +256 -0
  290. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_miscs.hpp +40 -0
  291. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_numbers.cpp +220 -0
  292. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_numbers.hpp +45 -0
  293. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_selectors.cpp +235 -0
  294. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_selectors.hpp +35 -0
  295. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_strings.cpp +254 -0
  296. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_strings.hpp +34 -0
  297. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_utils.cpp +156 -0
  298. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/fn_utils.hpp +56 -0
  299. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/inspect.cpp +1087 -0
  300. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/inspect.hpp +99 -0
  301. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/json.cpp +1436 -0
  302. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/json.hpp +117 -0
  303. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  304. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/lexer.cpp +184 -0
  305. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/lexer.hpp +315 -0
  306. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/listize.cpp +84 -0
  307. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/listize.hpp +38 -0
  308. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/mapping.hpp +18 -0
  309. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/memory/SharedPtr.cpp +33 -0
  310. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/memory/SharedPtr.hpp +286 -0
  311. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/node.cpp +322 -0
  312. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/node.hpp +118 -0
  313. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/operation.hpp +213 -0
  314. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/operators.cpp +266 -0
  315. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/operators.hpp +30 -0
  316. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/output.cpp +339 -0
  317. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/output.hpp +47 -0
  318. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/parser.cpp +3153 -0
  319. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/parser.hpp +402 -0
  320. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/paths.hpp +71 -0
  321. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/plugins.cpp +188 -0
  322. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/plugins.hpp +57 -0
  323. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/position.cpp +184 -0
  324. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/position.hpp +124 -0
  325. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/prelexer.cpp +1780 -0
  326. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/prelexer.hpp +484 -0
  327. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/remove_placeholders.cpp +87 -0
  328. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/remove_placeholders.hpp +34 -0
  329. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass.cpp +155 -0
  330. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass.hpp +142 -0
  331. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass2scss.cpp +895 -0
  332. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_context.cpp +772 -0
  333. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_context.hpp +129 -0
  334. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_functions.cpp +210 -0
  335. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_functions.hpp +50 -0
  336. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_util.cpp +152 -0
  337. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_util.hpp +256 -0
  338. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_values.cpp +365 -0
  339. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/sass_values.hpp +82 -0
  340. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/source_map.cpp +198 -0
  341. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/source_map.hpp +62 -0
  342. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/subset_map.cpp +58 -0
  343. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/subset_map.hpp +76 -0
  344. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/to_value.cpp +114 -0
  345. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/to_value.hpp +46 -0
  346. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/units.cpp +505 -0
  347. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/units.hpp +110 -0
  348. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8.h +34 -0
  349. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8/checked.h +336 -0
  350. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8/core.h +332 -0
  351. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8/unchecked.h +235 -0
  352. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8_string.cpp +105 -0
  353. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/utf8_string.hpp +37 -0
  354. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/util.cpp +725 -0
  355. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/util.hpp +106 -0
  356. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/util_string.cpp +75 -0
  357. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/util_string.hpp +19 -0
  358. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/values.cpp +140 -0
  359. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/libsass/src/values.hpp +12 -0
  360. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/listize.o +0 -0
  361. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/node.o +0 -0
  362. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/operators.o +0 -0
  363. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/output.o +0 -0
  364. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/parser.o +0 -0
  365. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/plugins.o +0 -0
  366. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/position.o +0 -0
  367. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/prelexer.o +0 -0
  368. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/remove_placeholders.o +0 -0
  369. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass.o +0 -0
  370. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass2scss.o +0 -0
  371. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass_context.o +0 -0
  372. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass_functions.o +0 -0
  373. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass_util.o +0 -0
  374. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/sass_values.o +0 -0
  375. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/source_map.o +0 -0
  376. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/subset_map.o +0 -0
  377. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/to_value.o +0 -0
  378. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/units.o +0 -0
  379. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/utf8_string.o +0 -0
  380. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/util.o +0 -0
  381. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/util_string.o +0 -0
  382. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/ext/values.o +0 -0
  383. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc.rb +57 -0
  384. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/dependency.rb +17 -0
  385. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/engine.rb +139 -0
  386. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/error.rb +37 -0
  387. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/functions_handler.rb +73 -0
  388. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/import_handler.rb +50 -0
  389. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/importer.rb +31 -0
  390. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/libsass.so +0 -0
  391. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native.rb +62 -0
  392. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/lib_c.rb +21 -0
  393. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/native_context_api.rb +147 -0
  394. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/native_functions_api.rb +159 -0
  395. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/sass2scss_api.rb +10 -0
  396. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/sass_input_style.rb +13 -0
  397. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/sass_output_style.rb +12 -0
  398. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/sass_value.rb +97 -0
  399. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/native/string_list.rb +10 -0
  400. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/sass_2_scss.rb +9 -0
  401. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script.rb +17 -0
  402. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/functions.rb +8 -0
  403. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value.rb +137 -0
  404. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/bool.rb +32 -0
  405. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/color.rb +95 -0
  406. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/list.rb +136 -0
  407. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/map.rb +69 -0
  408. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/number.rb +389 -0
  409. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value/string.rb +96 -0
  410. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion.rb +69 -0
  411. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/base.rb +13 -0
  412. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/bool.rb +13 -0
  413. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/color.rb +18 -0
  414. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/list.rb +25 -0
  415. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/map.rb +21 -0
  416. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/number.rb +13 -0
  417. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/script/value_conversion/string.rb +17 -0
  418. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/util.rb +231 -0
  419. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/util/normalized_map.rb +117 -0
  420. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/lib/sassc/version.rb +5 -0
  421. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/sassc.gemspec +69 -0
  422. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/custom_importer_test.rb +127 -0
  423. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/engine_test.rb +314 -0
  424. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/error_test.rb +29 -0
  425. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/fixtures/paths.scss +10 -0
  426. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/functions_test.rb +323 -0
  427. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/native_test.rb +213 -0
  428. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/output_style_test.rb +107 -0
  429. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/sass_2_scss_test.rb +14 -0
  430. data/vendor/ruby/2.6.0/gems/sassc-2.2.0/test/test_helper.rb +45 -0
  431. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/README.md +533 -0
  432. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk.rb +12 -0
  433. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/error.rb +10 -0
  434. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/explicit_namespace.rb +80 -0
  435. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/gem_inflector.rb +19 -0
  436. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/inflector.rb +19 -0
  437. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/kernel.rb +33 -0
  438. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/loader.rb +759 -0
  439. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/loader/callbacks.rb +71 -0
  440. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/real_mod_name.rb +15 -0
  441. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/registry.rb +147 -0
  442. data/vendor/ruby/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/version.rb +5 -0
  443. data/vendor/ruby/2.6.0/specifications/autoprefixer-rails-9.6.1.1.gemspec +47 -0
  444. data/vendor/ruby/2.6.0/specifications/parser-2.6.4.1.gemspec +62 -0
  445. data/vendor/ruby/2.6.0/specifications/sassc-2.2.0.gemspec +60 -0
  446. data/vendor/ruby/2.6.0/specifications/zeitwerk-2.1.10.gemspec +21 -0
  447. metadata +441 -4
  448. data/vendor/assets/anjuna/css/anjuna-application.css +0 -2
  449. data/vendor/assets/anjuna/css/anjuna-theme.css +0 -2
@@ -0,0 +1,3659 @@
1
+ # encoding: ascii-8bit
2
+ # frozen_string_literal: true
3
+
4
+ require 'helper'
5
+ require 'complex'
6
+
7
+ class TestLexer < Minitest::Test
8
+ def setup_lexer(version)
9
+ @lex = Parser::Lexer.new(version)
10
+
11
+ @lex.comments = []
12
+ @lex.diagnostics = Parser::Diagnostic::Engine.new
13
+ @lex.diagnostics.all_errors_are_fatal = true
14
+ # @lex.diagnostics.consumer = lambda { |diag| $stderr.puts "", diag.render }
15
+ end
16
+
17
+ def setup
18
+ setup_lexer 18
19
+ end
20
+
21
+ #
22
+ # Tools
23
+ #
24
+
25
+ def utf(str)
26
+ str.dup.force_encoding(Encoding::UTF_8)
27
+ end
28
+
29
+ #
30
+ # Additional matchers
31
+ #
32
+
33
+ def refute_scanned(s, *args)
34
+ assert_raises Parser::SyntaxError do
35
+ assert_scanned(s, *args)
36
+ end
37
+ end
38
+
39
+ def assert_escape(expected, input)
40
+ source_buffer = Parser::Source::Buffer.new('(assert_escape)')
41
+
42
+ source_buffer.source = "\"\\#{input}\"".encode(input.encoding)
43
+
44
+ @lex.reset
45
+ @lex.source_buffer = source_buffer
46
+
47
+ lex_token, (lex_value, *) = @lex.advance
48
+
49
+ lex_value.force_encoding(Encoding::BINARY)
50
+
51
+ assert_equal [:tSTRING, expected],
52
+ [lex_token, lex_value],
53
+ source_buffer.source
54
+ end
55
+
56
+ def refute_escape(input)
57
+ err = assert_raises Parser::SyntaxError do
58
+ @lex.state = :expr_beg
59
+ assert_scanned "%Q[\\#{input}]"
60
+ end
61
+ assert_equal :fatal, err.diagnostic.level
62
+ end
63
+
64
+ def assert_lex_fname(name, type, range)
65
+ begin_pos, end_pos = range
66
+ assert_scanned("def #{name} ",
67
+ :kDEF, 'def', [0, 3],
68
+ type, name, [begin_pos + 4, end_pos + 4])
69
+
70
+ assert_equal :expr_endfn, @lex.state
71
+ end
72
+
73
+ def assert_scanned(input, *args)
74
+ source_buffer = Parser::Source::Buffer.new('(assert_scanned)')
75
+ source_buffer.source = input
76
+
77
+ @lex.reset(false)
78
+ @lex.source_buffer = source_buffer
79
+
80
+ until args.empty? do
81
+ token, value, (begin_pos, end_pos) = args.shift(3)
82
+
83
+ lex_token, (lex_value, lex_range) = @lex.advance
84
+ assert lex_token, 'no more tokens'
85
+ assert_operator [lex_token, lex_value], :eql?, [token, value], input
86
+ assert_equal begin_pos, lex_range.begin_pos
87
+ assert_equal end_pos, lex_range.end_pos
88
+ end
89
+
90
+ lex_token, (lex_value, *) = @lex.advance
91
+ refute lex_token, "must be empty, but had #{[lex_token, lex_value].inspect}"
92
+ end
93
+
94
+ #
95
+ # Tests
96
+ #
97
+
98
+ def test_read_escape
99
+ assert_escape "\\", "\\"
100
+ assert_escape "\n", "n"
101
+ assert_escape "\t", "t"
102
+ assert_escape "\r", "r"
103
+ assert_escape "\f", "f"
104
+ assert_escape "\13", "v"
105
+ assert_escape "\0", "0"
106
+ assert_escape "\07", "a"
107
+ assert_escape "\007", "a"
108
+ assert_escape "\033", "e"
109
+ assert_escape "\377", "377"
110
+ assert_escape "\377", "xff"
111
+ assert_escape "\010", "b"
112
+ assert_escape " ", "s"
113
+ assert_escape "q", "q" # plain vanilla escape
114
+ end
115
+
116
+ def test_read_escape_c
117
+ assert_escape "\030", "C-x"
118
+ assert_escape "\030", "cx"
119
+ assert_escape "\230", 'C-\M-x'
120
+ assert_escape "\230", 'c\M-x'
121
+
122
+ assert_escape "\177", "C-?"
123
+ assert_escape "\177", "c?"
124
+ assert_escape "\r", "cM"
125
+ end
126
+
127
+ def test_read_escape_m
128
+ assert_escape "\370", "M-x"
129
+ assert_escape "\230", 'M-\C-x'
130
+ assert_escape "\230", 'M-\cx'
131
+ end
132
+
133
+ def test_read_escape_errors
134
+ refute_escape ""
135
+
136
+ refute_escape "M"
137
+ refute_escape "M-"
138
+ refute_escape "Mx"
139
+
140
+ refute_escape "Cx"
141
+ refute_escape "C"
142
+ refute_escape "C-"
143
+
144
+ refute_escape "c"
145
+
146
+ refute_escape "x"
147
+ end
148
+
149
+ def test_read_escape_unicode__19
150
+ assert_escape "\x09", 'u{9}'
151
+ assert_escape "\x31", 'u{31}'
152
+ assert_escape "\x09\x01", 'u{9 1}'
153
+
154
+ assert_escape "\xc4\xa3", utf('u0123')
155
+ assert_escape "\xc4\xa3\xc3\xb0\xeb\x84\xa3", utf('u{123 f0 B123}')
156
+ end
157
+
158
+ def test_read_escape_unicode_bad__19
159
+ refute_escape 'u123'
160
+ refute_escape 'u{}'
161
+ refute_escape 'u{123 f0h}'
162
+ refute_escape 'u{123 f0'
163
+ end
164
+
165
+ def test_read_escape_whitespaces__27
166
+ setup_lexer 27
167
+
168
+ [ *(0..8), *(14..31) ].each do |code|
169
+ @lex.reset
170
+ refute_scanned "\"\\C-" + code.chr + "\""
171
+
172
+ @lex.reset
173
+ refute_scanned "\"\\M-" + code.chr + "\""
174
+
175
+ @lex.reset
176
+ refute_scanned "\"\\C-\\M-" + code.chr + "\""
177
+
178
+ @lex.reset
179
+ refute_scanned "\"\\M-\\C-" + code.chr + "\""
180
+ end
181
+ end
182
+
183
+ def test_ambiguous_uminus
184
+ assert_scanned("m -3",
185
+ :tIDENTIFIER, "m", [0, 1],
186
+ :tUNARY_NUM, "-", [2, 3],
187
+ :tINTEGER, 3, [3, 4])
188
+ end
189
+
190
+ def test_ambiguous_uplus
191
+ assert_scanned("m +3",
192
+ :tIDENTIFIER, "m", [0, 1],
193
+ :tUNARY_NUM, "+", [2, 3],
194
+ :tINTEGER, 3, [3, 4])
195
+ end
196
+
197
+ def test_and
198
+ assert_scanned "&", :tAMPER, "&", [0, 1]
199
+ end
200
+
201
+ def test_and2
202
+ @lex.state = :expr_end
203
+
204
+ assert_scanned "&&", :tANDOP, "&&", [0, 2]
205
+ end
206
+
207
+ def test_and2_equals
208
+ @lex.state = :expr_end
209
+
210
+ assert_scanned "&&=", :tOP_ASGN, "&&", [0, 3]
211
+ end
212
+
213
+ def test_and_arg
214
+ @lex.state = :expr_arg
215
+
216
+ assert_scanned(" &y",
217
+ :tAMPER, "&", [1, 2],
218
+ :tIDENTIFIER, "y", [2, 3])
219
+ end
220
+
221
+ def test_and_equals
222
+ @lex.state = :expr_end
223
+
224
+ assert_scanned "&=", :tOP_ASGN, "&", [0, 2]
225
+ end
226
+
227
+ def test_and_expr
228
+ @lex.state = :expr_arg
229
+
230
+ assert_scanned("x & y",
231
+ :tIDENTIFIER, "x", [0, 1],
232
+ :tAMPER2, "&", [2, 3],
233
+ :tIDENTIFIER, "y", [4, 5])
234
+ end
235
+
236
+ def test_and_meth
237
+ assert_lex_fname "&", :tAMPER2, [0, 1]
238
+ end
239
+
240
+ def test_and_dot_arg
241
+ @lex.state = :expr_arg
242
+
243
+ assert_scanned "&.", :tANDDOT, "&.", [0, 2]
244
+ end
245
+
246
+ def test_and_dot_cmdarg
247
+ @lex.state = :expr_cmdarg
248
+
249
+ assert_scanned "&.", :tANDDOT, "&.", [0, 2]
250
+ end
251
+
252
+ def test_assoc
253
+ assert_scanned "=>", :tASSOC, "=>", [0, 2]
254
+ end
255
+
256
+ def test_label__18
257
+ assert_scanned("{a:b",
258
+ :tLBRACE, "{", [0, 1],
259
+ :tIDENTIFIER, "a", [1, 2],
260
+ :tSYMBOL, "b", [2, 4])
261
+ end
262
+
263
+ def test_label_in_params__18
264
+ assert_scanned("foo(a:b",
265
+ :tIDENTIFIER, "foo", [0, 3],
266
+ :tLPAREN2, "(", [3, 4],
267
+ :tIDENTIFIER, "a", [4, 5],
268
+ :tSYMBOL, "b", [5, 7])
269
+ end
270
+
271
+ def test_label__19
272
+ setup_lexer 19
273
+
274
+ assert_scanned("{a:b",
275
+ :tLBRACE, "{", [0, 1],
276
+ :tLABEL, "a", [1, 3],
277
+ :tIDENTIFIER, "b", [3, 4])
278
+ end
279
+
280
+ def test_label_in_params__19
281
+ setup_lexer 19
282
+
283
+ assert_scanned("foo(a:b",
284
+ :tIDENTIFIER, "foo", [0, 3],
285
+ :tLPAREN2, "(", [3, 4],
286
+ :tLABEL, "a", [4, 6],
287
+ :tIDENTIFIER, "b", [6, 7])
288
+ end
289
+
290
+ def test_label_fid__19
291
+ setup_lexer 19
292
+
293
+ assert_scanned("{a?:true",
294
+ :tLBRACE, '{', [0, 1],
295
+ :tLABEL, 'a?', [1, 4],
296
+ :kTRUE, 'true', [4, 8])
297
+ end
298
+
299
+ def test_label__22
300
+ setup_lexer 22
301
+
302
+ assert_scanned("{'a':",
303
+ :tLBRACE, '{', [0, 1],
304
+ :tSTRING_BEG, "'", [1, 2],
305
+ :tSTRING_CONTENT, 'a', [2, 3],
306
+ :tLABEL_END, "'", [3, 5])
307
+ end
308
+
309
+ def test_label_nested__22
310
+ setup_lexer 22
311
+
312
+ assert_scanned("{'a\":':",
313
+ :tLBRACE, '{', [0, 1],
314
+ :tSTRING_BEG, "'", [1, 2],
315
+ :tSTRING_CONTENT, 'a":', [2, 5],
316
+ :tLABEL_END, "'", [5, 7])
317
+ end
318
+
319
+ def test_label_colon2__22
320
+ setup_lexer 22
321
+
322
+ assert_scanned("{'a'::",
323
+ :tLBRACE, '{', [0, 1],
324
+ :tSTRING, "a", [1, 4],
325
+ :tCOLON2, '::', [4, 6])
326
+ end
327
+
328
+ def test_pct_string_colon__22
329
+ setup_lexer 22
330
+
331
+ assert_scanned("{%'a':",
332
+ :tLBRACE, '{', [0, 1],
333
+ :tSTRING_BEG, "%'", [1, 3],
334
+ :tSTRING_CONTENT, 'a', [3, 4],
335
+ :tSTRING_END, "'", [4, 5],
336
+ :tCOLON, ':', [5, 6])
337
+ end
338
+
339
+ def test_command_start__19
340
+ setup_lexer 19
341
+
342
+ %w[case elsif for in until when while
343
+ if unless and or].each do |keyword|
344
+ token = "k#{keyword.upcase}".to_sym
345
+
346
+ @lex.reset
347
+ assert_scanned("#{keyword} a:b",
348
+ token, keyword, [0, keyword.length],
349
+ :tIDENTIFIER, "a", [keyword.length + 1, keyword.length + 2],
350
+ :tSYMBOL, "b", [keyword.length + 2, keyword.length + 4])
351
+ end
352
+ end
353
+
354
+ def test_mod_not_command_start__19
355
+ setup_lexer 19
356
+
357
+ %w[if unless while until rescue].each do |keyword|
358
+ token = "k#{keyword.upcase}_MOD".to_sym
359
+
360
+ @lex.state = :expr_end
361
+ assert_scanned("#{keyword} a:b",
362
+ token, keyword, [0, keyword.length],
363
+ :tLABEL, "a", [keyword.length + 1, keyword.length + 3],
364
+ :tIDENTIFIER, "b", [keyword.length + 3, keyword.length + 4])
365
+ end
366
+ end
367
+
368
+ def test_back_ref
369
+ assert_scanned("[$&, $`, $', $+]",
370
+ :tLBRACK, "[", [0, 1],
371
+ :tBACK_REF, "$&", [1, 3], :tCOMMA, ",", [3, 4],
372
+ :tBACK_REF, "$`", [5, 7], :tCOMMA, ",", [7, 8],
373
+ :tBACK_REF, "$'", [9, 11], :tCOMMA, ",", [11, 12],
374
+ :tBACK_REF, "$+", [13, 15],
375
+ :tRBRACK, "]", [15, 16])
376
+ end
377
+
378
+ def test_backslash
379
+ assert_scanned("1 \\\n+ 2",
380
+ :tINTEGER, 1, [0, 1],
381
+ :tPLUS, "+", [4, 5],
382
+ :tINTEGER, 2, [6, 7])
383
+ end
384
+
385
+ def test_backslash_bad
386
+ refute_scanned("1 \\ + 2",
387
+ :tINTEGER, 1, [0, 1])
388
+ end
389
+
390
+ def test_backtick
391
+ assert_scanned("`ls`",
392
+ :tXSTRING_BEG, "`", [0, 1],
393
+ :tSTRING_CONTENT, "ls", [1, 3],
394
+ :tSTRING_END, "`", [3, 4])
395
+ end
396
+
397
+ def test_backtick_cmdarg
398
+ @lex.state = :expr_dot
399
+ assert_scanned("\n`", :tBACK_REF2, "`", [1, 2]) # \n ensures expr_cmd
400
+
401
+ assert_equal :expr_arg, @lex.state
402
+ end
403
+
404
+ def test_backtick_dot
405
+ @lex.state = :expr_dot
406
+ assert_scanned("a.`(3)",
407
+ :tIDENTIFIER, "a", [0, 1],
408
+ :tDOT, ".", [1, 2],
409
+ :tBACK_REF2, "`", [2, 3],
410
+ :tLPAREN2, "(", [3, 4],
411
+ :tINTEGER, 3, [4, 5],
412
+ :tRPAREN, ")", [5, 6])
413
+ end
414
+
415
+ def test_backtick_method
416
+ @lex.state = :expr_fname
417
+ assert_scanned("`", :tBACK_REF2, "`", [0, 1])
418
+ assert_equal :expr_endfn, @lex.state
419
+ end
420
+
421
+ def test_bad_char
422
+ refute_scanned(" \010 ")
423
+ end
424
+
425
+ def test_bang
426
+ assert_scanned "!", :tBANG, "!", [0, 1]
427
+ end
428
+
429
+ def test_bang_equals
430
+ assert_scanned "!=", :tNEQ, "!=", [0, 2]
431
+ end
432
+
433
+ def test_bang_tilde
434
+ assert_scanned "!~", :tNMATCH, "!~", [0, 2]
435
+ end
436
+
437
+ def test_def_ubang
438
+ setup_lexer(20)
439
+
440
+ @lex.state = :expr_fname
441
+ assert_scanned '!@', :tBANG, '!@', [0, 2]
442
+ end
443
+
444
+ def test_carat
445
+ assert_scanned "^", :tCARET, "^", [0, 1]
446
+ end
447
+
448
+ def test_carat_equals
449
+ assert_scanned "^=", :tOP_ASGN, "^", [0, 2]
450
+ end
451
+
452
+ def test_colon2
453
+ assert_scanned("A::B",
454
+ :tCONSTANT, "A", [0, 1],
455
+ :tCOLON2, "::", [1, 3],
456
+ :tCONSTANT, "B", [3, 4])
457
+
458
+ @lex.state = :expr_arg
459
+ assert_scanned("::Array",
460
+ :tCOLON2, "::", [0, 2],
461
+ :tCONSTANT, "Array", [2, 7])
462
+ end
463
+
464
+ def test_colon3
465
+ assert_scanned("::Array",
466
+ :tCOLON3, "::", [0, 2],
467
+ :tCONSTANT, "Array", [2, 7])
468
+
469
+ @lex.state = :expr_arg
470
+ assert_scanned(" ::Array",
471
+ :tCOLON3, "::", [1, 3],
472
+ :tCONSTANT, "Array", [3, 8])
473
+ end
474
+
475
+ def test_comma
476
+ assert_scanned ",", :tCOMMA, ",", [0, 1]
477
+ end
478
+
479
+ def test_comment
480
+ assert_scanned("1 # one\n# two\n2",
481
+ :tINTEGER, 1, [0, 1],
482
+ :tNL, nil, [7, 8],
483
+ :tINTEGER, 2, [14, 15])
484
+
485
+ assert_equal 2, @lex.comments.length
486
+ assert_equal '# one', @lex.comments[0].text
487
+ assert_equal '# two', @lex.comments[1].text
488
+ end
489
+
490
+ def test_comment_expr_beg
491
+ assert_scanned("{#1\n}",
492
+ :tLBRACE, "{", [0, 1],
493
+ :tRCURLY, "}", [4, 5])
494
+ end
495
+
496
+ def test_comment_begin
497
+ assert_scanned("=begin\nblah\nblah\n=end\n42",
498
+ :tINTEGER, 42, [22, 24])
499
+ assert_equal 1, @lex.comments.length
500
+ assert_equal "=begin\nblah\nblah\n=end\n", @lex.comments[0].text
501
+ end
502
+
503
+ def test_comment_begin_bad
504
+ refute_scanned("=begin\nblah\nblah\n")
505
+ end
506
+
507
+ def test_comment_begin_not_comment
508
+ assert_scanned("beginfoo = 5\np x \\\n=beginfoo",
509
+ :tIDENTIFIER, "beginfoo", [0, 8],
510
+ :tEQL, "=", [9, 10],
511
+ :tINTEGER, 5, [11, 12],
512
+ :tNL, nil, [12, 13],
513
+ :tIDENTIFIER, "p", [13, 14],
514
+ :tIDENTIFIER, "x", [15, 16],
515
+ :tEQL, "=", [19, 20],
516
+ :tIDENTIFIER, "beginfoo", [20, 28])
517
+ end
518
+
519
+ def test_comment_begin_space
520
+ assert_scanned("=begin blah\nblah\n=end\n")
521
+
522
+ assert_equal 1, @lex.comments.length
523
+ assert_equal "=begin blah\nblah\n=end\n", @lex.comments[0].text
524
+ end
525
+
526
+ def test_comment_end_space_and_text
527
+ assert_scanned("=begin blah\nblah\n=end blab\n")
528
+
529
+ assert_equal 1, @lex.comments.length
530
+ assert_equal "=begin blah\nblah\n=end blab\n", @lex.comments[0].text
531
+ end
532
+
533
+ def test_comment_eos
534
+ assert_scanned("# comment")
535
+ end
536
+
537
+ def test_constant
538
+ assert_scanned("ArgumentError",
539
+ :tCONSTANT, "ArgumentError", [0, 13])
540
+ end
541
+
542
+ def test_constant_semi
543
+ assert_scanned("ArgumentError;",
544
+ :tCONSTANT, "ArgumentError", [0, 13],
545
+ :tSEMI, ";", [13, 14])
546
+ end
547
+
548
+ def test_cvar
549
+ assert_scanned "@@blah", :tCVAR, "@@blah", [0, 6]
550
+ end
551
+
552
+ def test_cvar_bad
553
+ refute_scanned "@@1"
554
+ end
555
+
556
+ def test_div
557
+ assert_scanned("a / 2",
558
+ :tIDENTIFIER, "a", [0, 1],
559
+ :tDIVIDE, "/", [2, 3],
560
+ :tINTEGER, 2, [4, 5])
561
+ end
562
+
563
+ def test_div_equals
564
+ assert_scanned("a /= 2",
565
+ :tIDENTIFIER, "a", [0, 1],
566
+ :tOP_ASGN, "/", [2, 4],
567
+ :tINTEGER, 2, [5, 6])
568
+ end
569
+
570
+ def test_do
571
+ assert_scanned("x do 42 end",
572
+ :tIDENTIFIER, "x", [0, 1],
573
+ :kDO, "do", [2, 4],
574
+ :tINTEGER, 42, [5, 7],
575
+ :kEND, "end", [8, 11])
576
+ end
577
+
578
+ def test_do_block
579
+ @lex.state = :expr_endarg
580
+
581
+ assert_scanned("do 42 end",
582
+ :kDO_BLOCK, "do", [0, 2],
583
+ :tINTEGER, 42, [3, 5],
584
+ :kEND, "end", [6, 9])
585
+ end
586
+
587
+ def test_do_cond
588
+ @lex.cond.push true
589
+
590
+ assert_scanned("x do 42 end",
591
+ :tIDENTIFIER, "x", [0, 1],
592
+ :kDO_COND, "do", [2, 4],
593
+ :tINTEGER, 42, [5, 7],
594
+ :kEND, "end", [8, 11])
595
+ end
596
+
597
+ def test_dot
598
+ assert_scanned ".", :tDOT, ".", [0, 1]
599
+ end
600
+
601
+ def test_dot2
602
+ assert_scanned "..", :tDOT2, "..", [0, 2]
603
+ end
604
+
605
+ def test_dot3
606
+ assert_scanned "...", :tDOT3, "...", [0, 3]
607
+ end
608
+
609
+ def test_equals
610
+ assert_scanned "=", :tEQL, "=", [0, 1]
611
+ end
612
+
613
+ def test_equals2
614
+ assert_scanned "==", :tEQ, "==", [0, 2]
615
+ end
616
+
617
+ def test_equals3
618
+ assert_scanned "===", :tEQQ, "===", [0, 3]
619
+ end
620
+
621
+ def test_equals_tilde
622
+ assert_scanned "=~", :tMATCH, "=~", [0, 2]
623
+ end
624
+
625
+ def test_float
626
+ assert_scanned "1.0", :tFLOAT, 1.0, [0, 3]
627
+ end
628
+
629
+ def test_float_bad_no_underscores
630
+ refute_scanned "1__0.0"
631
+ end
632
+
633
+ def test_float_bad_no_zero_leading
634
+ refute_scanned ".0"
635
+ end
636
+
637
+ def test_float_bad_trailing_underscore
638
+ refute_scanned "123_.0"
639
+ end
640
+
641
+ def test_float_call
642
+ assert_scanned("1.0.to_s",
643
+ :tFLOAT, 1.0, [0, 3],
644
+ :tDOT, ".", [3, 4],
645
+ :tIDENTIFIER, "to_s", [4, 8])
646
+ end
647
+
648
+ def test_float_dot_E
649
+ assert_scanned "1.0E10", :tFLOAT, 1.0e10, [0, 6]
650
+ end
651
+
652
+ def test_float_dot_E_neg
653
+ assert_scanned("-1.0E10",
654
+ :tUNARY_NUM, "-", [0, 1],
655
+ :tFLOAT, 1.0e10, [1, 7])
656
+ end
657
+
658
+ def test_float_dot_E_pos
659
+ assert_scanned("+1.0E10",
660
+ :tUNARY_NUM, "+", [0, 1],
661
+ :tFLOAT, 1.0e10, [1, 7])
662
+ end
663
+
664
+ def test_float_dot_e
665
+ assert_scanned "1.0e10", :tFLOAT, 1.0e10, [0, 6]
666
+ end
667
+
668
+ def test_float_dot_e_neg
669
+ assert_scanned("-1.0e10",
670
+ :tUNARY_NUM, "-", [0, 1],
671
+ :tFLOAT, 1.0e10, [1, 7])
672
+ end
673
+
674
+ def test_float_dot_e_pos
675
+ assert_scanned("+1.0e10",
676
+ :tUNARY_NUM, "+", [0, 1],
677
+ :tFLOAT, 1.0e10, [1, 7])
678
+ end
679
+
680
+ def test_float_e
681
+ assert_scanned "1e10", :tFLOAT, 1e10, [0, 4]
682
+ end
683
+
684
+ def test_float_e_bad_trailing_underscore
685
+ refute_scanned "123_e10"
686
+ end
687
+
688
+ def test_float_e_minus
689
+ assert_scanned "1e-10", :tFLOAT, 1e-10, [0, 5]
690
+ end
691
+
692
+ def test_float_e_neg
693
+ assert_scanned("-1e10",
694
+ :tUNARY_NUM, "-", [0, 1],
695
+ :tFLOAT, 1e10, [1, 5])
696
+ end
697
+
698
+ def test_float_e_neg_minus
699
+ assert_scanned("-1e-10",
700
+ :tUNARY_NUM, "-", [0, 1],
701
+ :tFLOAT, 1e-10, [1, 6])
702
+ end
703
+
704
+ def test_float_e_neg_plus
705
+ assert_scanned("-1e+10",
706
+ :tUNARY_NUM, "-", [0, 1],
707
+ :tFLOAT, 1e10, [1, 6])
708
+ end
709
+
710
+ def test_float_e_pos
711
+ assert_scanned("+1e10",
712
+ :tUNARY_NUM, "+", [0, 1],
713
+ :tFLOAT, 1e10, [1, 5])
714
+ end
715
+
716
+ def test_float_e_pos_minus
717
+ assert_scanned("+1e-10",
718
+ :tUNARY_NUM, "+", [0, 1],
719
+ :tFLOAT, 1e-10, [1, 6])
720
+ end
721
+
722
+ def test_float_e_pos_plus
723
+ assert_scanned("+1e+10",
724
+ :tUNARY_NUM, "+", [0, 1],
725
+ :tFLOAT, 1e10, [1, 6])
726
+ end
727
+
728
+ def test_float_e_plus
729
+ assert_scanned "1e+10", :tFLOAT, 1e10, [0, 5]
730
+ end
731
+
732
+ def test_float_e_zero
733
+ assert_scanned "0e0", :tFLOAT, 0e0, [0, 3]
734
+ end
735
+
736
+ def test_float_e_nothing
737
+ [18, 19, 20].each do |version|
738
+ setup_lexer version
739
+
740
+ refute_scanned "1end"
741
+ refute_scanned "1.1end"
742
+ end
743
+
744
+ setup_lexer 21
745
+
746
+ assert_scanned("1end",
747
+ :tINTEGER, 1, [0, 1],
748
+ :kEND, 'end', [1, 4])
749
+ assert_scanned("1.1end",
750
+ :tFLOAT, 1.1, [0, 3],
751
+ :kEND, 'end', [3, 6])
752
+ end
753
+
754
+ def test_float_neg
755
+ assert_scanned("-1.0",
756
+ :tUNARY_NUM, "-", [0, 1],
757
+ :tFLOAT, 1.0, [1, 4])
758
+ end
759
+
760
+ def test_float_pos
761
+ assert_scanned("+1.0",
762
+ :tUNARY_NUM, "+", [0, 1],
763
+ :tFLOAT, 1.0, [1, 4])
764
+ end
765
+
766
+ def test_ge
767
+ assert_scanned("a >= 2",
768
+ :tIDENTIFIER, "a", [0, 1],
769
+ :tGEQ, ">=", [2, 4],
770
+ :tINTEGER, 2, [5, 6])
771
+ end
772
+
773
+ def test_global
774
+ assert_scanned("$blah", :tGVAR, "$blah", [0, 5])
775
+ end
776
+
777
+ def test_global_backref
778
+ assert_scanned("$`", :tBACK_REF, "$`", [0, 2])
779
+ end
780
+
781
+ # This was removed in 2.1.
782
+ # def test_global_dash_nothing
783
+ # assert_scanned("$- ", :tGVAR, "$-")
784
+ # end
785
+
786
+ def test_global_dash_something
787
+ assert_scanned("$-x", :tGVAR, "$-x", [0, 3])
788
+ end
789
+
790
+ def test_global_number
791
+ assert_scanned("$10", :tNTH_REF, 10, [0, 3])
792
+ end
793
+
794
+ def test_global_other
795
+ assert_scanned("[$~, $*, $$, $?, $!, $@, $/, $\\, $;, $,, $., $=, $:, $<, $>, $\"]",
796
+ :tLBRACK, "[", [0, 1],
797
+ :tGVAR, "$~", [1, 3], :tCOMMA, ",", [3, 4],
798
+ :tGVAR, "$*", [5, 7], :tCOMMA, ",", [7, 8],
799
+ :tGVAR, "$$", [9, 11], :tCOMMA, ",", [11, 12],
800
+ :tGVAR, "$\?", [13, 15], :tCOMMA, ",", [15, 16],
801
+ :tGVAR, "$!", [17, 19], :tCOMMA, ",", [19, 20],
802
+ :tGVAR, "$@", [21, 23], :tCOMMA, ",", [23, 24],
803
+ :tGVAR, "$/", [25, 27], :tCOMMA, ",", [27, 28],
804
+ :tGVAR, "$\\", [29, 31], :tCOMMA, ",", [31, 32],
805
+ :tGVAR, "$;", [33, 35], :tCOMMA, ",", [35, 36],
806
+ :tGVAR, "$,", [37, 39], :tCOMMA, ",", [39, 40],
807
+ :tGVAR, "$.", [41, 43], :tCOMMA, ",", [43, 44],
808
+ :tGVAR, "$=", [45, 47], :tCOMMA, ",", [47, 48],
809
+ :tGVAR, "$:", [49, 51], :tCOMMA, ",", [51, 52],
810
+ :tGVAR, "$<", [53, 55], :tCOMMA, ",", [55, 56],
811
+ :tGVAR, "$>", [57, 59], :tCOMMA, ",", [59, 60],
812
+ :tGVAR, "$\"", [61, 63],
813
+ :tRBRACK, "]", [63, 64])
814
+ end
815
+
816
+ def test_global_underscore
817
+ assert_scanned("$_",
818
+ :tGVAR, "$_", [0, 2])
819
+ end
820
+
821
+ def test_global_weird
822
+ assert_scanned("$__blah",
823
+ :tGVAR, "$__blah", [0, 7])
824
+ end
825
+
826
+ def test_global_zero
827
+ assert_scanned("$0", :tGVAR, "$0", [0, 2])
828
+ end
829
+
830
+ def test_gt
831
+ assert_scanned("a > 2",
832
+ :tIDENTIFIER, "a", [0, 1],
833
+ :tGT, ">", [2, 3],
834
+ :tINTEGER, 2, [4, 5])
835
+ end
836
+
837
+ def test_heredoc_backtick
838
+ assert_scanned("a = <<`EOF`\n blah blah\nEOF\n",
839
+ :tIDENTIFIER, "a", [0, 1],
840
+ :tEQL, "=", [2, 3],
841
+ :tXSTRING_BEG, "<<`", [4, 11],
842
+ :tSTRING_CONTENT, " blah blah\n", [12, 24],
843
+ :tSTRING_END, "EOF", [24, 27],
844
+ :tNL, nil, [11, 12])
845
+ end
846
+
847
+ def test_heredoc_double
848
+ assert_scanned("a = <<\"EOF\"\n blah blah\nEOF\n",
849
+ :tIDENTIFIER, "a", [0, 1],
850
+ :tEQL, "=", [2, 3],
851
+ :tSTRING_BEG, "<<\"", [4, 11],
852
+ :tSTRING_CONTENT, " blah blah\n", [12, 24],
853
+ :tSTRING_END, "EOF", [24, 27],
854
+ :tNL, nil, [11, 12])
855
+ end
856
+
857
+ def test_heredoc_double_dash
858
+ assert_scanned("a = <<-\"EOF\"\n blah blah\n EOF\n",
859
+ :tIDENTIFIER, "a", [0, 1],
860
+ :tEQL, "=", [2, 3],
861
+ :tSTRING_BEG, "<<\"", [4, 12],
862
+ :tSTRING_CONTENT, " blah blah\n", [13, 25],
863
+ :tSTRING_END, "EOF", [25, 30],
864
+ :tNL, nil, [12, 13])
865
+ end
866
+
867
+ def test_heredoc_double_eos
868
+ refute_scanned("a = <<\"EOF\"\nblah",
869
+ :tIDENTIFIER, "a", [0, 1],
870
+ :tEQL, "=", [2, 3],
871
+ :tSTRING_BEG, "<<\"", [4, 7])
872
+ end
873
+
874
+ def test_heredoc_double_eos_nl
875
+ refute_scanned("a = <<\"EOF\"\nblah\n",
876
+ :tIDENTIFIER, "a", [0, 1],
877
+ :tEQL, "=", [2, 3],
878
+ :tSTRING_BEG, "<<\"", [4, 7])
879
+ end
880
+
881
+ def test_heredoc_double_interp
882
+ assert_scanned("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n",
883
+ :tIDENTIFIER, "a", [0, 1],
884
+ :tEQL, "=", [2, 3],
885
+ :tSTRING_BEG, "<<\"", [4, 11],
886
+ :tSTRING_CONTENT, "#x a ", [12, 17],
887
+ :tSTRING_DVAR, nil, [17, 18],
888
+ :tIVAR, "@a", [18, 20],
889
+ :tSTRING_CONTENT, " b ", [20, 23],
890
+ :tSTRING_DVAR, nil, [23, 24],
891
+ :tGVAR, "$b", [24, 26],
892
+ :tSTRING_CONTENT, " c ", [26, 29],
893
+ :tSTRING_DBEG, '#{', [29, 31],
894
+ :tINTEGER, 3, [31, 32],
895
+ :tRCURLY, "}", [32, 33],
896
+ :tSTRING_CONTENT, " \n", [33, 35],
897
+ :tSTRING_END, "EOF", [35, 38],
898
+ :tNL, nil, [11, 12])
899
+ end
900
+
901
+ def test_heredoc_empty
902
+ assert_scanned("<<\"\"\n\#{x}\nblah2\n\n",
903
+ :tSTRING_BEG, "<<\"", [0, 4],
904
+ :tSTRING_DBEG, "\#{", [5, 7],
905
+ :tIDENTIFIER, "x", [7, 8],
906
+ :tRCURLY, "}", [8, 9],
907
+ :tSTRING_CONTENT, "\n", [9, 10],
908
+ :tSTRING_CONTENT, "blah2\n", [10, 16],
909
+ :tSTRING_END, "", [16, 16],
910
+ :tNL, nil, [4, 5])
911
+ end
912
+
913
+ def test_heredoc_none
914
+ assert_scanned("a = <<EOF\nblah\nblah\nEOF",
915
+ :tIDENTIFIER, "a", [0, 1],
916
+ :tEQL, "=", [2, 3],
917
+ :tSTRING_BEG, "<<\"", [4, 9],
918
+ :tSTRING_CONTENT, "blah\n", [10, 15],
919
+ :tSTRING_CONTENT, "blah\n", [15, 20],
920
+ :tSTRING_END, "EOF", [20, 23],
921
+ :tNL, nil, [9, 10])
922
+ end
923
+
924
+ def test_heredoc_none_dash
925
+ assert_scanned("a = <<-EOF\nblah\nblah\n EOF",
926
+ :tIDENTIFIER, "a", [0, 1],
927
+ :tEQL, "=", [2, 3],
928
+ :tSTRING_BEG, "<<\"", [4, 10],
929
+ :tSTRING_CONTENT, "blah\n", [11, 16],
930
+ :tSTRING_CONTENT, "blah\n", [16, 21],
931
+ :tSTRING_END, "EOF", [21, 26],
932
+ :tNL, nil, [10, 11])
933
+ end
934
+
935
+ def test_heredoc_single
936
+ assert_scanned("a = <<'EOF'\n blah blah\nEOF\n",
937
+ :tIDENTIFIER, "a", [0, 1],
938
+ :tEQL, "=", [2, 3],
939
+ :tSTRING_BEG, "<<'", [4, 11],
940
+ :tSTRING_CONTENT, " blah blah\n", [12, 24],
941
+ :tSTRING_END, "EOF", [24, 27],
942
+ :tNL, nil, [11, 12])
943
+ end
944
+
945
+ def test_heredoc_single_bad_eos_body
946
+ refute_scanned("a = <<'EOF'\nblah",
947
+ :tIDENTIFIER, "a", [0, 1],
948
+ :tEQL, "=", [2, 3],
949
+ :tSTRING_BEG, "'", [6, 7])
950
+ end
951
+
952
+ def test_heredoc_single_dash
953
+ assert_scanned("a = <<-'EOF'\n blah blah\n EOF\n",
954
+ :tIDENTIFIER, "a", [0, 1],
955
+ :tEQL, "=", [2, 3],
956
+ :tSTRING_BEG, "<<'", [4, 12],
957
+ :tSTRING_CONTENT, " blah blah\n", [13, 25],
958
+ :tSTRING_END, "EOF", [25, 30],
959
+ :tNL, nil, [12, 13])
960
+ end
961
+
962
+ def test_heredoc_one_character
963
+ assert_scanned("a = <<E\nABCDEF\nE\n",
964
+ :tIDENTIFIER, "a", [0, 1],
965
+ :tEQL, "=", [2, 3],
966
+ :tSTRING_BEG, "<<\"", [4, 7],
967
+ :tSTRING_CONTENT, "ABCDEF\n", [8, 15],
968
+ :tSTRING_END, "E", [15, 16],
969
+ :tNL, nil, [7, 8])
970
+ end
971
+
972
+ def test_heredoc_cr
973
+ assert_scanned("a = <<E\r\r\nABCDEF\r\r\nE\r\r\r\n",
974
+ :tIDENTIFIER, "a", [0, 1],
975
+ :tEQL, "=", [2, 3],
976
+ :tSTRING_BEG, "<<\"", [4, 7],
977
+ :tSTRING_CONTENT, "ABCDEF\r\n", [9, 17],
978
+ :tSTRING_END, "E", [17, 20],
979
+ :tNL, nil, [8, 9])
980
+ end
981
+
982
+ def test_heredoc_with_identifier_ending_newline__19
983
+ setup_lexer 19
984
+ refute_scanned "<<\"EOS\n\"\n123\nEOS\n"
985
+ end
986
+
987
+ def test_heredoc_with_identifier_ending_newline__24
988
+ setup_lexer 24
989
+
990
+ assert_scanned("a = <<\"EOS\n\"\nABCDEF\nEOS\n",
991
+ :tIDENTIFIER, "a", [0, 1],
992
+ :tEQL, "=", [2, 3],
993
+ :tSTRING_BEG, "<<\"", [4, 12],
994
+ :tSTRING_CONTENT, "ABCDEF\n", [13, 20],
995
+ :tSTRING_END, "EOS", [20, 23],
996
+ :tNL, nil, [12, 13])
997
+ end
998
+
999
+ def test_heredoc_with_identifier_containing_newline_inside__19
1000
+ setup_lexer 19
1001
+ refute_scanned "<<\"EOS\nEOS\"\n123\nEOS\n"
1002
+ end
1003
+
1004
+ def test_heredoc_with_identifier_containing_newline_inside__24
1005
+ setup_lexer 24
1006
+
1007
+ refute_scanned "<<\"EOS\nEOS\"\n123\nEOS\n"
1008
+ end
1009
+
1010
+ def test_identifier
1011
+ assert_scanned("identifier",
1012
+ :tIDENTIFIER, "identifier", [0, 10])
1013
+ end
1014
+
1015
+ def test_identifier_bang
1016
+ assert_scanned("identifier!",
1017
+ :tFID, "identifier!", [0, 11])
1018
+
1019
+ assert_scanned("identifier!=",
1020
+ :tIDENTIFIER, "identifier", [0, 10],
1021
+ :tNEQ, "!=", [10, 12])
1022
+ end
1023
+
1024
+ def test_identifier_eh
1025
+ setup_lexer 19
1026
+
1027
+ assert_scanned("identifier?",
1028
+ :tFID, "identifier?", [0, 11])
1029
+
1030
+ assert_scanned("identifier?=",
1031
+ :tIDENTIFIER, "identifier", [0, 10],
1032
+ :tCHARACTER, "=", [10, 12])
1033
+ end
1034
+
1035
+ def test_identifier_cmp
1036
+ assert_lex_fname "<=>", :tCMP, [0, 3]
1037
+ end
1038
+
1039
+ def test_identifier_def
1040
+ assert_lex_fname "identifier", :tIDENTIFIER, [0, 10]
1041
+ end
1042
+
1043
+ def test_identifier_equals_arrow
1044
+ assert_scanned(":blah==>",
1045
+ :tSYMBOL, "blah=", [0, 6],
1046
+ :tASSOC, "=>", [6, 8])
1047
+ end
1048
+
1049
+ def test_identifier_equals3
1050
+ assert_scanned(":a===b",
1051
+ :tSYMBOL, "a", [0, 2],
1052
+ :tEQQ, "===", [2, 5],
1053
+ :tIDENTIFIER, "b", [5, 6])
1054
+ end
1055
+
1056
+ def test_identifier_equals_equals_arrow
1057
+ assert_scanned(":a==>b",
1058
+ :tSYMBOL, "a=", [0, 3],
1059
+ :tASSOC, "=>", [3, 5],
1060
+ :tIDENTIFIER, "b", [5, 6])
1061
+ end
1062
+
1063
+ def test_identifier_equals_caret
1064
+ assert_lex_fname "^", :tCARET, [0, 1]
1065
+ end
1066
+
1067
+ def test_identifier_equals_def
1068
+ assert_lex_fname "identifier=", :tIDENTIFIER, [0, 11]
1069
+ end
1070
+
1071
+ def test_identifier_equals_def2
1072
+ assert_lex_fname "==", :tEQ, [0, 2]
1073
+ end
1074
+
1075
+ def test_identifier_equals_expr
1076
+ @lex.state = :expr_dot
1077
+ assert_scanned("y = arg",
1078
+ :tIDENTIFIER, "y", [0, 1],
1079
+ :tEQL, "=", [2, 3],
1080
+ :tIDENTIFIER, "arg", [4, 7])
1081
+
1082
+ assert_equal :expr_arg, @lex.state
1083
+ end
1084
+
1085
+ def test_identifier_equals_or
1086
+ assert_lex_fname "|", :tPIPE, [0, 1]
1087
+ end
1088
+
1089
+ def test_identifier_equals_slash
1090
+ assert_lex_fname "/", :tDIVIDE, [0, 1]
1091
+ end
1092
+
1093
+ def test_identifier_equals_tilde
1094
+ @lex.state = :expr_fname
1095
+ assert_scanned("identifier=~",
1096
+ :tIDENTIFIER, "identifier=", [0, 11],
1097
+ :tTILDE, "~", [11, 12])
1098
+ end
1099
+
1100
+ def test_identifier_gt
1101
+ assert_lex_fname ">", :tGT, [0, 1]
1102
+ end
1103
+
1104
+ def test_identifier_le
1105
+ assert_lex_fname "<=", :tLEQ, [0, 2]
1106
+ end
1107
+
1108
+ def test_identifier_lt
1109
+ assert_lex_fname "<", :tLT, [0, 1]
1110
+ end
1111
+
1112
+ def test_identifier_tilde
1113
+ assert_lex_fname "~", :tTILDE, [0, 1]
1114
+ end
1115
+
1116
+ def test_identifier_defined?
1117
+ assert_lex_fname "defined?", :kDEFINED, [0, 8]
1118
+ end
1119
+
1120
+ def test_index
1121
+ assert_lex_fname "[]", :tAREF, [0, 2]
1122
+ end
1123
+
1124
+ def test_index_equals
1125
+ assert_lex_fname "[]=", :tASET, [0, 3]
1126
+ end
1127
+
1128
+ def test_integer
1129
+ assert_scanned "42", :tINTEGER, 42, [0, 2]
1130
+ end
1131
+
1132
+ def test_integer_bin
1133
+ assert_scanned "0b101010", :tINTEGER, 42, [0, 8]
1134
+ end
1135
+
1136
+ def test_integer_bin_bad_none
1137
+ refute_scanned "0b "
1138
+ end
1139
+
1140
+ def test_integer_bin_bad_underscores
1141
+ refute_scanned "0b10__01"
1142
+ end
1143
+
1144
+ def test_integer_dec
1145
+ assert_scanned "42", :tINTEGER, 42, [0, 2]
1146
+ end
1147
+
1148
+ def test_integer_dec_bad_underscores
1149
+ refute_scanned "42__24"
1150
+ end
1151
+
1152
+ def test_integer_dec_d
1153
+ assert_scanned "0d42", :tINTEGER, 42, [0, 4]
1154
+ end
1155
+
1156
+ def test_integer_dec_d_bad_none
1157
+ refute_scanned "0d"
1158
+ end
1159
+
1160
+ def test_integer_dec_d_bad_underscores
1161
+ refute_scanned "0d42__24"
1162
+ end
1163
+
1164
+ def test_question_eh_a__18
1165
+ setup_lexer 18
1166
+
1167
+ assert_scanned "?a", :tINTEGER, 97, [0, 2]
1168
+ end
1169
+
1170
+ def test_question_eh_a__19
1171
+ setup_lexer 19
1172
+
1173
+ assert_scanned '?a', :tCHARACTER, "a", [0, 2]
1174
+ end
1175
+
1176
+ def test_question_eh_escape_M_escape_C__18
1177
+ setup_lexer 18
1178
+
1179
+ assert_scanned '?\M-\C-a', :tINTEGER, 129, [0, 8]
1180
+ end
1181
+
1182
+ def test_question_eh_escape_M_escape_C__19
1183
+ setup_lexer 19
1184
+
1185
+ assert_scanned '?\M-\C-a', :tCHARACTER, "\M-\C-a", [0, 8]
1186
+ end
1187
+
1188
+ def test_question_eh_escape_u_1_digit
1189
+ setup_lexer 19
1190
+
1191
+ refute_scanned '?\\u1'
1192
+ end
1193
+
1194
+ def test_question_eh_escape_u_2_digits
1195
+ setup_lexer 19
1196
+
1197
+ refute_scanned '?\\u12'
1198
+ end
1199
+
1200
+ def test_question_eh_escape_u_3_digits
1201
+ setup_lexer 19
1202
+
1203
+ refute_scanned '?\\u123'
1204
+ end
1205
+
1206
+ def test_question_eh_escape_u_4_digits
1207
+ setup_lexer 19
1208
+ assert_scanned '?\\u0001', :tCHARACTER, "\u0001", [0, 7]
1209
+ end
1210
+
1211
+ def test_question_eh_single_unicode_point
1212
+ setup_lexer 19
1213
+ assert_scanned '?\\u{123}', :tCHARACTER, "\u0123", [0, 8]
1214
+
1215
+ setup_lexer 19
1216
+ assert_scanned '?\\u{a}', :tCHARACTER, "\n", [0, 6]
1217
+ end
1218
+
1219
+ def test_question_eh_multiple_unicode_points
1220
+ setup_lexer 19
1221
+ refute_scanned '?\\u{1 2 3}'
1222
+
1223
+ setup_lexer 19
1224
+ refute_scanned '?\\u{a b}'
1225
+ end
1226
+
1227
+ def test_question_eh_escape_u_unclosed_bracket
1228
+ setup_lexer 19
1229
+
1230
+ refute_scanned '?\\u{123'
1231
+ end
1232
+
1233
+ def test_question_eh_escape_space_around_unicode_point__19
1234
+ setup_lexer 19
1235
+ refute_scanned '"\\u{1 }"'
1236
+
1237
+ setup_lexer 19
1238
+ refute_scanned '"\\u{ 1}"'
1239
+
1240
+ setup_lexer 19
1241
+ refute_scanned '"\\u{ 1 }"'
1242
+
1243
+ setup_lexer 19
1244
+ refute_scanned '"\\u{1 2 }"'
1245
+
1246
+ setup_lexer 19
1247
+ refute_scanned '"\\u{ 1 2}"'
1248
+
1249
+ setup_lexer 19
1250
+ refute_scanned '"\\u{1 2}"'
1251
+ end
1252
+
1253
+ def test_question_eh_escape_space_around_unicode_point__24
1254
+ setup_lexer 24
1255
+ assert_scanned '"\\u{ 1}"', :tSTRING, "\u0001", [0, 8]
1256
+
1257
+ setup_lexer 24
1258
+ assert_scanned '"\\u{1 }"', :tSTRING, "\u0001", [0, 8]
1259
+
1260
+ setup_lexer 24
1261
+ assert_scanned '"\\u{ 1 }"', :tSTRING, "\u0001", [0, 9]
1262
+
1263
+ setup_lexer 24
1264
+ assert_scanned '"\\u{1 2 }"', :tSTRING, "\u0001\u0002", [0, 10]
1265
+
1266
+ setup_lexer 24
1267
+ assert_scanned '"\\u{ 1 2}"', :tSTRING, "\u0001\u0002", [0, 10]
1268
+
1269
+ setup_lexer 24
1270
+ assert_scanned '"\\u{1 2}"', :tSTRING, "\u0001\u0002", [0, 10]
1271
+ end
1272
+
1273
+ def test_integer_hex
1274
+ assert_scanned "0x2a", :tINTEGER, 42, [0, 4]
1275
+ end
1276
+
1277
+ def test_integer_hex_bad_none
1278
+ refute_scanned "0x "
1279
+ end
1280
+
1281
+ def test_integer_hex_bad_underscores
1282
+ refute_scanned "0xab__cd"
1283
+ end
1284
+
1285
+ def test_integer_oct
1286
+ assert_scanned "052", :tINTEGER, 42, [0, 3]
1287
+ end
1288
+
1289
+ def test_integer_oct_bad_range
1290
+ refute_scanned "08"
1291
+ end
1292
+
1293
+ def test_integer_oct_bad_underscores
1294
+ refute_scanned "01__23"
1295
+ end
1296
+
1297
+ def test_integer_oct_O
1298
+ assert_scanned "0O52", :tINTEGER, 42, [0, 4]
1299
+ end
1300
+
1301
+ def test_integer_oct_O_bad_range
1302
+ refute_scanned "0O1238"
1303
+ end
1304
+
1305
+ def test_integer_oct_O_bad_underscores
1306
+ refute_scanned "0O1__23"
1307
+ end
1308
+
1309
+ def test_integer_oct_O_not_bad_none
1310
+ assert_scanned "0O ", :tINTEGER, 0, [0, 2]
1311
+ end
1312
+
1313
+ def test_integer_oct_o
1314
+ assert_scanned "0o52", :tINTEGER, 42, [0, 4]
1315
+ end
1316
+
1317
+ def test_integer_oct_o_bad_range
1318
+ refute_scanned "0o1283"
1319
+ end
1320
+
1321
+ def test_integer_oct_o_bad_underscores
1322
+ refute_scanned "0o1__23"
1323
+ end
1324
+
1325
+ def test_integer_oct_o_not_bad_none
1326
+ assert_scanned "0o ", :tINTEGER, 0, [0, 2]
1327
+ end
1328
+
1329
+ def test_integer_trailing
1330
+ assert_scanned("1.to_s",
1331
+ :tINTEGER, 1, [0, 1],
1332
+ :tDOT, '.', [1, 2],
1333
+ :tIDENTIFIER, 'to_s', [2, 6])
1334
+ end
1335
+
1336
+ def test_integer_underscore
1337
+ assert_scanned "4_2", :tINTEGER, 42, [0, 3]
1338
+ end
1339
+
1340
+ def test_integer_underscore_bad
1341
+ refute_scanned "4__2"
1342
+ end
1343
+
1344
+ def test_integer_zero
1345
+ assert_scanned "0", :tINTEGER, 0, [0, 1]
1346
+ end
1347
+
1348
+ def test_ivar
1349
+ assert_scanned "@blah", :tIVAR, "@blah", [0, 5]
1350
+ end
1351
+
1352
+ def test_ivar_bad
1353
+ refute_scanned "@1"
1354
+ end
1355
+
1356
+ def test_ivar_bad_0_length
1357
+ refute_scanned "1+@\n", :tINTEGER, 1, [0, 1], :tPLUS, "+", [1, 2]
1358
+ end
1359
+
1360
+ def test_keyword_expr
1361
+ @lex.state = :expr_endarg
1362
+
1363
+ assert_scanned "if", :kIF_MOD, "if", [0, 2]
1364
+
1365
+ assert_equal :expr_beg, @lex.state
1366
+ end
1367
+
1368
+ def test_lt
1369
+ assert_scanned "<", :tLT, "<", [0, 1]
1370
+ end
1371
+
1372
+ def test_lt2
1373
+ assert_scanned("a <\< b",
1374
+ :tIDENTIFIER, "a", [0, 1],
1375
+ :tLSHFT, "<\<", [2, 4],
1376
+ :tIDENTIFIER, "b", [5, 6])
1377
+
1378
+ end
1379
+
1380
+ def test_lt2_equals
1381
+ assert_scanned("a <\<= b",
1382
+ :tIDENTIFIER, "a", [0, 1],
1383
+ :tOP_ASGN, "<\<", [2, 5],
1384
+ :tIDENTIFIER, "b", [6, 7])
1385
+ end
1386
+
1387
+ def test_lt_equals
1388
+ assert_scanned "<=", :tLEQ, "<=", [0, 2]
1389
+ end
1390
+
1391
+ def test_minus
1392
+ assert_scanned("1 - 2",
1393
+ :tINTEGER, 1, [0, 1],
1394
+ :tMINUS, "-", [2, 3],
1395
+ :tINTEGER, 2, [4, 5])
1396
+ end
1397
+
1398
+ def test_minus_equals
1399
+ @lex.state = :expr_end
1400
+
1401
+ assert_scanned "-=", :tOP_ASGN, "-", [0, 2]
1402
+ end
1403
+
1404
+ def test_minus_method
1405
+ @lex.state = :expr_fname
1406
+ assert_scanned "-", :tMINUS, "-", [0, 1]
1407
+ end
1408
+
1409
+ def test_minus_unary_method
1410
+ @lex.state = :expr_fname
1411
+ assert_scanned "-@", :tUMINUS, "-@", [0, 2]
1412
+ end
1413
+
1414
+ def test_minus_unary_number
1415
+ assert_scanned("-42",
1416
+ :tUNARY_NUM, "-", [0, 1],
1417
+ :tINTEGER, 42, [1, 3])
1418
+ end
1419
+
1420
+ def test_minus_unary_whitespace_number
1421
+ assert_scanned("- 42",
1422
+ :tUNARY_NUM, "-", [0, 1],
1423
+ :tINTEGER, 42, [2, 4])
1424
+ end
1425
+
1426
+ def test_nth_ref
1427
+ assert_scanned('[$1, $2, $3]',
1428
+ :tLBRACK, "[", [0, 1],
1429
+ :tNTH_REF, 1, [1, 3], :tCOMMA, ",", [3, 4],
1430
+ :tNTH_REF, 2, [5, 7], :tCOMMA, ",", [7, 8],
1431
+ :tNTH_REF, 3, [9, 11],
1432
+ :tRBRACK, "]", [11, 12])
1433
+ end
1434
+
1435
+ def test_open_bracket
1436
+ assert_scanned("(", :tLPAREN, "(", [0, 1])
1437
+ end
1438
+
1439
+ def test_open_bracket_cmdarg
1440
+ assert_scanned("m (", :tIDENTIFIER, "m", [0, 1],
1441
+ :tLPAREN_ARG, "(", [2, 3])
1442
+ end
1443
+
1444
+ def test_open_bracket_exprarg
1445
+ assert_scanned("m(", :tIDENTIFIER, "m", [0, 1],
1446
+ :tLPAREN2, "(", [1, 2])
1447
+ end
1448
+
1449
+ def test_open_curly_bracket
1450
+ assert_scanned("{",
1451
+ :tLBRACE, "{", [0, 1])
1452
+ end
1453
+
1454
+ def test_open_curly_bracket_arg
1455
+ assert_scanned("m { 3 }",
1456
+ :tIDENTIFIER, "m", [0, 1],
1457
+ :tLCURLY, "{", [2, 3],
1458
+ :tINTEGER, 3, [4, 5],
1459
+ :tRCURLY, "}", [6, 7])
1460
+ end
1461
+
1462
+ def test_open_curly_bracket_block
1463
+ @lex.state = :expr_endarg # seen m(3)
1464
+
1465
+ assert_scanned("{ 4 }",
1466
+ :tLBRACE_ARG, "{", [0, 1],
1467
+ :tINTEGER, 4, [2, 3],
1468
+ :tRCURLY, "}", [4, 5])
1469
+ end
1470
+
1471
+ def test_open_square_bracket_arg
1472
+ assert_scanned("m [ 3 ]",
1473
+ :tIDENTIFIER, "m", [0, 1],
1474
+ :tLBRACK, "[", [2, 3],
1475
+ :tINTEGER, 3, [4, 5],
1476
+ :tRBRACK, "]", [6, 7])
1477
+ end
1478
+
1479
+ def test_open_square_bracket_ary
1480
+ assert_scanned("[1, 2, 3]",
1481
+ :tLBRACK, "[", [0, 1],
1482
+ :tINTEGER, 1, [1, 2],
1483
+ :tCOMMA, ",", [2, 3],
1484
+ :tINTEGER, 2, [4, 5],
1485
+ :tCOMMA, ",", [5, 6],
1486
+ :tINTEGER, 3, [7, 8],
1487
+ :tRBRACK, "]", [8, 9])
1488
+ end
1489
+
1490
+ def test_open_square_bracket_meth
1491
+ assert_scanned("m[3]",
1492
+ :tIDENTIFIER, "m", [0, 1],
1493
+ :tLBRACK2, "[", [1, 2],
1494
+ :tINTEGER, 3, [2, 3],
1495
+ :tRBRACK, "]", [3, 4])
1496
+ end
1497
+
1498
+ def test_or
1499
+ assert_scanned "|", :tPIPE, "|", [0, 1]
1500
+ end
1501
+
1502
+ def test_or2
1503
+ assert_scanned "||", :tOROP, "||", [0, 2]
1504
+ end
1505
+
1506
+ def test_or2_equals
1507
+ assert_scanned "||=", :tOP_ASGN, "||", [0, 3]
1508
+ end
1509
+
1510
+ def test_or_equals
1511
+ assert_scanned "|=", :tOP_ASGN, "|", [0, 2]
1512
+ end
1513
+
1514
+ def test_percent
1515
+ assert_scanned("a % 2",
1516
+ :tIDENTIFIER, "a", [0, 1],
1517
+ :tPERCENT, "%", [2, 3],
1518
+ :tINTEGER, 2, [4, 5])
1519
+ end
1520
+
1521
+ def test_percent_equals
1522
+ assert_scanned("a %= 2",
1523
+ :tIDENTIFIER, "a", [0, 1],
1524
+ :tOP_ASGN, "%", [2, 4],
1525
+ :tINTEGER, 2, [5, 6])
1526
+ end
1527
+
1528
+ def test_plus
1529
+ assert_scanned("1 + 1",
1530
+ :tINTEGER, 1, [0, 1],
1531
+ :tPLUS, "+", [2, 3],
1532
+ :tINTEGER, 1, [4, 5])
1533
+ end
1534
+
1535
+ def test_plus_equals
1536
+ @lex.state = :expr_end
1537
+
1538
+ assert_scanned "+=", :tOP_ASGN, "+", [0, 2]
1539
+ end
1540
+
1541
+ def test_plus_method
1542
+ @lex.state = :expr_fname
1543
+ assert_scanned "+", :tPLUS, "+", [0, 1]
1544
+ end
1545
+
1546
+ def test_plus_unary_method
1547
+ @lex.state = :expr_fname
1548
+ assert_scanned "+@", :tUPLUS, "+@", [0, 2]
1549
+ end
1550
+
1551
+ def test_plus_unary_number
1552
+ assert_scanned("+42",
1553
+ :tUNARY_NUM, "+", [0, 1],
1554
+ :tINTEGER, 42, [1, 3])
1555
+ end
1556
+
1557
+ def test_plus_unary_whitespace_number
1558
+ assert_scanned("+ 42",
1559
+ :tUNARY_NUM, "+", [0, 1],
1560
+ :tINTEGER, 42, [2, 4])
1561
+ end
1562
+
1563
+ def test_numbers
1564
+ assert_scanned "0b10", :tINTEGER, 2, [0, 4]
1565
+ assert_scanned "0B10", :tINTEGER, 2, [0, 4]
1566
+
1567
+ assert_scanned "0d10", :tINTEGER, 10, [0, 4]
1568
+ assert_scanned "0D10", :tINTEGER, 10, [0, 4]
1569
+
1570
+ assert_scanned "0x10", :tINTEGER, 16, [0, 4]
1571
+ assert_scanned "0X10", :tINTEGER, 16, [0, 4]
1572
+
1573
+ assert_scanned "0o10", :tINTEGER, 8, [0, 4]
1574
+ assert_scanned "0O10", :tINTEGER, 8, [0, 4]
1575
+ assert_scanned "0o", :tINTEGER, 0, [0, 2]
1576
+ assert_scanned "0O", :tINTEGER, 0, [0, 2]
1577
+
1578
+ assert_scanned "0o", :tINTEGER, 0, [0, 2]
1579
+ assert_scanned "0O", :tINTEGER, 0, [0, 2]
1580
+
1581
+ assert_scanned "0777_333", :tINTEGER, 261851, [0, 8]
1582
+
1583
+ assert_scanned "0", :tINTEGER, 0, [0, 1]
1584
+
1585
+ refute_scanned "0x"
1586
+ refute_scanned "0X"
1587
+ refute_scanned "0b"
1588
+ refute_scanned "0B"
1589
+ refute_scanned "0d"
1590
+ refute_scanned "0D"
1591
+
1592
+ refute_scanned "08"
1593
+ refute_scanned "09"
1594
+ refute_scanned "0o8"
1595
+ refute_scanned "0o9"
1596
+ refute_scanned "0O8"
1597
+ refute_scanned "0O9"
1598
+
1599
+ refute_scanned "1_e1"
1600
+ refute_scanned "1_.1"
1601
+ refute_scanned "1__1"
1602
+
1603
+ refute_scanned "1end"
1604
+ refute_scanned "1.1end"
1605
+ end
1606
+
1607
+ def test_question__18
1608
+ setup_lexer 18
1609
+
1610
+ assert_scanned "?*", :tINTEGER, 42, [0, 2]
1611
+ end
1612
+
1613
+ def test_question__19
1614
+ setup_lexer 19
1615
+
1616
+ assert_scanned "?*", :tCHARACTER, "*", [0, 2]
1617
+ end
1618
+
1619
+ def test_question_bad_eos
1620
+ refute_scanned "?"
1621
+ end
1622
+
1623
+ def test_question_bad_ws
1624
+ assert_scanned "? ", :tEH, "?", [0, 1]
1625
+ assert_scanned "?\n", :tEH, "?", [0, 1]
1626
+ assert_scanned "?\t", :tEH, "?", [0, 1]
1627
+ assert_scanned "?\v", :tEH, "?", [0, 1]
1628
+ assert_scanned "?\r", :tEH, "?", [0, 1]
1629
+ assert_scanned "?\f", :tEH, "?", [0, 1]
1630
+ end
1631
+
1632
+ def test_question_ws_backslashed__18
1633
+ setup_lexer 18
1634
+
1635
+ @lex.state = :expr_beg
1636
+ assert_scanned "?\\ ", :tINTEGER, 32, [0, 3]
1637
+ @lex.state = :expr_beg
1638
+ assert_scanned "?\\n", :tINTEGER, 10, [0, 3]
1639
+ @lex.state = :expr_beg
1640
+ assert_scanned "?\\t", :tINTEGER, 9, [0, 3]
1641
+ @lex.state = :expr_beg
1642
+ assert_scanned "?\\v", :tINTEGER, 11, [0, 3]
1643
+ @lex.state = :expr_beg
1644
+ assert_scanned "?\\r", :tINTEGER, 13, [0, 3]
1645
+ @lex.state = :expr_beg
1646
+ assert_scanned "?\\f", :tINTEGER, 12, [0, 3]
1647
+ end
1648
+
1649
+ def test_question_ws_backslashed__19
1650
+ setup_lexer 19
1651
+
1652
+ @lex.state = :expr_beg
1653
+ assert_scanned "?\\ ", :tCHARACTER, " ", [0, 3]
1654
+ @lex.state = :expr_beg
1655
+ assert_scanned "?\\n", :tCHARACTER, "\n", [0, 3]
1656
+ @lex.state = :expr_beg
1657
+ assert_scanned "?\\t", :tCHARACTER, "\t", [0, 3]
1658
+ @lex.state = :expr_beg
1659
+ assert_scanned "?\\v", :tCHARACTER, "\v", [0, 3]
1660
+ @lex.state = :expr_beg
1661
+ assert_scanned "?\\r", :tCHARACTER, "\r", [0, 3]
1662
+ @lex.state = :expr_beg
1663
+ assert_scanned "?\\f", :tCHARACTER, "\f", [0, 3]
1664
+ end
1665
+
1666
+ def test_rbracket
1667
+ assert_scanned "]", :tRBRACK, "]", [0, 1]
1668
+ end
1669
+
1670
+ def test_rcurly
1671
+ assert_scanned "}", :tRCURLY, "}", [0, 1]
1672
+ end
1673
+
1674
+ def test_regexp
1675
+ assert_scanned("/regexp/",
1676
+ :tREGEXP_BEG, "/", [0, 1],
1677
+ :tSTRING_CONTENT, "regexp", [1, 7],
1678
+ :tSTRING_END, "/", [7, 8],
1679
+ :tREGEXP_OPT, "", [8, 8])
1680
+ end
1681
+
1682
+ def test_regexp_ambiguous
1683
+ assert_scanned("method /regexp/",
1684
+ :tIDENTIFIER, "method", [0, 6],
1685
+ :tREGEXP_BEG, "/", [7, 8],
1686
+ :tSTRING_CONTENT, "regexp", [8, 14],
1687
+ :tSTRING_END, "/", [14, 15],
1688
+ :tREGEXP_OPT, "", [15, 15])
1689
+ end
1690
+
1691
+ def test_regexp_bad
1692
+ refute_scanned("/.*/xyz",
1693
+ :tREGEXP_BEG, "/", [0, 1],
1694
+ :tSTRING_CONTENT, ".*", [1, 3],
1695
+ :tSTRING_END, "/", [3, 4])
1696
+ end
1697
+
1698
+ def test_regexp_escape_C
1699
+ assert_scanned('/regex\\C-x/',
1700
+ :tREGEXP_BEG, "/", [0, 1],
1701
+ :tSTRING_CONTENT, "regex\\C-x", [1, 10],
1702
+ :tSTRING_END, "/", [10, 11],
1703
+ :tREGEXP_OPT, "", [11, 11])
1704
+ end
1705
+
1706
+ def test_regexp_escape_C_M
1707
+ assert_scanned('/regex\\C-\\M-x/',
1708
+ :tREGEXP_BEG, "/", [0, 1],
1709
+ :tSTRING_CONTENT, "regex\\C-\\M-x", [1, 13],
1710
+ :tSTRING_END, "/", [13, 14],
1711
+ :tREGEXP_OPT, "", [14, 14])
1712
+ end
1713
+
1714
+ def test_regexp_escape_C_M_craaaazy
1715
+ assert_scanned("/regex\\C-\\\n\\M-x/",
1716
+ :tREGEXP_BEG, "/", [0, 1],
1717
+ :tSTRING_CONTENT, "regex\\C-\\M-x", [1, 15],
1718
+ :tSTRING_END, "/", [15, 16],
1719
+ :tREGEXP_OPT, "", [16, 16])
1720
+ end
1721
+
1722
+ def test_regexp_escape_C_bad_dash
1723
+ refute_scanned '/regex\\Cx/', :tREGEXP_BEG, "/", [0, 1]
1724
+ end
1725
+
1726
+ def test_regexp_escape_C_bad_dash_eos
1727
+ refute_scanned '/regex\\C-/', :tREGEXP_BEG, "/", [0, 1]
1728
+ end
1729
+
1730
+ def test_regexp_escape_C_bad_dash_eos2
1731
+ refute_scanned '/regex\\C-', :tREGEXP_BEG, "/", [0, 1]
1732
+ end
1733
+
1734
+ def test_regexp_escape_C_bad_eos
1735
+ refute_scanned '/regex\\C/', :tREGEXP_BEG, "/", [0, 1]
1736
+ end
1737
+
1738
+ def test_regexp_escape_C_bad_eos2
1739
+ refute_scanned '/regex\\c', :tREGEXP_BEG, "/", [0, 1]
1740
+ end
1741
+
1742
+ def test_regexp_escape_M
1743
+ assert_scanned('/regex\\M-x/',
1744
+ :tREGEXP_BEG, "/", [0, 1],
1745
+ :tSTRING_CONTENT, "regex\\M-x", [1, 10],
1746
+ :tSTRING_END, "/", [10, 11],
1747
+ :tREGEXP_OPT, "", [11, 11])
1748
+ end
1749
+
1750
+ def test_regexp_escape_M_C
1751
+ assert_scanned('/regex\\M-\\C-x/',
1752
+ :tREGEXP_BEG, "/", [0, 1],
1753
+ :tSTRING_CONTENT, "regex\\M-\\C-x", [1, 13],
1754
+ :tSTRING_END, "/", [13, 14],
1755
+ :tREGEXP_OPT, "", [14, 14])
1756
+ end
1757
+
1758
+ def test_regexp_escape_M_bad_dash
1759
+ refute_scanned '/regex\\Mx/', :tREGEXP_BEG, "/", [0, 1]
1760
+ end
1761
+
1762
+ def test_regexp_escape_M_bad_dash_eos
1763
+ refute_scanned '/regex\\M-/', :tREGEXP_BEG, "/", [0, 1]
1764
+ end
1765
+
1766
+ def test_regexp_escape_M_bad_dash_eos2
1767
+ refute_scanned '/regex\\M-', :tREGEXP_BEG, "/", [0, 1]
1768
+ end
1769
+
1770
+ def test_regexp_escape_M_bad_eos
1771
+ refute_scanned '/regex\\M/', :tREGEXP_BEG, "/", [0, 1]
1772
+ end
1773
+
1774
+ def test_regexp_escape_backslash_slash
1775
+ assert_scanned('/\\//',
1776
+ :tREGEXP_BEG, "/", [0, 1],
1777
+ :tSTRING_CONTENT, '/', [1, 3],
1778
+ :tSTRING_END, "/", [3, 4],
1779
+ :tREGEXP_OPT, "", [4, 4])
1780
+ end
1781
+
1782
+ def test_regexp_escape_backslash_terminator
1783
+ assert_scanned('%r%blah\\%blah%',
1784
+ :tREGEXP_BEG, "%r%", [0, 3],
1785
+ :tSTRING_CONTENT, "blah%blah", [3, 13],
1786
+ :tSTRING_END, "%", [13, 14],
1787
+ :tREGEXP_OPT, "", [14, 14])
1788
+ end
1789
+
1790
+ def test_regexp_escape_backslash_terminator_meta1
1791
+ assert_scanned('%r{blah\\}blah}',
1792
+ :tREGEXP_BEG, "%r{", [0, 3],
1793
+ :tSTRING_CONTENT, "blah\\}blah", [3, 13],
1794
+ :tSTRING_END, "}", [13, 14],
1795
+ :tREGEXP_OPT, "", [14, 14])
1796
+ end
1797
+
1798
+ def test_regexp_escape_backslash_terminator_meta2
1799
+ assert_scanned('%r/blah\\/blah/',
1800
+ :tREGEXP_BEG, "%r/", [0, 3],
1801
+ :tSTRING_CONTENT, "blah/blah", [3, 13],
1802
+ :tSTRING_END, "/", [13, 14],
1803
+ :tREGEXP_OPT, "", [14, 14])
1804
+ end
1805
+
1806
+ def test_regexp_escape_backslash_terminator_meta3
1807
+ assert_scanned('%r/blah\\%blah/',
1808
+ :tREGEXP_BEG, "%r/", [0, 3],
1809
+ :tSTRING_CONTENT, "blah\\%blah", [3, 13],
1810
+ :tSTRING_END, "/", [13, 14],
1811
+ :tREGEXP_OPT, "", [14, 14])
1812
+ end
1813
+
1814
+ def test_regexp_escape_bad_eos
1815
+ refute_scanned '/regex\\', :tREGEXP_BEG, "/", [0, 1]
1816
+ end
1817
+
1818
+ def test_regexp_escape_bs
1819
+ assert_scanned('/regex\\\\regex/',
1820
+ :tREGEXP_BEG, "/", [0, 1],
1821
+ :tSTRING_CONTENT, "regex\\\\regex", [1, 13],
1822
+ :tSTRING_END, "/", [13, 14],
1823
+ :tREGEXP_OPT, "", [14, 14])
1824
+ end
1825
+
1826
+ def test_regexp_escape_c
1827
+ assert_scanned('/regex\\cxxx/',
1828
+ :tREGEXP_BEG, "/", [0, 1],
1829
+ :tSTRING_CONTENT, "regex\\cxxx", [1, 11],
1830
+ :tSTRING_END, "/", [11, 12],
1831
+ :tREGEXP_OPT, "", [12, 12])
1832
+ end
1833
+
1834
+ def test_regexp_escape_c_backslash
1835
+ assert_scanned('/regex\\c\\n/',
1836
+ :tREGEXP_BEG, "/", [0, 1],
1837
+ :tSTRING_CONTENT, "regex\\c\\n", [1, 10],
1838
+ :tSTRING_END, "/", [10, 11],
1839
+ :tREGEXP_OPT, "", [11, 11])
1840
+ end
1841
+
1842
+ def test_regexp_escape_chars
1843
+ assert_scanned('/re\\tge\\nxp/',
1844
+ :tREGEXP_BEG, "/", [0, 1],
1845
+ :tSTRING_CONTENT, "re\\tge\\nxp", [1, 11],
1846
+ :tSTRING_END, "/", [11, 12],
1847
+ :tREGEXP_OPT, "", [12, 12])
1848
+ end
1849
+
1850
+ def test_regexp_escape_double_backslash
1851
+ assert_scanned('/[\\/\\\\]$/',
1852
+ :tREGEXP_BEG, "/", [0, 1],
1853
+ :tSTRING_CONTENT,'[/\\\\]$', [1, 8],
1854
+ :tSTRING_END, "/", [8, 9],
1855
+ :tREGEXP_OPT, "", [9, 9])
1856
+ end
1857
+
1858
+ def test_regexp_escape_hex
1859
+ assert_scanned('/regex\\x61xp/',
1860
+ :tREGEXP_BEG, "/", [0, 1],
1861
+ :tSTRING_CONTENT, "regex\\x61xp", [1, 12],
1862
+ :tSTRING_END, "/", [12, 13],
1863
+ :tREGEXP_OPT, "", [13, 13])
1864
+ end
1865
+
1866
+ def test_regexp_escape_hex_bad
1867
+ refute_scanned '/regex\\xzxp/', :tREGEXP_BEG, "/", [0, 1]
1868
+ end
1869
+
1870
+ def test_regexp_escape_hex_one
1871
+ assert_scanned('/^[\\xd\\xa]{2}/on',
1872
+ :tREGEXP_BEG, '/', [0, 1],
1873
+ :tSTRING_CONTENT, '^[\\xd\\xa]{2}', [1, 13],
1874
+ :tSTRING_END, "/", [13, 14],
1875
+ :tREGEXP_OPT, 'on', [14, 16])
1876
+ end
1877
+
1878
+ def test_regexp_escape_oct1
1879
+ assert_scanned('/regex\\0xp/',
1880
+ :tREGEXP_BEG, "/", [0, 1],
1881
+ :tSTRING_CONTENT, "regex\\0xp", [1, 10],
1882
+ :tSTRING_END, "/", [10, 11],
1883
+ :tREGEXP_OPT, "", [11, 11])
1884
+ end
1885
+
1886
+ def test_regexp_escape_oct2
1887
+ assert_scanned('/regex\\07xp/',
1888
+ :tREGEXP_BEG, "/", [0, 1],
1889
+ :tSTRING_CONTENT, "regex\\07xp", [1, 11],
1890
+ :tSTRING_END, "/", [11, 12],
1891
+ :tREGEXP_OPT, "", [12, 12])
1892
+ end
1893
+
1894
+ def test_regexp_escape_oct3
1895
+ assert_scanned('/regex\\10142/',
1896
+ :tREGEXP_BEG, "/", [0, 1],
1897
+ :tSTRING_CONTENT, "regex\\10142", [1, 12],
1898
+ :tSTRING_END, "/", [12, 13],
1899
+ :tREGEXP_OPT, "", [13, 13])
1900
+ end
1901
+
1902
+ def test_regexp_escape_return
1903
+ assert_scanned("/regex\\\nregex/",
1904
+ :tREGEXP_BEG, "/", [0, 1],
1905
+ :tSTRING_CONTENT, "regexregex", [1, 13],
1906
+ :tSTRING_END, "/", [13, 14],
1907
+ :tREGEXP_OPT, "", [14, 14])
1908
+ end
1909
+
1910
+ def test_regexp_escape_delimiter_meta
1911
+ assert_scanned("%r(\\))",
1912
+ :tREGEXP_BEG, "%r(", [0, 3],
1913
+ :tSTRING_CONTENT, "\\)", [3, 5],
1914
+ :tSTRING_END, ")", [5, 6],
1915
+ :tREGEXP_OPT, "", [6, 6])
1916
+ end
1917
+
1918
+ def test_regexp_escape_delimiter_nonmeta
1919
+ assert_scanned("%r'\\''",
1920
+ :tREGEXP_BEG, "%r'", [0, 3],
1921
+ :tSTRING_CONTENT, "'", [3, 5],
1922
+ :tSTRING_END, "'", [5, 6],
1923
+ :tREGEXP_OPT, "", [6, 6])
1924
+ end
1925
+
1926
+ def test_regexp_escape_other_meta
1927
+ assert_scanned("/\\.\\$\\*\\+\\.\\?\\|/",
1928
+ :tREGEXP_BEG, "/", [0, 1],
1929
+ :tSTRING_CONTENT, "\\.\\$\\*\\+\\.\\?\\|", [1, 15],
1930
+ :tSTRING_END, "/", [15, 16],
1931
+ :tREGEXP_OPT, "", [16, 16])
1932
+ end
1933
+
1934
+ def test_regexp_nm
1935
+ assert_scanned("/.*/nm",
1936
+ :tREGEXP_BEG, "/", [0, 1],
1937
+ :tSTRING_CONTENT, ".*", [1, 3],
1938
+ :tSTRING_END, "/", [3, 4],
1939
+ :tREGEXP_OPT, "nm", [4, 6])
1940
+ end
1941
+
1942
+ def test_rparen
1943
+ assert_scanned ")", :tRPAREN, ")", [0, 1]
1944
+ end
1945
+
1946
+ def test_rshft
1947
+ assert_scanned("a >> 2",
1948
+ :tIDENTIFIER, "a", [0, 1],
1949
+ :tRSHFT, ">>", [2, 4],
1950
+ :tINTEGER, 2, [5, 6])
1951
+ end
1952
+
1953
+ def test_rshft_equals
1954
+ assert_scanned("a >>= 2",
1955
+ :tIDENTIFIER, "a", [0, 1],
1956
+ :tOP_ASGN, ">>", [2, 5],
1957
+ :tINTEGER, 2, [6, 7])
1958
+ end
1959
+
1960
+ def test_star
1961
+ assert_scanned("a * ",
1962
+ :tIDENTIFIER, "a", [0, 1],
1963
+ :tSTAR2, "*", [2, 3])
1964
+
1965
+ assert_equal :expr_value, @lex.state
1966
+ end
1967
+
1968
+ def test_star2
1969
+ assert_scanned("a ** ",
1970
+ :tIDENTIFIER, "a", [0, 1],
1971
+ :tPOW, "**", [2, 4])
1972
+
1973
+ assert_equal :expr_value, @lex.state
1974
+ end
1975
+
1976
+ def test_star2_equals
1977
+ assert_scanned("a **= ",
1978
+ :tIDENTIFIER, "a", [0, 1],
1979
+ :tOP_ASGN, "**", [2, 5])
1980
+
1981
+ assert_equal :expr_beg, @lex.state
1982
+ end
1983
+
1984
+ def test_star2_beg
1985
+ assert_scanned("** ",
1986
+ :tDSTAR, "**", [0, 2])
1987
+
1988
+ assert_equal :expr_beg, @lex.state
1989
+ end
1990
+
1991
+ def test_star_arg
1992
+ @lex.state = :expr_arg
1993
+
1994
+ assert_scanned(" *a",
1995
+ :tSTAR, "*", [1, 2],
1996
+ :tIDENTIFIER, "a", [2, 3])
1997
+
1998
+ assert_equal :expr_arg, @lex.state
1999
+ end
2000
+
2001
+ def test_star_arg_beg
2002
+ @lex.state = :expr_beg
2003
+
2004
+ assert_scanned("*a",
2005
+ :tSTAR, "*", [0, 1],
2006
+ :tIDENTIFIER, "a", [1, 2])
2007
+
2008
+ assert_equal :expr_arg, @lex.state
2009
+ end
2010
+
2011
+ def test_star_arg_beg_fname
2012
+ @lex.state = :expr_fname
2013
+
2014
+ assert_scanned("*a",
2015
+ :tSTAR2, "*", [0, 1],
2016
+ :tIDENTIFIER, "a", [1, 2])
2017
+
2018
+ assert_equal :expr_arg, @lex.state
2019
+ end
2020
+
2021
+ def test_star_equals
2022
+ assert_scanned("a *= ",
2023
+ :tIDENTIFIER, "a", [0, 1],
2024
+ :tOP_ASGN, "*", [2, 4])
2025
+
2026
+ assert_equal :expr_beg, @lex.state
2027
+ end
2028
+
2029
+ def test_string_bad_eos
2030
+ refute_scanned('%',
2031
+ :tSTRING_BEG, '%', [0, 1])
2032
+ end
2033
+
2034
+ def test_string_bad_eos_quote
2035
+ refute_scanned('%{nest',
2036
+ :tSTRING_BEG, '%}', [0, 2])
2037
+ end
2038
+
2039
+ def test_string_double
2040
+ assert_scanned('"string"',
2041
+ :tSTRING, "string", [0, 8])
2042
+ end
2043
+
2044
+ def test_string_double_escape_C
2045
+ assert_scanned('"\\C-a"',
2046
+ :tSTRING, "\001", [0, 6])
2047
+ end
2048
+
2049
+ def test_string_double_escape_C_backslash
2050
+ assert_scanned('"\\C-\\\\"',
2051
+ :tSTRING, "\034", [0, 7])
2052
+ end
2053
+
2054
+ def test_string_double_escape_C_escape
2055
+ assert_scanned('"\\C-\\M-a"',
2056
+ :tSTRING, "\201", [0, 9])
2057
+ end
2058
+
2059
+ def test_string_double_escape_C_question
2060
+ assert_scanned('"\\C-?"',
2061
+ :tSTRING, "\177", [0, 6])
2062
+ end
2063
+
2064
+ def test_string_double_escape_M
2065
+ assert_scanned('"\\M-a"',
2066
+ :tSTRING, "\341", [0, 6])
2067
+ end
2068
+
2069
+ def test_string_double_escape_M_backslash
2070
+ assert_scanned('"\\M-\\\\"',
2071
+ :tSTRING, "\334", [0, 7])
2072
+ end
2073
+
2074
+ def test_string_double_escape_M_escape
2075
+ assert_scanned('"\\M-\\C-a"',
2076
+ :tSTRING, "\201", [0, 9])
2077
+ end
2078
+
2079
+ def test_string_double_escape_bs1
2080
+ assert_scanned('"a\\a\\a"',
2081
+ :tSTRING, "a\a\a", [0, 7])
2082
+ end
2083
+
2084
+ def test_string_double_escape_bs2
2085
+ assert_scanned('"a\\\\a"',
2086
+ :tSTRING, "a\\a", [0, 6])
2087
+ end
2088
+
2089
+ def test_string_double_escape_c
2090
+ assert_scanned('"\\ca"',
2091
+ :tSTRING, "\001", [0, 5])
2092
+ end
2093
+
2094
+ def test_string_double_escape_c_escape
2095
+ assert_scanned('"\\c\\M-a"',
2096
+ :tSTRING, "\201", [0, 8])
2097
+ end
2098
+
2099
+ def test_string_double_escape_c_question
2100
+ assert_scanned('"\\c?"',
2101
+ :tSTRING, "\177", [0, 5])
2102
+ end
2103
+
2104
+ def test_string_double_escape_chars
2105
+ assert_scanned('"s\\tri\\ng"',
2106
+ :tSTRING, "s\tri\ng", [0, 10])
2107
+ end
2108
+
2109
+ def test_string_double_escape_hex
2110
+ assert_scanned('"n = \\x61\\x62\\x63"',
2111
+ :tSTRING, "n = abc", [0, 18])
2112
+ end
2113
+
2114
+ def test_string_double_escape_octal
2115
+ assert_scanned('"n = \\101\\102\\103"',
2116
+ :tSTRING, "n = ABC", [0, 18])
2117
+ end
2118
+
2119
+ def test_string_double_escape_octal_wrap
2120
+ assert_scanned('"\\753"',
2121
+ :tSTRING, "\xEB", [0, 6])
2122
+ end
2123
+
2124
+ def test_string_double_interp
2125
+ assert_scanned("\"blah #x a \#@a b \#$b c \#{3} # \"",
2126
+ :tSTRING_BEG, "\"", [0, 1],
2127
+ :tSTRING_CONTENT, "blah #x a ", [1, 11],
2128
+ :tSTRING_DVAR, nil, [11, 12],
2129
+ :tIVAR, "@a", [12, 14],
2130
+ :tSTRING_CONTENT, " b ", [14, 17],
2131
+ :tSTRING_DVAR, nil, [17, 18],
2132
+ :tGVAR, "$b", [18, 20],
2133
+ :tSTRING_CONTENT, " c ", [20, 23],
2134
+ :tSTRING_DBEG, '#{', [23, 25],
2135
+ :tINTEGER, 3, [25, 26],
2136
+ :tRCURLY, "}", [26, 27],
2137
+ :tSTRING_CONTENT, " # ", [27, 30],
2138
+ :tSTRING_END, "\"", [30, 31])
2139
+ end
2140
+
2141
+ def test_string_double_interp_label
2142
+ assert_scanned('"#{foo:bar}"',
2143
+ :tSTRING_BEG, '"', [0, 1],
2144
+ :tSTRING_DBEG, '#{', [1, 3],
2145
+ :tIDENTIFIER, 'foo', [3, 6],
2146
+ :tSYMBOL, 'bar', [6, 10],
2147
+ :tRCURLY, '}', [10, 11],
2148
+ :tSTRING_END, '"', [11, 12])
2149
+ end
2150
+
2151
+ def test_string_double_nested_curlies
2152
+ assert_scanned('%{nest{one{two}one}nest}',
2153
+ :tSTRING_BEG, '%{', [0, 2],
2154
+ :tSTRING_CONTENT, "nest{one{two}one}nest", [2, 23],
2155
+ :tSTRING_END, '}', [23, 24])
2156
+ end
2157
+
2158
+ def test_string_double_no_interp
2159
+ assert_scanned("\"# blah\"", # pound first
2160
+ :tSTRING, "# blah", [0, 8])
2161
+
2162
+ assert_scanned("\"blah # blah\"", # pound not first
2163
+ :tSTRING, "blah # blah", [0, 13])
2164
+ end
2165
+
2166
+ def test_string_escape_x_single
2167
+ assert_scanned('"\\x0"',
2168
+ :tSTRING, "\000", [0, 5])
2169
+ end
2170
+
2171
+ def test_string_pct_Q
2172
+ assert_scanned("%Q[s1 s2]",
2173
+ :tSTRING_BEG, '%Q[', [0, 3],
2174
+ :tSTRING_CONTENT, "s1 s2", [3, 8],
2175
+ :tSTRING_END, ']', [8, 9])
2176
+ end
2177
+
2178
+ def test_string_pct_W
2179
+ assert_scanned("%W[s1 s2\ns3]",
2180
+ :tWORDS_BEG, "%W[", [0, 3],
2181
+ :tSTRING_CONTENT, "s1", [3, 5],
2182
+ :tSPACE, nil, [5, 6],
2183
+ :tSTRING_CONTENT, "s2", [6, 8],
2184
+ :tSPACE, nil, [8, 9],
2185
+ :tSTRING_CONTENT, "s3", [9, 11],
2186
+ :tSPACE, nil, [11, 11],
2187
+ :tSTRING_END, ']', [11, 12])
2188
+ end
2189
+
2190
+ def test_string_pct_W_bs_nl
2191
+ assert_scanned("%W[s1 \\\ns2]",
2192
+ :tWORDS_BEG, "%W[", [0, 3],
2193
+ :tSTRING_CONTENT, "s1", [3, 5],
2194
+ :tSPACE, nil, [5, 6],
2195
+ :tSTRING_CONTENT, "\ns2", [6, 10],
2196
+ :tSPACE, nil, [10, 10],
2197
+ :tSTRING_END, ']', [10, 11])
2198
+ end
2199
+
2200
+ def test_string_pct_W_interp
2201
+ assert_scanned('%W[#{1}#{2} #@a]',
2202
+ :tWORDS_BEG, '%W[', [0, 3],
2203
+ :tSTRING_DBEG, '#{', [3, 5],
2204
+ :tINTEGER, 1, [5, 6],
2205
+ :tRCURLY, '}', [6, 7],
2206
+ :tSTRING_DBEG, '#{', [7, 9],
2207
+ :tINTEGER, 2, [9, 10],
2208
+ :tRCURLY, '}', [10, 11],
2209
+ :tSPACE, nil, [11, 12],
2210
+ :tSTRING_DVAR, nil, [12, 13],
2211
+ :tIVAR, '@a', [13, 15],
2212
+ :tSPACE, nil, [15, 15],
2213
+ :tSTRING_END, ']', [15, 16])
2214
+ end
2215
+
2216
+ def test_string_pct_I
2217
+ assert_scanned("%I(s1 s2)",
2218
+ :tSYMBOLS_BEG, "%I(", [0, 3],
2219
+ :tSTRING_CONTENT, "s1", [3, 5],
2220
+ :tSPACE, nil, [5, 6],
2221
+ :tSTRING_CONTENT, "s2", [6, 8],
2222
+ :tSPACE, nil, [8, 8],
2223
+ :tSTRING_END, ')', [8, 9])
2224
+ end
2225
+
2226
+ def test_string_pct_angle
2227
+ assert_scanned("%<blah>",
2228
+ :tSTRING_BEG, '%<', [0, 2],
2229
+ :tSTRING_CONTENT, "blah", [2, 6],
2230
+ :tSTRING_END, '>', [6, 7])
2231
+ end
2232
+
2233
+ def test_string_pct_pct
2234
+ assert_scanned("%%blah%",
2235
+ :tSTRING_BEG, '%%', [0, 2],
2236
+ :tSTRING_CONTENT, "blah", [2, 6],
2237
+ :tSTRING_END, '%', [6, 7])
2238
+ end
2239
+
2240
+ def test_string_pct_w
2241
+ assert_scanned("%w[s1 s2 ]",
2242
+ :tQWORDS_BEG, "%w[", [0, 3],
2243
+ :tSTRING_CONTENT, "s1", [3, 5],
2244
+ :tSPACE, nil, [5, 6],
2245
+ :tSTRING_CONTENT, "s2", [6, 8],
2246
+ :tSPACE, nil, [8, 9],
2247
+ :tSTRING_END, "]", [9, 10])
2248
+ end
2249
+
2250
+ def test_string_pct_w_incomplete
2251
+ refute_scanned("%w[s1 ",
2252
+ :tQWORDS_BEG, "%w[", [0, 3],
2253
+ :tSTRING_CONTENT, "s1", [3, 5],
2254
+ :tSPACE, nil, [5, 6])
2255
+ end
2256
+
2257
+ def test_string_pct_w_bs_nl
2258
+ assert_scanned("%w[s1 \\\ns2]",
2259
+ :tQWORDS_BEG, "%w[", [0, 3],
2260
+ :tSTRING_CONTENT, "s1", [3, 5],
2261
+ :tSPACE, nil, [5, 6],
2262
+ :tSTRING_CONTENT, "\ns2", [6, 10],
2263
+ :tSPACE, nil, [10, 10],
2264
+ :tSTRING_END, ']', [10, 11])
2265
+ end
2266
+
2267
+ def test_string_pct_w_bs_sp
2268
+ assert_scanned("%w[s\\ 1 s\\ 2]",
2269
+ :tQWORDS_BEG, "%w[", [0, 3],
2270
+ :tSTRING_CONTENT, "s 1", [3, 7],
2271
+ :tSPACE, nil, [7, 8],
2272
+ :tSTRING_CONTENT, "s 2", [8, 12],
2273
+ :tSPACE, nil, [12, 12],
2274
+ :tSTRING_END, ']', [12, 13])
2275
+ end
2276
+
2277
+ def test_string_pct_w_tab
2278
+ assert_scanned("%w[abc\tdef]",
2279
+ :tQWORDS_BEG, "%w[", [0, 3],
2280
+ :tSTRING_CONTENT, "abc", [3, 6],
2281
+ :tSPACE, nil, [6, 7],
2282
+ :tSTRING_CONTENT, "def", [7, 10],
2283
+ :tSPACE, nil, [10, 10],
2284
+ :tSTRING_END, ']', [10, 11])
2285
+ end
2286
+
2287
+ def test_string_pct_i
2288
+ assert_scanned("%i(s1 s2)",
2289
+ :tQSYMBOLS_BEG, "%i(", [0, 3],
2290
+ :tSTRING_CONTENT, "s1", [3, 5],
2291
+ :tSPACE, nil, [5, 6],
2292
+ :tSTRING_CONTENT, "s2", [6, 8],
2293
+ :tSPACE, nil, [8, 8],
2294
+ :tSTRING_END, ')', [8, 9])
2295
+ end
2296
+
2297
+ def test_string_pct_backslash
2298
+ assert_scanned("%\\a\\",
2299
+ :tSTRING_BEG, "%\\", [0, 2],
2300
+ :tSTRING_CONTENT, "a", [2, 3],
2301
+ :tSTRING_END, "\\", [3, 4])
2302
+ end
2303
+
2304
+ def test_string_pct_w_backslash
2305
+ assert_scanned("%w\\s1 s2 \\",
2306
+ :tQWORDS_BEG, "%w\\", [0, 3],
2307
+ :tSTRING_CONTENT, "s1", [3, 5],
2308
+ :tSPACE, nil, [5, 6],
2309
+ :tSTRING_CONTENT, "s2", [6, 8],
2310
+ :tSPACE, nil, [8, 9],
2311
+ :tSTRING_END, "\\", [9, 10])
2312
+ end
2313
+
2314
+ def test_string_pct_w_backslash_nl
2315
+ assert_scanned("%w\\s1 s2 \\\n",
2316
+ :tQWORDS_BEG, "%w\\", [0, 3],
2317
+ :tSTRING_CONTENT, "s1", [3, 5],
2318
+ :tSPACE, nil, [5, 6],
2319
+ :tSTRING_CONTENT, "s2", [6, 8],
2320
+ :tSPACE, nil, [8, 9],
2321
+ :tSTRING_END, "\\", [9, 10],
2322
+ :tNL, nil, [10, 11])
2323
+ end
2324
+
2325
+ def test_string_pct_w_backslash_interp_nl
2326
+ assert_scanned("%W\\blah #x a \#@a b \#$b c \#{3} # \\",
2327
+ :tWORDS_BEG, "%W\\", [0, 3],
2328
+ :tSTRING_CONTENT, "blah", [3, 7],
2329
+ :tSPACE, nil, [7, 8],
2330
+ :tSTRING_CONTENT, "#x", [8, 10],
2331
+ :tSPACE, nil, [10, 11],
2332
+ :tSTRING_CONTENT, "a", [11, 12],
2333
+ :tSPACE, nil, [12, 13],
2334
+ :tSTRING_DVAR, nil, [13, 14],
2335
+ :tIVAR, "@a", [14, 16],
2336
+ :tSPACE, nil, [16, 17],
2337
+ :tSTRING_CONTENT, "b", [17, 18],
2338
+ :tSPACE, nil, [18, 19],
2339
+ :tSTRING_DVAR, nil, [19, 20],
2340
+ :tGVAR, "$b", [20, 22],
2341
+ :tSPACE, nil, [22, 23],
2342
+ :tSTRING_CONTENT, "c", [23, 24],
2343
+ :tSPACE, nil, [24, 25],
2344
+ :tSTRING_DBEG, '#{', [25, 27],
2345
+ :tINTEGER, 3, [27, 28],
2346
+ :tRCURLY, "}", [28, 29],
2347
+ :tSPACE, nil, [29, 30],
2348
+ :tSTRING_CONTENT, "#", [30, 31],
2349
+ :tSPACE, nil, [31, 32],
2350
+ :tSTRING_END, "\\", [32, 33])
2351
+ end
2352
+
2353
+ def test_string_pct_backslash_with_bad_escape
2354
+ # No escapes are allowed in a backslash-delimited string
2355
+ refute_scanned("%\\a\\n\\",
2356
+ :tSTRING_BEG, "%\\", [0, 2],
2357
+ :tSTRING_CONTENT, "a", [2, 3],
2358
+ :tSTRING_END, "\\", [3, 4],
2359
+ :tIDENTIFIER, "n", [4, 5])
2360
+ end
2361
+
2362
+ def test_string_pct_intertwined_with_heredoc
2363
+ assert_scanned("<<-foo + %\\a\nbar\nfoo\nb\\",
2364
+ :tSTRING_BEG, "<<\"", [0, 6],
2365
+ :tSTRING_CONTENT, "bar\n", [13, 17],
2366
+ :tSTRING_END, "foo", [17, 20],
2367
+ :tPLUS, "+", [7, 8],
2368
+ :tSTRING_BEG, "%\\", [9, 11],
2369
+ :tSTRING_CONTENT, "a\n", [11, 13],
2370
+ :tSTRING_CONTENT, "b", [21, 22],
2371
+ :tSTRING_END, "\\", [22, 23])
2372
+ end
2373
+
2374
+ def test_string_pct_q_backslash
2375
+ assert_scanned("%q\\a\\",
2376
+ :tSTRING_BEG, "%q\\", [0, 3],
2377
+ :tSTRING_CONTENT, "a", [3, 4],
2378
+ :tSTRING_END, "\\", [4, 5])
2379
+ end
2380
+
2381
+ def test_string_pct_Q_backslash
2382
+ assert_scanned("%Q\\a\\",
2383
+ :tSTRING_BEG, "%Q\\", [0, 3],
2384
+ :tSTRING_CONTENT, "a", [3, 4],
2385
+ :tSTRING_END, "\\", [4, 5])
2386
+ end
2387
+
2388
+ def test_string_single
2389
+ assert_scanned("'string'",
2390
+ :tSTRING, "string", [0, 8])
2391
+ end
2392
+
2393
+ def test_string_single_escape_chars
2394
+ assert_scanned("'s\\tri\\ng'",
2395
+ :tSTRING, "s\\tri\\ng", [0, 10])
2396
+ end
2397
+
2398
+ def test_string_single_nl
2399
+ assert_scanned("'blah\\\nblah'",
2400
+ :tSTRING_BEG, "'", [0, 1],
2401
+ :tSTRING_CONTENT, "blah\\\n", [1, 7],
2402
+ :tSTRING_CONTENT, "blah", [7, 11],
2403
+ :tSTRING_END, "'", [11, 12])
2404
+ end
2405
+
2406
+ def test_symbol
2407
+ assert_scanned(":symbol",
2408
+ :tSYMBOL, "symbol", [0, 7])
2409
+ end
2410
+
2411
+ def test_symbol_double
2412
+ assert_scanned(":\"symbol\"",
2413
+ :tSYMBEG, ":\"", [0, 2],
2414
+ :tSTRING_CONTENT, "symbol", [2, 8],
2415
+ :tSTRING_END, "\"", [8, 9])
2416
+ end
2417
+
2418
+ def test_symbol_single
2419
+ assert_scanned(":'symbol'",
2420
+ :tSYMBEG, ":'", [0, 2],
2421
+ :tSTRING_CONTENT, "symbol", [2, 8],
2422
+ :tSTRING_END, "'", [8, 9])
2423
+ end
2424
+
2425
+ def test_ternary
2426
+ assert_scanned("a ? b : c",
2427
+ :tIDENTIFIER, "a", [0, 1],
2428
+ :tEH, "?", [2, 3],
2429
+ :tIDENTIFIER, "b", [4, 5],
2430
+ :tCOLON, ":", [6, 7],
2431
+ :tIDENTIFIER, "c", [8, 9])
2432
+
2433
+ assert_scanned("a ?b : c",
2434
+ :tIDENTIFIER, "a", [0, 1],
2435
+ :tINTEGER, 98, [2, 4],
2436
+ :tCOLON, ":", [5, 6],
2437
+ :tIDENTIFIER, "c", [7, 8])
2438
+
2439
+ assert_scanned("a ?bb : c", # GAH! MATZ!!!
2440
+ :tIDENTIFIER, "a", [0, 1],
2441
+ :tEH, "?", [2, 3],
2442
+ :tIDENTIFIER, "bb", [3, 5],
2443
+ :tCOLON, ":", [6, 7],
2444
+ :tIDENTIFIER, "c", [8, 9])
2445
+
2446
+ assert_scanned("42 ?", # 42 forces expr_end
2447
+ :tINTEGER, 42, [0, 2],
2448
+ :tEH, "?", [3, 4])
2449
+ end
2450
+
2451
+ def test_tilde
2452
+ assert_scanned "~", :tTILDE, "~", [0, 1]
2453
+ end
2454
+
2455
+ def test_tilde_unary
2456
+ @lex.state = :expr_fname
2457
+ assert_scanned "~@", :tTILDE, "~@", [0, 2]
2458
+ end
2459
+
2460
+ def test_uminus
2461
+ assert_scanned("-blah",
2462
+ :tUMINUS, "-", [0, 1],
2463
+ :tIDENTIFIER, "blah", [1, 5])
2464
+ end
2465
+
2466
+ def test_underscore
2467
+ assert_scanned("_var", :tIDENTIFIER, "_var", [0, 4])
2468
+ end
2469
+
2470
+ def test_underscore_end
2471
+ assert_scanned("__END__\n")
2472
+ assert_scanned("__END__")
2473
+ assert_scanned("__END__ foo",
2474
+ :tIDENTIFIER, '__END__', [0, 7],
2475
+ :tIDENTIFIER, 'foo', [8, 11])
2476
+ assert_scanned("__END__\rfoo",
2477
+ :tIDENTIFIER, '__END__', [0, 7],
2478
+ :tIDENTIFIER, 'foo', [8, 11])
2479
+ end
2480
+
2481
+ def test_uplus
2482
+ assert_scanned("+blah",
2483
+ :tUPLUS, "+", [0, 1],
2484
+ :tIDENTIFIER, "blah", [1, 5])
2485
+ end
2486
+
2487
+ def test_if_unless_mod
2488
+ assert_scanned("return if true unless false",
2489
+ :kRETURN, "return", [0, 6],
2490
+ :kIF_MOD, "if", [7, 9],
2491
+ :kTRUE, "true", [10, 14],
2492
+ :kUNLESS_MOD, "unless", [15, 21],
2493
+ :kFALSE, "false", [22, 27])
2494
+ end
2495
+
2496
+ def test_if_stmt
2497
+ assert_scanned("if true\n return end",
2498
+ :kIF, "if", [0, 2],
2499
+ :kTRUE, "true", [3, 7],
2500
+ :tNL, nil, [7, 8],
2501
+ :kRETURN, "return", [9, 15],
2502
+ :kEND, "end", [16, 19])
2503
+ end
2504
+
2505
+ def test_sclass_label
2506
+ setup_lexer 20
2507
+ assert_scanned("class << a:b",
2508
+ :kCLASS, 'class', [0, 5],
2509
+ :tLSHFT, '<<', [6, 8],
2510
+ :tIDENTIFIER, 'a', [9, 10],
2511
+ :tSYMBOL, 'b', [10, 12])
2512
+ end
2513
+
2514
+ def test_fname_pct_s__22
2515
+ setup_lexer 22
2516
+ @lex.state = :expr_fname
2517
+ assert_scanned("%s(a)",
2518
+ :tPERCENT, '%', [0, 1],
2519
+ :tIDENTIFIER, 's', [1, 2],
2520
+ :tLPAREN2, '(', [2, 3],
2521
+ :tIDENTIFIER, 'a', [3, 4],
2522
+ :tRPAREN, ')', [4, 5])
2523
+ end
2524
+
2525
+ def test_fname_pct_s__23
2526
+ setup_lexer 23
2527
+ @lex.state = :expr_fname
2528
+ assert_scanned("%s(a)",
2529
+ :tSYMBEG, '%s(', [0, 3],
2530
+ :tSTRING_CONTENT, 'a', [3, 4],
2531
+ :tSTRING_END, ')', [4, 5])
2532
+ end
2533
+
2534
+ def test_static_env
2535
+ env = Parser::StaticEnvironment.new
2536
+ env.declare "a"
2537
+
2538
+ @lex.static_env = env
2539
+ assert_scanned("a [42]",
2540
+ :tIDENTIFIER, "a", [0, 1],
2541
+ :tLBRACK2, "[", [2, 3],
2542
+ :tINTEGER, 42, [3, 5],
2543
+ :tRBRACK, "]", [5, 6])
2544
+ end
2545
+
2546
+ def test_int_suffix
2547
+ [18, 19, 20].each do |version|
2548
+ setup_lexer version
2549
+
2550
+ assert_scanned("42r",
2551
+ :tINTEGER, 42, [0, 2],
2552
+ :tIDENTIFIER, 'r', [2, 3])
2553
+
2554
+ assert_scanned("42if",
2555
+ :tINTEGER, 42, [0, 2],
2556
+ :kIF_MOD, 'if', [2, 4])
2557
+ end
2558
+
2559
+ setup_lexer 21
2560
+
2561
+ assert_scanned("42r", :tRATIONAL, Rational(42), [0, 3])
2562
+ assert_scanned("42i", :tIMAGINARY, Complex(0, 42), [0, 3])
2563
+ assert_scanned("42ri", :tIMAGINARY, Complex(0, Rational(42)), [0, 4])
2564
+ end
2565
+
2566
+ def test_float_suffix
2567
+ [18, 19, 20].each do |version|
2568
+ setup_lexer version
2569
+
2570
+ assert_scanned("42.1r",
2571
+ :tFLOAT, 42.1, [0, 4],
2572
+ :tIDENTIFIER, 'r', [4, 5])
2573
+
2574
+ assert_scanned("42.1if",
2575
+ :tFLOAT, 42.1, [0, 4],
2576
+ :kIF_MOD, 'if', [4, 6])
2577
+
2578
+ assert_scanned("1e1r",
2579
+ :tFLOAT, 1e1, [0, 3],
2580
+ :tIDENTIFIER, 'r', [3, 4])
2581
+ end
2582
+
2583
+ begin
2584
+ # Feature-check.
2585
+ Rational("10")
2586
+
2587
+ setup_lexer 21
2588
+
2589
+ assert_scanned("42.1r", :tRATIONAL, Rational(421, 10), [0, 5])
2590
+ assert_scanned("42.1i", :tIMAGINARY, Complex(0, 42.1), [0, 5])
2591
+ assert_scanned("42.1ri", :tIMAGINARY, Complex(0, Rational(421, 10)), [0, 6])
2592
+ assert_scanned("42.1ir",
2593
+ :tIMAGINARY, Complex(0, 42.1), [0, 5],
2594
+ :tIDENTIFIER, 'r', [5, 6])
2595
+
2596
+ assert_scanned("1e1i", :tIMAGINARY, Complex(0, 1e1), [0, 4])
2597
+ assert_scanned("1e1r",
2598
+ :tFLOAT, 1e1, [0, 3],
2599
+ :tIDENTIFIER, 'r', [3, 4])
2600
+ assert_scanned("1e1ri",
2601
+ :tFLOAT, 1e1, [0, 3],
2602
+ :tIDENTIFIER, 'ri', [3, 5])
2603
+ assert_scanned("1e1ir",
2604
+ :tIMAGINARY, Complex(0, 1e1), [0, 4],
2605
+ :tIDENTIFIER, 'r', [4, 5])
2606
+ rescue NoMethodError
2607
+ # Ruby not modern enough
2608
+ end
2609
+ end
2610
+
2611
+ def test_eof
2612
+ assert_scanned("self",
2613
+ :kSELF, "self", [0, 4])
2614
+ assert_equal([false, ["$eof", Parser::Source::Range.new(@lex.source_buffer, 4, 4)]],
2615
+ @lex.advance)
2616
+ end
2617
+
2618
+ #
2619
+ # Test for 'fluent interface'
2620
+ #
2621
+
2622
+ def test_fluent_dot
2623
+ assert_scanned("x\n.y",
2624
+ :tIDENTIFIER, 'x', [0, 1],
2625
+ :tDOT, '.', [2, 3],
2626
+ :tIDENTIFIER, 'y', [3, 4])
2627
+
2628
+ assert_scanned("x\n .y",
2629
+ :tIDENTIFIER, 'x', [0, 1],
2630
+ :tDOT, '.', [4, 5],
2631
+ :tIDENTIFIER, 'y', [5, 6])
2632
+
2633
+ assert_scanned("x # comment\n .y",
2634
+ :tIDENTIFIER, 'x', [0, 1],
2635
+ :tDOT, '.', [14, 15],
2636
+ :tIDENTIFIER, 'y', [15, 16])
2637
+ end
2638
+
2639
+ def test_fluent_and_dot
2640
+ assert_scanned("x\n&.y",
2641
+ :tIDENTIFIER, 'x', [0, 1],
2642
+ :tANDDOT, '&.', [2, 4],
2643
+ :tIDENTIFIER, 'y', [4, 5])
2644
+ end
2645
+
2646
+ #
2647
+ # Tests for whitespace.
2648
+ #
2649
+
2650
+ def test_whitespace_fname
2651
+ @lex.state = :expr_fname
2652
+ assert_scanned('class',
2653
+ :kCLASS, 'class', [0, 5])
2654
+
2655
+ @lex.state = :expr_fname
2656
+ assert_scanned(' class',
2657
+ :kCLASS, 'class', [1, 6])
2658
+
2659
+ @lex.state = :expr_fname
2660
+ assert_scanned("\nclass",
2661
+ :kCLASS, 'class', [1, 6])
2662
+
2663
+ @lex.state = :expr_fname
2664
+ assert_scanned("\\\nclass",
2665
+ :kCLASS, 'class', [2, 7])
2666
+
2667
+ @lex.state = :expr_fname
2668
+ assert_scanned("#foo\nclass",
2669
+ :kCLASS, 'class', [5, 10])
2670
+ end
2671
+
2672
+ def test_whitespace_endfn
2673
+ setup_lexer(21)
2674
+
2675
+ @lex.state = :expr_endfn
2676
+ assert_scanned('foo:',
2677
+ :tLABEL, 'foo', [0, 4])
2678
+
2679
+ @lex.state = :expr_endfn
2680
+ assert_scanned(' foo:',
2681
+ :tLABEL, 'foo', [1, 5])
2682
+
2683
+ @lex.state = :expr_endfn
2684
+ assert_scanned("\nfoo:",
2685
+ :tNL, nil, [0, 1],
2686
+ :tIDENTIFIER, 'foo', [1, 4],
2687
+ :tCOLON, ':', [4, 5])
2688
+
2689
+ @lex.state = :expr_endfn
2690
+ assert_scanned("\nfoo: ",
2691
+ :tNL, nil, [0, 1],
2692
+ :tIDENTIFIER, 'foo', [1, 4],
2693
+ :tCOLON, ':', [4, 5])
2694
+
2695
+ @lex.state = :expr_endfn
2696
+ assert_scanned("\\\nfoo:",
2697
+ :tLABEL, 'foo', [2, 6])
2698
+
2699
+ @lex.state = :expr_endfn
2700
+ assert_scanned("#foo\nfoo:",
2701
+ :tNL, nil, [4, 5],
2702
+ :tIDENTIFIER, 'foo', [5, 8],
2703
+ :tCOLON, ':', [8, 9])
2704
+
2705
+ @lex.state = :expr_endfn
2706
+ assert_scanned("#foo\nfoo: ",
2707
+ :tNL, nil, [4, 5],
2708
+ :tIDENTIFIER, 'foo', [5, 8],
2709
+ :tCOLON, ':', [8, 9])
2710
+ end
2711
+
2712
+ def test_whitespace_dot
2713
+ @lex.state = :expr_dot
2714
+ assert_scanned('class',
2715
+ :tIDENTIFIER, 'class', [0, 5])
2716
+
2717
+ @lex.state = :expr_dot
2718
+ assert_scanned(' class',
2719
+ :tIDENTIFIER, 'class', [1, 6])
2720
+
2721
+ @lex.state = :expr_dot
2722
+ assert_scanned("\nclass",
2723
+ :tIDENTIFIER, 'class', [1, 6])
2724
+
2725
+ @lex.state = :expr_dot
2726
+ assert_scanned("\\\nclass",
2727
+ :tIDENTIFIER, 'class', [2, 7])
2728
+
2729
+ @lex.state = :expr_dot
2730
+ assert_scanned("#foo\nclass",
2731
+ :tIDENTIFIER, 'class', [5, 10])
2732
+ end
2733
+
2734
+ def test_whitespace_arg
2735
+ @lex.state = :expr_arg
2736
+ assert_scanned('+',
2737
+ :tPLUS, '+', [0, 1])
2738
+
2739
+ @lex.state = :expr_arg
2740
+ assert_scanned(' +',
2741
+ :tUPLUS, '+', [1, 2])
2742
+
2743
+ @lex.state = :expr_arg
2744
+ assert_scanned("\n+",
2745
+ :tNL, nil, [0, 1],
2746
+ :tUPLUS, '+', [1, 2])
2747
+
2748
+ @lex.state = :expr_arg
2749
+ assert_scanned("\\\n+",
2750
+ :tUPLUS, '+', [2, 3])
2751
+
2752
+ @lex.state = :expr_arg
2753
+ assert_scanned("\\\n +",
2754
+ :tUPLUS, '+', [3, 4])
2755
+
2756
+ @lex.state = :expr_arg
2757
+ assert_scanned("#foo\n+",
2758
+ :tNL, nil, [4, 5],
2759
+ :tUPLUS, '+', [5, 6])
2760
+ end
2761
+
2762
+ def test_whitespace_endarg
2763
+ @lex.state = :expr_endarg
2764
+ assert_scanned('{',
2765
+ :tLBRACE_ARG, '{', [0, 1])
2766
+
2767
+ @lex.state = :expr_endarg
2768
+ assert_scanned(' {',
2769
+ :tLBRACE_ARG, '{', [1, 2])
2770
+
2771
+ @lex.state = :expr_endarg
2772
+ assert_scanned("\n{",
2773
+ :tNL, nil, [0, 1],
2774
+ :tLBRACE, '{', [1, 2])
2775
+
2776
+ @lex.state = :expr_endarg
2777
+ assert_scanned("\\\n{",
2778
+ :tLBRACE_ARG, '{', [2, 3])
2779
+
2780
+ @lex.state = :expr_endarg
2781
+ assert_scanned("#foo\n{",
2782
+ :tNL, nil, [4, 5],
2783
+ :tLBRACE, '{', [5, 6])
2784
+ end
2785
+
2786
+ def test_whitespace_mid
2787
+ @lex.state = :expr_mid
2788
+ assert_scanned('+',
2789
+ :tUPLUS, '+', [0, 1])
2790
+
2791
+ @lex.state = :expr_mid
2792
+ assert_scanned(' +',
2793
+ :tUPLUS, '+', [1, 2])
2794
+
2795
+ @lex.state = :expr_mid
2796
+ assert_scanned("\n+",
2797
+ :tNL, nil, [0, 1],
2798
+ :tUPLUS, '+', [1, 2])
2799
+
2800
+ @lex.state = :expr_mid
2801
+ assert_scanned("\\\n+",
2802
+ :tUPLUS, '+', [2, 3])
2803
+
2804
+ @lex.state = :expr_mid
2805
+ assert_scanned("#foo\n+",
2806
+ :tNL, nil, [4, 5],
2807
+ :tUPLUS, '+', [5, 6])
2808
+ end
2809
+
2810
+ def test_whitespace_beg
2811
+ @lex.state = :expr_beg
2812
+ assert_scanned('+',
2813
+ :tUPLUS, '+', [0, 1])
2814
+
2815
+ @lex.state = :expr_beg
2816
+ assert_scanned(' +',
2817
+ :tUPLUS, '+', [1, 2])
2818
+
2819
+ @lex.state = :expr_beg
2820
+ assert_scanned("\n+",
2821
+ :tUPLUS, '+', [1, 2])
2822
+
2823
+ @lex.state = :expr_beg
2824
+ assert_scanned("\\\n+",
2825
+ :tUPLUS, '+', [2, 3])
2826
+
2827
+ @lex.state = :expr_beg
2828
+ assert_scanned("#foo\n+",
2829
+ :tUPLUS, '+', [5, 6])
2830
+ end
2831
+
2832
+ def test_whitespace_value
2833
+ setup_lexer(20)
2834
+
2835
+ @lex.state = :expr_value
2836
+ assert_scanned('a:b',
2837
+ :tIDENTIFIER, 'a', [0, 1],
2838
+ :tSYMBOL, 'b', [1, 3])
2839
+
2840
+ @lex.state = :expr_value
2841
+ assert_scanned(' a:b',
2842
+ :tIDENTIFIER, 'a', [1, 2],
2843
+ :tSYMBOL, 'b', [2, 4])
2844
+
2845
+ @lex.state = :expr_value
2846
+ assert_scanned("\na:b",
2847
+ :tIDENTIFIER, 'a', [1, 2],
2848
+ :tSYMBOL, 'b', [2, 4])
2849
+
2850
+ @lex.state = :expr_value
2851
+ assert_scanned("\\\na:b",
2852
+ :tIDENTIFIER, 'a', [2, 3],
2853
+ :tSYMBOL, 'b', [3, 5])
2854
+
2855
+ @lex.state = :expr_value
2856
+ assert_scanned("#foo\na:b",
2857
+ :tIDENTIFIER, 'a', [5, 6],
2858
+ :tSYMBOL, 'b', [6, 8])
2859
+ end
2860
+
2861
+ def test_whitespace_end
2862
+ @lex.state = :expr_end
2863
+ assert_scanned('+ 1',
2864
+ :tPLUS, '+', [0, 1],
2865
+ :tINTEGER, 1, [2, 3])
2866
+
2867
+ @lex.state = :expr_end
2868
+ assert_scanned(' + 1',
2869
+ :tPLUS, '+', [1, 2],
2870
+ :tINTEGER, 1, [3, 4])
2871
+
2872
+ @lex.state = :expr_end
2873
+ assert_scanned("\n+ 1",
2874
+ :tNL, nil, [0, 1],
2875
+ :tUNARY_NUM, '+', [1, 2],
2876
+ :tINTEGER, 1, [3, 4])
2877
+
2878
+ @lex.state = :expr_end
2879
+ assert_scanned("\\\n+ 1",
2880
+ :tPLUS, '+', [2, 3],
2881
+ :tINTEGER, 1, [4, 5])
2882
+
2883
+ @lex.state = :expr_end
2884
+ assert_scanned("#foo\n+ 1",
2885
+ :tNL, nil, [4, 5],
2886
+ :tUNARY_NUM, '+', [5, 6],
2887
+ :tINTEGER, 1, [7, 8])
2888
+ end
2889
+
2890
+ def test_whitespace_cr
2891
+ setup_lexer(20)
2892
+ assert_scanned("<<E\nfoo\nE\rO",
2893
+ :tSTRING_BEG, '<<"', [0, 3],
2894
+ :tSTRING_CONTENT, "foo\n", [4, 8],
2895
+ :tSTRING_END, 'E', [8, 11],
2896
+ :tNL, nil, [3, 4])
2897
+
2898
+ setup_lexer(21)
2899
+ refute_scanned("<<E\nfoo\nE\rO",
2900
+ :tSTRING_BEG, '<<"', [0, 3],
2901
+ :tSTRING_CONTENT, "foo\n", [4, 8])
2902
+ end
2903
+
2904
+ #
2905
+ # Handling of encoding-related issues.
2906
+ #
2907
+
2908
+ def test_transcoded_source_is_converted_back_to_original_encoding
2909
+ setup_lexer(19)
2910
+ @lex.force_utf32 = true
2911
+ @lex.tokens = []
2912
+ assert_scanned(utf('"a" + "b"'),
2913
+ :tSTRING, "a", [0, 3],
2914
+ :tPLUS, "+", [4, 5],
2915
+ :tSTRING, "b", [6, 9])
2916
+
2917
+ @lex.tokens.each do |_type, (str, _range)|
2918
+ assert_equal Encoding::UTF_8, str.encoding
2919
+ end
2920
+ end
2921
+
2922
+ #
2923
+ # Tests for bugs.
2924
+ #
2925
+ # These tests should be moved from nursery and properly
2926
+ # categorized when it's clear how to do that.
2927
+ #
2928
+
2929
+ def test_bug_sclass_joined
2930
+ assert_scanned("class<<self",
2931
+ :kCLASS, "class", [0, 5],
2932
+ :tLSHFT, "<<", [5, 7],
2933
+ :kSELF, "self", [7, 11])
2934
+ end
2935
+
2936
+ def test_bug_const_expr_end
2937
+ assert_scanned("Option",
2938
+ :tCONSTANT, 'Option', [0, 6])
2939
+
2940
+ assert_equal :expr_cmdarg, @lex.state
2941
+ end
2942
+
2943
+ def test_bug_expr_beg_div
2944
+ @lex.state = :expr_beg
2945
+ assert_scanned("/=/",
2946
+ :tREGEXP_BEG, "/", [0, 1],
2947
+ :tSTRING_CONTENT, "=", [1, 2],
2948
+ :tSTRING_END, "/", [2, 3],
2949
+ :tREGEXP_OPT, "", [3, 3])
2950
+
2951
+ @lex.state = :expr_beg
2952
+ assert_scanned("/ = /",
2953
+ :tREGEXP_BEG, "/", [0, 1],
2954
+ :tSTRING_CONTENT, " = ", [1, 4],
2955
+ :tSTRING_END, "/", [4, 5],
2956
+ :tREGEXP_OPT, "", [5, 5])
2957
+ end
2958
+
2959
+ def test_bug_expr_beg_percent
2960
+ @lex.state = :expr_beg
2961
+ assert_scanned("%=foo=",
2962
+ :tSTRING_BEG, "%=", [0, 2],
2963
+ :tSTRING_CONTENT, 'foo', [2, 5],
2964
+ :tSTRING_END, "=", [5, 6])
2965
+
2966
+ @lex.state = :expr_beg
2967
+ assert_scanned("% = ",
2968
+ :tSTRING_BEG, "% ", [0, 2],
2969
+ :tSTRING_CONTENT, '=', [2, 3],
2970
+ :tSTRING_END, ' ', [3, 4])
2971
+ end
2972
+
2973
+ def test_bug_expr_beg_document
2974
+ @lex.state = :expr_beg
2975
+ assert_scanned(" \n=begin\n=end\nend",
2976
+ :kEND, "end", [14, 17])
2977
+
2978
+ end
2979
+
2980
+ def test_bug_expr_beg_number
2981
+ @lex.state = :expr_beg
2982
+ assert_scanned("86400_000_000",
2983
+ :tINTEGER, 86400_000_000, [0, 13])
2984
+ end
2985
+
2986
+ def test_bug_expr_beg_backspace_nl
2987
+ @lex.state = :expr_beg
2988
+ assert_scanned("\n/foo/",
2989
+ :tREGEXP_BEG, "/", [1, 2],
2990
+ :tSTRING_CONTENT, "foo", [2, 5],
2991
+ :tSTRING_END, "/", [5, 6],
2992
+ :tREGEXP_OPT, "", [6, 6])
2993
+ end
2994
+
2995
+ def test_bug_expr_beg_heredoc
2996
+ assert_scanned("<<EOL % [\nfoo\nEOL\n]",
2997
+ :tSTRING_BEG, '<<"', [0, 5],
2998
+ :tSTRING_CONTENT, "foo\n", [10, 14],
2999
+ :tSTRING_END, 'EOL', [14, 17],
3000
+ :tPERCENT, '%', [6, 7],
3001
+ :tLBRACK, '[', [8, 9],
3002
+ :tRBRACK, ']', [18, 19])
3003
+ end
3004
+
3005
+ def test_bug_expr_beg_fid
3006
+ assert_scanned("Rainbows!",
3007
+ :tFID, 'Rainbows!', [0, 9])
3008
+ end
3009
+
3010
+ def test_bug_expr_beg_rescue_assoc
3011
+ assert_scanned("rescue=>",
3012
+ :kRESCUE, 'rescue', [0, 6],
3013
+ :tASSOC, '=>', [6, 8])
3014
+ end
3015
+
3016
+ def test_bug_expr_arg_percent
3017
+ @lex.state = :expr_arg
3018
+ assert_scanned("%[",
3019
+ :tPERCENT, "%", [0, 1],
3020
+ :tLBRACK, "[", [1, 2])
3021
+
3022
+ @lex.state = :expr_arg
3023
+ assert_scanned("%=1",
3024
+ :tOP_ASGN, "%", [0, 2],
3025
+ :tINTEGER, 1, [2, 3])
3026
+
3027
+ @lex.state = :expr_arg
3028
+ assert_scanned(" %[1]",
3029
+ :tSTRING_BEG, "%[", [1, 3],
3030
+ :tSTRING_CONTENT, '1', [3, 4],
3031
+ :tSTRING_END, ']', [4, 5])
3032
+
3033
+ @lex.state = :expr_arg
3034
+ assert_scanned(" %=1=",
3035
+ :tOP_ASGN, "%", [1, 3],
3036
+ :tINTEGER, 1, [3, 4],
3037
+ :tEQL, "=", [4, 5])
3038
+
3039
+ @lex.state = :expr_arg
3040
+ assert_scanned(" %\n",
3041
+ :tPERCENT, '%', [1, 2])
3042
+ end
3043
+
3044
+ def test_bug_expr_arg_lt_lt
3045
+ @lex.state = :expr_arg
3046
+ assert_scanned("<<EOS\nEOS",
3047
+ :tLSHFT, "<<", [0, 2],
3048
+ :tCONSTANT, "EOS", [2, 5],
3049
+ :tNL, nil, [5, 6],
3050
+ :tCONSTANT, "EOS", [6, 9])
3051
+
3052
+ @lex.state = :expr_arg
3053
+ assert_scanned(" <<EOS\nEOS",
3054
+ :tSTRING_BEG, "<<\"", [1, 6],
3055
+ :tSTRING_END, "EOS", [7, 10],
3056
+ :tNL, nil, [6, 7])
3057
+ end
3058
+
3059
+ def test_bug_expr_arg_slash
3060
+ @lex.state = :expr_arg
3061
+ assert_scanned("/1",
3062
+ :tDIVIDE, "/", [0, 1],
3063
+ :tINTEGER, 1, [1, 2])
3064
+
3065
+ @lex.state = :expr_arg
3066
+ assert_scanned("/ 1",
3067
+ :tDIVIDE, "/", [0, 1],
3068
+ :tINTEGER, 1, [2, 3])
3069
+
3070
+ @lex.state = :expr_arg
3071
+ assert_scanned(" /1/",
3072
+ :tREGEXP_BEG, "/", [1, 2],
3073
+ :tSTRING_CONTENT, "1", [2, 3],
3074
+ :tSTRING_END, "/", [3, 4],
3075
+ :tREGEXP_OPT, "", [4, 4])
3076
+
3077
+ @lex.state = :expr_arg
3078
+ assert_scanned(" / 1",
3079
+ :tDIVIDE, "/", [1, 2],
3080
+ :tINTEGER, 1, [3, 4])
3081
+ end
3082
+
3083
+ def test_bug_expr_arg_label
3084
+ setup_lexer 19
3085
+
3086
+ @lex.state = :expr_arg
3087
+ assert_scanned(" unless:",
3088
+ :tLABEL, 'unless', [1, 8])
3089
+
3090
+ @lex.state = :expr_arg
3091
+ assert_scanned(" unless: ",
3092
+ :tLABEL, 'unless', [1, 8])
3093
+ end
3094
+
3095
+ def test_bug_heredoc_continuation
3096
+ @lex.state = :expr_arg
3097
+ assert_scanned(" <<EOS\nEOS\nend",
3098
+ :tSTRING_BEG, "<<\"", [1, 6],
3099
+ :tSTRING_END, "EOS", [7, 10],
3100
+ :tNL, nil, [6, 7],
3101
+ :kEND, "end", [11, 14])
3102
+ end
3103
+
3104
+ def test_bug_heredoc_cr_lf
3105
+ assert_scanned("<<FIN\r\nfoo\r\nFIN\r\n",
3106
+ :tSTRING_BEG, "<<\"", [0, 5],
3107
+ :tSTRING_CONTENT, "foo\n", [6, 10],
3108
+ :tSTRING_END, "FIN", [10, 13],
3109
+ :tNL, nil, [5, 6])
3110
+ end
3111
+
3112
+ def test_bug_eh_symbol_no_newline
3113
+ assert_scanned("?\"\nfoo",
3114
+ :tINTEGER, 34, [0, 2],
3115
+ :tNL, nil, [2, 3],
3116
+ :tIDENTIFIER, "foo", [3, 6])
3117
+ end
3118
+
3119
+ def test_bug_expr_arg_newline
3120
+ @lex.state = :expr_arg
3121
+ assert_scanned("\nfoo",
3122
+ :tNL, nil, [0, 1],
3123
+ :tIDENTIFIER, "foo", [1, 4])
3124
+
3125
+ @lex.state = :expr_arg
3126
+ assert_scanned(" \nfoo",
3127
+ :tNL, nil, [1, 2],
3128
+ :tIDENTIFIER, "foo", [2, 5])
3129
+
3130
+ @lex.state = :expr_arg
3131
+ assert_scanned("#foo\nfoo",
3132
+ :tNL, nil, [4, 5],
3133
+ :tIDENTIFIER, "foo", [5, 8])
3134
+ end
3135
+
3136
+ def test_bug_expr_arg_comment_newline
3137
+ @lex.state = :expr_arg
3138
+ assert_scanned(" #\nfoo",
3139
+ :tNL, nil, [2, 3],
3140
+ :tIDENTIFIER, 'foo', [3, 6])
3141
+ end
3142
+
3143
+ def test_bug_expr_arg_eh_crlf
3144
+ @lex.state = :expr_arg
3145
+ assert_scanned(" ?\r\n",
3146
+ :tEH, '?', [1, 2])
3147
+ end
3148
+
3149
+ def test_bug_heredoc_backspace_nl
3150
+ assert_scanned(" <<'XXX'\nf \\\nXXX\n",
3151
+ :tSTRING_BEG, "<<'", [1, 8],
3152
+ :tSTRING_CONTENT, "f \\\n", [9, 13],
3153
+ :tSTRING_END, "XXX", [13, 16],
3154
+ :tNL, nil, [8, 9])
3155
+ end
3156
+
3157
+ def test_bug_heredoc_lshft
3158
+ assert_scanned("<<RULES << CLEANINGS\nRULES",
3159
+ :tSTRING_BEG, '<<"', [0, 7],
3160
+ :tSTRING_END, 'RULES', [21, 26],
3161
+ :tLSHFT, '<<', [8, 10],
3162
+ :tCONSTANT, 'CLEANINGS', [11, 20])
3163
+ end
3164
+
3165
+ def test_bug_sclass_comment_lshft_label
3166
+ assert_scanned("class # foo\n<< a:b;end",
3167
+ :kCLASS, 'class', [0, 5],
3168
+ :tLSHFT, '<<', [12, 14],
3169
+ :tIDENTIFIER, 'a', [15, 16],
3170
+ :tSYMBOL, 'b', [16, 18],
3171
+ :tSEMI, ';', [18, 19],
3172
+ :kEND, 'end', [19, 22])
3173
+ end
3174
+
3175
+ def test_bug_expr_dot_comment
3176
+ assert_scanned("foo. #bar\nbaz",
3177
+ :tIDENTIFIER, 'foo', [0, 3],
3178
+ :tDOT, '.', [3, 4],
3179
+ :tIDENTIFIER, 'baz', [10, 13])
3180
+ end
3181
+
3182
+ def test_bug_expr_dot_fid
3183
+ assert_scanned("foo.S?",
3184
+ :tIDENTIFIER, 'foo', [0, 3],
3185
+ :tDOT, '.', [3, 4],
3186
+ :tFID, 'S?', [4, 6])
3187
+ end
3188
+
3189
+ def test_bug_expr_dot_id_eq
3190
+ assert_scanned("foo.x= 1",
3191
+ :tIDENTIFIER, 'foo', [0, 3],
3192
+ :tDOT, '.', [3, 4],
3193
+ :tIDENTIFIER, 'x', [4, 5],
3194
+ :tEQL, '=', [5, 6],
3195
+ :tINTEGER, 1, [7, 8])
3196
+ end
3197
+
3198
+ def test_bug_expr_dot_fid_mod
3199
+ assert_scanned("foo.x!if 1",
3200
+ :tIDENTIFIER, 'foo', [0, 3],
3201
+ :tDOT, '.', [3, 4],
3202
+ :tFID, 'x!', [4, 6],
3203
+ :kIF_MOD, 'if', [6, 8],
3204
+ :tINTEGER, 1, [9, 10])
3205
+ end
3206
+
3207
+ def test_bug_expr_mid_comment
3208
+ assert_scanned("rescue #bar\nprint",
3209
+ :kRESCUE, 'rescue', [0, 6],
3210
+ :tNL, nil, [11, 12],
3211
+ :tIDENTIFIER, 'print', [12, 17])
3212
+ end
3213
+
3214
+ def test_bug_expr_mid_bareword
3215
+ assert_scanned("begin; rescue rescue1",
3216
+ :kBEGIN, 'begin', [0, 5],
3217
+ :tSEMI, ';', [5, 6],
3218
+ :kRESCUE, 'rescue', [7, 13],
3219
+ :tIDENTIFIER, 'rescue1', [14, 21])
3220
+ end
3221
+
3222
+ def test_bug_expr_value_document
3223
+ assert_scanned("1;\n=begin\n=end",
3224
+ :tINTEGER, 1, [0, 1],
3225
+ :tSEMI, ';', [1, 2])
3226
+ end
3227
+
3228
+ def test_bug_expr_end_colon
3229
+ assert_scanned("'foo':'bar'",
3230
+ :tSTRING, 'foo', [0, 5],
3231
+ :tCOLON, ':', [5, 6],
3232
+ :tSTRING, 'bar', [6, 11])
3233
+ end
3234
+
3235
+ def test_bug_expr_value_rescue_colon2
3236
+ @lex.state = :expr_value
3237
+ assert_scanned("rescue::Exception",
3238
+ :kRESCUE, 'rescue', [0, 6],
3239
+ :tCOLON3, '::', [6, 8],
3240
+ :tCONSTANT, 'Exception', [8, 17])
3241
+ end
3242
+
3243
+ def test_bug_expr_endarg_braces
3244
+ assert_scanned("let [] {",
3245
+ :tIDENTIFIER, 'let', [0, 3],
3246
+ :tLBRACK, '[', [4, 5],
3247
+ :tRBRACK, ']', [5, 6],
3248
+ :tLBRACE_ARG, '{', [7, 8])
3249
+ end
3250
+
3251
+ def test_bug_line_begin_label
3252
+ setup_lexer(19)
3253
+ assert_scanned("foo:bar",
3254
+ :tIDENTIFIER, 'foo', [0, 3],
3255
+ :tSYMBOL, 'bar', [3, 7])
3256
+ end
3257
+
3258
+ def test_bug_interp_expr_value
3259
+ assert_scanned('"#{f:a}"',
3260
+ :tSTRING_BEG, '"', [0, 1],
3261
+ :tSTRING_DBEG, '#{', [1, 3],
3262
+ :tIDENTIFIER, 'f', [3, 4],
3263
+ :tSYMBOL, 'a', [4, 6],
3264
+ :tRCURLY, '}', [6, 7],
3265
+ :tSTRING_END, '"', [7, 8])
3266
+ end
3267
+
3268
+ def test_bug_const_e
3269
+ assert_scanned('E10',
3270
+ :tCONSTANT, 'E10', [0, 3])
3271
+ assert_scanned('E4U',
3272
+ :tCONSTANT, 'E4U', [0, 3])
3273
+ end
3274
+
3275
+ def test_bug_symbol_newline
3276
+ assert_scanned(":foo\n",
3277
+ :tSYMBOL, 'foo', [0, 4],
3278
+ :tNL, nil, [4, 5])
3279
+
3280
+ assert_scanned(":foo=\n",
3281
+ :tSYMBOL, 'foo=', [0, 5],
3282
+ :tNL, nil, [5, 6])
3283
+ end
3284
+
3285
+ def test_bug_interleaved_heredoc
3286
+ assert_scanned(%Q{<<w; "\nfoo\nw\n"},
3287
+ :tSTRING_BEG, '<<"', [0, 3],
3288
+ :tSTRING_CONTENT, "foo\n", [7, 11],
3289
+ :tSTRING_END, 'w', [11, 12],
3290
+ :tSEMI, ';', [3, 4],
3291
+ :tSTRING_BEG, '"', [5, 6],
3292
+ :tSTRING_CONTENT, "\n", [6, 7],
3293
+ :tSTRING_END, '"', [13, 14])
3294
+
3295
+ @lex.state = :expr_beg
3296
+ assert_scanned(%Q{<<w; %w[\nfoo\nw\n1]},
3297
+ :tSTRING_BEG, '<<"', [0, 3],
3298
+ :tSTRING_CONTENT, "foo\n", [9, 13],
3299
+ :tSTRING_END, 'w', [13, 14],
3300
+ :tSEMI, ';', [3, 4],
3301
+ :tQWORDS_BEG, '%w[', [5, 8],
3302
+ :tSTRING_CONTENT, "1", [15, 16],
3303
+ :tSPACE, nil, [16, 16],
3304
+ :tSTRING_END, ']', [16, 17])
3305
+
3306
+ @lex.state = :expr_beg
3307
+ assert_scanned(%Q{<<w; "\#{\nfoo\nw\n}"},
3308
+ :tSTRING_BEG, '<<"', [0, 3],
3309
+ :tSTRING_CONTENT, "foo\n", [9, 13],
3310
+ :tSTRING_END, 'w', [13, 14],
3311
+ :tSEMI, ';', [3, 4],
3312
+ :tSTRING_BEG, '"', [5, 6],
3313
+ :tSTRING_DBEG, '#{', [6, 8],
3314
+ :tRCURLY, '}', [15, 16],
3315
+ :tSTRING_END, '"', [16, 17])
3316
+ end
3317
+
3318
+ def test_bug_fid_char
3319
+ setup_lexer(19)
3320
+ assert_scanned('eof??a',
3321
+ :tFID, 'eof?', [0, 4],
3322
+ :tCHARACTER, 'a', [4, 6])
3323
+ end
3324
+
3325
+ def test_bug_nonlabel_context__18
3326
+ env = Parser::StaticEnvironment.new
3327
+ env.declare "a"
3328
+
3329
+ @lex.static_env = env
3330
+ assert_scanned("1+a:a",
3331
+ :tINTEGER, 1, [0, 1],
3332
+ :tPLUS, '+', [1, 2],
3333
+ :tIDENTIFIER, 'a', [2, 3],
3334
+ :tCOLON, ':', [3, 4],
3335
+ :tIDENTIFIER, 'a', [4, 5])
3336
+ end
3337
+
3338
+ def test_bug_string_percent_newline
3339
+ assert_scanned(%Q{%\nfoo\n},
3340
+ :tSTRING_BEG, "%\n", [0, 2],
3341
+ :tSTRING_CONTENT, 'foo', [2, 5],
3342
+ :tSTRING_END, "\n", [5, 6])
3343
+ end
3344
+
3345
+ def test_bug_string_percent_zero
3346
+ assert_scanned(%Q{%\0foo\0},
3347
+ :tSTRING_BEG, "%\0", [0, 2],
3348
+ :tSTRING_CONTENT, 'foo', [2, 5],
3349
+ :tSTRING_END, "\0", [5, 6])
3350
+ end
3351
+
3352
+ def test_bug_string_utf_escape_composition
3353
+ assert_scanned(%q{"\xE2\x80\x99"},
3354
+ :tSTRING, "\xE2\x80\x99", [0, 14])
3355
+
3356
+ assert_scanned(utf(%q{"\xE2\x80\x99"}),
3357
+ :tSTRING, utf('’'), [0, 14])
3358
+ assert_scanned(utf(%q{"\342\200\231"}),
3359
+ :tSTRING, utf('’'), [0, 14])
3360
+ assert_scanned(utf(%q{"\M-b\C-\M-@\C-\M-Y"}),
3361
+ :tSTRING, utf('’'), [0, 20])
3362
+ end
3363
+
3364
+ def test_bug_string_utf_escape_noop
3365
+ assert_scanned(utf(%q{"\あ"}),
3366
+ :tSTRING, utf("あ"), [0, 4])
3367
+ end
3368
+
3369
+ def test_bug_string_non_utf
3370
+ assert_scanned(%Q{"caf\xE9"},
3371
+ :tSTRING, "caf\xE9", [0, 6])
3372
+ assert_scanned(%Q{"caf\xC3\xA9"},
3373
+ :tSTRING, "caf\xC3\xA9", [0, 7])
3374
+
3375
+ assert_scanned(utf(%q{"café"}),
3376
+ :tSTRING, utf("café"), [0, 6])
3377
+ end
3378
+
3379
+ def test_bug_semi__END__
3380
+ assert_scanned(%Q{foo;\n__END__},
3381
+ :tIDENTIFIER, 'foo', [0, 3],
3382
+ :tSEMI, ';', [3, 4])
3383
+ end
3384
+
3385
+ def test_bug_eql_end
3386
+ assert_scanned(%Q{=begin\n#=end\n=end})
3387
+ end
3388
+
3389
+ def test_bug_hidden_eof
3390
+ @lex.state = :expr_beg
3391
+ assert_scanned(%Q{"foo\0\x1a\x04bar"},
3392
+ :tSTRING_BEG, '"', [0, 1],
3393
+ :tSTRING_CONTENT, "foo\0", [1, 5],
3394
+ :tSTRING_CONTENT, "\x1a", [5, 6],
3395
+ :tSTRING_CONTENT, "\x04", [6, 7],
3396
+ :tSTRING_CONTENT, "bar", [7, 10],
3397
+ :tSTRING_END, '"', [10, 11])
3398
+
3399
+ @lex.state = :expr_beg
3400
+ assert_scanned(%Q{'foo\0\x1a\x04bar'},
3401
+ :tSTRING_BEG, "'", [0, 1],
3402
+ :tSTRING_CONTENT, "foo\0", [1, 5],
3403
+ :tSTRING_CONTENT, "\x1a", [5, 6],
3404
+ :tSTRING_CONTENT, "\x04", [6, 7],
3405
+ :tSTRING_CONTENT, "bar", [7, 10],
3406
+ :tSTRING_END, "'", [10, 11])
3407
+
3408
+ @lex.state = :expr_beg
3409
+ assert_scanned(%Q{%w[foo\0\x1a\x04bar]},
3410
+ :tQWORDS_BEG, '%w[', [0, 3],
3411
+ :tSTRING_CONTENT, "foo\0", [3, 7],
3412
+ :tSTRING_CONTENT, "\x1a", [7, 8],
3413
+ :tSTRING_CONTENT, "\x04", [8, 9],
3414
+ :tSTRING_CONTENT, "bar", [9, 12],
3415
+ :tSPACE, nil, [12, 12],
3416
+ :tSTRING_END, ']', [12, 13])
3417
+
3418
+ @lex.state = :expr_beg
3419
+ assert_scanned(%Q{%W[foo\0\x1a\x04bar]},
3420
+ :tWORDS_BEG, '%W[', [0, 3],
3421
+ :tSTRING_CONTENT, "foo\0", [3, 7],
3422
+ :tSTRING_CONTENT, "\x1a", [7, 8],
3423
+ :tSTRING_CONTENT, "\x04", [8, 9],
3424
+ :tSTRING_CONTENT, "bar", [9, 12],
3425
+ :tSPACE, nil, [12, 12],
3426
+ :tSTRING_END, ']', [12, 13])
3427
+
3428
+ @lex.state = :expr_beg
3429
+ assert_scanned(%Q{# foo\0\nbar},
3430
+ :tIDENTIFIER, 'bar', [7, 10])
3431
+
3432
+ @lex.state = :line_begin
3433
+ assert_scanned(%Q{=begin\n\0\n=end\nbar},
3434
+ :tIDENTIFIER, 'bar', [14, 17])
3435
+ end
3436
+
3437
+ def test_bug_num_adj_kw
3438
+ assert_scanned('1if',
3439
+ :tINTEGER, 1, [0, 1],
3440
+ :kIF_MOD, 'if', [1, 3])
3441
+
3442
+ assert_scanned('1.0if',
3443
+ :tFLOAT, 1.0, [0, 3],
3444
+ :kIF_MOD, 'if', [3, 5])
3445
+ end
3446
+
3447
+ def test_bug_unicode_in_literal
3448
+ setup_lexer(19)
3449
+ assert_scanned('"\u00a4"',
3450
+ :tSTRING, "\u00a4", [0, 8])
3451
+ end
3452
+
3453
+ def test_bug_utf32le_leak
3454
+ setup_lexer(19)
3455
+ @lex.force_utf32 = true
3456
+ assert_scanned('"F0"',
3457
+ :tSTRING, "F0", [0, 4])
3458
+ end
3459
+
3460
+ def test_bug_ragel_stack
3461
+ assert_scanned("\"\#{$2 ? $2 : 1}\"",
3462
+ :tSTRING_BEG, "\"", [0, 1],
3463
+ :tSTRING_DBEG, "\#{", [1, 3],
3464
+ :tNTH_REF, 2, [3, 5],
3465
+ :tEH, "?", [6, 7],
3466
+ :tNTH_REF, 2, [8, 10],
3467
+ :tCOLON, ":", [11, 12],
3468
+ :tINTEGER, 1, [13, 14],
3469
+ :tRCURLY, "}", [14, 15],
3470
+ :tSTRING_END, "\"", [15, 16])
3471
+ end
3472
+
3473
+ def test_bug_423
3474
+ @lex.state = :expr_beg
3475
+ assert_scanned(':&&',
3476
+ :tSYMBEG, ':', [0, 1],
3477
+ :tANDOP, '&&', [1, 3])
3478
+
3479
+ @lex.state = :expr_beg
3480
+ assert_scanned(':||',
3481
+ :tSYMBEG, ':', [0, 1],
3482
+ :tOROP, '||', [1, 3])
3483
+ end
3484
+
3485
+ def test_bug_418
3486
+ setup_lexer 19
3487
+
3488
+ assert_scanned("{\n=begin\nx: 1,\n=end\ny: 2}",
3489
+ :tLBRACE, '{', [0, 1],
3490
+ :tLABEL, 'y', [20, 22],
3491
+ :tINTEGER, 2, [23, 24],
3492
+ :tRCURLY, '}', [24, 25])
3493
+ end
3494
+
3495
+ def test_bug_407
3496
+ setup_lexer(21)
3497
+
3498
+ assert_scanned('123if cond',
3499
+ :tINTEGER, 123, [0, 3],
3500
+ :kIF_MOD, 'if', [3, 5],
3501
+ :tIDENTIFIER, 'cond', [6, 10])
3502
+
3503
+ assert_scanned('1.23if cond',
3504
+ :tFLOAT, 1.23, [0, 4],
3505
+ :kIF_MOD, 'if', [4, 6],
3506
+ :tIDENTIFIER, 'cond', [7, 11])
3507
+
3508
+ assert_scanned('123rescue cond',
3509
+ :tINTEGER, 123, [0, 3],
3510
+ :kRESCUE_MOD, 'rescue', [3, 9],
3511
+ :tIDENTIFIER, 'cond', [10, 14])
3512
+
3513
+ assert_scanned('1.23rescue cond',
3514
+ :tFLOAT, 1.23, [0, 4],
3515
+ :kRESCUE_MOD, 'rescue', [4, 10],
3516
+ :tIDENTIFIER, 'cond', [11, 15])
3517
+ end
3518
+
3519
+ def test_parser_bug_486
3520
+ setup_lexer(19)
3521
+ assert_scanned(':!@',
3522
+ :tSYMBOL, '!', [0, 3])
3523
+
3524
+ setup_lexer(19)
3525
+ assert_scanned(':~@',
3526
+ :tSYMBOL, '~', [0, 3])
3527
+ end
3528
+
3529
+ def test_slash_only_in_heredocs
3530
+ setup_lexer(23)
3531
+ refute_scanned(%Q{<<~E\n\\\nE})
3532
+
3533
+ setup_lexer(23)
3534
+ refute_scanned(%Q{<<-E\n\\\nE})
3535
+ end
3536
+
3537
+ def test_escapes_in_squiggly_heredoc
3538
+ setup_lexer(23)
3539
+
3540
+ assert_scanned(%Q{<<~E\n\a\b\e\f\r\t\\\v\nE},
3541
+ :tSTRING_BEG, '<<"', [0, 4],
3542
+ :tSTRING_CONTENT, "\a\b\e\f\r\t\v\n", [5, 14],
3543
+ :tSTRING_END, 'E', [14, 15],
3544
+ :tNL, nil, [4, 5])
3545
+
3546
+ setup_lexer(23)
3547
+
3548
+ assert_scanned(%Q{<<-E\n\a\b\e\f\r\t\\\v\nE},
3549
+ :tSTRING_BEG, '<<"', [0, 4],
3550
+ :tSTRING_CONTENT, "\a\b\e\f\r\t\v\n", [5, 14],
3551
+ :tSTRING_END, 'E', [14, 15],
3552
+ :tNL, nil, [4, 5])
3553
+ end
3554
+
3555
+ def test_ambiguous_integer_re
3556
+ assert_scanned('1re',
3557
+ :tINTEGER, 1, [0, 1],
3558
+ :tIDENTIFIER, 're', [1, 3])
3559
+ end
3560
+
3561
+ def test_meth_ref
3562
+ assert_scanned('foo.:bar',
3563
+ :tIDENTIFIER, 'foo', [0, 3],
3564
+ :tMETHREF, '.:', [3, 5],
3565
+ :tIDENTIFIER, 'bar', [5, 8])
3566
+
3567
+ assert_scanned('foo .:bar',
3568
+ :tIDENTIFIER, 'foo', [0, 3],
3569
+ :tMETHREF, '.:', [4, 6],
3570
+ :tIDENTIFIER, 'bar', [6, 9])
3571
+ end
3572
+
3573
+ def test_meth_ref_unary_op
3574
+ assert_scanned('foo.:+',
3575
+ :tIDENTIFIER, 'foo', [0, 3],
3576
+ :tMETHREF, '.:', [3, 5],
3577
+ :tPLUS, '+', [5, 6])
3578
+
3579
+ assert_scanned('foo.:-@',
3580
+ :tIDENTIFIER, 'foo', [0, 3],
3581
+ :tMETHREF, '.:', [3, 5],
3582
+ :tUMINUS, '-@', [5, 7])
3583
+ end
3584
+
3585
+ def test_meth_ref_unsupported_newlines
3586
+ # MRI emits exactly the same sequence of tokens,
3587
+ # the error happens later in the parser
3588
+
3589
+ assert_scanned('foo. :+',
3590
+ :tIDENTIFIER, 'foo', [0, 3],
3591
+ :tDOT, '.', [3, 4],
3592
+ :tCOLON, ':', [5, 6],
3593
+ :tUPLUS, '+', [6, 7])
3594
+
3595
+ assert_scanned('foo.: +',
3596
+ :tIDENTIFIER, 'foo', [0, 3],
3597
+ :tDOT, '.', [3, 4],
3598
+ :tCOLON, ':', [4, 5],
3599
+ :tPLUS, '+', [6, 7])
3600
+ end
3601
+
3602
+ def lex_numbered_parameter(input)
3603
+ @lex.max_numparam_stack.push
3604
+
3605
+ @lex.context = Parser::Context.new
3606
+ @lex.context.push(:block)
3607
+
3608
+ source_buffer = Parser::Source::Buffer.new('(assert_lex_numbered_parameter)')
3609
+ source_buffer.source = input
3610
+
3611
+ @lex.source_buffer = source_buffer
3612
+
3613
+ @lex.advance
3614
+ end
3615
+
3616
+ def assert_scanned_numbered_parameter(input)
3617
+ lex_token, (lex_value, lex_range) = lex_numbered_parameter(input)
3618
+
3619
+ assert_equal(lex_token, :tNUMPARAM)
3620
+ assert_equal(lex_value, input.tr('@', ''))
3621
+ assert_equal(lex_range.begin_pos, 0)
3622
+ assert_equal(lex_range.end_pos, input.length)
3623
+ end
3624
+
3625
+ def refute_scanned_numbered_parameter(input, message = nil)
3626
+ err = assert_raises Parser::SyntaxError do
3627
+ lex_token, (lex_value, lex_range) = lex_numbered_parameter(input)
3628
+ end
3629
+
3630
+ if message
3631
+ assert_equal(err.message, Parser::MESSAGES[message])
3632
+
3633
+ assert_equal(err.diagnostic.location.begin_pos, 0)
3634
+ assert_equal(err.diagnostic.location.end_pos, input.length)
3635
+ end
3636
+ end
3637
+
3638
+ def test_numbered_args_before_27
3639
+ setup_lexer(26)
3640
+ refute_scanned_numbered_parameter('@1')
3641
+ end
3642
+
3643
+ def test_numbered_args_27
3644
+ setup_lexer(27)
3645
+ assert_scanned_numbered_parameter('@1')
3646
+ assert_equal(@lex.max_numparam, 1)
3647
+
3648
+ setup_lexer(27)
3649
+ assert_scanned_numbered_parameter('@100')
3650
+ assert_equal(@lex.max_numparam, 100)
3651
+
3652
+ setup_lexer(27)
3653
+ refute_scanned_numbered_parameter('@101', :too_large_numparam)
3654
+
3655
+ setup_lexer(27)
3656
+ refute_scanned_numbered_parameter('@01', :leading_zero_in_numparam)
3657
+ end
3658
+
3659
+ end