opal-wedge 0.9.0.dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (830) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitmodules +7 -0
  4. data/.inch.yml +19 -0
  5. data/.jshintrc +48 -0
  6. data/.rspec +3 -0
  7. data/.spectator +2 -0
  8. data/.spectator-mspec +3 -0
  9. data/.travis.yml +60 -0
  10. data/.yardopts +6 -0
  11. data/CHANGELOG.md +571 -0
  12. data/CODE_OF_CONDUCT.md +15 -0
  13. data/CONTRIBUTING.md +192 -0
  14. data/Gemfile +26 -0
  15. data/Guardfile +77 -0
  16. data/LICENSE +19 -0
  17. data/README.md +167 -0
  18. data/Rakefile +15 -0
  19. data/benchmark/benchmarks +103 -0
  20. data/benchmark/bm_array_intersection_numbers.rb +7 -0
  21. data/benchmark/bm_array_intersection_objects.rb +7 -0
  22. data/benchmark/bm_array_intersection_strings.rb +7 -0
  23. data/benchmark/bm_array_minus_numbers.rb +7 -0
  24. data/benchmark/bm_array_minus_objects.rb +7 -0
  25. data/benchmark/bm_array_minus_strings.rb +7 -0
  26. data/benchmark/bm_array_union_numbers.rb +7 -0
  27. data/benchmark/bm_array_union_objects.rb +7 -0
  28. data/benchmark/bm_array_union_strings.rb +7 -0
  29. data/benchmark/bm_array_uniq_bang_numbers.rb +5 -0
  30. data/benchmark/bm_array_uniq_bang_objects.rb +5 -0
  31. data/benchmark/bm_array_uniq_bang_strings.rb +5 -0
  32. data/benchmark/bm_array_uniq_numbers.rb +5 -0
  33. data/benchmark/bm_array_uniq_objects.rb +5 -0
  34. data/benchmark/bm_array_uniq_strings.rb +5 -0
  35. data/benchmark/bm_dispatch_bind_table.rb +57 -0
  36. data/benchmark/bm_dispatch_code_gen.rb +65 -0
  37. data/benchmark/bm_dispatch_code_gen_if.rb +64 -0
  38. data/benchmark/bm_dispatch_hardcoded.rb +44 -0
  39. data/benchmark/bm_dispatch_send.rb +38 -0
  40. data/benchmark/bm_dispatch_send_table.rb +57 -0
  41. data/benchmark/bm_hash_assoc_object.rb +11 -0
  42. data/benchmark/bm_hash_assoc_string.rb +9 -0
  43. data/benchmark/bm_hash_clone_object.rb +9 -0
  44. data/benchmark/bm_hash_clone_string.rb +9 -0
  45. data/benchmark/bm_hash_delete_object.rb +11 -0
  46. data/benchmark/bm_hash_delete_string.rb +9 -0
  47. data/benchmark/bm_hash_each_key_object.rb +9 -0
  48. data/benchmark/bm_hash_each_key_string.rb +9 -0
  49. data/benchmark/bm_hash_each_object.rb +9 -0
  50. data/benchmark/bm_hash_each_string.rb +9 -0
  51. data/benchmark/bm_hash_each_value_object.rb +9 -0
  52. data/benchmark/bm_hash_each_value_string.rb +9 -0
  53. data/benchmark/bm_hash_element_reference_object.rb +11 -0
  54. data/benchmark/bm_hash_element_reference_string.rb +9 -0
  55. data/benchmark/bm_hash_element_set_object.rb +5 -0
  56. data/benchmark/bm_hash_element_set_string.rb +5 -0
  57. data/benchmark/bm_hash_equal_value_object.rb +14 -0
  58. data/benchmark/bm_hash_equal_value_string.rb +11 -0
  59. data/benchmark/bm_hash_fetch_object.rb +11 -0
  60. data/benchmark/bm_hash_fetch_string.rb +9 -0
  61. data/benchmark/bm_hash_flatten_object.rb +9 -0
  62. data/benchmark/bm_hash_flatten_string.rb +9 -0
  63. data/benchmark/bm_hash_has_key_object.rb +11 -0
  64. data/benchmark/bm_hash_has_key_string.rb +9 -0
  65. data/benchmark/bm_hash_has_value_object.rb +9 -0
  66. data/benchmark/bm_hash_has_value_string.rb +9 -0
  67. data/benchmark/bm_hash_hash_object.rb +9 -0
  68. data/benchmark/bm_hash_hash_string.rb +9 -0
  69. data/benchmark/bm_hash_inspect_object.rb +9 -0
  70. data/benchmark/bm_hash_inspect_string.rb +9 -0
  71. data/benchmark/bm_hash_invert_object.rb +9 -0
  72. data/benchmark/bm_hash_invert_string.rb +9 -0
  73. data/benchmark/bm_hash_keep_if_object.rb +9 -0
  74. data/benchmark/bm_hash_keep_if_string.rb +9 -0
  75. data/benchmark/bm_hash_key_object.rb +9 -0
  76. data/benchmark/bm_hash_key_string.rb +9 -0
  77. data/benchmark/bm_hash_keys_object.rb +9 -0
  78. data/benchmark/bm_hash_keys_string.rb +9 -0
  79. data/benchmark/bm_hash_literal_mixed_large.rb +3 -0
  80. data/benchmark/bm_hash_literal_mixed_small.rb +3 -0
  81. data/benchmark/bm_hash_literal_object_large.rb +4 -0
  82. data/benchmark/bm_hash_literal_object_small.rb +3 -0
  83. data/benchmark/bm_hash_literal_string_large.rb +4 -0
  84. data/benchmark/bm_hash_literal_string_small.rb +3 -0
  85. data/benchmark/bm_hash_merge_object.rb +22 -0
  86. data/benchmark/bm_hash_merge_string.rb +18 -0
  87. data/benchmark/bm_hash_rassoc_object.rb +9 -0
  88. data/benchmark/bm_hash_rassoc_string.rb +9 -0
  89. data/benchmark/bm_hash_rehash_object.rb +9 -0
  90. data/benchmark/bm_hash_rehash_string.rb +9 -0
  91. data/benchmark/bm_hash_reject_bang_object.rb +9 -0
  92. data/benchmark/bm_hash_reject_bang_string.rb +9 -0
  93. data/benchmark/bm_hash_reject_object.rb +9 -0
  94. data/benchmark/bm_hash_reject_string.rb +9 -0
  95. data/benchmark/bm_hash_replace_object.rb +18 -0
  96. data/benchmark/bm_hash_replace_string.rb +14 -0
  97. data/benchmark/bm_hash_select_bang_object.rb +9 -0
  98. data/benchmark/bm_hash_select_bang_string.rb +9 -0
  99. data/benchmark/bm_hash_select_object.rb +9 -0
  100. data/benchmark/bm_hash_select_string.rb +9 -0
  101. data/benchmark/bm_hash_shift_object.rb +10 -0
  102. data/benchmark/bm_hash_shift_string.rb +10 -0
  103. data/benchmark/bm_hash_to_a_object.rb +9 -0
  104. data/benchmark/bm_hash_to_a_string.rb +9 -0
  105. data/benchmark/bm_hash_to_h_object.rb +10 -0
  106. data/benchmark/bm_hash_to_h_string.rb +10 -0
  107. data/benchmark/bm_hash_values_object.rb +9 -0
  108. data/benchmark/bm_hash_values_string.rb +9 -0
  109. data/benchmark/run.rb +37 -0
  110. data/bin/opal +27 -0
  111. data/bin/opal-build +77 -0
  112. data/bin/opal-mspec +10 -0
  113. data/bin/opal-repl +72 -0
  114. data/config.ru +14 -0
  115. data/docs/compiler_directives.md +127 -0
  116. data/examples/rack/.gitignore +1 -0
  117. data/examples/rack/Gemfile +3 -0
  118. data/examples/rack/app/application.rb +13 -0
  119. data/examples/rack/app/user.rb +22 -0
  120. data/examples/rack/config.ru +20 -0
  121. data/examples/rack/index.html.erb +10 -0
  122. data/examples/sinatra/Gemfile +5 -0
  123. data/examples/sinatra/app/application.rb +7 -0
  124. data/examples/sinatra/config.ru +38 -0
  125. data/lib/mspec/opal/main.rb.erb +9 -0
  126. data/lib/mspec/opal/new.html.erb +1 -0
  127. data/lib/mspec/opal/rake_task.rb +248 -0
  128. data/lib/mspec/opal/runner.rb +281 -0
  129. data/lib/mspec/opal/special_calls.rb +44 -0
  130. data/lib/mspec/opal/sprockets.js +57 -0
  131. data/lib/opal-wedge.rb +4 -0
  132. data/lib/opal.rb +11 -0
  133. data/lib/opal/builder.rb +161 -0
  134. data/lib/opal/builder_processors.rb +149 -0
  135. data/lib/opal/cli.rb +162 -0
  136. data/lib/opal/cli_options.rb +158 -0
  137. data/lib/opal/cli_runners.rb +11 -0
  138. data/lib/opal/cli_runners/apple_script.rb +65 -0
  139. data/lib/opal/cli_runners/nodejs.rb +63 -0
  140. data/lib/opal/cli_runners/phantom.js +44 -0
  141. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  142. data/lib/opal/cli_runners/server.rb +56 -0
  143. data/lib/opal/compiler.rb +381 -0
  144. data/lib/opal/config.rb +48 -0
  145. data/lib/opal/erb.rb +84 -0
  146. data/lib/opal/fragment.rb +53 -0
  147. data/lib/opal/hike_path_finder.rb +18 -0
  148. data/lib/opal/nodes.rb +26 -0
  149. data/lib/opal/nodes/arglist.rb +56 -0
  150. data/lib/opal/nodes/array.rb +54 -0
  151. data/lib/opal/nodes/base.rb +151 -0
  152. data/lib/opal/nodes/call.rb +290 -0
  153. data/lib/opal/nodes/call_special.rb +252 -0
  154. data/lib/opal/nodes/case.rb +96 -0
  155. data/lib/opal/nodes/class.rb +42 -0
  156. data/lib/opal/nodes/constants.rb +78 -0
  157. data/lib/opal/nodes/def.rb +281 -0
  158. data/lib/opal/nodes/defined.rb +113 -0
  159. data/lib/opal/nodes/definitions.rb +168 -0
  160. data/lib/opal/nodes/for.rb +48 -0
  161. data/lib/opal/nodes/hash.rb +67 -0
  162. data/lib/opal/nodes/helpers.rb +116 -0
  163. data/lib/opal/nodes/if.rb +81 -0
  164. data/lib/opal/nodes/iter.rb +136 -0
  165. data/lib/opal/nodes/literal.rb +247 -0
  166. data/lib/opal/nodes/logic.rb +217 -0
  167. data/lib/opal/nodes/masgn.rb +62 -0
  168. data/lib/opal/nodes/module.rb +45 -0
  169. data/lib/opal/nodes/rescue.rb +143 -0
  170. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  171. data/lib/opal/nodes/scope.rb +281 -0
  172. data/lib/opal/nodes/singleton_class.rb +26 -0
  173. data/lib/opal/nodes/super.rb +97 -0
  174. data/lib/opal/nodes/top.rb +103 -0
  175. data/lib/opal/nodes/variables.rb +191 -0
  176. data/lib/opal/nodes/while.rb +65 -0
  177. data/lib/opal/nodes/yield.rb +95 -0
  178. data/lib/opal/parser.rb +742 -0
  179. data/lib/opal/parser/grammar.rb +5723 -0
  180. data/lib/opal/parser/grammar.y +1787 -0
  181. data/lib/opal/parser/keywords.rb +66 -0
  182. data/lib/opal/parser/lexer.rb +1260 -0
  183. data/lib/opal/parser/parser_scope.rb +28 -0
  184. data/lib/opal/parser/sexp.rb +81 -0
  185. data/lib/opal/path_reader.rb +35 -0
  186. data/lib/opal/paths.rb +55 -0
  187. data/lib/opal/regexp_anchors.rb +5 -0
  188. data/lib/opal/source_map.rb +70 -0
  189. data/lib/opal/sprockets.rb +3 -0
  190. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  191. data/lib/opal/sprockets/environment.rb +31 -0
  192. data/lib/opal/sprockets/erb.rb +23 -0
  193. data/lib/opal/sprockets/path_reader.rb +36 -0
  194. data/lib/opal/sprockets/processor.rb +167 -0
  195. data/lib/opal/sprockets/server.rb +160 -0
  196. data/lib/opal/sprockets/source_map_header_patch.rb +41 -0
  197. data/lib/opal/sprockets/source_map_server.rb +115 -0
  198. data/lib/opal/util.rb +69 -0
  199. data/lib/opal/version.rb +5 -0
  200. data/lib/tilt/opal.rb +54 -0
  201. data/opal.gemspec +37 -0
  202. data/opal/README.md +6 -0
  203. data/opal/corelib/array.rb +2073 -0
  204. data/opal/corelib/array/inheritance.rb +127 -0
  205. data/opal/corelib/basic_object.rb +82 -0
  206. data/opal/corelib/boolean.rb +47 -0
  207. data/opal/corelib/class.rb +55 -0
  208. data/opal/corelib/comparable.rb +57 -0
  209. data/opal/corelib/complex.rb +3 -0
  210. data/opal/corelib/dir.rb +20 -0
  211. data/opal/corelib/enumerable.rb +1138 -0
  212. data/opal/corelib/enumerator.rb +426 -0
  213. data/opal/corelib/error.rb +77 -0
  214. data/opal/corelib/file.rb +59 -0
  215. data/opal/corelib/hash.rb +951 -0
  216. data/opal/corelib/helpers.rb +102 -0
  217. data/opal/corelib/io.rb +73 -0
  218. data/opal/corelib/kernel.rb +1124 -0
  219. data/opal/corelib/main.rb +7 -0
  220. data/opal/corelib/match_data.rb +128 -0
  221. data/opal/corelib/method.rb +62 -0
  222. data/opal/corelib/module.rb +553 -0
  223. data/opal/corelib/nil_class.rb +57 -0
  224. data/opal/corelib/numeric.rb +564 -0
  225. data/opal/corelib/proc.rb +105 -0
  226. data/opal/corelib/process.rb +27 -0
  227. data/opal/corelib/range.rb +116 -0
  228. data/opal/corelib/rational.rb +3 -0
  229. data/opal/corelib/regexp.rb +203 -0
  230. data/opal/corelib/runtime.js +1637 -0
  231. data/opal/corelib/string.rb +1762 -0
  232. data/opal/corelib/string/inheritance.rb +117 -0
  233. data/opal/corelib/struct.rb +159 -0
  234. data/opal/corelib/time.rb +746 -0
  235. data/opal/corelib/variables.rb +28 -0
  236. data/opal/opal.rb +33 -0
  237. data/spec/README.md +8 -0
  238. data/spec/filters/bugs/array.rb +77 -0
  239. data/spec/filters/bugs/basicobject.rb +33 -0
  240. data/spec/filters/bugs/class.rb +15 -0
  241. data/spec/filters/bugs/comparable.rb +4 -0
  242. data/spec/filters/bugs/date.rb +173 -0
  243. data/spec/filters/bugs/enumerable.rb +62 -0
  244. data/spec/filters/bugs/enumerator.rb +45 -0
  245. data/spec/filters/bugs/exception.rb +84 -0
  246. data/spec/filters/bugs/fixnum.rb +35 -0
  247. data/spec/filters/bugs/float.rb +100 -0
  248. data/spec/filters/bugs/hash.rb +17 -0
  249. data/spec/filters/bugs/integer.rb +63 -0
  250. data/spec/filters/bugs/kernel.rb +395 -0
  251. data/spec/filters/bugs/language.rb +246 -0
  252. data/spec/filters/bugs/math.rb +89 -0
  253. data/spec/filters/bugs/method.rb +5 -0
  254. data/spec/filters/bugs/module.rb +372 -0
  255. data/spec/filters/bugs/nil.rb +7 -0
  256. data/spec/filters/bugs/numeric.rb +123 -0
  257. data/spec/filters/bugs/proc.rb +65 -0
  258. data/spec/filters/bugs/range.rb +148 -0
  259. data/spec/filters/bugs/regexp.rb +252 -0
  260. data/spec/filters/bugs/set.rb +51 -0
  261. data/spec/filters/bugs/singleton.rb +6 -0
  262. data/spec/filters/bugs/string.rb +99 -0
  263. data/spec/filters/bugs/strscan.rb +106 -0
  264. data/spec/filters/bugs/struct.rb +22 -0
  265. data/spec/filters/bugs/time.rb +28 -0
  266. data/spec/filters/bugs/unboundmethod.rb +22 -0
  267. data/spec/filters/unsupported/array.rb +176 -0
  268. data/spec/filters/unsupported/basicobject.rb +12 -0
  269. data/spec/filters/unsupported/class.rb +4 -0
  270. data/spec/filters/unsupported/delegator.rb +5 -0
  271. data/spec/filters/unsupported/enumerable.rb +8 -0
  272. data/spec/filters/unsupported/enumerator.rb +13 -0
  273. data/spec/filters/unsupported/fixnum.rb +15 -0
  274. data/spec/filters/unsupported/float.rb +6 -0
  275. data/spec/filters/unsupported/hash.rb +55 -0
  276. data/spec/filters/unsupported/integer.rb +3 -0
  277. data/spec/filters/unsupported/kernel.rb +22 -0
  278. data/spec/filters/unsupported/language.rb +31 -0
  279. data/spec/filters/unsupported/matchdata.rb +33 -0
  280. data/spec/filters/unsupported/math.rb +3 -0
  281. data/spec/filters/unsupported/module.rb +36 -0
  282. data/spec/filters/unsupported/pathname.rb +3 -0
  283. data/spec/filters/unsupported/regexp.rb +94 -0
  284. data/spec/filters/unsupported/set.rb +4 -0
  285. data/spec/filters/unsupported/singleton.rb +6 -0
  286. data/spec/filters/unsupported/string.rb +538 -0
  287. data/spec/filters/unsupported/struct.rb +3 -0
  288. data/spec/filters/unsupported/time.rb +208 -0
  289. data/spec/lib/builder_processors_spec.rb +27 -0
  290. data/spec/lib/builder_spec.rb +72 -0
  291. data/spec/lib/cli_spec.rb +150 -0
  292. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +87 -0
  293. data/spec/lib/compiler_spec.rb +131 -0
  294. data/spec/lib/dependency_resolver_spec.rb +40 -0
  295. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +4 -0
  296. data/spec/lib/fixtures/file_with_directives.js +2 -0
  297. data/spec/lib/fixtures/jst_file.js.jst +1 -0
  298. data/spec/lib/fixtures/no_requires.rb +1 -0
  299. data/spec/lib/fixtures/opal_file.rb +2 -0
  300. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  301. data/spec/lib/fixtures/required_file.js +1 -0
  302. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  303. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  304. data/spec/lib/fixtures/requires.rb +7 -0
  305. data/spec/lib/fixtures/source_map.rb +1 -0
  306. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +1 -0
  307. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  308. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  309. data/spec/lib/hike_path_finder_spec.rb +23 -0
  310. data/spec/lib/lexer_spec.rb +110 -0
  311. data/spec/lib/parser/alias_spec.rb +26 -0
  312. data/spec/lib/parser/and_spec.rb +13 -0
  313. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  314. data/spec/lib/parser/begin_spec.rb +42 -0
  315. data/spec/lib/parser/block_spec.rb +12 -0
  316. data/spec/lib/parser/break_spec.rb +17 -0
  317. data/spec/lib/parser/call_spec.rb +165 -0
  318. data/spec/lib/parser/class_spec.rb +35 -0
  319. data/spec/lib/parser/comments_spec.rb +11 -0
  320. data/spec/lib/parser/def_spec.rb +80 -0
  321. data/spec/lib/parser/if_spec.rb +26 -0
  322. data/spec/lib/parser/iter_spec.rb +59 -0
  323. data/spec/lib/parser/lambda_spec.rb +64 -0
  324. data/spec/lib/parser/literal_spec.rb +118 -0
  325. data/spec/lib/parser/masgn_spec.rb +37 -0
  326. data/spec/lib/parser/module_spec.rb +27 -0
  327. data/spec/lib/parser/not_spec.rb +21 -0
  328. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  329. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  330. data/spec/lib/parser/or_spec.rb +13 -0
  331. data/spec/lib/parser/return_spec.rb +17 -0
  332. data/spec/lib/parser/sclass_spec.rb +21 -0
  333. data/spec/lib/parser/string_spec.rb +276 -0
  334. data/spec/lib/parser/super_spec.rb +20 -0
  335. data/spec/lib/parser/unary_spec.rb +48 -0
  336. data/spec/lib/parser/undef_spec.rb +15 -0
  337. data/spec/lib/parser/unless_spec.rb +13 -0
  338. data/spec/lib/parser/variables_spec.rb +92 -0
  339. data/spec/lib/parser/while_spec.rb +15 -0
  340. data/spec/lib/parser/yield_spec.rb +20 -0
  341. data/spec/lib/path_reader_spec.rb +36 -0
  342. data/spec/lib/shared/path_finder_shared.rb +19 -0
  343. data/spec/lib/shared/path_reader_shared.rb +31 -0
  344. data/spec/lib/spec_helper.rb +9 -0
  345. data/spec/lib/sprockets/erb_spec.rb +38 -0
  346. data/spec/lib/sprockets/path_reader_spec.rb +41 -0
  347. data/spec/lib/sprockets/processor_spec.rb +67 -0
  348. data/spec/lib/sprockets/server_spec.rb +102 -0
  349. data/spec/lib/tilt/opal_spec.rb +37 -0
  350. data/spec/opal/compiler/irb_spec.rb +44 -0
  351. data/spec/opal/core/array/intersection_spec.rb +38 -0
  352. data/spec/opal/core/array/minus_spec.rb +38 -0
  353. data/spec/opal/core/array/select_spec.rb +14 -0
  354. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  355. data/spec/opal/core/array/union_spec.rb +38 -0
  356. data/spec/opal/core/array/uniq_spec.rb +49 -0
  357. data/spec/opal/core/date_spec.rb +177 -0
  358. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  359. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  360. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  361. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  362. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  363. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  364. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  365. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  366. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  367. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  368. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  369. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  370. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  371. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  372. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  373. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  374. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  375. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  376. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  377. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  378. data/spec/opal/core/exception_spec.rb +13 -0
  379. data/spec/opal/core/fixtures/class.rb +124 -0
  380. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  381. data/spec/opal/core/fixtures/constants.rb +33 -0
  382. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  383. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  384. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  385. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  386. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  387. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +1 -0
  388. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +1 -0
  389. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +1 -0
  390. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  391. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  392. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  393. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  394. data/spec/opal/core/hash/has_value_spec.rb +13 -0
  395. data/spec/opal/core/hash/internals_spec.rb +332 -0
  396. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  397. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  398. data/spec/opal/core/kernel/class_spec.rb +6 -0
  399. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  400. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  401. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  402. data/spec/opal/core/kernel/format_spec.rb +122 -0
  403. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  404. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  405. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  406. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  407. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  408. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  409. data/spec/opal/core/kernel/match_spec.rb +5 -0
  410. data/spec/opal/core/kernel/method_spec.rb +31 -0
  411. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  412. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  413. data/spec/opal/core/kernel/p_spec.rb +15 -0
  414. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  415. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  416. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  417. data/spec/opal/core/kernel/require_tree_spec.rb +18 -0
  418. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  419. data/spec/opal/core/kernel/send_spec.rb +56 -0
  420. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  421. data/spec/opal/core/language/block_spec.rb +538 -0
  422. data/spec/opal/core/language/fixtures/array.rb +11 -0
  423. data/spec/opal/core/language/fixtures/block.rb +57 -0
  424. data/spec/opal/core/language/fixtures/break.rb +240 -0
  425. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  426. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  427. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  428. data/spec/opal/core/language/fixtures/module.rb +24 -0
  429. data/spec/opal/core/language/fixtures/next.rb +128 -0
  430. data/spec/opal/core/language/fixtures/return.rb +118 -0
  431. data/spec/opal/core/language/fixtures/send.rb +110 -0
  432. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  433. data/spec/opal/core/language/fixtures/super.rb +308 -0
  434. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  435. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  436. data/spec/opal/core/language/predefined_spec.rb +138 -0
  437. data/spec/opal/core/language/proc_spec.rb +263 -0
  438. data/spec/opal/core/language/regexp_spec.rb +20 -0
  439. data/spec/opal/core/language/send_spec.rb +225 -0
  440. data/spec/opal/core/language/string_spec.rb +44 -0
  441. data/spec/opal/core/language/variables_spec.rb +1366 -0
  442. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  443. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  444. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  445. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  446. data/spec/opal/core/language/versions/def_2_0_spec.rb +62 -0
  447. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  448. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  449. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  450. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  451. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  452. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  453. data/spec/opal/core/language_spec.rb +23 -0
  454. data/spec/opal/core/method/to_proc_spec.rb +28 -0
  455. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  456. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  457. data/spec/opal/core/module/append_features_spec.rb +14 -0
  458. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  459. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  460. data/spec/opal/core/module/const_get_spec.rb +85 -0
  461. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  462. data/spec/opal/core/module/const_set_spec.rb +64 -0
  463. data/spec/opal/core/module/constants_spec.rb +49 -0
  464. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  465. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  466. data/spec/opal/core/module/module_function_spec.rb +25 -0
  467. data/spec/opal/core/module/name_spec.rb +52 -0
  468. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  469. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  470. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  471. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  472. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  473. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  474. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  475. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  476. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  477. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  478. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  479. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  480. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  481. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  482. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  483. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  484. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  485. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  486. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  487. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  488. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  489. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  490. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  491. data/spec/opal/core/numeric/next_spec.rb +9 -0
  492. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  493. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  494. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  495. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  496. data/spec/opal/core/numeric/step_spec.rb +11 -0
  497. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  498. data/spec/opal/core/numeric/times_spec.rb +36 -0
  499. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  500. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  501. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  502. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  503. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  504. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  505. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  506. data/spec/opal/core/object_id_spec.rb +56 -0
  507. data/spec/opal/core/proc/call_spec.rb +21 -0
  508. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  509. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  510. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  511. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  512. data/spec/opal/core/runtime/block_spec.rb +23 -0
  513. data/spec/opal/core/runtime/bridged_classes_spec.rb +111 -0
  514. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  515. data/spec/opal/core/runtime/donate_spec.rb +53 -0
  516. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  517. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  518. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  519. data/spec/opal/core/runtime/method_spec.rb +31 -0
  520. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  521. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  522. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  523. data/spec/opal/core/runtime/return_spec.rb +38 -0
  524. data/spec/opal/core/runtime/send_spec.rb +34 -0
  525. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  526. data/spec/opal/core/runtime/super_spec.rb +212 -0
  527. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  528. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  529. data/spec/opal/core/runtime_spec.rb +58 -0
  530. data/spec/opal/core/source_map_spec.rb +15 -0
  531. data/spec/opal/core/string_spec.rb +11 -0
  532. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  533. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  534. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  535. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  536. data/spec/opal/stdlib/js_spec.rb +66 -0
  537. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  538. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  539. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  540. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  541. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  542. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  543. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  544. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  545. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  546. data/spec/opal/stdlib/native/native_alias_spec.rb +19 -0
  547. data/spec/opal/stdlib/native/native_class_spec.rb +18 -0
  548. data/spec/opal/stdlib/native/native_module_spec.rb +13 -0
  549. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  550. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  551. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  552. data/spec/opal/stdlib/promise/always_spec.rb +30 -0
  553. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  554. data/spec/opal/stdlib/promise/rescue_spec.rb +44 -0
  555. data/spec/opal/stdlib/promise/then_spec.rb +71 -0
  556. data/spec/opal/stdlib/promise/trace_spec.rb +52 -0
  557. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  558. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  559. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  560. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  561. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  562. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  563. data/spec/rubyspecs +144 -0
  564. data/spec/spec_helper.rb +53 -0
  565. data/spec/support/mspec_rspec_adapter.rb +33 -0
  566. data/spec/support/parser_helpers.rb +37 -0
  567. data/stdlib/README.md +3 -0
  568. data/stdlib/base64.rb +152 -0
  569. data/stdlib/benchmark.rb +557 -0
  570. data/stdlib/buffer.rb +41 -0
  571. data/stdlib/buffer/array.rb +66 -0
  572. data/stdlib/buffer/view.rb +70 -0
  573. data/stdlib/date.rb +248 -0
  574. data/stdlib/delegate.rb +29 -0
  575. data/stdlib/dir.rb +1 -0
  576. data/stdlib/encoding.rb +170 -0
  577. data/stdlib/enumerator.rb +1 -0
  578. data/stdlib/erb.rb +16 -0
  579. data/stdlib/file.rb +1 -0
  580. data/stdlib/fileutils.rb +0 -0
  581. data/stdlib/forwardable.rb +71 -0
  582. data/stdlib/iconv.rb +0 -0
  583. data/stdlib/js.rb +56 -0
  584. data/stdlib/json.rb +190 -0
  585. data/stdlib/math.rb +370 -0
  586. data/stdlib/native.rb +530 -0
  587. data/stdlib/nodejs.rb +7 -0
  588. data/stdlib/nodejs/dir.rb +13 -0
  589. data/stdlib/nodejs/file.rb +98 -0
  590. data/stdlib/nodejs/fileutils.rb +26 -0
  591. data/stdlib/nodejs/io.rb +2 -0
  592. data/stdlib/nodejs/irb.rb +45 -0
  593. data/stdlib/nodejs/kernel.rb +33 -0
  594. data/stdlib/nodejs/node_modules/.bin/js-yaml +140 -0
  595. data/stdlib/nodejs/node_modules/glob/LICENSE +15 -0
  596. data/stdlib/nodejs/node_modules/glob/README.md +357 -0
  597. data/stdlib/nodejs/node_modules/glob/common.js +177 -0
  598. data/stdlib/nodejs/node_modules/glob/glob.js +649 -0
  599. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/.eslintrc +17 -0
  600. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/LICENSE +15 -0
  601. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/README.md +37 -0
  602. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/inflight.js +44 -0
  603. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +15 -0
  604. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +36 -0
  605. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +52 -0
  606. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/test/basic.js +51 -0
  607. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +33 -0
  608. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/package.json +61 -0
  609. data/stdlib/nodejs/node_modules/glob/node_modules/inflight/test.js +97 -0
  610. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/LICENSE +16 -0
  611. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/README.md +42 -0
  612. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits.js +1 -0
  613. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/inherits_browser.js +23 -0
  614. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/package.json +51 -0
  615. data/stdlib/nodejs/node_modules/glob/node_modules/inherits/test.js +25 -0
  616. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.npmignore +1 -0
  617. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/.travis.yml +4 -0
  618. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  619. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/README.md +216 -0
  620. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/benchmark.js +15 -0
  621. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/browser.js +1181 -0
  622. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/minimatch.js +845 -0
  623. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.npmignore +2 -0
  624. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/.travis.yml +3 -0
  625. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +121 -0
  626. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/example.js +8 -0
  627. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +191 -0
  628. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +2 -0
  629. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml +4 -0
  630. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/Makefile +6 -0
  631. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +80 -0
  632. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js +5 -0
  633. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +38 -0
  634. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +73 -0
  635. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js +56 -0
  636. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +4 -0
  637. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +18 -0
  638. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +62 -0
  639. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +6 -0
  640. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +13 -0
  641. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +83 -0
  642. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +39 -0
  643. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +75 -0
  644. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js +32 -0
  645. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt +1075 -0
  646. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt +182 -0
  647. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js +9 -0
  648. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js +10 -0
  649. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh +24 -0
  650. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js +15 -0
  651. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/nested.js +16 -0
  652. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/order.js +10 -0
  653. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/pad.js +13 -0
  654. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js +7 -0
  655. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js +50 -0
  656. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/package.json +60 -0
  657. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  658. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/brace-expand.js +45 -0
  659. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  660. data/stdlib/nodejs/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  661. data/stdlib/nodejs/node_modules/glob/node_modules/once/LICENSE +27 -0
  662. data/stdlib/nodejs/node_modules/glob/node_modules/once/README.md +51 -0
  663. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +15 -0
  664. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +36 -0
  665. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +52 -0
  666. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/test/basic.js +51 -0
  667. data/stdlib/nodejs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +33 -0
  668. data/stdlib/nodejs/node_modules/glob/node_modules/once/once.js +21 -0
  669. data/stdlib/nodejs/node_modules/glob/node_modules/once/package.json +60 -0
  670. data/stdlib/nodejs/node_modules/glob/node_modules/once/test/once.js +23 -0
  671. data/stdlib/nodejs/node_modules/glob/package.json +72 -0
  672. data/stdlib/nodejs/node_modules/glob/sync.js +409 -0
  673. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +277 -0
  674. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +21 -0
  675. data/stdlib/nodejs/node_modules/js-yaml/README.md +288 -0
  676. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +140 -0
  677. data/stdlib/nodejs/node_modules/js-yaml/bower.json +23 -0
  678. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.js +3666 -0
  679. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +3 -0
  680. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +102 -0
  681. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +18 -0
  682. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +31 -0
  683. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +22 -0
  684. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +18 -0
  685. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +197 -0
  686. data/stdlib/nodejs/node_modules/js-yaml/index.js +7 -0
  687. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +39 -0
  688. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +62 -0
  689. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +554 -0
  690. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +25 -0
  691. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +1581 -0
  692. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +78 -0
  693. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +103 -0
  694. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +18 -0
  695. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +25 -0
  696. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +28 -0
  697. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +17 -0
  698. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +25 -0
  699. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +61 -0
  700. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +133 -0
  701. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +37 -0
  702. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +110 -0
  703. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +183 -0
  704. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +85 -0
  705. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +84 -0
  706. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +27 -0
  707. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +8 -0
  708. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +12 -0
  709. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +36 -0
  710. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +56 -0
  711. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +61 -0
  712. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +8 -0
  713. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +33 -0
  714. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +8 -0
  715. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +98 -0
  716. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +117 -0
  717. data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +177 -0
  718. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +115 -0
  719. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +21 -0
  720. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +239 -0
  721. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +36 -0
  722. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +22 -0
  723. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +59 -0
  724. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +13 -0
  725. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +33 -0
  726. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +28 -0
  727. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +23 -0
  728. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +49 -0
  729. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +35 -0
  730. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +270 -0
  731. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +1 -0
  732. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +146 -0
  733. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +55 -0
  734. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +47 -0
  735. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +40 -0
  736. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +48 -0
  737. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +50 -0
  738. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +43 -0
  739. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +27 -0
  740. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +26 -0
  741. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +148 -0
  742. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +50 -0
  743. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +481 -0
  744. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +14 -0
  745. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +50 -0
  746. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +54 -0
  747. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +75 -0
  748. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +1168 -0
  749. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +18 -0
  750. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +88 -0
  751. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +798 -0
  752. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +77 -0
  753. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +2 -0
  754. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +8 -0
  755. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +825 -0
  756. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +33 -0
  757. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +11 -0
  758. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +10 -0
  759. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +26 -0
  760. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +673 -0
  761. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  762. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +107 -0
  763. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +23 -0
  764. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +22 -0
  765. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +69 -0
  766. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +6 -0
  767. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +1415 -0
  768. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +62 -0
  769. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +73 -0
  770. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +117 -0
  771. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +177 -0
  772. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +3908 -0
  773. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +69 -0
  774. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +239 -0
  775. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +422 -0
  776. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +66 -0
  777. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +387 -0
  778. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +20238 -0
  779. data/stdlib/nodejs/node_modules/js-yaml/package.json +83 -0
  780. data/stdlib/nodejs/package.json +6 -0
  781. data/stdlib/nodejs/require.rb +30 -0
  782. data/stdlib/nodejs/rubygems.rb +68 -0
  783. data/stdlib/nodejs/yaml.rb +11 -0
  784. data/stdlib/observer.rb +202 -0
  785. data/stdlib/opal-parser.rb +54 -0
  786. data/stdlib/opal-source-maps.rb +2 -0
  787. data/stdlib/ostruct.rb +69 -0
  788. data/stdlib/pathname.rb +55 -0
  789. data/stdlib/phantomjs.rb +3 -0
  790. data/stdlib/pp.rb +35 -0
  791. data/stdlib/promise.rb +427 -0
  792. data/stdlib/racc/parser.rb +215 -0
  793. data/stdlib/rbconfig.rb +18 -0
  794. data/stdlib/securerandom.rb +12 -0
  795. data/stdlib/set.rb +170 -0
  796. data/stdlib/singleton.rb +40 -0
  797. data/stdlib/source_map.rb +5 -0
  798. data/stdlib/source_map/map.rb +220 -0
  799. data/stdlib/source_map/mapping.rb +26 -0
  800. data/stdlib/source_map/offset.rb +88 -0
  801. data/stdlib/source_map/version.rb +3 -0
  802. data/stdlib/source_map/vlq.rb +98 -0
  803. data/stdlib/sourcemap.rb +1 -0
  804. data/stdlib/stringio.rb +181 -0
  805. data/stdlib/strscan.rb +166 -0
  806. data/stdlib/template.rb +46 -0
  807. data/stdlib/thread.rb +164 -0
  808. data/stdlib/time.rb +9 -0
  809. data/stdlib/yaml.rb +1 -0
  810. data/tasks/benchmarking.rake +88 -0
  811. data/tasks/building.rake +58 -0
  812. data/tasks/documenting.rake +37 -0
  813. data/tasks/github.rake +19 -0
  814. data/tasks/linting.rake +18 -0
  815. data/tasks/testing.rake +125 -0
  816. data/vendored-minitest/minitest.rb +780 -0
  817. data/vendored-minitest/minitest/assertions.rb +662 -0
  818. data/vendored-minitest/minitest/autorun.rb +12 -0
  819. data/vendored-minitest/minitest/benchmark.rb +426 -0
  820. data/vendored-minitest/minitest/expectations.rb +281 -0
  821. data/vendored-minitest/minitest/hell.rb +11 -0
  822. data/vendored-minitest/minitest/mock.rb +220 -0
  823. data/vendored-minitest/minitest/parallel.rb +65 -0
  824. data/vendored-minitest/minitest/pride.rb +4 -0
  825. data/vendored-minitest/minitest/pride_plugin.rb +142 -0
  826. data/vendored-minitest/minitest/spec.rb +310 -0
  827. data/vendored-minitest/minitest/test.rb +293 -0
  828. data/vendored-minitest/minitest/unit.rb +45 -0
  829. data/vendored-minitest/test/unit.rb +28 -0
  830. metadata +1058 -0
