opal-cj 0.7.0.beta1

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 (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,95 @@
1
+ require 'opal/nodes/base'
2
+
3
+ module Opal
4
+ module Nodes
5
+ class BaseYieldNode < Base
6
+ def compile_call(children, level)
7
+ yielding_scope = find_yielding_scope
8
+
9
+ yielding_scope.uses_block!
10
+ block_name = yielding_scope.block_name || '$yield'
11
+
12
+ if yields_single_arg?(children)
13
+ push expr(children.first)
14
+ wrap "$opal.$yield1(#{block_name}, ", ')'
15
+ else
16
+ push expr(s(:arglist, *children))
17
+
18
+ if uses_splat?(children)
19
+ wrap "$opal.$yieldX(#{block_name}, ", ')'
20
+ else
21
+ wrap "$opal.$yieldX(#{block_name}, [", '])'
22
+ end
23
+ end
24
+ end
25
+
26
+ def find_yielding_scope
27
+ working = scope
28
+ while working
29
+ if working.block_name or working.def?
30
+ break
31
+ end
32
+ working = working.parent
33
+ end
34
+
35
+ working
36
+ end
37
+
38
+ def yields_single_arg?(children)
39
+ !uses_splat?(children) and children.size == 1
40
+ end
41
+
42
+ def uses_splat?(children)
43
+ children.any? { |child| child.type == :splat }
44
+ end
45
+ end
46
+
47
+ class YieldNode < BaseYieldNode
48
+ handle :yield
49
+
50
+ def compile
51
+ compile_call(children, @level)
52
+
53
+ if stmt?
54
+ wrap 'if (', ' === $breaker) return $breaker.$v'
55
+ else
56
+ with_temp do |tmp|
57
+ wrap "(((#{tmp} = ", ") === $breaker) ? $breaker.$v : #{tmp})"
58
+ end
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ # special opal yield assign, for `a = yield(arg1, arg2)` to assign
65
+ # to a temp value to make yield expr into stmt.
66
+ #
67
+ # level will always be stmt as its the reason for this to exist
68
+ #
69
+ # s(:yasgn, :a, s(:yield, arg1, arg2))
70
+ class YasgnNode < BaseYieldNode
71
+ handle :yasgn
72
+
73
+ children :var_name, :yield_args
74
+
75
+ def compile
76
+ compile_call(s(*yield_args[1..-1]), :stmt)
77
+ wrap "if ((#{var_name} = ", ") === $breaker) return $breaker.$v"
78
+ end
79
+ end
80
+
81
+ # Created by `#returns()` for when a yield statement should return
82
+ # it's value (its last in a block etc).
83
+ class ReturnableYieldNode < BaseYieldNode
84
+ handle :returnable_yield
85
+
86
+ def compile
87
+ compile_call children, @level
88
+
89
+ with_temp do |tmp|
90
+ wrap "return #{tmp} = ", ", #{tmp} === $breaker ? #{tmp} : #{tmp}"
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,658 @@
1
+ require 'opal/parser/sexp'
2
+ require 'opal/parser/lexer'
3
+ require 'opal/parser/grammar'
4
+ require 'opal/parser/parser_scope'
5
+
6
+ module Opal
7
+ class Parser < Racc::Parser
8
+
9
+ attr_reader :lexer, :file, :scope
10
+
11
+ def parse(source, file = '(string)')
12
+ @file = file
13
+ @scopes = []
14
+ @lexer = Lexer.new(source, file)
15
+ @lexer.parser = self
16
+
17
+ self.parse_to_sexp
18
+ rescue => e
19
+ if $DEBUG || $VERBOSE
20
+ $stderr.puts
21
+ $stderr.puts e
22
+ $stderr.puts "Source: #{@file}:#{lexer.line}:#{lexer.column}"
23
+ $stderr.puts source.split("\n")[lexer.line-1]
24
+ $stderr.puts '~'*lexer.column + '^'
25
+ end
26
+ raise e
27
+ end
28
+
29
+ def parse_to_sexp
30
+ push_scope
31
+ result = do_parse
32
+ pop_scope
33
+
34
+ result
35
+ end
36
+
37
+ def next_token
38
+ @lexer.next_token
39
+ end
40
+
41
+ def s(*parts)
42
+ Sexp.new(parts)
43
+ end
44
+
45
+ def push_scope(type = nil)
46
+ top = @scopes.last
47
+ scope = ParserScope.new type
48
+ scope.parent = top
49
+ @scopes << scope
50
+ @scope = scope
51
+ end
52
+
53
+ def pop_scope
54
+ @scopes.pop
55
+ @scope = @scopes.last
56
+ end
57
+
58
+ def on_error(t, val, vstack)
59
+ raise "parse error on value #{value(val).inspect} (#{token_to_str(t) || '?'}) :#{@file}:#{lexer.line}"
60
+ end
61
+
62
+ def value(tok)
63
+ tok[0]
64
+ end
65
+
66
+ def source(tok)
67
+ tok ? tok[1] : nil
68
+ end
69
+
70
+ def s0(type, source)
71
+ sexp = s(type)
72
+ sexp.source = source
73
+ sexp
74
+ end
75
+
76
+ def s1(type, first, source)
77
+ sexp = s(type, first)
78
+ sexp.source = source
79
+ sexp
80
+ end
81
+
82
+ def new_nil(tok)
83
+ s0(:nil, source(tok))
84
+ end
85
+
86
+ def new_self(tok)
87
+ s0(:self, source(tok))
88
+ end
89
+
90
+ def new_true(tok)
91
+ s0(:true, source(tok))
92
+ end
93
+
94
+ def new_false(tok)
95
+ s0(:false, source(tok))
96
+ end
97
+
98
+ def new___FILE__(tok)
99
+ s1(:str, self.file, source(tok))
100
+ end
101
+
102
+ def new___LINE__(tok)
103
+ s1(:int, lexer.line, source(tok))
104
+ end
105
+
106
+ def new_ident(tok)
107
+ s1(:identifier, value(tok).to_sym, source(tok))
108
+ end
109
+
110
+ def new_int(tok)
111
+ s1(:int, value(tok), source(tok))
112
+ end
113
+
114
+ def new_float(tok)
115
+ s1(:float, value(tok), source(tok))
116
+ end
117
+
118
+ def new_ivar(tok)
119
+ s1(:ivar, value(tok).to_sym, source(tok))
120
+ end
121
+
122
+ def new_gvar(tok)
123
+ s1(:gvar, value(tok).to_sym, source(tok))
124
+ end
125
+
126
+ def new_cvar(tok)
127
+ s1(:cvar, value(tok).to_sym, source(tok))
128
+ end
129
+
130
+ def new_const(tok)
131
+ s1(:const, value(tok).to_sym, source(tok))
132
+ end
133
+
134
+ def new_colon2(lhs, tok, name)
135
+ sexp = s(:colon2, lhs, value(name).to_sym)
136
+ sexp.source = source(tok)
137
+ sexp
138
+ end
139
+
140
+ def new_colon3(tok, name)
141
+ s1(:colon3, value(name).to_sym, source(name))
142
+ end
143
+
144
+ def new_sym(tok)
145
+ s1(:sym, value(tok).to_sym, source(tok))
146
+ end
147
+
148
+ def new_alias(kw, new, old)
149
+ sexp = s(:alias, new, old)
150
+ sexp.source = source(kw)
151
+ sexp
152
+ end
153
+
154
+ def new_break(kw, args=nil)
155
+ if args.nil?
156
+ sexp = s(:break)
157
+ elsif args.length == 1
158
+ sexp = s(:break, args[0])
159
+ else
160
+ sexp = s(:break, s(:array, *args))
161
+ end
162
+
163
+ sexp
164
+ end
165
+
166
+ def new_return(kw, args=nil)
167
+ if args.nil?
168
+ sexp = s(:return)
169
+ elsif args.length == 1
170
+ sexp = s(:return, args[0])
171
+ else
172
+ sexp = s(:return, s(:array, *args))
173
+ end
174
+
175
+ sexp
176
+ end
177
+
178
+ def new_next(kw, args=[])
179
+ if args.length == 1
180
+ sexp = s(:next, args[0])
181
+ else
182
+ sexp = s(:next, s(:array, *args))
183
+ end
184
+
185
+ sexp
186
+ end
187
+
188
+ def new_block(stmt = nil)
189
+ sexp = s(:block)
190
+ sexp << stmt if stmt
191
+ sexp
192
+ end
193
+
194
+ def new_compstmt(block)
195
+ comp = if block.size == 1
196
+ nil
197
+ elsif block.size == 2
198
+ block[1]
199
+ else
200
+ block
201
+ end
202
+
203
+ if comp && comp.type == :begin && comp.size == 2
204
+ result = comp[1]
205
+ else
206
+ result = comp
207
+ end
208
+
209
+ result
210
+ end
211
+
212
+ def new_body(compstmt, res, els, ens)
213
+ s = compstmt || s(:block)
214
+
215
+ if res
216
+ s = s(:rescue, s)
217
+ res.each { |r| s << r }
218
+ s << els if els
219
+ end
220
+
221
+ ens ? s(:ensure, s, ens) : s
222
+ end
223
+
224
+ def new_def(kw, recv, name, args, body, end_tok)
225
+ body = s(:block, body) if body.type != :block
226
+ body << s(:nil) if body.size == 1
227
+
228
+ sexp = s(:def, recv, value(name).to_sym, args, body)
229
+ sexp.source = source(kw)
230
+ sexp
231
+ end
232
+
233
+ def new_class(start, path, sup, body, endt)
234
+ sexp = s(:class, path, sup, body)
235
+ sexp.source = source(start)
236
+ sexp
237
+ end
238
+
239
+ def new_sclass(kw, expr, body, end_tok)
240
+ sexp = s(:sclass, expr, body)
241
+ sexp.source = source(kw)
242
+ sexp
243
+ end
244
+
245
+ def new_module(kw, path, body, end_tok)
246
+ sexp = s(:module, path, body)
247
+ sexp.source = source(kw)
248
+ sexp
249
+ end
250
+
251
+ def new_iter(args, body)
252
+ args ||= nil
253
+ s = s(:iter, args)
254
+ s << body if body
255
+ s
256
+ end
257
+
258
+ def new_if(if_tok, expr, stmt, tail)
259
+ sexp = s(:if, expr, stmt, tail)
260
+ sexp.source = source(if_tok)
261
+ sexp
262
+ end
263
+
264
+ def new_while(kw, test, body)
265
+ sexp = s(:while, test, body)
266
+ sexp.source = source(kw)
267
+ sexp
268
+ end
269
+
270
+ def new_until(kw, test, body)
271
+ sexp = s(:until, test, body)
272
+ sexp.source = source(kw)
273
+ sexp
274
+ end
275
+
276
+ def new_rescue_mod(kw, expr, resc)
277
+ sexp = s(:rescue_mod, expr, resc)
278
+ sexp.source = source(kw)
279
+ sexp
280
+ end
281
+
282
+ def new_array(start, args, finish)
283
+ args ||= []
284
+ sexp = s(:array, *args)
285
+ sexp.source = source(start)
286
+ sexp
287
+ end
288
+
289
+ def new_hash(open, assocs, close)
290
+ sexp = s(:hash, *assocs)
291
+ sexp.source = source(open)
292
+ sexp
293
+ end
294
+
295
+ def new_not(kw, expr)
296
+ s1(:not, expr, source(kw))
297
+ end
298
+
299
+ def new_paren(open, expr, close)
300
+ if expr.nil? or expr == [:block]
301
+ s1(:paren, s0(:nil, source(open)), source(open))
302
+ else
303
+ s1(:paren, expr, source(open))
304
+ end
305
+ end
306
+
307
+ def new_args(norm, opt, rest, block)
308
+ res = s(:args)
309
+
310
+ if norm
311
+ norm.each do |arg|
312
+ scope.add_local arg
313
+ res << arg
314
+ end
315
+ end
316
+
317
+ if opt
318
+ opt[1..-1].each do |_opt|
319
+ res << _opt[1]
320
+ end
321
+ end
322
+
323
+ if rest
324
+ res << rest
325
+ rest_str = rest.to_s[1..-1]
326
+ scope.add_local rest_str.to_sym unless rest_str.empty?
327
+ end
328
+
329
+ if block
330
+ res << block
331
+ scope.add_local block.to_s[1..-1].to_sym
332
+ end
333
+
334
+ res << opt if opt
335
+
336
+ res
337
+ end
338
+
339
+ def new_block_args(norm, opt, rest, block)
340
+ res = s(:array)
341
+
342
+ if norm
343
+ norm.each do |arg|
344
+ if arg.is_a? Symbol
345
+ scope.add_local arg
346
+ res << s(:lasgn, arg)
347
+ else
348
+ res << arg
349
+ end
350
+ end
351
+ end
352
+
353
+ if opt
354
+ opt[1..-1].each do |_opt|
355
+ res << s(:lasgn, _opt[1])
356
+ end
357
+ end
358
+
359
+ if rest
360
+ r = rest.to_s[1..-1].to_sym
361
+ res << new_splat(nil, s(:lasgn, r))
362
+ scope.add_local r
363
+ end
364
+
365
+ if block
366
+ b = block.to_s[1..-1].to_sym
367
+ res << s(:block_pass, s(:lasgn, b))
368
+ scope.add_local b
369
+ end
370
+
371
+ res << opt if opt
372
+
373
+ args = res.size == 2 && norm ? res[1] : s(:masgn, res)
374
+
375
+ if args.type == :array
376
+ s(:masgn, args)
377
+ else
378
+ args
379
+ end
380
+ end
381
+
382
+ def new_call(recv, meth, args = nil)
383
+ args ||= []
384
+ sexp = s(:call, recv, value(meth).to_sym, s(:arglist, *args))
385
+ sexp.source = source(meth)
386
+ sexp
387
+ end
388
+
389
+ def new_binary_call(recv, meth, arg)
390
+ new_call(recv, meth, [arg])
391
+ end
392
+
393
+ def new_unary_call(op, recv)
394
+ new_call(recv, op, [])
395
+ end
396
+
397
+ def new_and(lhs, tok, rhs)
398
+ sexp = s(:and, lhs, rhs)
399
+ sexp.source = source(tok)
400
+ sexp
401
+ end
402
+
403
+ def new_or(lhs, tok, rhs)
404
+ sexp = s(:or, lhs, rhs)
405
+ sexp.source = source(tok)
406
+ sexp
407
+ end
408
+
409
+ def new_irange(beg, op, finish)
410
+ sexp = s(:irange, beg, finish)
411
+ sexp.source = source(op)
412
+ sexp
413
+ end
414
+
415
+ def new_erange(beg, op, finish)
416
+ sexp = s(:erange, beg, finish)
417
+ sexp.source = source(op)
418
+ sexp
419
+ end
420
+
421
+ def negate_num(sexp)
422
+ sexp.array[1] = -sexp.array[1]
423
+ sexp
424
+ end
425
+
426
+ def add_block_pass(arglist, block)
427
+ arglist << block if block
428
+ arglist
429
+ end
430
+
431
+ def new_block_pass(amper_tok, val)
432
+ s1(:block_pass, val, source(amper_tok))
433
+ end
434
+
435
+ def new_splat(tok, value)
436
+ s1(:splat, value, source(tok))
437
+ end
438
+
439
+ def new_op_asgn(op, lhs, rhs)
440
+ case value(op).to_sym
441
+ when :"||"
442
+ result = s(:op_asgn_or, new_gettable(lhs))
443
+ result << (lhs << rhs)
444
+ when :"&&"
445
+ result = s(:op_asgn_and, new_gettable(lhs))
446
+ result << (lhs << rhs)
447
+ else
448
+ result = lhs
449
+ result << new_call(new_gettable(lhs), op, [rhs])
450
+
451
+ end
452
+
453
+ result
454
+ end
455
+
456
+ def new_op_asgn1(lhs, args, op, rhs)
457
+ arglist = s(:arglist, *args)
458
+ sexp = s(:op_asgn1, lhs, arglist, value(op), rhs)
459
+ sexp.source = source(op)
460
+ sexp
461
+ end
462
+
463
+ def op_to_setter(op)
464
+ "#{value(op)}=".to_sym
465
+ end
466
+
467
+ def new_attrasgn(recv, op, args=[])
468
+ arglist = s(:arglist, *args)
469
+ sexp = s(:attrasgn, recv, op, arglist)
470
+ sexp
471
+ end
472
+
473
+ def new_assign(lhs, tok, rhs)
474
+ case lhs.type
475
+ when :iasgn, :cdecl, :lasgn, :gasgn, :cvdecl, :nth_ref
476
+ lhs << rhs
477
+ lhs
478
+ when :call, :attrasgn
479
+ lhs.last << rhs
480
+ lhs
481
+ when :colon2
482
+ lhs << rhs
483
+ lhs.type = :casgn
484
+ lhs
485
+ when :colon3
486
+ lhs << rhs
487
+ lhs.type = :casgn3
488
+ lhs
489
+ else
490
+ raise "Bad lhs for new_assign: #{lhs.type}"
491
+ end
492
+ end
493
+
494
+ def new_assignable(ref)
495
+ case ref.type
496
+ when :ivar
497
+ ref.type = :iasgn
498
+ when :const
499
+ ref.type = :cdecl
500
+ when :identifier
501
+ scope.add_local ref[1] unless scope.has_local? ref[1]
502
+ ref.type = :lasgn
503
+ when :gvar
504
+ ref.type = :gasgn
505
+ when :cvar
506
+ ref.type = :cvdecl
507
+ else
508
+ raise SyntaxError, "Bad new_assignable type: #{ref.type}"
509
+ end
510
+
511
+ ref
512
+ end
513
+
514
+ def new_gettable(ref)
515
+ res = case ref.type
516
+ when :lasgn
517
+ s(:lvar, ref[1])
518
+ when :iasgn
519
+ s(:ivar, ref[1])
520
+ when :gasgn
521
+ s(:gvar, ref[1])
522
+ when :cvdecl
523
+ s(:cvar, ref[1])
524
+ when :cdecl
525
+ s(:const, ref[1])
526
+ else
527
+ raise "Bad new_gettable ref: #{ref.type}"
528
+ end
529
+
530
+ res.source = ref.source
531
+ res
532
+ end
533
+
534
+ def new_var_ref(ref)
535
+ case ref.type
536
+ when :self, :nil, :true, :false, :line, :file
537
+ ref
538
+ when :const
539
+ ref
540
+ when :ivar, :gvar, :cvar
541
+ ref
542
+ when :int
543
+ # this is when we passed __LINE__ which is converted into :int
544
+ ref
545
+ when :str
546
+ # returns for __FILE__ as it is converted into str
547
+ ref
548
+ when :identifier
549
+ result = if scope.has_local? ref[1]
550
+ s(:lvar, ref[1])
551
+ else
552
+ s(:call, nil, ref[1], s(:arglist))
553
+ end
554
+
555
+ result.source = ref.source
556
+ result
557
+ else
558
+ raise "Bad var_ref type: #{ref.type}"
559
+ end
560
+ end
561
+
562
+ def new_super(kw, args)
563
+ if args.nil?
564
+ sexp = s(:super, nil)
565
+ else
566
+ sexp = s(:super, s(:arglist, *args))
567
+ end
568
+
569
+ sexp.source = source(kw)
570
+ sexp
571
+ end
572
+
573
+ def new_yield(args)
574
+ args ||= []
575
+ s(:yield, *args)
576
+ end
577
+
578
+ def new_xstr(start_t, str, end_t)
579
+ return s(:xstr, '') unless str
580
+ case str.type
581
+ when :str then str.type = :xstr
582
+ when :dstr then str.type = :dxstr
583
+ when :evstr then str = s(:dxstr, '', str)
584
+ end
585
+
586
+ str.source = source(start_t)
587
+
588
+ str
589
+ end
590
+
591
+ def new_dsym(str)
592
+ return s(:nil) unless str
593
+ case str.type
594
+ when :str
595
+ str.type = :sym
596
+ str[1] = str[1].to_sym
597
+ when :dstr
598
+ str.type = :dsym
599
+ end
600
+
601
+ str
602
+ end
603
+
604
+ def new_evstr(str)
605
+ s(:evstr, str)
606
+ end
607
+
608
+ def new_str(str)
609
+ # cover empty strings
610
+ return s(:str, "") unless str
611
+ # catch s(:str, "", other_str)
612
+ if str.size == 3 and str[1] == "" and str.type == :str
613
+ return str[2]
614
+ # catch s(:str, "content", more_content)
615
+ elsif str.type == :str && str.size > 3
616
+ str.type = :dstr
617
+ str
618
+ # top level evstr should be a dstr
619
+ elsif str.type == :evstr
620
+ s(:dstr, "", str)
621
+ else
622
+ str
623
+ end
624
+ end
625
+
626
+ def new_regexp(reg, ending)
627
+ return s(:regexp, '') unless reg
628
+ case reg.type
629
+ when :str
630
+ s(:regexp, reg[1], value(ending))
631
+ when :evstr
632
+ s(:dregx, "", reg)
633
+ when :dstr
634
+ reg.type = :dregx
635
+ reg
636
+ end
637
+ end
638
+
639
+ def str_append(str, str2)
640
+ return str2 unless str
641
+ return str unless str2
642
+
643
+ if str.type == :evstr
644
+ str = s(:dstr, "", str)
645
+ elsif str.type == :str
646
+ str = s(:dstr, str[1])
647
+ else
648
+ #puts str.type
649
+ end
650
+ str << str2
651
+ str
652
+ end
653
+
654
+ def new_str_content(tok)
655
+ s1(:str, value(tok), source(tok))
656
+ end
657
+ end
658
+ end