@@ -0,0 +1,66 @@
1
+ module Opal
2
+ module Keywords
3
+
4
+ class KeywordTable
5
+ attr_accessor :name, :id, :state
6
+
7
+ def initialize(name, id, state)
8
+ @name = name
9
+ @id = id
10
+ @state = state
11
+ end
12
+ end
13
+
14
+ KEYWORDS = [
15
+ ["__LINE__", [:k__LINE__, :k__LINE__], :expr_end],
16
+ ["__FILE__", [:k__FILE__, :k__FILE__], :expr_end],
17
+ ["alias", [:kALIAS, :kALIAS], :expr_fname],
18
+ ["and", [:kAND, :kAND], :expr_beg],
19
+ ["begin", [:kBEGIN, :kBEGIN], :expr_beg],
20
+ ["break", [:kBREAK, :kBREAK], :expr_mid],
21
+ ["case", [:kCASE, :kCASE], :expr_beg],
22
+ ["class", [:kCLASS, :kCLASS], :expr_class],
23
+ ["def", [:kDEF, :kDEF], :expr_fname],
24
+ ["defined?", [:kDEFINED, :kDEFINED], :expr_arg],
25
+ ["do", [:kDO, :kDO], :expr_beg],
26
+ ["else", [:kELSE, :kELSE], :expr_beg],
27
+ ["elsif", [:kELSIF, :kELSIF], :expr_beg],
28
+ ["end", [:kEND, :kEND], :expr_end],
29
+ ["ensure", [:kENSURE, :kENSURE], :expr_beg],
30
+ ["false", [:kFALSE, :kFALSE], :expr_end],
31
+ ["for", [:kFOR, :kFOR], :expr_beg],
32
+ ["if", [:kIF, :kIF_MOD], :expr_beg],
33
+ ["in", [:kIN, :kIN], :expr_beg],
34
+ ["module", [:kMODULE, :kMODULE], :expr_beg],
35
+ ["nil", [:kNIL, :kNIL], :expr_end],
36
+ ["next", [:kNEXT, :kNEXT], :expr_mid],
37
+ ["not", [:kNOT, :kNOT], :expr_beg],
38
+ ["or", [:kOR, :kOR], :expr_beg],
39
+ ["redo", [:kREDO, :kREDO], :expr_end],
40
+ ["rescue", [:kRESCUE, :kRESCUE_MOD], :expr_mid],
41
+ ["return", [:kRETURN, :kRETURN], :expr_mid],
42
+ ["self", [:kSELF, :kSELF], :expr_end],
43
+ ["super", [:kSUPER, :kSUPER], :expr_arg],
44
+ ["then", [:kTHEN, :kTHEN], :expr_beg],
45
+ ["true", [:kTRUE, :kTRUE], :expr_end],
46
+ ["undef", [:kUNDEF, :kUNDEF], :expr_fname],
47
+ ["unless", [:kUNLESS, :kUNLESS_MOD], :expr_beg],
48
+ ["until", [:kUNTIL, :kUNTIL_MOD], :expr_beg],
49
+ ["when", [:kWHEN, :kWHEN], :expr_beg],
50
+ ["while", [:kWHILE, :kWHILE_MOD], :expr_beg],
51
+ ["yield", [:kYIELD, :kYIELD], :expr_arg]
52
+ ].map { |decl| KeywordTable.new(*decl) }
53
+
54
+ def self.map
55
+ unless @map
56
+ @map = {}
57
+ KEYWORDS.each { |k| @map[k.name] = k }
58
+ end
59
+ @map
60
+ end
61
+
62
+ def self.keyword(kw)
63
+ map[kw]
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,1260 @@
1
+ require 'opal/regexp_anchors'
2
+ require 'strscan'
3
+ require 'opal/parser/keywords'
4
+
5
+ module Opal
6
+ # {Opal::Lexer} is used by {Opal::Parser} to step through ruby code, and
7
+ # returning tokens representing each chunk of ruby code.
8
+ #
9
+ # Tokens are in the form:
10
+ #
11
+ # [token, [value, location]]
12
+ #
13
+ # where `location` is in the form `[line_number, column_number]`. The location
14
+ # data can be used to produce source maps in the compiler. Tokens are
15
+ # generally ruby symbols, and the value will always be a string value.
16
+ #
17
+ # The main method used by the parser is {#next_token}, which is called
18
+ # repeatedly until a token of value `false` is returned, which indicated the
19
+ # EOF has been reached.
20
+ #
21
+ # Generally this class is only used by {Opal::Parser} directly.
22
+ #
23
+ class Lexer
24
+
25
+ STR_FUNC_ESCAPE = 0x01
26
+ STR_FUNC_EXPAND = 0x02
27
+ STR_FUNC_REGEXP = 0x04
28
+ STR_FUNC_QWORDS = 0x08
29
+ STR_FUNC_SYMBOL = 0x10
30
+ STR_FUNC_INDENT = 0x20
31
+ STR_FUNC_XQUOTE = 0x40
32
+
33
+ STR_SQUOTE = 0x00
34
+ STR_DQUOTE = STR_FUNC_EXPAND
35
+ STR_XQUOTE = STR_FUNC_EXPAND | STR_FUNC_XQUOTE
36
+ STR_REGEXP = STR_FUNC_REGEXP | STR_FUNC_ESCAPE | STR_FUNC_EXPAND
37
+ STR_SWORD = STR_FUNC_QWORDS
38
+ STR_DWORD = STR_FUNC_QWORDS | STR_FUNC_EXPAND
39
+ STR_SSYM = STR_FUNC_SYMBOL
40
+ STR_DSYM = STR_FUNC_SYMBOL | STR_FUNC_EXPAND
41
+
42
+ attr_reader :line, :column
43
+ attr_reader :scope
44
+ attr_reader :eof_content
45
+
46
+ attr_accessor :lex_state
47
+ attr_accessor :strterm
48
+ attr_accessor :scanner
49
+ attr_accessor :yylval
50
+ attr_accessor :parser
51
+
52
+ # Create a new instance using the given ruby code and filename for
53
+ # reference.
54
+ #
55
+ # Opal::Lexer.new("ruby code", "my_file.rb")
56
+ #
57
+ # @param source [String] ruby code to lex
58
+ # @param file [String] filename of given ruby code
59
+ def initialize(source, file)
60
+ @lex_state = :expr_beg
61
+ @cond = 0
62
+ @cmdarg = 0
63
+ @line = 1
64
+ @tok_line = 1
65
+ @column = 0
66
+ @tok_column = 0
67
+ @file = file
68
+
69
+ @scanner = StringScanner.new(source)
70
+ @scanner_stack = [@scanner]
71
+
72
+ @case_stmt = nil
73
+ @start_of_lambda = nil
74
+ end
75
+
76
+ # Returns next token from source input stream.
77
+ #
78
+ # Token in form:
79
+ #
80
+ # [token, [value, [source_line, source_column]]]
81
+ #
82
+ # @return [Array]
83
+ def next_token
84
+ token = self.yylex
85
+ value = self.yylval
86
+ location = [@tok_line, @tok_column]
87
+
88
+ # once location is stored, ensure next token starts in correct place
89
+ @tok_column = @column
90
+ @tok_line = @line
91
+
92
+ [token, [value, location]]
93
+ end
94
+
95
+ def has_local?(local)
96
+ parser.scope.has_local?(local.to_sym)
97
+ end
98
+
99
+ def cond_push(n)
100
+ @cond = (@cond << 1) | (n & 1)
101
+ end
102
+
103
+ def cond_pop
104
+ @cond = @cond >> 1
105
+ end
106
+
107
+ def cond_lexpop
108
+ @cond = (@cond >> 1) | (@cond & 1)
109
+ end
110
+
111
+ def cond?
112
+ (@cond & 1) != 0
113
+ end
114
+
115
+ def cmdarg_push(n)
116
+ @cmdarg = (@cmdarg << 1) | (n & 1)
117
+ end
118
+
119
+ def cmdarg_pop
120
+ @cmdarg = @cmdarg >> 1
121
+ end
122
+
123
+ def cmdarg_lexpop
124
+ @cmdarg = (@cmdarg >> 1) | (@cmdarg & 1)
125
+ end
126
+
127
+ def cmdarg?
128
+ (@cmdarg & 1) != 0
129
+ end
130
+
131
+ def arg?
132
+ [:expr_arg, :expr_cmdarg].include? @lex_state
133
+ end
134
+
135
+ def end?
136
+ [:expr_end, :expr_endarg, :expr_endfn].include? @lex_state
137
+ end
138
+
139
+ def beg?
140
+ [:expr_beg, :expr_value, :expr_mid, :expr_class].include? @lex_state
141
+ end
142
+
143
+ def after_operator?
144
+ [:expr_fname, :expr_dot].include? @lex_state
145
+ end
146
+
147
+ def label_state?
148
+ [:expr_beg, :expr_endfn].include?(@lex_state) or arg?
149
+ end
150
+
151
+ def spcarg?
152
+ arg? and @space_seen and !space?
153
+ end
154
+
155
+ def space?
156
+ @scanner.check(/\s/)
157
+ end
158
+
159
+ def set_arg_state
160
+ @lex_state = after_operator? ? :expr_arg : :expr_beg
161
+ end
162
+
163
+ def scan(regexp)
164
+ if result = @scanner.scan(regexp)
165
+ @column += result.length
166
+ @yylval += @scanner.matched
167
+ end
168
+
169
+ result
170
+ end
171
+
172
+ def skip(regexp)
173
+ if result = @scanner.scan(regexp)
174
+ @column += result.length
175
+ @tok_column = @column
176
+ end
177
+
178
+ result
179
+ end
180
+
181
+ def check(regexp)
182
+ @scanner.check regexp
183
+ end
184
+
185
+ def pushback(n)
186
+ @scanner.pos -= n
187
+ end
188
+
189
+ def matched
190
+ @scanner.matched
191
+ end
192
+
193
+ def line=(line)
194
+ @column = @tok_column = 0
195
+ @line = @tok_line = line
196
+ end
197
+
198
+ def new_strterm(func, term, paren)
199
+ { :type => :string, :func => func, :term => term, :paren => paren }
200
+ end
201
+
202
+ def new_strterm2(func, term, paren)
203
+ term = new_strterm(func, term, paren)
204
+ term.merge({ :balance => true, :nesting => 0 })
205
+ end
206
+
207
+ def new_op_asgn(value)
208
+ self.yylval = value
209
+ :tOP_ASGN
210
+ end
211
+
212
+ def process_numeric
213
+ @lex_state = :expr_end
214
+
215
+ if scan(/[\d_]+\.[\d_]+\b|[\d_]+(\.[\d_]+)?[eE][-+]?[\d_]+\b/) # FLOATS
216
+ self.yylval = scanner.matched.gsub(/_/, '').to_f
217
+ return :tFLOAT
218
+ elsif scan(/([^0][\d_]*|0)\b/) # BASE 10
219
+ self.yylval = scanner.matched.gsub(/_/, '').to_i
220
+ return :tINTEGER
221
+ elsif scan(/0[bB](0|1|_)+/) # BASE 2
222
+ self.yylval = scanner.matched.to_i(2)
223
+ return :tINTEGER
224
+ elsif scan(/0[xX](\d|[a-f]|[A-F]|_)+/) # BASE 16
225
+ self.yylval = scanner.matched.to_i(16)
226
+ return :tINTEGER
227
+ elsif scan(/0[oO]?([0-7]|_)+/) # BASE 8
228
+ self.yylval = scanner.matched.to_i(8)
229
+ return :tINTEGER
230
+ elsif scan(/0[dD]([0-9]|_)+/) # BASE 10
231
+ self.yylval = scanner.matched.gsub(/_/, '').to_i
232
+ return :tINTEGER
233
+ else
234
+ raise "Lexing error on numeric type: `#{scanner.peek 5}`"
235
+ end
236
+ end
237
+
238
+ def read_escape
239
+ if scan(/\\/)
240
+ "\\"
241
+ elsif scan(/n/)
242
+ "\n"
243
+ elsif scan(/t/)
244
+ "\t"
245
+ elsif scan(/r/)
246
+ "\r"
247
+ elsif scan(/f/)
248
+ "\f"
249
+ elsif scan(/v/)
250
+ "\v"
251
+ elsif scan(/a/)
252
+ "\a"
253
+ elsif scan(/b/)
254
+ "\b"
255
+ elsif scan(/e/)
256
+ "\e"
257
+ elsif scan(/s/)
258
+ " "
259
+ elsif scan(/[0-7]{1,3}/)
260
+ (matched.to_i(8) % 0x100).chr
261
+ elsif scan(/x([0-9a-fA-F]{1,2})/)
262
+ scanner[1].to_i(16).chr
263
+ elsif scan(/u([0-9a-zA-Z]{1,4})/)
264
+ scanner[1].to_i(16).chr(Encoding::UTF_8)
265
+ else
266
+ # escaped char doesnt need escaping, so just return it
267
+ scan(/./)
268
+ end
269
+ end
270
+
271
+ def peek_variable_name
272
+ if check(/[@$]/)
273
+ :tSTRING_DVAR
274
+ elsif scan(/\{/)
275
+ :tSTRING_DBEG
276
+ end
277
+ end
278
+
279
+ def here_document(str_parse)
280
+ eos_regx = /[ \t]*#{Regexp.escape(str_parse[:term])}(\r*\n|$)/
281
+ expand = true
282
+
283
+ # Don't escape single-quoted heredoc identifiers
284
+ escape = str_parse[:func] != STR_SQUOTE
285
+
286
+ if check(eos_regx)
287
+ scan(/[ \t]*#{Regexp.escape(str_parse[:term])}/)
288
+
289
+ if str_parse[:scanner]
290
+ @scanner_stack << str_parse[:scanner]
291
+ @scanner = str_parse[:scanner]
292
+ end
293
+
294
+ return :tSTRING_END
295
+ end
296
+
297
+ str_buffer = []
298
+
299
+ if scan(/#/)
300
+ if tok = peek_variable_name
301
+ return tok
302
+ end
303
+
304
+ str_buffer << '#'
305
+ end
306
+
307
+ until check(eos_regx) && scanner.bol?
308
+ if scanner.eos?
309
+ raise "reached EOF while in heredoc"
310
+ end
311
+
312
+ if scan(/\n/)
313
+ str_buffer << scanner.matched
314
+ elsif expand && check(/#(?=[\$\@\{])/)
315
+ break
316
+ elsif scan(/\\/)
317
+ str_buffer << (escape ? self.read_escape : scanner.matched)
318
+ else
319
+ reg = Regexp.new("[^\#\0\\\\\n]+|.")
320
+
321
+ scan reg
322
+ str_buffer << scanner.matched
323
+ end
324
+ end
325
+
326
+ complete_str = str_buffer.join ''
327
+ @line += complete_str.count("\n")
328
+
329
+ self.yylval = complete_str
330
+ return :tSTRING_CONTENT
331
+ end
332
+
333
+ def parse_string
334
+ str_parse = self.strterm
335
+ func = str_parse[:func]
336
+
337
+ space = false
338
+
339
+ qwords = (func & STR_FUNC_QWORDS) != 0
340
+ expand = (func & STR_FUNC_EXPAND) != 0
341
+ regexp = (func & STR_FUNC_REGEXP) != 0
342
+
343
+ space = true if qwords and scan(/\s+/)
344
+
345
+ # if not end of string, so we must be parsing contents
346
+ str_buffer = []
347
+
348
+ if scan Regexp.new(Regexp.escape(str_parse[:term]))
349
+ if qwords && !str_parse[:done_last_space]#&& space
350
+ str_parse[:done_last_space] = true
351
+ pushback(1)
352
+ self.yylval = ' '
353
+ return :tSPACE
354
+ end
355
+
356
+ if str_parse[:balance]
357
+ if str_parse[:nesting] == 0
358
+
359
+ if regexp
360
+ self.yylval = scan(/\w+/)
361
+ return :tREGEXP_END
362
+ end
363
+ return :tSTRING_END
364
+ else
365
+ str_buffer << scanner.matched
366
+ str_parse[:nesting] -= 1
367
+ self.strterm = str_parse
368
+ end
369
+ elsif regexp
370
+ @lex_state = :expr_end
371
+ self.yylval = scan(/\w+/)
372
+ return :tREGEXP_END
373
+ else
374
+ if str_parse[:scanner]
375
+ @scanner_stack << str_parse[:scanner]
376
+ @scanner = str_parse[:scanner]
377
+ end
378
+
379
+ return :tSTRING_END
380
+ end
381
+ end
382
+
383
+ if space
384
+ self.yylval = ' '
385
+ return :tSPACE
386
+ end
387
+
388
+ if str_parse[:balance] and scan Regexp.new(Regexp.escape(str_parse[:paren]))
389
+ str_buffer << scanner.matched
390
+ str_parse[:nesting] += 1
391
+ elsif check(/#[@$]/)
392
+ scan(/#/)
393
+ if expand
394
+ return :tSTRING_DVAR
395
+ else
396
+ str_buffer << scanner.matched
397
+ end
398
+
399
+ elsif scan(/#\{/)
400
+ if expand
401
+ return :tSTRING_DBEG
402
+ else
403
+ str_buffer << scanner.matched
404
+ end
405
+
406
+ # causes error, so we will just collect it later on with other text
407
+ elsif scan(/\#/)
408
+ str_buffer << '#'
409
+ end
410
+
411
+ add_string_content str_buffer, str_parse
412
+
413
+ complete_str = str_buffer.join ''
414
+ @line += complete_str.count("\n")
415
+
416
+ self.yylval = complete_str
417
+ return :tSTRING_CONTENT
418
+ end
419
+
420
+ def add_string_content(str_buffer, str_parse)
421
+ func = str_parse[:func]
422
+
423
+ end_str_re = Regexp.new(Regexp.escape(str_parse[:term]))
424
+
425
+ qwords = (func & STR_FUNC_QWORDS) != 0
426
+ expand = (func & STR_FUNC_EXPAND) != 0
427
+ regexp = (func & STR_FUNC_REGEXP) != 0
428
+ escape = (func & STR_FUNC_ESCAPE) != 0
429
+ xquote = (func == STR_XQUOTE)
430
+
431
+ until scanner.eos?
432
+ c = nil
433
+ handled = true
434
+
435
+ if check end_str_re
436
+ # eos
437
+ # if its just balancing, add it ass normal content..
438
+ if str_parse[:balance] && (str_parse[:nesting] != 0)
439
+ # we only checked above, so actually scan it
440
+ scan end_str_re
441
+ c = scanner.matched
442
+ str_parse[:nesting] -= 1
443
+ else
444
+ # not balancing, so break (eos!)
445
+ break
446
+ end
447
+
448
+ elsif str_parse[:balance] and scan Regexp.new(Regexp.escape(str_parse[:paren]))
449
+ str_parse[:nesting] += 1
450
+ c = scanner.matched
451
+
452
+ elsif qwords && scan(/\s/)
453
+ pushback(1)
454
+ break
455
+ elsif expand && check(/#(?=[\$\@\{])/)
456
+ break
457
+ elsif qwords and scan(/\s/)
458
+ pushback(1)
459
+ break
460
+ elsif scan(/\\/)
461
+ if xquote # opal - treat xstrings as dquotes? forces us to double escape
462
+ c = "\\" + scan(/./)
463
+ elsif qwords and scan(/\n/)
464
+ str_buffer << "\n"
465
+ next
466
+ elsif expand and scan(/\n/)
467
+ next
468
+ elsif qwords and scan(/\s/)
469
+ c = ' '
470
+ elsif regexp
471
+ if scan(/(.)/)
472
+ c = "\\" + scanner.matched
473
+ end
474
+ elsif expand
475
+ c = self.read_escape
476
+ elsif scan(/\n/)
477
+ # nothing..
478
+ elsif scan(/\\/)
479
+ if escape
480
+ c = "\\\\"
481
+ else
482
+ c = scanner.matched
483
+ end
484
+ else # \\
485
+ unless scan(end_str_re)
486
+ str_buffer << "\\"
487
+ else
488
+ #c = scanner.matched
489
+ end
490
+ end
491
+ else
492
+ handled = false
493
+ end
494
+
495
+ unless handled
496
+ reg = if qwords
497
+ Regexp.new("[^#{Regexp.escape str_parse[:term]}\#\0\n\ \\\\]+|.")
498
+ elsif str_parse[:balance]
499
+ Regexp.new("[^#{Regexp.escape str_parse[:term]}#{Regexp.escape str_parse[:paren]}\#\0\\\\]+|.")
500
+ else
501
+ Regexp.new("[^#{Regexp.escape str_parse[:term]}\#\0\\\\]+|.")
502
+ end
503
+
504
+ scan reg
505
+ c = scanner.matched
506
+ end
507
+
508
+ c ||= scanner.matched
509
+ str_buffer << c
510
+ end
511
+
512
+ raise "reached EOF while in string" if scanner.eos?
513
+ end
514
+
515
+ def heredoc_identifier
516
+ if scan(/(-?)(['"])?(\w+)\2?/)
517
+ escape_method = (@scanner[2] == "'") ? STR_SQUOTE : STR_DQUOTE
518
+ heredoc = @scanner[3]
519
+
520
+ self.strterm = new_strterm(escape_method, heredoc, heredoc)
521
+ self.strterm[:type] = :heredoc
522
+
523
+ # if ruby code at end of line after heredoc, we have to store it to
524
+ # parse after heredoc is finished parsing
525
+ end_of_line = scan(/.*\n/)
526
+ self.strterm[:scanner] = StringScanner.new(end_of_line) if end_of_line != "\n"
527
+
528
+ self.line += 1
529
+ self.yylval = heredoc
530
+ return :tSTRING_BEG
531
+ end
532
+ end
533
+
534
+ def process_identifier(matched, cmd_start)
535
+ last_state = @lex_state
536
+
537
+ if label_state? and !check(/::/) and scan(/:/)
538
+ @lex_state = :expr_beg
539
+ self.yylval = matched
540
+ return :tLABEL
541
+ end
542
+
543
+ if matched == 'defined?'
544
+ if after_operator?
545
+ @lex_state = :expr_end
546
+ return :tIDENTIFIER
547
+ end
548
+
549
+ @lex_state = :expr_arg
550
+ return :kDEFINED
551
+ end
552
+
553
+ if matched.end_with? '?', '!'
554
+ result = :tIDENTIFIER
555
+ else
556
+ if @lex_state == :expr_fname
557
+ if !check(/\=\>/) and scan(/\=/)
558
+ result = :tIDENTIFIER
559
+ matched += scanner.matched
560
+ end
561
+
562
+ elsif matched =~ /#{REGEXP_START}[A-Z]/
563
+ result = :tCONSTANT
564
+ else
565
+ result = :tIDENTIFIER
566
+ end
567
+ end
568
+
569
+ if @lex_state != :expr_dot and kw = Keywords.keyword(matched)
570
+ old_state = @lex_state
571
+ @lex_state = kw.state
572
+
573
+ if old_state == :expr_fname
574
+ self.yylval = kw.name
575
+ return kw.id[0]
576
+ end
577
+
578
+ if @lex_state == :expr_beg
579
+ cmd_start = true
580
+ end
581
+
582
+ if matched == "do"
583
+ if after_operator?
584
+ @lex_state = :expr_end
585
+ return :tIDENTIFIER
586
+ end
587
+
588
+ if @start_of_lambda
589
+ @start_of_lambda = false
590
+ @lex_state = :expr_beg
591
+ return :kDO_LAMBDA
592
+ elsif cond?
593
+ @lex_state = :expr_beg
594
+ return :kDO_COND
595
+ elsif cmdarg? && @lex_state != :expr_cmdarg
596
+ @lex_state = :expr_beg
597
+ return :kDO_BLOCK
598
+ elsif @lex_state == :expr_endarg
599
+ return :kDO_BLOCK
600
+ else
601
+ @lex_state = :expr_beg
602
+ return :kDO
603
+ end
604
+ else
605
+ if old_state == :expr_beg or old_state == :expr_value
606
+ self.yylval = matched
607
+ return kw.id[0]
608
+ else
609
+ if kw.id[0] != kw.id[1]
610
+ @lex_state = :expr_beg
611
+ end
612
+
613
+ self.yylval = matched
614
+ return kw.id[1]
615
+ end
616
+ end
617
+ end
618
+
619
+ if [:expr_beg, :expr_dot, :expr_mid, :expr_arg, :expr_cmdarg].include? @lex_state
620
+ @lex_state = cmd_start ? :expr_cmdarg : :expr_arg
621
+ elsif @lex_state == :expr_fname
622
+ @lex_state = :expr_endfn
623
+ else
624
+ @lex_state = :expr_end
625
+ end
626
+
627
+ if ![:expr_dot, :expr_fname].include?(last_state) and has_local?(matched)
628
+ @lex_state = :expr_end
629
+ end
630
+
631
+ return matched =~ /#{REGEXP_START}[A-Z]/ ? :tCONSTANT : :tIDENTIFIER
632
+ end
633
+
634
+ # Does the heavy lifting for `next_token`.
635
+ def yylex
636
+ @yylval = ''
637
+ @space_seen = false
638
+ cmd_start = false
639
+ c = ''
640
+
641
+ if self.strterm
642
+ if self.strterm[:type] == :heredoc
643
+ token = here_document(self.strterm)
644
+ else
645
+ token = parse_string
646
+ end
647
+
648
+ if token == :tSTRING_END or token == :tREGEXP_END
649
+ self.strterm = nil
650
+ @lex_state = :expr_end
651
+ end
652
+
653
+ return token
654
+ end
655
+
656
+ while true
657
+ if skip(/\ |\t|\r/)
658
+ @space_seen = true
659
+ next
660
+
661
+ elsif skip(/(\n|#)/)
662
+ c = scanner.matched
663
+ if c == '#'
664
+ skip(/(.*)/)
665
+ else
666
+ self.line += 1
667
+ end
668
+
669
+ skip(/(\n+)/)
670
+
671
+ if scanner.matched
672
+ self.line += scanner.matched.length
673
+ end
674
+
675
+ next if [:expr_beg, :expr_dot].include? @lex_state
676
+
677
+ if skip(/([\ \t\r\f\v]*)\./)
678
+ @space_seen = true unless scanner[1].empty?
679
+ pushback(1)
680
+
681
+ next unless check(/\.\./)
682
+ end
683
+
684
+ cmd_start = true
685
+ @lex_state = :expr_beg
686
+ self.yylval = '\\n'
687
+ return :tNL
688
+
689
+ elsif scan(/\;/)
690
+ @lex_state = :expr_beg
691
+ return :tSEMI
692
+
693
+ elsif check(/\*/)
694
+ if scan(/\*\*\=/)
695
+ @lex_state = :expr_beg
696
+ return new_op_asgn('**')
697
+ elsif scan(/\*\*/)
698
+ self.set_arg_state
699
+ return :tPOW
700
+ elsif scan(/\*\=/)
701
+ @lex_state = :expr_beg
702
+ return new_op_asgn('*')
703
+ else
704
+ scan(/\*/)
705
+
706
+ if after_operator?
707
+ @lex_state = :expr_arg
708
+ return :tSTAR2
709
+ elsif @space_seen && check(/\S/)
710
+ @lex_state = :expr_beg
711
+ return :tSTAR
712
+ elsif [:expr_beg, :expr_mid].include? @lex_state
713
+ @lex_state = :expr_beg
714
+ return :tSTAR
715
+ else
716
+ @lex_state = :expr_beg
717
+ return :tSTAR2
718
+ end
719
+ end
720
+
721
+ elsif scan(/\!/)
722
+ if after_operator?
723
+ @lex_state = :expr_arg
724
+ if scan(/@/)
725
+ return :tBANG, '!'
726
+ end
727
+ else
728
+ @lex_state = :expr_beg
729
+ end
730
+
731
+ if scan(/\=/)
732
+ return :tNEQ
733
+ elsif scan(/\~/)
734
+ return :tNMATCH
735
+ end
736
+
737
+ return :tBANG
738
+
739
+ elsif scan(/\=/)
740
+ if @lex_state == :expr_beg and !@space_seen
741
+ if scan(/begin/) and space?
742
+ scan(/(.*)/) # end of line
743
+ line_count = 0
744
+
745
+ while true
746
+ if scanner.eos?
747
+ raise "embedded document meets end of file"
748
+ end
749
+
750
+ if scan(/\=end/) and space?
751
+ @line += line_count
752
+ return yylex
753
+ end
754
+
755
+ if scan(/\n/)
756
+ line_count += 1
757
+ next
758
+ end
759
+
760
+ scan(/(.*)/)
761
+ end
762
+ end
763
+ end
764
+
765
+ self.set_arg_state
766
+
767
+ if scan(/\=/)
768
+ if scan(/\=/)
769
+ return :tEQQ
770
+ end
771
+
772
+ return :tEQ
773
+ end
774
+
775
+ if scan(/\~/)
776
+ return :tMATCH
777
+ elsif scan(/\>/)
778
+ return :tASSOC
779
+ end
780
+
781
+ return :tEQL
782
+
783
+ elsif scan(/\"/)
784
+ self.strterm = new_strterm(STR_DQUOTE, '"', "\0")
785
+ return :tSTRING_BEG
786
+
787
+ elsif scan(/\'/)
788
+ self.strterm = new_strterm(STR_SQUOTE, "'", "\0")
789
+ return :tSTRING_BEG
790
+
791
+ elsif scan(/\`/)
792
+ self.strterm = new_strterm(STR_XQUOTE, "`", "\0")
793
+ return :tXSTRING_BEG
794
+
795
+ elsif scan(/\&/)
796
+ if scan(/\&/)
797
+ @lex_state = :expr_beg
798
+
799
+ if scan(/\=/)
800
+ return new_op_asgn('&&')
801
+ end
802
+
803
+ return :tANDOP
804
+
805
+ elsif scan(/\=/)
806
+ @lex_state = :expr_beg
807
+ return new_op_asgn('&')
808
+ end
809
+
810
+ if spcarg?
811
+ #puts "warning: `&' interpreted as argument prefix"
812
+ result = :tAMPER
813
+ elsif beg?
814
+ result = :tAMPER
815
+ else
816
+ #puts "warn_balanced: & argument prefix"
817
+ result = :tAMPER2
818
+ end
819
+
820
+ self.set_arg_state
821
+ return result
822
+
823
+ elsif scan(/\|/)
824
+ if scan(/\|/)
825
+ @lex_state = :expr_beg
826
+ if scan(/\=/)
827
+ return new_op_asgn('||')
828
+ end
829
+
830
+ return :tOROP
831
+
832
+ elsif scan(/\=/)
833
+ return new_op_asgn('|')
834
+ end
835
+
836
+ self.set_arg_state
837
+ return :tPIPE
838
+
839
+ elsif scan(/\%[QqWwixrs]/)
840
+ str_type = scanner.matched[1, 1]
841
+ paren = term = scan(/./)
842
+
843
+ case term
844
+ when '(' then term = ')'
845
+ when '[' then term = ']'
846
+ when '{' then term = '}'
847
+ when '<' then term = '>'
848
+ else paren = "\0"
849
+ end
850
+
851
+ token, func = case str_type
852
+ when 'Q'
853
+ [:tSTRING_BEG, STR_DQUOTE]
854
+ when 'q'
855
+ [:tSTRING_BEG, STR_SQUOTE]
856
+ when 'W'
857
+ skip(/\s*/)
858
+ [:tWORDS_BEG, STR_DWORD]
859
+ when 'w', 'i'
860
+ skip(/\s*/)
861
+ [:tAWORDS_BEG, STR_SWORD]
862
+ when 'x'
863
+ [:tXSTRING_BEG, STR_XQUOTE]
864
+ when 'r'
865
+ [:tREGEXP_BEG, STR_REGEXP]
866
+ when 's'
867
+ [:tSTRING_BEG, STR_SQUOTE]
868
+ end
869
+
870
+ self.strterm = new_strterm2(func, term, paren)
871
+ return token
872
+
873
+ elsif scan(/\//)
874
+ if beg?
875
+ self.strterm = new_strterm(STR_REGEXP, '/', '/')
876
+ return :tREGEXP_BEG
877
+ elsif scan(/\=/)
878
+ @lex_state = :expr_beg
879
+ return new_op_asgn('/')
880
+ end
881
+
882
+ if arg?
883
+ if !check(/\s/) && @space_seen
884
+ self.strterm = new_strterm(STR_REGEXP, '/', '/')
885
+ return :tREGEXP_BEG
886
+ end
887
+ end
888
+
889
+ if after_operator?
890
+ @lex_state = :expr_arg
891
+ else
892
+ @lex_state = :expr_beg
893
+ end
894
+
895
+ return :tDIVIDE
896
+
897
+ elsif scan(/\%/)
898
+ if scan(/\=/)
899
+ @lex_state = :expr_beg
900
+ return new_op_asgn('%')
901
+ elsif check(/[^\s]/)
902
+ if @lex_state == :expr_beg or (@lex_state == :expr_arg && @space_seen)
903
+ start_word = scan(/./)
904
+ end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
905
+ self.strterm = new_strterm2(STR_DQUOTE, end_word, start_word)
906
+ return :tSTRING_BEG
907
+ end
908
+ end
909
+
910
+ self.set_arg_state
911
+
912
+ return :tPERCENT
913
+
914
+ elsif scan(/\\/)
915
+ if scan(/\r?\n/)
916
+ @space_seen = true
917
+ next
918
+ end
919
+
920
+ raise SyntaxError, "backslash must appear before newline :#{@file}:#{@line}"
921
+
922
+ elsif scan(/\(/)
923
+ result = scanner.matched
924
+ if beg?
925
+ result = :tLPAREN
926
+ elsif @space_seen && arg?
927
+ result = :tLPAREN_ARG
928
+ else
929
+ result = :tLPAREN2
930
+ end
931
+
932
+ @lex_state = :expr_beg
933
+ cond_push 0
934
+ cmdarg_push 0
935
+
936
+ return result
937
+
938
+ elsif scan(/\)/)
939
+ cond_lexpop
940
+ cmdarg_lexpop
941
+ @lex_state = :expr_end
942
+ return :tRPAREN
943
+
944
+ elsif scan(/\[/)
945
+ result = scanner.matched
946
+
947
+ if after_operator?
948
+ @lex_state = :expr_arg
949
+ if scan(/\]=/)
950
+ return :tASET
951
+ elsif scan(/\]/)
952
+ return :tAREF
953
+ else
954
+ raise "Unexpected '[' token"
955
+ end
956
+ elsif beg?
957
+ result = :tLBRACK
958
+ elsif arg? && @space_seen
959
+ result = :tLBRACK
960
+ else
961
+ result = :tLBRACK2
962
+ end
963
+
964
+ @lex_state = :expr_beg
965
+ cond_push 0
966
+ cmdarg_push 0
967
+ return result
968
+
969
+ elsif scan(/\]/)
970
+ cond_lexpop
971
+ cmdarg_lexpop
972
+ @lex_state = :expr_end
973
+ return :tRBRACK
974
+
975
+ elsif scan(/\}/)
976
+ cond_lexpop
977
+ cmdarg_lexpop
978
+ @lex_state = :expr_end
979
+
980
+ return :tRCURLY
981
+
982
+ elsif scan(/\.\.\./)
983
+ @lex_state = :expr_beg
984
+ return :tDOT3
985
+
986
+ elsif scan(/\.\./)
987
+ @lex_state = :expr_beg
988
+ return :tDOT2
989
+
990
+ elsif @lex_state != :expr_fname && scan(/\.JS\[/)
991
+ @lex_state = :expr_beg
992
+ cond_push 0
993
+ cmdarg_push 0
994
+ return :tJSLBRACK
995
+
996
+ elsif @lex_state != :expr_fname && scan(/\.JS\./)
997
+ @lex_state = :expr_dot
998
+ return :tJSDOT
999
+
1000
+ elsif scan(/\./)
1001
+ @lex_state = :expr_dot unless @lex_state == :expr_fname
1002
+ return :tDOT
1003
+
1004
+ elsif scan(/\:\:/)
1005
+ if beg?
1006
+ @lex_state = :expr_beg
1007
+ return :tCOLON3
1008
+ elsif spcarg?
1009
+ @lex_state = :expr_beg
1010
+ return :tCOLON3
1011
+ end
1012
+
1013
+ @lex_state = :expr_dot
1014
+ return :tCOLON2
1015
+
1016
+ elsif scan(/\:/)
1017
+ if end? || check(/\s/)
1018
+ unless check(/\w/)
1019
+ @lex_state = :expr_beg
1020
+ return :tCOLON
1021
+ end
1022
+
1023
+ @lex_state = :expr_fname
1024
+ return :tSYMBEG
1025
+ end
1026
+
1027
+ if scan(/\'/)
1028
+ self.strterm = new_strterm(STR_SSYM, "'", "\0")
1029
+ elsif scan(/\"/)
1030
+ self.strterm = new_strterm(STR_DSYM, '"', "\0")
1031
+ end
1032
+
1033
+ @lex_state = :expr_fname
1034
+ return :tSYMBEG
1035
+
1036
+ elsif scan(/\^\=/)
1037
+ @lex_state = :expr_beg
1038
+ return new_op_asgn('^')
1039
+
1040
+ elsif scan(/\^/)
1041
+ self.set_arg_state
1042
+ return :tCARET
1043
+
1044
+ elsif check(/</)
1045
+ if scan(/<<\=/)
1046
+ @lex_state = :expr_beg
1047
+ return new_op_asgn('<<')
1048
+
1049
+ elsif scan(/<</)
1050
+ if after_operator?
1051
+ @lex_state = :expr_arg
1052
+ return :tLSHFT
1053
+ elsif !after_operator? && !end? && (!arg? || @space_seen) && @lex_state != :expr_class
1054
+ if token = heredoc_identifier
1055
+ return token
1056
+ end
1057
+
1058
+ @lex_state = :expr_beg
1059
+ return :tLSHFT
1060
+ end
1061
+ @lex_state = :expr_beg
1062
+ return :tLSHFT
1063
+ elsif scan(/<\=\>/)
1064
+ if after_operator?
1065
+ @lex_state = :expr_arg
1066
+ else
1067
+ if @lex_state == :expr_class
1068
+ cmd_start = true
1069
+ end
1070
+
1071
+ @lex_state = :expr_beg
1072
+ end
1073
+
1074
+ return :tCMP
1075
+ elsif scan(/<\=/)
1076
+ self.set_arg_state
1077
+ return :tLEQ
1078
+
1079
+ elsif scan(/</)
1080
+ self.set_arg_state
1081
+ return :tLT
1082
+ end
1083
+
1084
+ elsif check(/\>/)
1085
+ if scan(/\>\>\=/)
1086
+ return new_op_asgn('>>')
1087
+
1088
+ elsif scan(/\>\>/)
1089
+ self.set_arg_state
1090
+ return :tRSHFT
1091
+
1092
+ elsif scan(/\>\=/)
1093
+ self.set_arg_state
1094
+ return :tGEQ
1095
+
1096
+ elsif scan(/\>/)
1097
+ self.set_arg_state
1098
+ return :tGT
1099
+ end
1100
+
1101
+ elsif scan(/->/)
1102
+ # FIXME: # should be :expr_arg, but '(' breaks it...
1103
+ @lex_state = :expr_end
1104
+ @start_of_lambda = true
1105
+ return :tLAMBDA
1106
+
1107
+ elsif scan(/[+-]/)
1108
+ matched = scanner.matched
1109
+ sign, utype = if matched == '+'
1110
+ [:tPLUS, :tUPLUS]
1111
+ else
1112
+ [:tMINUS, :tUMINUS]
1113
+ end
1114
+
1115
+ if beg?
1116
+ @lex_state = :expr_mid
1117
+ self.yylval = matched
1118
+ if scanner.peek(1) =~ /\d/ and
1119
+ return utype == :tUMINUS ? '-@NUM' : '+@NUM'
1120
+ else
1121
+ return utype
1122
+ end
1123
+ elsif after_operator?
1124
+ @lex_state = :expr_arg
1125
+ if scan(/@/)
1126
+ self.yylval = matched + '@'
1127
+ return :tIDENTIFIER
1128
+ end
1129
+
1130
+ self.yylval = matched
1131
+ return sign
1132
+ end
1133
+
1134
+ if scan(/\=/)
1135
+ @lex_state = :expr_beg
1136
+ return new_op_asgn(matched)
1137
+ end
1138
+
1139
+ if spcarg?
1140
+ @lex_state = :expr_mid
1141
+ self.yylval = matched
1142
+ return utype
1143
+ end
1144
+
1145
+ @lex_state = :expr_beg
1146
+ self.yylval = matched
1147
+ return sign
1148
+
1149
+ elsif scan(/\?/)
1150
+ if end?
1151
+ @lex_state = :expr_beg
1152
+ return :tEH
1153
+ end
1154
+
1155
+ if check(/\ |\t|\r|\s/)
1156
+ @lex_state = :expr_beg
1157
+ return :tEH
1158
+ elsif scan(/\\/)
1159
+ @lex_state = :expr_end
1160
+ self.yylval = self.read_escape
1161
+ return :tSTRING
1162
+ end
1163
+
1164
+ @lex_state = :expr_end
1165
+ self.yylval = scan(/./)
1166
+ return :tSTRING
1167
+
1168
+ elsif scan(/\~/)
1169
+ self.set_arg_state
1170
+ return :tTILDE
1171
+
1172
+ elsif check(/\$/)
1173
+ if scan(/\$([1-9]\d*)/)
1174
+ @lex_state = :expr_end
1175
+ self.yylval = scanner.matched.sub('$', '')
1176
+ return :tNTH_REF
1177
+
1178
+ elsif scan(/(\$_)(\w+)/)
1179
+ @lex_state = :expr_end
1180
+ return :tGVAR
1181
+
1182
+ elsif scan(/\$[\+\'\`\&!@\"~*$?\/\\:;=.,<>_]/)
1183
+ @lex_state = :expr_end
1184
+ return :tGVAR
1185
+ elsif scan(/\$\w+/)
1186
+ @lex_state = :expr_end
1187
+ return :tGVAR
1188
+ else
1189
+ raise "Bad gvar name: #{scanner.peek(5).inspect}"
1190
+ end
1191
+
1192
+ elsif scan(/\$\w+/)
1193
+ @lex_state = :expr_end
1194
+ return :tGVAR
1195
+
1196
+ elsif scan(/\@\@\w*/)
1197
+ @lex_state = :expr_end
1198
+ return :tCVAR
1199
+
1200
+ elsif scan(/\@\w*/)
1201
+ @lex_state = :expr_end
1202
+ return :tIVAR
1203
+
1204
+ elsif scan(/\,/)
1205
+ @lex_state = :expr_beg
1206
+ return :tCOMMA
1207
+
1208
+ elsif scan(/\{/)
1209
+ if @start_of_lambda
1210
+ @start_of_lambda = false
1211
+ @lex_state = :expr_beg
1212
+ return :tLAMBEG
1213
+
1214
+ elsif arg? or @lex_state == :expr_end
1215
+ result = :tLCURLY
1216
+ elsif @lex_state == :expr_endarg
1217
+ result = :LBRACE_ARG
1218
+ else
1219
+ result = :tLBRACE
1220
+ end
1221
+
1222
+ @lex_state = :expr_beg
1223
+ cond_push 0
1224
+ cmdarg_push 0
1225
+ return result
1226
+
1227
+ elsif scanner.bol? and skip(/\__END__(\n|$)/)
1228
+ while true
1229
+ if scanner.eos?
1230
+ @eof_content = self.yylval
1231
+ return false
1232
+ end
1233
+
1234
+ scan(/(.*)/)
1235
+ scan(/\n/)
1236
+ end
1237
+
1238
+ elsif check(/[0-9]/)
1239
+ return process_numeric
1240
+
1241
+ elsif scan(/(\w)+(\?|(\!(?!=)))?/)
1242
+ return process_identifier scanner.matched, cmd_start
1243
+ end
1244
+
1245
+ if scanner.eos?
1246
+ if @scanner_stack.size == 1 # our main scanner, we cant pop this
1247
+ self.yylval = false
1248
+ return false
1249
+ else # we were probably parsing a heredoc, so pop that parser and continue
1250
+ @scanner_stack.pop
1251
+ @scanner = @scanner_stack.last
1252
+ return yylex
1253
+ end
1254
+ end
1255
+
1256
+ raise "Unexpected content in parsing stream `#{scanner.peek 5}` :#{@file}:#{@line}"
1257
+ end
1258
+ end
1259
+ end
1260
+ end