opal 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (796) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +8 -0
  5. data/CONTRIBUTING.md +46 -2
  6. data/Gemfile +17 -0
  7. data/README.md +13 -4
  8. data/Rakefile +22 -119
  9. data/bin/opal +11 -2
  10. data/bin/opal-repl +71 -0
  11. data/corelib/array.rb +554 -356
  12. data/corelib/basic_object.rb +22 -18
  13. data/corelib/boolean.rb +15 -6
  14. data/corelib/class.rb +12 -6
  15. data/corelib/comparable.rb +40 -9
  16. data/corelib/encoding.rb +164 -0
  17. data/corelib/enumerable.rb +532 -300
  18. data/corelib/enumerator.rb +31 -6
  19. data/corelib/error.rb +14 -3
  20. data/corelib/hash.rb +108 -97
  21. data/corelib/io.rb +30 -0
  22. data/corelib/kernel.rb +151 -82
  23. data/corelib/main.rb +7 -0
  24. data/corelib/match_data.rb +118 -0
  25. data/corelib/method.rb +58 -0
  26. data/corelib/module.rb +145 -77
  27. data/corelib/native.rb +144 -22
  28. data/corelib/nil_class.rb +2 -0
  29. data/corelib/numeric.rb +259 -61
  30. data/corelib/opal.rb +43 -28
  31. data/corelib/proc.rb +21 -9
  32. data/corelib/range.rb +42 -23
  33. data/corelib/regexp.rb +51 -9
  34. data/corelib/runtime.js +470 -129
  35. data/corelib/string.rb +170 -246
  36. data/corelib/struct.rb +13 -1
  37. data/corelib/time.rb +414 -43
  38. data/doc/compiler.md +42 -0
  39. data/doc/compiler_options.md +5 -0
  40. data/doc/examples/node_http_server.rb +49 -0
  41. data/doc/external_libraries.md +9 -0
  42. data/doc/generated_javascript.md +272 -0
  43. data/doc/home.md +17 -0
  44. data/doc/method_missing.md +58 -0
  45. data/doc/static_applications.md +60 -0
  46. data/doc/using_ruby_from_javascript.md +18 -0
  47. data/doc/using_sprockets.md +65 -0
  48. data/lib/opal.rb +18 -15
  49. data/lib/opal/builder.rb +26 -9
  50. data/lib/opal/cli.rb +143 -90
  51. data/lib/opal/cli_options.rb +19 -13
  52. data/lib/opal/compiler.rb +307 -0
  53. data/lib/opal/erb.rb +3 -3
  54. data/lib/opal/fragment.rb +34 -0
  55. data/lib/opal/nodes.rb +25 -0
  56. data/lib/opal/nodes/arglist.rb +56 -0
  57. data/lib/opal/nodes/array.rb +54 -0
  58. data/lib/opal/nodes/base.rb +150 -0
  59. data/lib/opal/nodes/base_scope.rb +11 -0
  60. data/lib/opal/nodes/call.rb +195 -0
  61. data/lib/opal/nodes/call_special.rb +153 -0
  62. data/lib/opal/nodes/case.rb +96 -0
  63. data/lib/opal/nodes/class.rb +43 -0
  64. data/lib/opal/nodes/constants.rb +91 -0
  65. data/lib/opal/nodes/def.rb +157 -0
  66. data/lib/opal/nodes/defined.rb +113 -0
  67. data/lib/opal/nodes/definitions.rb +182 -0
  68. data/lib/opal/nodes/hash.rb +67 -0
  69. data/lib/opal/nodes/helpers.rb +105 -0
  70. data/lib/opal/nodes/if.rb +60 -0
  71. data/lib/opal/nodes/iter.rb +118 -0
  72. data/lib/opal/nodes/literal.rb +193 -0
  73. data/lib/opal/nodes/logic.rb +211 -0
  74. data/lib/opal/nodes/masgn.rb +62 -0
  75. data/lib/opal/nodes/module.rb +46 -0
  76. data/lib/opal/nodes/rescue.rb +134 -0
  77. data/lib/opal/nodes/singleton_class.rb +26 -0
  78. data/lib/opal/nodes/super.rb +97 -0
  79. data/lib/opal/nodes/top.rb +63 -0
  80. data/lib/opal/nodes/variables.rb +155 -0
  81. data/lib/opal/nodes/while.rb +65 -0
  82. data/lib/opal/nodes/yield.rb +84 -0
  83. data/lib/opal/parser.rb +294 -2169
  84. data/lib/opal/parser/grammar.rb +5326 -0
  85. data/lib/opal/{grammar.y → parser/grammar.y} +180 -113
  86. data/lib/opal/parser/keywords.rb +64 -0
  87. data/lib/opal/{lexer.rb → parser/lexer.rb} +278 -327
  88. data/lib/opal/{lexer_scope.rb → parser/parser_scope.rb} +2 -5
  89. data/lib/opal/parser/sexp.rb +63 -0
  90. data/lib/opal/source_map.rb +6 -5
  91. data/lib/opal/target_scope.rb +15 -17
  92. data/lib/opal/version.rb +1 -1
  93. data/mri_spec/cli_spec.rb +67 -6
  94. data/opal.gemspec +4 -4
  95. data/spec/config.ru +2 -1
  96. data/spec/corelib/enumerable/all_break_spec.rb +5 -0
  97. data/spec/corelib/enumerable/any_break_spec.rb +5 -0
  98. data/spec/corelib/enumerable/collect_break_spec.rb +13 -0
  99. data/spec/corelib/enumerable/count_break_spec.rb +5 -0
  100. data/spec/corelib/enumerable/detect_break_spec.rb +5 -0
  101. data/spec/corelib/enumerable/drop_while_break_spec.rb +5 -0
  102. data/spec/corelib/enumerable/each_slice_break.rb +6 -0
  103. data/spec/corelib/enumerable/each_with_index_break_spec.rb +5 -0
  104. data/spec/corelib/enumerable/each_with_object_break_spec.rb +5 -0
  105. data/spec/corelib/enumerable/find_all_break_spec.rb +5 -0
  106. data/spec/corelib/enumerable/find_index_break_spec.rb +5 -0
  107. data/spec/corelib/enumerable/grep_break_spec.rb +5 -0
  108. data/spec/corelib/enumerable/max_break_spec.rb +5 -0
  109. data/spec/corelib/enumerable/max_by_break_spec.rb +5 -0
  110. data/spec/corelib/enumerable/min_break_spec.rb +5 -0
  111. data/spec/corelib/enumerable/min_by_break_spec.rb +5 -0
  112. data/spec/corelib/enumerable/none_break_spec.rb +5 -0
  113. data/spec/corelib/enumerable/one_break_spec.rb +5 -0
  114. data/spec/corelib/enumerable/reduce_break_spec.rb +5 -0
  115. data/spec/corelib/enumerable/take_while_break_spec.rb +5 -0
  116. data/spec/{rubyspec → corelib}/fixtures/class.rb +0 -0
  117. data/spec/{rubyspec → corelib}/fixtures/class_variables.rb +0 -0
  118. data/spec/{rubyspec → corelib}/fixtures/constants.rb +0 -0
  119. data/spec/{rubyspec/core → corelib}/kernel/Array_spec.rb +0 -0
  120. data/spec/{opal → corelib}/kernel/block_given_spec.rb +0 -0
  121. data/spec/{opal → corelib}/kernel/class_spec.rb +0 -0
  122. data/spec/{rubyspec/core → corelib}/kernel/define_singleton_method_spec.rb +0 -0
  123. data/spec/{rubyspec/core → corelib}/kernel/equal_value_spec.rb +0 -0
  124. data/spec/{opal → corelib}/kernel/extend_spec.rb +0 -0
  125. data/spec/{opal → corelib}/kernel/format_spec.rb +0 -0
  126. data/spec/{opal → corelib}/kernel/freeze_spec.rb +0 -0
  127. data/spec/{rubyspec/core → corelib}/kernel/instance_eval_spec.rb +0 -0
  128. data/spec/{opal → corelib}/kernel/instance_variable_defined_spec.rb +0 -0
  129. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_get_spec.rb +0 -0
  130. data/spec/{rubyspec/core → corelib}/kernel/instance_variable_set_spec.rb +0 -0
  131. data/spec/{rubyspec/core → corelib}/kernel/loop_spec.rb +0 -0
  132. data/spec/{opal → corelib}/kernel/match_spec.rb +0 -0
  133. data/spec/{opal → corelib}/kernel/method_spec.rb +0 -0
  134. data/spec/{opal → corelib}/kernel/methods_spec.rb +0 -0
  135. data/spec/{opal → corelib}/kernel/nil_spec.rb +0 -0
  136. data/spec/{opal → corelib}/kernel/p_spec.rb +8 -6
  137. data/spec/{opal → corelib}/kernel/printf_spec.rb +4 -2
  138. data/spec/{opal → corelib}/kernel/proc_spec.rb +0 -0
  139. data/spec/{opal → corelib}/kernel/rand_spec.rb +0 -0
  140. data/spec/{opal → corelib}/kernel/respond_to_spec.rb +0 -0
  141. data/spec/{rubyspec/core → corelib}/kernel/send_spec.rb +0 -0
  142. data/spec/{opal → corelib}/kernel/sprintf_spec.rb +0 -0
  143. data/spec/corelib/kernel/warn_spec.rb +83 -0
  144. data/spec/{rubyspec → corelib}/language/block_spec.rb +17 -18
  145. data/spec/{rubyspec → corelib}/language/fixtures/array.rb +0 -0
  146. data/spec/{rubyspec → corelib}/language/fixtures/block.rb +0 -0
  147. data/spec/{rubyspec → corelib}/language/fixtures/break.rb +0 -0
  148. data/spec/{rubyspec → corelib}/language/fixtures/ensure.rb +0 -0
  149. data/spec/{rubyspec → corelib}/language/fixtures/literal_lambda.rb +0 -0
  150. data/spec/{rubyspec → corelib}/language/fixtures/metaclass.rb +0 -0
  151. data/spec/{rubyspec → corelib}/language/fixtures/module.rb +0 -0
  152. data/spec/{rubyspec → corelib}/language/fixtures/next.rb +0 -0
  153. data/spec/{rubyspec → corelib}/language/fixtures/return.rb +0 -0
  154. data/spec/{rubyspec → corelib}/language/fixtures/send.rb +1 -1
  155. data/spec/{rubyspec → corelib}/language/fixtures/send_1.9.rb +0 -0
  156. data/spec/{rubyspec → corelib}/language/fixtures/super.rb +0 -0
  157. data/spec/{rubyspec → corelib}/language/fixtures/variables.rb +0 -0
  158. data/spec/{rubyspec → corelib}/language/fixtures/yield.rb +0 -0
  159. data/spec/{rubyspec → corelib}/language/numbers_spec.rb +0 -2
  160. data/spec/{rubyspec → corelib}/language/predefined_spec.rb +0 -0
  161. data/spec/{rubyspec → corelib}/language/proc_spec.rb +0 -2
  162. data/spec/{rubyspec → corelib}/language/regexp_spec.rb +0 -0
  163. data/spec/{rubyspec → corelib}/language/send_spec.rb +6 -7
  164. data/spec/{rubyspec → corelib}/language/string_spec.rb +0 -0
  165. data/spec/{rubyspec → corelib}/language/symbol_spec.rb +0 -0
  166. data/spec/{rubyspec → corelib}/language/variables_spec.rb +1 -2
  167. data/spec/{rubyspec → corelib}/language/versions/array_1.9.rb +0 -0
  168. data/spec/{rubyspec → corelib}/language/versions/block_1.9.rb +0 -0
  169. data/spec/{rubyspec → corelib}/language/versions/break_1.9.rb +0 -0
  170. data/spec/{rubyspec → corelib}/language/versions/case_1.9.rb +0 -0
  171. data/spec/{rubyspec → corelib}/language/versions/hash_1.9.rb +0 -0
  172. data/spec/{rubyspec → corelib}/language/versions/literal_lambda_1.9.rb +0 -0
  173. data/spec/{rubyspec → corelib}/language/versions/not_1.9.rb +0 -0
  174. data/spec/{rubyspec → corelib}/language/versions/send_1.9.rb +0 -0
  175. data/spec/{rubyspec → corelib}/language/versions/symbol_1.9.rb +0 -0
  176. data/spec/{rubyspec → corelib}/language/versions/variables_1.9.rb +1 -1
  177. data/spec/corelib/module/alias_method_spec.rb +28 -0
  178. data/spec/{opal → corelib}/module/ancestors_spec.rb +0 -0
  179. data/spec/{opal → corelib}/module/append_features_spec.rb +0 -0
  180. data/spec/corelib/module/attr_accessor_spec.rb +26 -0
  181. data/spec/{rubyspec/core → corelib}/module/const_defined_spec.rb +1 -2
  182. data/spec/{rubyspec/core → corelib}/module/const_get_spec.rb +1 -2
  183. data/spec/{rubyspec/core → corelib}/module/const_missing_spec.rb +1 -2
  184. data/spec/{rubyspec/core → corelib}/module/const_set_spec.rb +1 -2
  185. data/spec/{opal → corelib}/module/constants_spec.rb +0 -0
  186. data/spec/{rubyspec/core → corelib}/module/fixtures/classes.rb +0 -0
  187. data/spec/{rubyspec/core → corelib}/module/method_defined_spec.rb +0 -1
  188. data/spec/{opal → corelib}/module/module_function_spec.rb +0 -2
  189. data/spec/corelib/module/name_spec.rb +52 -0
  190. data/spec/{rubyspec/core → corelib}/module/public_method_defined_spec.rb +0 -1
  191. data/spec/{rubyspec/core → corelib}/module/remove_const_spec.rb +0 -1
  192. data/spec/{rubyspec/core → corelib}/module/undef_method_spec.rb +0 -1
  193. data/spec/{opal → corelib}/native/alias_native_spec.rb +7 -0
  194. data/spec/{opal → corelib}/native/each_spec.rb +2 -5
  195. data/spec/{opal → corelib}/native/element_reference_spec.rb +0 -0
  196. data/spec/{rubyspec/core/hash/to_native_spec.rb → corelib/native/ext_spec.rb} +0 -0
  197. data/spec/corelib/native/initialize_spec.rb +17 -0
  198. data/spec/{opal → corelib}/native/method_missing_spec.rb +0 -0
  199. data/spec/corelib/native/new_spec.rb +6 -0
  200. data/spec/{rubyspec/core → corelib}/numeric/abs_spec.rb +0 -0
  201. data/spec/{rubyspec/core → corelib}/numeric/bit_and_spec.rb +0 -0
  202. data/spec/{rubyspec/core → corelib}/numeric/bit_or_spec.rb +0 -0
  203. data/spec/{rubyspec/core → corelib}/numeric/bit_xor_spec.rb +0 -0
  204. data/spec/{rubyspec/core → corelib}/numeric/ceil_spec.rb +0 -0
  205. data/spec/{rubyspec/core → corelib}/numeric/chr_spec.rb +0 -0
  206. data/spec/{rubyspec/core → corelib}/numeric/comparison_spec.rb +0 -0
  207. data/spec/{rubyspec/core → corelib}/numeric/complement_spec.rb +0 -0
  208. data/spec/{rubyspec/core → corelib}/numeric/divide_spec.rb +0 -0
  209. data/spec/{rubyspec/core → corelib}/numeric/downto_spec.rb +0 -0
  210. data/spec/{rubyspec/core → corelib}/numeric/eql_spec.rb +0 -0
  211. data/spec/{rubyspec/core → corelib}/numeric/equal_value_spec.rb +0 -0
  212. data/spec/{rubyspec/core → corelib}/numeric/even_spec.rb +0 -0
  213. data/spec/{rubyspec/core → corelib}/numeric/exponent_spec.rb +0 -0
  214. data/spec/{rubyspec/core → corelib}/numeric/floor_spec.rb +0 -0
  215. data/spec/{rubyspec/core → corelib}/numeric/gt_spec.rb +0 -0
  216. data/spec/{rubyspec/core → corelib}/numeric/gte_spec.rb +0 -0
  217. data/spec/{rubyspec/core → corelib}/numeric/integer_spec.rb +0 -0
  218. data/spec/{rubyspec/core → corelib}/numeric/left_shift_spec.rb +0 -0
  219. data/spec/{rubyspec/core → corelib}/numeric/lt_spec.rb +0 -0
  220. data/spec/{rubyspec/core → corelib}/numeric/lte_spec.rb +0 -0
  221. data/spec/{rubyspec/core → corelib}/numeric/magnitude_spec.rb +0 -0
  222. data/spec/{rubyspec/core → corelib}/numeric/minus_spec.rb +0 -0
  223. data/spec/{rubyspec/core → corelib}/numeric/modulo_spec.rb +0 -0
  224. data/spec/{rubyspec/core → corelib}/numeric/multiply_spec.rb +0 -0
  225. data/spec/{rubyspec/core → corelib}/numeric/next_spec.rb +0 -0
  226. data/spec/{rubyspec/core → corelib}/numeric/odd_spec.rb +0 -0
  227. data/spec/{rubyspec/core → corelib}/numeric/ord_spec.rb +0 -0
  228. data/spec/{rubyspec/core → corelib}/numeric/plus_spec.rb +0 -0
  229. data/spec/{rubyspec/core → corelib}/numeric/pred_spec.rb +0 -0
  230. data/spec/{rubyspec/core → corelib}/numeric/right_shift_spec.rb +0 -0
  231. data/spec/{rubyspec/core → corelib}/numeric/step_spec.rb +0 -3
  232. data/spec/{rubyspec/core → corelib}/numeric/succ_spec.rb +0 -0
  233. data/spec/{rubyspec/core → corelib}/numeric/times_spec.rb +0 -0
  234. data/spec/{rubyspec/core → corelib}/numeric/to_f_spec.rb +0 -0
  235. data/spec/{rubyspec/core → corelib}/numeric/to_i_spec.rb +0 -0
  236. data/spec/{rubyspec/core → corelib}/numeric/to_json_spec.rb +0 -0
  237. data/spec/corelib/numeric/to_s_spec.rb +26 -0
  238. data/spec/{rubyspec/core → corelib}/numeric/uminus_spec.rb +0 -0
  239. data/spec/{rubyspec/core → corelib}/numeric/upto_spec.rb +0 -0
  240. data/spec/{rubyspec/core → corelib}/numeric/zero_spec.rb +0 -0
  241. data/spec/{rubyspec/core → corelib}/proc/call_spec.rb +0 -0
  242. data/spec/{rubyspec/core → corelib}/proc/element_reference_spec.rb +0 -0
  243. data/spec/{opal → corelib}/proc/proc_tricks_spec.rb +0 -0
  244. data/spec/corelib/runtime/begin_spec.rb +39 -0
  245. data/spec/{opal → corelib}/runtime/block_send_spec.rb +0 -0
  246. data/spec/{opal/language → corelib/runtime}/block_spec.rb +10 -0
  247. data/spec/corelib/runtime/bridged_classes_spec.rb +64 -0
  248. data/spec/{opal → corelib/runtime}/constants_spec.rb +0 -0
  249. data/spec/{opal → corelib}/runtime/eval_spec.rb +0 -0
  250. data/spec/{opal → corelib}/runtime/main_methods_spec.rb +0 -0
  251. data/spec/{opal → corelib/runtime}/method_missing_spec.rb +0 -0
  252. data/spec/corelib/runtime/method_spec.rb +31 -0
  253. data/spec/corelib/runtime/paren_spec.rb +14 -0
  254. data/spec/{opal/language → corelib/runtime}/rescue_spec.rb +11 -0
  255. data/spec/{opal/language → corelib/runtime}/return_spec.rb +0 -0
  256. data/spec/{opal → corelib}/runtime/send_spec.rb +0 -0
  257. data/spec/{opal/language → corelib/runtime}/singleton_class_spec.rb +0 -0
  258. data/spec/{opal/language → corelib/runtime}/super_spec.rb +113 -0
  259. data/spec/{opal/language → corelib/runtime}/variables_spec.rb +0 -0
  260. data/spec/{opal → corelib}/source_map_spec.rb +3 -3
  261. data/spec/{rubyspec/core → corelib}/string/chop_spec.rb +0 -0
  262. data/spec/{rubyspec/core → corelib}/string/chr_spec.rb +0 -0
  263. data/spec/{rubyspec/core → corelib}/string/clone_spec.rb +0 -0
  264. data/spec/{rubyspec/core → corelib}/string/comparison_spec.rb +0 -0
  265. data/spec/{rubyspec/core → corelib}/string/dup_spec.rb +0 -0
  266. data/spec/{rubyspec/core → corelib}/string/element_reference_spec.rb +0 -1
  267. data/spec/{rubyspec/core → corelib}/string/fixtures/classes.rb +0 -0
  268. data/spec/{rubyspec/core → corelib}/string/format_spec.rb +0 -0
  269. data/spec/{opal → corelib}/string/freeze_spec.rb +0 -0
  270. data/spec/{rubyspec/core → corelib}/string/gsub_spec.rb +0 -0
  271. data/spec/{rubyspec/core → corelib}/string/lines_spec.rb +0 -0
  272. data/spec/{rubyspec/core → corelib}/string/ljust_spec.rb +0 -1
  273. data/spec/{rubyspec/core → corelib}/string/lstrip_spec.rb +0 -0
  274. data/spec/{rubyspec/core → corelib}/string/match_spec.rb +0 -0
  275. data/spec/{rubyspec/core → corelib}/string/next_spec.rb +0 -0
  276. data/spec/{rubyspec/core → corelib}/string/ord_spec.rb +0 -0
  277. data/spec/{rubyspec/core → corelib}/string/partition_spec.rb +0 -0
  278. data/spec/{rubyspec/core → corelib}/string/rindex_spec.rb +0 -0
  279. data/spec/{rubyspec/core → corelib}/string/rjust_spec.rb +0 -1
  280. data/spec/{rubyspec/core → corelib}/string/rstrip_spec.rb +0 -0
  281. data/spec/{rubyspec/core → corelib}/string/scan_spec.rb +0 -0
  282. data/spec/{rubyspec/core → corelib}/string/slice_spec.rb +1 -2
  283. data/spec/{rubyspec/core → corelib}/string/split_spec.rb +0 -0
  284. data/spec/{rubyspec/core → corelib}/string/strip_spec.rb +0 -0
  285. data/spec/{rubyspec/core → corelib}/string/sub_spec.rb +0 -0
  286. data/spec/{rubyspec/core → corelib}/string/succ_spec.rb +0 -0
  287. data/spec/{rubyspec/core → corelib}/string/sum_spec.rb +0 -0
  288. data/spec/{rubyspec/core → corelib}/string/to_f_spec.rb +0 -0
  289. data/spec/{rubyspec/core → corelib}/string/to_i_spec.rb +0 -0
  290. data/spec/{rubyspec/core → corelib}/string/tr_s_spec.rb +0 -0
  291. data/spec/{rubyspec/core → corelib}/string/tr_spec.rb +0 -0
  292. data/spec/filters/bugs/array.rb +236 -4
  293. data/spec/filters/bugs/basic_object.rb +4 -0
  294. data/spec/filters/bugs/class.rb +4 -0
  295. data/spec/filters/bugs/enumerable.rb +58 -0
  296. data/spec/filters/bugs/enumerator.rb +6 -0
  297. data/spec/filters/bugs/hash.rb +146 -0
  298. data/spec/filters/bugs/kernel.rb +10 -0
  299. data/spec/filters/bugs/language.rb +366 -0
  300. data/spec/filters/bugs/module.rb +14 -0
  301. data/spec/filters/bugs/regexp.rb +7 -0
  302. data/spec/filters/bugs/set.rb +7 -0
  303. data/spec/filters/bugs/{singleton/instance.rb → singleton.rb} +3 -1
  304. data/spec/filters/bugs/string.rb +37 -0
  305. data/spec/filters/bugs/stringscanner.rb +18 -0
  306. data/spec/filters/bugs/struct.rb +11 -0
  307. data/spec/filters/bugs/symbol.rb +5 -0
  308. data/spec/filters/bugs/time.rb +28 -0
  309. data/spec/filters/bugs/unknown.rb +11 -0
  310. data/spec/filters/unsupported/array_subclasses.rb +32 -0
  311. data/spec/filters/unsupported/encoding.rb +14 -0
  312. data/spec/filters/unsupported/float.rb +4 -0
  313. data/spec/filters/unsupported/frozen.rb +57 -0
  314. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  315. data/spec/filters/unsupported/immutable_strings.rb +6 -0
  316. data/spec/filters/unsupported/mutable_strings.rb +49 -0
  317. data/spec/filters/unsupported/private_methods.rb +26 -0
  318. data/spec/filters/{mspec → unsupported}/ruby_exe.rb +0 -0
  319. data/spec/filters/unsupported/string_subclasses.rb +8 -0
  320. data/spec/filters/unsupported/tainted.rb +46 -0
  321. data/spec/filters/unsupported/time.rb +21 -0
  322. data/spec/filters/unsupported/trusted.rb +26 -0
  323. data/spec/opal/{parser → compiler}/irb_spec.rb +9 -9
  324. data/spec/{parser → opal/parser}/alias_spec.rb +0 -0
  325. data/spec/{parser → opal/parser}/and_spec.rb +0 -0
  326. data/spec/{parser → opal/parser}/array_spec.rb +0 -0
  327. data/spec/{parser → opal/parser}/attrasgn_spec.rb +0 -0
  328. data/spec/{parser → opal/parser}/begin_spec.rb +0 -0
  329. data/spec/{parser → opal/parser}/block_spec.rb +0 -0
  330. data/spec/{parser → opal/parser}/break_spec.rb +0 -0
  331. data/spec/{parser → opal/parser}/call_spec.rb +33 -8
  332. data/spec/{parser → opal/parser}/class_spec.rb +0 -0
  333. data/spec/{parser → opal/parser}/const_spec.rb +0 -0
  334. data/spec/{parser → opal/parser}/cvar_spec.rb +0 -0
  335. data/spec/{parser → opal/parser}/def_spec.rb +17 -17
  336. data/spec/{parser → opal/parser}/false_spec.rb +0 -0
  337. data/spec/{parser → opal/parser}/file_spec.rb +0 -0
  338. data/spec/{parser → opal/parser}/gvar_spec.rb +0 -0
  339. data/spec/{parser → opal/parser}/hash_spec.rb +0 -0
  340. data/spec/opal/parser/heredoc_spec.rb +30 -0
  341. data/spec/{parser → opal/parser}/iasgn_spec.rb +0 -0
  342. data/spec/{parser → opal/parser}/if_spec.rb +0 -0
  343. data/spec/{parser → opal/parser}/int_spec.rb +0 -0
  344. data/spec/opal/parser/iter_spec.rb +59 -0
  345. data/spec/{parser → opal/parser}/ivar_spec.rb +0 -0
  346. data/spec/opal/parser/lambda_spec.rb +64 -0
  347. data/spec/{parser → opal/parser}/lasgn_spec.rb +0 -0
  348. data/spec/{parser → opal/parser}/line_spec.rb +0 -0
  349. data/spec/{parser → opal/parser}/lvar_spec.rb +6 -6
  350. data/spec/{parser → opal/parser}/masgn_spec.rb +0 -0
  351. data/spec/{parser → opal/parser}/module_spec.rb +0 -0
  352. data/spec/{parser → opal/parser}/nil_spec.rb +0 -0
  353. data/spec/{parser → opal/parser}/not_spec.rb +0 -0
  354. data/spec/{parser → opal/parser}/nth_ref_spec.rb +0 -0
  355. data/spec/{parser → opal/parser}/op_asgn1_spec.rb +0 -0
  356. data/spec/{parser → opal/parser}/op_asgn2_spec.rb +0 -0
  357. data/spec/{parser → opal/parser}/or_spec.rb +0 -0
  358. data/spec/{parser → opal/parser}/parse_spec.rb +17 -17
  359. data/spec/{parser → opal/parser}/regexp_spec.rb +0 -0
  360. data/spec/{parser → opal/parser}/return_spec.rb +0 -0
  361. data/spec/{parser → opal/parser}/sclass_spec.rb +0 -0
  362. data/spec/{parser → opal/parser}/self_spec.rb +0 -0
  363. data/spec/{parser → opal/parser}/str_spec.rb +1 -12
  364. data/spec/{parser → opal/parser}/string_spec.rb +0 -0
  365. data/spec/opal/parser/super_spec.rb +20 -0
  366. data/spec/{parser → opal/parser}/true_spec.rb +0 -0
  367. data/spec/{parser → opal/parser}/undef_spec.rb +0 -0
  368. data/spec/{parser → opal/parser}/unless_spec.rb +0 -0
  369. data/spec/{parser → opal/parser}/while_spec.rb +0 -0
  370. data/spec/{parser → opal/parser}/xstr_spec.rb +2 -2
  371. data/spec/{parser → opal/parser}/yield_spec.rb +0 -0
  372. data/spec/ospec/main.rb.erb +1 -13
  373. data/spec/ospec/mspec_fixes.rb +87 -0
  374. data/spec/ospec/runner.rb +188 -0
  375. data/spec/rubyspecs +351 -0
  376. data/spec/spec_helper.rb +8 -198
  377. data/spec/{opal → stdlib}/erb/erb_spec.rb +3 -3
  378. data/spec/{opal → stdlib}/erb/inline_block.opalerb +0 -0
  379. data/spec/{opal → stdlib}/erb/quoted.opalerb +0 -0
  380. data/spec/{opal → stdlib}/erb/simple.opalerb +0 -0
  381. data/spec/stdlib/json/ext_spec.rb +48 -0
  382. data/spec/{opal → stdlib}/json/parse_spec.rb +0 -0
  383. data/spec/stdlib/template/paths_spec.rb +10 -0
  384. data/stdlib/delegate.rb +29 -0
  385. data/stdlib/dir.rb +5 -0
  386. data/stdlib/file.rb +7 -0
  387. data/stdlib/json.rb +82 -27
  388. data/stdlib/opal-parser.rb +46 -0
  389. data/stdlib/opal-source-maps.js.erb +1 -1
  390. data/stdlib/pathname.rb +31 -0
  391. data/stdlib/{racc.rb → racc/parser.rb} +0 -0
  392. data/stdlib/securerandom.rb +12 -0
  393. data/stdlib/set.rb +89 -0
  394. data/stdlib/stringio.rb +12 -4
  395. data/stdlib/strscan.rb +19 -0
  396. data/stdlib/template.rb +4 -0
  397. data/stdlib/thread.rb +20 -0
  398. data/tasks/mspec.rake +147 -0
  399. metadata +650 -1266
  400. data/lib/opal/core_ext.rb +0 -5
  401. data/lib/opal/grammar.rb +0 -5137
  402. data/lib/opal/grammar_helpers.rb +0 -364
  403. data/lib/opal/require_parser.rb +0 -77
  404. data/spec/filters/bugs/alias.rb +0 -6
  405. data/spec/filters/bugs/ancestors.rb +0 -4
  406. data/spec/filters/bugs/array/combination.rb +0 -11
  407. data/spec/filters/bugs/array/count.rb +0 -3
  408. data/spec/filters/bugs/array/delete_if.rb +0 -3
  409. data/spec/filters/bugs/array/drop.rb +0 -3
  410. data/spec/filters/bugs/array/drop_while.rb +0 -5
  411. data/spec/filters/bugs/array/eql.rb +0 -3
  412. data/spec/filters/bugs/array/flatten.rb +0 -9
  413. data/spec/filters/bugs/array/minus.rb +0 -5
  414. data/spec/filters/bugs/array/multipliy.rb +0 -9
  415. data/spec/filters/bugs/array/new.rb +0 -3
  416. data/spec/filters/bugs/array/pop.rb +0 -6
  417. data/spec/filters/bugs/array/rassoc.rb +0 -4
  418. data/spec/filters/bugs/array/rindex.rb +0 -6
  419. data/spec/filters/bugs/array/select.rb +0 -3
  420. data/spec/filters/bugs/array/shift.rb +0 -7
  421. data/spec/filters/bugs/array/shuffle.rb +0 -11
  422. data/spec/filters/bugs/array/slice.rb +0 -7
  423. data/spec/filters/bugs/array/take.rb +0 -3
  424. data/spec/filters/bugs/array/to_a.rb +0 -3
  425. data/spec/filters/bugs/array/try_convert.rb +0 -7
  426. data/spec/filters/bugs/array/uniq.rb +0 -10
  427. data/spec/filters/bugs/array/zip.rb +0 -4
  428. data/spec/filters/bugs/array_delete.rb +0 -4
  429. data/spec/filters/bugs/array_fetch.rb +0 -3
  430. data/spec/filters/bugs/array_first.rb +0 -3
  431. data/spec/filters/bugs/array_flatten.rb +0 -14
  432. data/spec/filters/bugs/array_intersection.rb +0 -5
  433. data/spec/filters/bugs/array_join.rb +0 -6
  434. data/spec/filters/bugs/break.rb +0 -10
  435. data/spec/filters/bugs/case.rb +0 -4
  436. data/spec/filters/bugs/coerce_integer.rb +0 -9
  437. data/spec/filters/bugs/enumerable_sort_by.rb +0 -3
  438. data/spec/filters/bugs/kernel/instance_variables.rb +0 -3
  439. data/spec/filters/bugs/kernel/rand.rb +0 -4
  440. data/spec/filters/bugs/language/array.rb +0 -3
  441. data/spec/filters/bugs/language/block.rb +0 -6
  442. data/spec/filters/bugs/language/break.rb +0 -3
  443. data/spec/filters/bugs/language/class.rb +0 -12
  444. data/spec/filters/bugs/language/class_variables.rb +0 -12
  445. data/spec/filters/bugs/language/def.rb +0 -27
  446. data/spec/filters/bugs/language/defined.rb +0 -3
  447. data/spec/filters/bugs/language/ensure.rb +0 -4
  448. data/spec/filters/bugs/language/execution.rb +0 -4
  449. data/spec/filters/bugs/language/for.rb +0 -18
  450. data/spec/filters/bugs/language/if.rb +0 -13
  451. data/spec/filters/bugs/language/loop.rb +0 -4
  452. data/spec/filters/bugs/language/metaclass.rb +0 -14
  453. data/spec/filters/bugs/language/module.rb +0 -6
  454. data/spec/filters/bugs/language/next.rb +0 -3
  455. data/spec/filters/bugs/language/or.rb +0 -3
  456. data/spec/filters/bugs/language/order.rb +0 -4
  457. data/spec/filters/bugs/language/precedence.rb +0 -10
  458. data/spec/filters/bugs/language/proc.rb +0 -24
  459. data/spec/filters/bugs/language/redo.rb +0 -5
  460. data/spec/filters/bugs/language/rescue.rb +0 -9
  461. data/spec/filters/bugs/language/retry.rb +0 -5
  462. data/spec/filters/bugs/language/send.rb +0 -10
  463. data/spec/filters/bugs/language/super.rb +0 -9
  464. data/spec/filters/bugs/language/until.rb +0 -8
  465. data/spec/filters/bugs/language/variables.rb +0 -37
  466. data/spec/filters/bugs/language/while.rb +0 -6
  467. data/spec/filters/bugs/language/yield.rb +0 -5
  468. data/spec/filters/bugs/module/class_variables.rb +0 -6
  469. data/spec/filters/bugs/module/method_defined.rb +0 -6
  470. data/spec/filters/bugs/public_methods.rb +0 -4
  471. data/spec/filters/bugs/return.rb +0 -7
  472. data/spec/filters/bugs/source_map.rb +0 -3
  473. data/spec/filters/bugs/string/center.rb +0 -4
  474. data/spec/filters/bugs/string/lines.rb +0 -3
  475. data/spec/filters/mspec/mocks.rb +0 -3
  476. data/spec/filters/mspec/should_receive.rb +0 -5
  477. data/spec/filters/parser/block_args.rb +0 -51
  478. data/spec/mspec/guards/block_device.rb +0 -0
  479. data/spec/mspec/guards/endian.rb +0 -0
  480. data/spec/mspec/helpers/environment.rb +0 -0
  481. data/spec/mspec/helpers/language_version.rb +0 -0
  482. data/spec/mspec/helpers/tmp.rb +0 -0
  483. data/spec/opal/array/element_reference_spec.rb +0 -206
  484. data/spec/opal/array/equal_value_spec.rb +0 -19
  485. data/spec/opal/array/fill_spec.rb +0 -26
  486. data/spec/opal/array/reduce_spec.rb +0 -31
  487. data/spec/opal/array/to_json_spec.rb +0 -9
  488. data/spec/opal/basic_object/send_spec.rb +0 -28
  489. data/spec/opal/boolean/singleton_class_spec.rb +0 -9
  490. data/spec/opal/boolean/to_json_spec.rb +0 -11
  491. data/spec/opal/browser/local_storage_spec.rb +0 -55
  492. data/spec/opal/class/constants_spec.rb +0 -7
  493. data/spec/opal/class/extend_spec.rb +0 -47
  494. data/spec/opal/class/instance_methods_spec.rb +0 -13
  495. data/spec/opal/class/last_value_spec.rb +0 -67
  496. data/spec/opal/class/proc_methods_spec.rb +0 -23
  497. data/spec/opal/class/singleton_methods_spec.rb +0 -41
  498. data/spec/opal/hash/allocate_spec.rb +0 -16
  499. data/spec/opal/hash/new_spec.rb +0 -10
  500. data/spec/opal/hash/to_s_spec.rb +0 -9
  501. data/spec/opal/kernel/to_json_spec.rb +0 -7
  502. data/spec/opal/module/alias_method_spec.rb +0 -10
  503. data/spec/opal/module/attr_accessor_spec.rb +0 -8
  504. data/spec/opal/native/new_spec.rb +0 -19
  505. data/spec/opal/native/nil_spec.rb +0 -14
  506. data/spec/opal/nil/to_json_spec.rb +0 -7
  507. data/spec/opal/numeric/equal_spec.rb +0 -9
  508. data/spec/opal/runtime2/call_spec.rb +0 -16
  509. data/spec/opal/runtime2/class_hierarchy_spec.rb +0 -21
  510. data/spec/opal/runtime2/defined_spec.rb +0 -11
  511. data/spec/opal/runtime2/super_spec.rb +0 -16
  512. data/spec/opal/string/to_json_spec.rb +0 -8
  513. data/spec/parser/iter_spec.rb +0 -59
  514. data/spec/parser/lambda_spec.rb +0 -64
  515. data/spec/parser/parser_spec.rb +0 -41
  516. data/spec/parser/strscan/check_spec.rb +0 -13
  517. data/spec/parser/strscan/get_byte_spec.rb +0 -29
  518. data/spec/parser/strscan/scan_spec.rb +0 -33
  519. data/spec/parser/strscan/skip_spec.rb +0 -40
  520. data/spec/parser/super_spec.rb +0 -20
  521. data/spec/rubyspec/core/array/allocate_spec.rb +0 -19
  522. data/spec/rubyspec/core/array/append_spec.rb +0 -43
  523. data/spec/rubyspec/core/array/array_spec.rb +0 -7
  524. data/spec/rubyspec/core/array/assoc_spec.rb +0 -40
  525. data/spec/rubyspec/core/array/at_spec.rb +0 -56
  526. data/spec/rubyspec/core/array/choice_spec.rb +0 -20
  527. data/spec/rubyspec/core/array/clear_spec.rb +0 -61
  528. data/spec/rubyspec/core/array/clone_spec.rb +0 -15
  529. data/spec/rubyspec/core/array/collect_spec.rb +0 -53
  530. data/spec/rubyspec/core/array/combination_spec.rb +0 -55
  531. data/spec/rubyspec/core/array/compact_spec.rb +0 -111
  532. data/spec/rubyspec/core/array/comparison_spec.rb +0 -16
  533. data/spec/rubyspec/core/array/concat_spec.rb +0 -19
  534. data/spec/rubyspec/core/array/constructor_spec.rb +0 -24
  535. data/spec/rubyspec/core/array/count_spec.rb +0 -17
  536. data/spec/rubyspec/core/array/delete_at_spec.rb +0 -71
  537. data/spec/rubyspec/core/array/delete_if_spec.rb +0 -71
  538. data/spec/rubyspec/core/array/delete_spec.rb +0 -104
  539. data/spec/rubyspec/core/array/drop_spec.rb +0 -29
  540. data/spec/rubyspec/core/array/drop_while_spec.rb +0 -17
  541. data/spec/rubyspec/core/array/dup_spec.rb +0 -15
  542. data/spec/rubyspec/core/array/each_index_spec.rb +0 -40
  543. data/spec/rubyspec/core/array/each_spec.rb +0 -30
  544. data/spec/rubyspec/core/array/empty_spec.rb +0 -10
  545. data/spec/rubyspec/core/array/eql_spec.rb +0 -14
  546. data/spec/rubyspec/core/array/fetch_spec.rb +0 -52
  547. data/spec/rubyspec/core/array/find_index_spec.rb +0 -8
  548. data/spec/rubyspec/core/array/first_spec.rb +0 -89
  549. data/spec/rubyspec/core/array/fixtures/classes.rb +0 -538
  550. data/spec/rubyspec/core/array/flatten_spec.rb +0 -232
  551. data/spec/rubyspec/core/array/frozen_spec.rb +0 -32
  552. data/spec/rubyspec/core/array/include_spec.rb +0 -33
  553. data/spec/rubyspec/core/array/index_spec.rb +0 -6
  554. data/spec/rubyspec/core/array/insert_spec.rb +0 -90
  555. data/spec/rubyspec/core/array/inspect_spec.rb +0 -7
  556. data/spec/rubyspec/core/array/intersection_spec.rb +0 -78
  557. data/spec/rubyspec/core/array/join_spec.rb +0 -34
  558. data/spec/rubyspec/core/array/keep_if_spec.rb +0 -12
  559. data/spec/rubyspec/core/array/last_spec.rb +0 -88
  560. data/spec/rubyspec/core/array/length_spec.rb +0 -7
  561. data/spec/rubyspec/core/array/map_spec.rb +0 -11
  562. data/spec/rubyspec/core/array/max_spec.rb +0 -32
  563. data/spec/rubyspec/core/array/min_spec.rb +0 -32
  564. data/spec/rubyspec/core/array/minus_spec.rb +0 -89
  565. data/spec/rubyspec/core/array/multiply_spec.rb +0 -143
  566. data/spec/rubyspec/core/array/new_spec.rb +0 -137
  567. data/spec/rubyspec/core/array/ntimes_spec.rb +0 -26
  568. data/spec/rubyspec/core/array/plus_spec.rb +0 -64
  569. data/spec/rubyspec/core/array/pop_spec.rb +0 -196
  570. data/spec/rubyspec/core/array/push_spec.rb +0 -44
  571. data/spec/rubyspec/core/array/rassoc_spec.rb +0 -38
  572. data/spec/rubyspec/core/array/reject_spec.rb +0 -134
  573. data/spec/rubyspec/core/array/replace_spec.rb +0 -7
  574. data/spec/rubyspec/core/array/reverse_each_spec.rb +0 -37
  575. data/spec/rubyspec/core/array/reverse_spec.rb +0 -58
  576. data/spec/rubyspec/core/array/rindex_spec.rb +0 -71
  577. data/spec/rubyspec/core/array/select_spec.rb +0 -36
  578. data/spec/rubyspec/core/array/shared/collect.rb +0 -7
  579. data/spec/rubyspec/core/array/shared/enumeratorize.rb +0 -12
  580. data/spec/rubyspec/core/array/shared/eql.rb +0 -95
  581. data/spec/rubyspec/core/array/shared/index.rb +0 -37
  582. data/spec/rubyspec/core/array/shared/inspect.rb +0 -3
  583. data/spec/rubyspec/core/array/shared/join.rb +0 -7
  584. data/spec/rubyspec/core/array/shared/keep_if.rb +0 -3
  585. data/spec/rubyspec/core/array/shared/length.rb +0 -3
  586. data/spec/rubyspec/core/array/shared/replace.rb +0 -3
  587. data/spec/rubyspec/core/array/shared/slice.rb +0 -3
  588. data/spec/rubyspec/core/array/shift_spec.rb +0 -160
  589. data/spec/rubyspec/core/array/shuffle_spec.rb +0 -87
  590. data/spec/rubyspec/core/array/size_spec.rb +0 -7
  591. data/spec/rubyspec/core/array/slice_spec.rb +0 -166
  592. data/spec/rubyspec/core/array/sort_spec.rb +0 -271
  593. data/spec/rubyspec/core/array/take_spec.rb +0 -29
  594. data/spec/rubyspec/core/array/take_while_spec.rb +0 -17
  595. data/spec/rubyspec/core/array/to_a_spec.rb +0 -24
  596. data/spec/rubyspec/core/array/to_ary_spec.rb +0 -20
  597. data/spec/rubyspec/core/array/try_convert_spec.rb +0 -52
  598. data/spec/rubyspec/core/array/uniq_spec.rb +0 -167
  599. data/spec/rubyspec/core/array/unshift_spec.rb +0 -64
  600. data/spec/rubyspec/core/array/zip_spec.rb +0 -55
  601. data/spec/rubyspec/core/class/fixtures/classes.rb +0 -9
  602. data/spec/rubyspec/core/class/new_spec.rb +0 -113
  603. data/spec/rubyspec/core/enumerable/all_spec.rb +0 -130
  604. data/spec/rubyspec/core/enumerable/any_spec.rb +0 -150
  605. data/spec/rubyspec/core/enumerable/collect_spec.rb +0 -39
  606. data/spec/rubyspec/core/enumerable/count_spec.rb +0 -45
  607. data/spec/rubyspec/core/enumerable/detect_spec.rb +0 -48
  608. data/spec/rubyspec/core/enumerable/drop_spec.rb +0 -20
  609. data/spec/rubyspec/core/enumerable/drop_while_spec.rb +0 -18
  610. data/spec/rubyspec/core/enumerable/each_slice_spec.rb +0 -25
  611. data/spec/rubyspec/core/enumerable/each_with_index_spec.rb +0 -14
  612. data/spec/rubyspec/core/enumerable/each_with_object_spec.rb +0 -20
  613. data/spec/rubyspec/core/enumerable/entries_spec.rb +0 -9
  614. data/spec/rubyspec/core/enumerable/find_all_spec.rb +0 -16
  615. data/spec/rubyspec/core/enumerable/find_index_spec.rb +0 -44
  616. data/spec/rubyspec/core/enumerable/find_spec.rb +0 -56
  617. data/spec/rubyspec/core/enumerable/first_spec.rb +0 -43
  618. data/spec/rubyspec/core/enumerable/fixtures/classes.rb +0 -240
  619. data/spec/rubyspec/core/enumerable/grep_spec.rb +0 -24
  620. data/spec/rubyspec/core/enumerable/group_by_spec.rb +0 -16
  621. data/spec/rubyspec/core/enumerable/none_spec.rb +0 -68
  622. data/spec/rubyspec/core/enumerable/select_spec.rb +0 -16
  623. data/spec/rubyspec/core/enumerable/sort_by_spec.rb +0 -31
  624. data/spec/rubyspec/core/enumerable/take_spec.rb +0 -43
  625. data/spec/rubyspec/core/enumerable/to_a_spec.rb +0 -9
  626. data/spec/rubyspec/core/enumerator/each_spec.rb +0 -11
  627. data/spec/rubyspec/core/enumerator/new_spec.rb +0 -17
  628. data/spec/rubyspec/core/enumerator/next_spec.rb +0 -25
  629. data/spec/rubyspec/core/enumerator/rewind_spec.rb +0 -28
  630. data/spec/rubyspec/core/false/and_spec.rb +0 -11
  631. data/spec/rubyspec/core/false/inspect_spec.rb +0 -7
  632. data/spec/rubyspec/core/false/or_spec.rb +0 -11
  633. data/spec/rubyspec/core/false/to_s_spec.rb +0 -7
  634. data/spec/rubyspec/core/false/xor_spec.rb +0 -11
  635. data/spec/rubyspec/core/hash/allocate_spec.rb +0 -13
  636. data/spec/rubyspec/core/hash/assoc_spec.rb +0 -25
  637. data/spec/rubyspec/core/hash/clear_spec.rb +0 -19
  638. data/spec/rubyspec/core/hash/clone_spec.rb +0 -10
  639. data/spec/rubyspec/core/hash/constructor_spec.rb +0 -13
  640. data/spec/rubyspec/core/hash/default_proc_spec.rb +0 -20
  641. data/spec/rubyspec/core/hash/default_spec.rb +0 -17
  642. data/spec/rubyspec/core/hash/delete_if_spec.rb +0 -13
  643. data/spec/rubyspec/core/hash/delete_spec.rb +0 -11
  644. data/spec/rubyspec/core/hash/dup_spec.rb +0 -10
  645. data/spec/rubyspec/core/hash/each_key_spec.rb +0 -15
  646. data/spec/rubyspec/core/hash/each_pair_spec.rb +0 -30
  647. data/spec/rubyspec/core/hash/each_spec.rb +0 -36
  648. data/spec/rubyspec/core/hash/each_value_spec.rb +0 -15
  649. data/spec/rubyspec/core/hash/element_reference_spec.rb +0 -41
  650. data/spec/rubyspec/core/hash/element_set_spec.rb +0 -7
  651. data/spec/rubyspec/core/hash/empty_spec.rb +0 -10
  652. data/spec/rubyspec/core/hash/fetch_spec.rb +0 -24
  653. data/spec/rubyspec/core/hash/flatten_spec.rb +0 -46
  654. data/spec/rubyspec/core/hash/has_key_spec.rb +0 -24
  655. data/spec/rubyspec/core/hash/has_value_spec.rb +0 -12
  656. data/spec/rubyspec/core/hash/include_spec.rb +0 -24
  657. data/spec/rubyspec/core/hash/index_spec.rb +0 -13
  658. data/spec/rubyspec/core/hash/indexes_spec.rb +0 -9
  659. data/spec/rubyspec/core/hash/indices_spec.rb +0 -9
  660. data/spec/rubyspec/core/hash/invert_spec.rb +0 -12
  661. data/spec/rubyspec/core/hash/keep_if_spec.rb +0 -18
  662. data/spec/rubyspec/core/hash/key_spec.rb +0 -24
  663. data/spec/rubyspec/core/hash/keys_spec.rb +0 -10
  664. data/spec/rubyspec/core/hash/length_spec.rb +0 -10
  665. data/spec/rubyspec/core/hash/member_spec.rb +0 -24
  666. data/spec/rubyspec/core/hash/merge_spec.rb +0 -37
  667. data/spec/rubyspec/core/hash/new_spec.rb +0 -19
  668. data/spec/rubyspec/core/hash/rassoc_spec.rb +0 -34
  669. data/spec/rubyspec/core/hash/reject_spec.rb +0 -18
  670. data/spec/rubyspec/core/hash/replace_spec.rb +0 -7
  671. data/spec/rubyspec/core/hash/select_spec.rb +0 -52
  672. data/spec/rubyspec/core/hash/shift_spec.rb +0 -19
  673. data/spec/rubyspec/core/hash/size_spec.rb +0 -10
  674. data/spec/rubyspec/core/hash/to_a_spec.rb +0 -13
  675. data/spec/rubyspec/core/hash/to_json_spec.rb +0 -11
  676. data/spec/rubyspec/core/hash/update_spec.rb +0 -17
  677. data/spec/rubyspec/core/hash/value_spec.rb +0 -12
  678. data/spec/rubyspec/core/hash/values_at_spec.rb +0 -9
  679. data/spec/rubyspec/core/hash/values_spec.rb +0 -7
  680. data/spec/rubyspec/core/kernel/eql_spec.rb +0 -15
  681. data/spec/rubyspec/core/kernel/equal_spec.rb +0 -12
  682. data/spec/rubyspec/core/kernel/tap_spec.rb +0 -10
  683. data/spec/rubyspec/core/kernel/to_s_spec.rb +0 -5
  684. data/spec/rubyspec/core/matchdata/to_a_spec.rb +0 -5
  685. data/spec/rubyspec/core/nil/and_spec.rb +0 -11
  686. data/spec/rubyspec/core/nil/dup_spec.rb +0 -7
  687. data/spec/rubyspec/core/nil/inspect_spec.rb +0 -7
  688. data/spec/rubyspec/core/nil/nil_spec.rb +0 -7
  689. data/spec/rubyspec/core/nil/or_spec.rb +0 -11
  690. data/spec/rubyspec/core/nil/to_a_spec.rb +0 -7
  691. data/spec/rubyspec/core/nil/to_f_spec.rb +0 -11
  692. data/spec/rubyspec/core/nil/to_h_spec.rb +0 -10
  693. data/spec/rubyspec/core/nil/to_i_spec.rb +0 -11
  694. data/spec/rubyspec/core/nil/to_s_spec.rb +0 -7
  695. data/spec/rubyspec/core/nil/xor_spec.rb +0 -11
  696. data/spec/rubyspec/core/numeric/to_s_spec.rb +0 -8
  697. data/spec/rubyspec/core/range/begin_spec.rb +0 -9
  698. data/spec/rubyspec/core/range/case_compare_spec.rb +0 -15
  699. data/spec/rubyspec/core/range/end_spec.rb +0 -9
  700. data/spec/rubyspec/core/regexp/match_spec.rb +0 -95
  701. data/spec/rubyspec/core/string/capitalize_spec.rb +0 -10
  702. data/spec/rubyspec/core/string/casecmp_spec.rb +0 -16
  703. data/spec/rubyspec/core/string/center_spec.rb +0 -49
  704. data/spec/rubyspec/core/string/chomp_spec.rb +0 -48
  705. data/spec/rubyspec/core/string/downcase_spec.rb +0 -6
  706. data/spec/rubyspec/core/string/empty_spec.rb +0 -7
  707. data/spec/rubyspec/core/string/end_with_spec.rb +0 -16
  708. data/spec/rubyspec/core/string/include_spec.rb +0 -6
  709. data/spec/rubyspec/core/string/index_spec.rb +0 -405
  710. data/spec/rubyspec/core/string/intern_spec.rb +0 -9
  711. data/spec/rubyspec/core/string/length_spec.rb +0 -9
  712. data/spec/rubyspec/core/string/reverse_spec.rb +0 -7
  713. data/spec/rubyspec/core/string/size_spec.rb +0 -9
  714. data/spec/rubyspec/core/string/start_with_spec.rb +0 -12
  715. data/spec/rubyspec/core/string/swapcase_spec.rb +0 -13
  716. data/spec/rubyspec/core/string/to_a_spec.rb +0 -9
  717. data/spec/rubyspec/core/string/to_s_spec.rb +0 -6
  718. data/spec/rubyspec/core/string/to_str_spec.rb +0 -6
  719. data/spec/rubyspec/core/string/to_sym_spec.rb +0 -9
  720. data/spec/rubyspec/core/string/upcase_spec.rb +0 -6
  721. data/spec/rubyspec/core/struct/fixtures/classes.rb +0 -26
  722. data/spec/rubyspec/core/struct/initialize_spec.rb +0 -11
  723. data/spec/rubyspec/core/struct/new_spec.rb +0 -24
  724. data/spec/rubyspec/core/symbol/to_proc_spec.rb +0 -12
  725. data/spec/rubyspec/core/time/at_spec.rb +0 -7
  726. data/spec/rubyspec/core/time/day_spec.rb +0 -5
  727. data/spec/rubyspec/core/time/friday_spec.rb +0 -9
  728. data/spec/rubyspec/core/time/hour_spec.rb +0 -5
  729. data/spec/rubyspec/core/time/min_spec.rb +0 -5
  730. data/spec/rubyspec/core/time/monday_spec.rb +0 -9
  731. data/spec/rubyspec/core/time/month_spec.rb +0 -5
  732. data/spec/rubyspec/core/time/now_spec.rb +0 -5
  733. data/spec/rubyspec/core/time/saturday_spec.rb +0 -9
  734. data/spec/rubyspec/core/true/and_spec.rb +0 -11
  735. data/spec/rubyspec/core/true/inspect_spec.rb +0 -7
  736. data/spec/rubyspec/core/true/or_spec.rb +0 -11
  737. data/spec/rubyspec/core/true/to_s_spec.rb +0 -7
  738. data/spec/rubyspec/core/true/xor_spec.rb +0 -11
  739. data/spec/rubyspec/language/alias_spec.rb +0 -160
  740. data/spec/rubyspec/language/and_spec.rb +0 -66
  741. data/spec/rubyspec/language/array_spec.rb +0 -117
  742. data/spec/rubyspec/language/break_spec.rb +0 -332
  743. data/spec/rubyspec/language/case_spec.rb +0 -310
  744. data/spec/rubyspec/language/class_spec.rb +0 -190
  745. data/spec/rubyspec/language/class_variable_spec.rb +0 -56
  746. data/spec/rubyspec/language/def_spec.rb +0 -551
  747. data/spec/rubyspec/language/defined_spec.rb +0 -107
  748. data/spec/rubyspec/language/ensure_spec.rb +0 -104
  749. data/spec/rubyspec/language/execution_spec.rb +0 -15
  750. data/spec/rubyspec/language/for_spec.rb +0 -192
  751. data/spec/rubyspec/language/hash_spec.rb +0 -65
  752. data/spec/rubyspec/language/if_spec.rb +0 -356
  753. data/spec/rubyspec/language/literal_lambda_spec.rb +0 -1
  754. data/spec/rubyspec/language/loop_spec.rb +0 -67
  755. data/spec/rubyspec/language/metaclass_spec.rb +0 -159
  756. data/spec/rubyspec/language/module_spec.rb +0 -56
  757. data/spec/rubyspec/language/next_spec.rb +0 -469
  758. data/spec/rubyspec/language/not_spec.rb +0 -55
  759. data/spec/rubyspec/language/or_spec.rb +0 -90
  760. data/spec/rubyspec/language/order_spec.rb +0 -77
  761. data/spec/rubyspec/language/precedence_spec.rb +0 -483
  762. data/spec/rubyspec/language/redo_spec.rb +0 -65
  763. data/spec/rubyspec/language/rescue_spec.rb +0 -121
  764. data/spec/rubyspec/language/retry_spec.rb +0 -56
  765. data/spec/rubyspec/language/return_spec.rb +0 -281
  766. data/spec/rubyspec/language/singleton_class_spec.rb +0 -32
  767. data/spec/rubyspec/language/super_spec.rb +0 -284
  768. data/spec/rubyspec/language/undef_spec.rb +0 -16
  769. data/spec/rubyspec/language/unless_spec.rb +0 -45
  770. data/spec/rubyspec/language/until_spec.rb +0 -234
  771. data/spec/rubyspec/language/while_spec.rb +0 -238
  772. data/spec/rubyspec/language/yield_spec.rb +0 -128
  773. data/spec/rubyspec/library/date/new_spec.rb +0 -10
  774. data/spec/rubyspec/library/date/to_s_spec.rb +0 -7
  775. data/spec/rubyspec/library/date/today_spec.rb +0 -7
  776. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +0 -10
  777. data/spec/rubyspec/library/observer/add_observer_spec.rb +0 -31
  778. data/spec/rubyspec/library/observer/count_observers_spec.rb +0 -33
  779. data/spec/rubyspec/library/observer/delete_observer_spec.rb +0 -19
  780. data/spec/rubyspec/library/observer/delete_observers_spec.rb +0 -19
  781. data/spec/rubyspec/library/observer/fixtures/classes.rb +0 -25
  782. data/spec/rubyspec/library/observer/notify_observers_spec.rb +0 -31
  783. data/spec/rubyspec/library/rbconfig/config_spec.rb +0 -47
  784. data/spec/rubyspec/library/singleton/clone_spec.rb +0 -8
  785. data/spec/rubyspec/library/singleton/dup_spec.rb +0 -8
  786. data/spec/rubyspec/library/singleton/fixtures/classes.rb +0 -18
  787. data/spec/rubyspec/library/singleton/instance_spec.rb +0 -30
  788. data/spec/rubyspec/library/stringscanner/element_reference_spec.rb +0 -29
  789. data/spec/rubyspec/library/stringscanner/pos_spec.rb +0 -20
  790. data/spec/rubyspec/spec_helper.rb +0 -96
  791. data/stdlib/fileutils.rb +0 -0
  792. data/stdlib/iconv.rb +0 -0
  793. data/stdlib/opal-browser/local_storage.rb +0 -27
  794. data/stdlib/opal-browser/script_loader.rb +0 -35
  795. data/stdlib/opal-parser.js.erb +0 -13
  796. data/stdlib/yaml.rb +0 -0
@@ -0,0 +1,64 @@
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__", [:LINE, :LINE], :expr_end],
16
+ ["__FILE__", [:FILE, :FILE], :expr_end],
17
+ ["alias", [:ALIAS, :ALIAS], :expr_fname],
18
+ ["and", [:AND, :AND], :expr_beg],
19
+ ["begin", [:BEGIN, :BEGIN], :expr_beg],
20
+ ["break", [:BREAK, :BREAK], :expr_mid],
21
+ ["case", [:CASE, :CASE], :expr_beg],
22
+ ["class", [:CLASS, :CLASS], :expr_class],
23
+ ["def", [:DEF, :DEF], :expr_fname],
24
+ ["defined?", [:DEFINED, :DEFINED], :expr_arg],
25
+ ["do", [:DO, :DO], :expr_beg],
26
+ ["else", [:ELSE, :ELSE], :expr_beg],
27
+ ["elsif", [:ELSIF, :ELSIF], :expr_beg],
28
+ ["end", [:END, :END], :expr_end],
29
+ ["ensure", [:ENSURE, :ENSURE], :expr_beg],
30
+ ["false", [:FALSE, :FALSE], :expr_end],
31
+ ["if", [:IF, :IF_MOD], :expr_beg],
32
+ ["module", [:MODULE, :MODULE], :expr_beg],
33
+ ["nil", [:NIL, :NIL], :expr_end],
34
+ ["next", [:NEXT, :NEXT], :expr_mid],
35
+ ["not", [:NOT, :NOT], :expr_beg],
36
+ ["or", [:OR, :OR], :expr_beg],
37
+ ["redo", [:REDO, :REDO], :expr_end],
38
+ ["rescue", [:RESCUE, :RESCUE_MOD], :expr_mid],
39
+ ["return", [:RETURN, :RETURN], :expr_mid],
40
+ ["self", [:SELF, :SELF], :expr_end],
41
+ ["super", [:SUPER, :SUPER], :expr_arg],
42
+ ["then", [:THEN, :THEN], :expr_beg],
43
+ ["true", [:TRUE, :TRUE], :expr_end],
44
+ ["undef", [:UNDEF, :UNDEF], :expr_fname],
45
+ ["unless", [:UNLESS, :UNLESS_MOD], :expr_beg],
46
+ ["until", [:UNTIL, :UNTIL_MOD], :expr_beg],
47
+ ["when", [:WHEN, :WHEN], :expr_beg],
48
+ ["while", [:WHILE, :WHILE_MOD], :expr_beg],
49
+ ["yield", [:YIELD, :YIELD], :expr_arg]
50
+ ].map { |decl| KeywordTable.new(*decl) }
51
+
52
+ def self.map
53
+ unless @map
54
+ @map = {}
55
+ KEYWORDS.each { |k| @map[k.name] = k }
56
+ end
57
+ @map
58
+ end
59
+
60
+ def self.keyword(kw)
61
+ map[kw]
62
+ end
63
+ end
64
+ end
@@ -1,59 +1,24 @@
1
- require 'opal/core_ext'
2
- require 'opal/grammar'
3
- require 'opal/grammar_helpers'
4
- require 'opal/lexer_scope'
5
1
  require 'strscan'
2
+ require 'opal/parser/keywords'
6
3
 
7
4
  module Opal
5
+ class Lexer
8
6
 
9
- class Grammar < Racc::Parser
7
+ attr_reader :line, :scope_line, :scope
10
8
 
11
- attr_reader :line
9
+ attr_accessor :lex_state, :strterm
12
10
 
13
- def initialize
11
+ def initialize(source, file)
14
12
  @lex_state = :expr_beg
15
13
  @cond = 0
16
14
  @cmdarg = 0
17
15
  @line = 1
18
- @scopes = []
16
+ @file = file
19
17
 
20
- @string_parse_stack = []
18
+ @scanner = StringScanner.new(source)
19
+ @scanner_stack = [@scanner]
21
20
  end
22
21
 
23
- def s(*parts)
24
- sexp = Array.new(parts)
25
- sexp.line = @line
26
- sexp
27
- end
28
-
29
- def parse(source, file = '(string)')
30
- @file = file
31
- @scanner = StringScanner.new source
32
- push_scope
33
- result = do_parse
34
- pop_scope
35
-
36
- result
37
- end
38
-
39
- def on_error(t, val, vstack)
40
- raise "parse error on value #{val.inspect} (#{token_to_str(t) || '?'}) :#{@file}:#{@line}"
41
- end
42
-
43
- def push_scope(type = nil)
44
- top = @scopes.last
45
- scope = LexerScope.new type
46
- scope.parent = top
47
- @scopes << scope
48
- @scope = scope
49
- end
50
-
51
- def pop_scope
52
- @scopes.pop
53
- @scope = @scopes.last
54
- end
55
-
56
-
57
22
  def cond_push(n)
58
23
  @cond = (@cond << 1) | (n & 1)
59
24
  end
@@ -110,14 +75,22 @@ module Opal
110
75
  @scanner.check(/\s/)
111
76
  end
112
77
 
78
+ def next_token
79
+ self.yylex
80
+ end
81
+
82
+ def strterm_expand?(strterm)
83
+ type = strterm[:type]
84
+
85
+ [:dquote, :dsym, :dword, :heredoc, :xquote, :regexp].include? type
86
+ end
87
+
113
88
  def next_string_token
114
- # str_parse, scanner = current_string_parse, @scanner
115
- str_parse = @string_parse
89
+ str_parse = self.strterm
116
90
  scanner = @scanner
117
91
  space = false
118
92
 
119
- # everything bar single quote and lower case bare wrds can interpolate
120
- interpolate = str_parse[:interpolate]
93
+ expand = strterm_expand?(str_parse)
121
94
 
122
95
  words = ['w', 'W'].include? str_parse[:beg]
123
96
 
@@ -126,6 +99,23 @@ module Opal
126
99
  # if not end of string, so we must be parsing contents
127
100
  str_buffer = []
128
101
 
102
+ if str_parse[:type] == :heredoc
103
+ eos_regx = /[ \t]*#{Regexp.escape(str_parse[:end])}(\r*\n|$)/
104
+
105
+ if scanner.check(eos_regx)
106
+ scanner.scan(/[ \t]*#{Regexp.escape(str_parse[:end])}/)
107
+ self.strterm = nil
108
+
109
+ if str_parse[:scanner]
110
+ @scanner_stack << str_parse[:scanner]
111
+ @scanner = str_parse[:scanner]
112
+ end
113
+
114
+ @lex_state = :expr_end
115
+ return :STRING_END, scanner.matched
116
+ end
117
+ end
118
+
129
119
  # see if we can read end of string/xstring/regecp markers
130
120
  # if scanner.scan /#{str_parse[:end]}/
131
121
  if scanner.scan Regexp.new(Regexp.escape(str_parse[:end]))
@@ -134,7 +124,7 @@ module Opal
134
124
  scanner.pos -= 1
135
125
  return :SPACE, ' '
136
126
  end
137
- @string_parse = nil
127
+ self.strterm = nil
138
128
 
139
129
  if str_parse[:balance]
140
130
  if str_parse[:nesting] == 0
@@ -148,7 +138,7 @@ module Opal
148
138
  else
149
139
  str_buffer << scanner.matched
150
140
  str_parse[:nesting] -= 1
151
- @string_parse = str_parse
141
+ self.strterm = str_parse
152
142
  end
153
143
 
154
144
  elsif ['"', "'"].include? str_parse[:beg]
@@ -165,6 +155,11 @@ module Opal
165
155
  return :REGEXP_END, result
166
156
 
167
157
  else
158
+ if str_parse[:scanner]
159
+ @scanner_stack << str_parse[:scanner]
160
+ @scanner = str_parse[:scanner]
161
+ end
162
+
168
163
  @lex_state = :expr_end
169
164
  return :STRING_END, scanner.matched
170
165
  end
@@ -177,14 +172,14 @@ module Opal
177
172
  str_parse[:nesting] += 1
178
173
  elsif scanner.check(/#[@$]/)
179
174
  scanner.scan(/#/)
180
- if interpolate
175
+ if expand
181
176
  return :STRING_DVAR, scanner.matched
182
177
  else
183
178
  str_buffer << scanner.matched
184
179
  end
185
180
 
186
181
  elsif scanner.scan(/#\{/)
187
- if interpolate
182
+ if expand
188
183
  # we are into ruby code, so stop parsing content (for now)
189
184
  return :STRING_DBEG, scanner.matched
190
185
  else
@@ -196,19 +191,78 @@ module Opal
196
191
  str_buffer << '#'
197
192
  end
198
193
 
199
- add_string_content str_buffer, str_parse
194
+ if str_parse[:type] == :heredoc
195
+ add_heredoc_content str_buffer, str_parse
196
+ else
197
+ add_string_content str_buffer, str_parse
198
+ end
199
+
200
200
  complete_str = str_buffer.join ''
201
201
  @line += complete_str.count("\n")
202
202
  return :STRING_CONTENT, complete_str
203
203
  end
204
204
 
205
+ def add_heredoc_content(str_buffer, str_parse)
206
+ scanner = @scanner
207
+
208
+ eos_regx = /[ \t]*#{Regexp.escape(str_parse[:end])}(\r*\n|$)/
209
+ expand = true
210
+
211
+ until scanner.eos?
212
+ c = nil
213
+ handled = true
214
+
215
+ if scanner.scan(/\n/)
216
+ c = scanner.matched
217
+ elsif scanner.check(eos_regx) && scanner.bol?
218
+ break # eos!
219
+ elsif expand && scanner.check(/#(?=[\$\@\{])/)
220
+ break
221
+ elsif scanner.scan(/\\/)
222
+ if str_parse[:regexp]
223
+ if scanner.scan(/(.)/)
224
+ c = "\\" + scanner.matched
225
+ end
226
+ else
227
+ c = if scanner.scan(/n/)
228
+ "\n"
229
+ elsif scanner.scan(/r/)
230
+ "\r"
231
+ elsif scanner.scan(/\n/)
232
+ "\n"
233
+ elsif scanner.scan(/t/)
234
+ "\t"
235
+ else
236
+ # escaped char doesnt need escaping, so just return it
237
+ scanner.scan(/./)
238
+ scanner.matched
239
+ end
240
+ end
241
+ else
242
+ handled = false
243
+ end
244
+
245
+ unless handled
246
+ reg = Regexp.new("[^#{Regexp.escape str_parse[:end]}\#\0\\\\\n]+|.")
247
+
248
+ scanner.scan reg
249
+ c = scanner.matched
250
+ end
251
+
252
+ c ||= scanner.matched
253
+ str_buffer << c
254
+ end
255
+
256
+ raise "reached EOF while in string" if scanner.eos?
257
+ end
258
+
205
259
  def add_string_content(str_buffer, str_parse)
206
260
  scanner = @scanner
207
261
  # regexp for end of string/regexp
208
262
  # end_str_re = /#{str_parse[:end]}/
209
263
  end_str_re = Regexp.new(Regexp.escape(str_parse[:end]))
210
- # can be interpolate
211
- interpolate = str_parse[:interpolate]
264
+
265
+ expand = strterm_expand?(str_parse)
212
266
 
213
267
  words = ['W', 'w'].include? str_parse[:beg]
214
268
 
@@ -237,7 +291,7 @@ module Opal
237
291
  scanner.pos -= 1
238
292
  break
239
293
 
240
- elsif interpolate && scanner.check(/#(?=[\$\@\{])/)
294
+ elsif expand && scanner.check(/#(?=[\$\@\{])/)
241
295
  break
242
296
 
243
297
  #elsif scanner.scan(/\\\\/)
@@ -271,14 +325,12 @@ module Opal
271
325
  reg = if words
272
326
  Regexp.new("[^#{Regexp.escape str_parse[:end]}\#\0\n\ \\\\]+|.")
273
327
  elsif str_parse[:balance]
274
- #puts "using tis regexp"
275
328
  Regexp.new("[^#{Regexp.escape str_parse[:end]}#{Regexp.escape str_parse[:beg]}\#\0\\\\]+|.")
276
329
  else
277
330
  Regexp.new("[^#{Regexp.escape str_parse[:end]}\#\0\\\\]+|.")
278
331
  end
279
332
 
280
333
  scanner.scan reg
281
- #puts scanner.matched
282
334
  c = scanner.matched
283
335
  end
284
336
 
@@ -289,16 +341,121 @@ module Opal
289
341
  raise "reached EOF while in string" if scanner.eos?
290
342
  end
291
343
 
292
- def next_token
293
- # if we are trying to parse a string, then delegate to that
294
- return next_string_token if @string_parse
344
+ def heredoc_identifier
345
+ if @scanner.scan(/(-?)['"]?(\w+)['"]?/)
346
+ heredoc = @scanner[2]
347
+ self.strterm = { :type => :heredoc, :beg => heredoc, :end => heredoc }
348
+
349
+ # if ruby code at end of line after heredoc, we have to store it to
350
+ # parse after heredoc is finished parsing
351
+ end_of_line = @scanner.scan(/.*\n/)
352
+ self.strterm[:scanner] = StringScanner.new(end_of_line) if end_of_line != "\n"
353
+
354
+ return :STRING_BEG, heredoc
355
+ end
356
+ end
357
+
358
+ def process_identifier(matched, cmd_start)
359
+ scanner = @scanner
360
+ matched = scanner.matched
361
+
362
+ if scanner.peek(2) != '::' && scanner.scan(/:/)
363
+ @lex_state = :expr_beg
364
+ return :LABEL, "#{matched}"
365
+ end
366
+
367
+ if matched == 'defined?'
368
+ if after_operator?
369
+ @lex_state = :expr_end
370
+ return :IDENTIFIER, matched
371
+ end
372
+
373
+ @lex_state = :expr_arg
374
+ return :DEFINED, 'defined?'
375
+ end
376
+
377
+ if matched.end_with? '?', '!'
378
+ result = :IDENTIFIER
379
+ else
380
+ if @lex_state == :expr_fname
381
+ if scanner.scan(/\=/)
382
+ result = :IDENTIFIER
383
+ matched += scanner.matched
384
+ end
385
+
386
+ elsif matched =~ /^[A-Z]/
387
+ result = :CONSTANT
388
+ else
389
+ result = :IDENTIFIER
390
+ end
391
+ end
295
392
 
296
- # scanner, @space_seen, cmd_start, c = @scanner, false, false, ''
393
+ if @lex_state != :expr_dot and kw = Keywords.keyword(matched)
394
+ old_state = @lex_state
395
+ @lex_state = kw.state
396
+
397
+ if old_state == :expr_fname
398
+ return [kw.id[0], kw.name]
399
+ end
400
+
401
+ if @lex_state == :expr_beg
402
+ cmd_start = true
403
+ end
404
+
405
+ if matched == "do"
406
+ if after_operator?
407
+ @lex_state = :expr_end
408
+ return :IDENTIFIER, matched
409
+ end
410
+
411
+ if @start_of_lambda
412
+ @start_of_lambda = false
413
+ @lex_state = :expr_beg
414
+ return [:DO_LAMBDA, scanner.matched]
415
+ elsif cond?
416
+ @lex_state = :expr_beg
417
+ return :DO_COND, matched
418
+ elsif cmdarg? && @lex_state != :expr_cmdarg
419
+ @lex_state = :expr_beg
420
+ return :DO_BLOCK, matched
421
+ elsif @lex_state == :expr_endarg
422
+ return :DO_BLOCK, matched
423
+ else
424
+ @lex_state = :expr_beg
425
+ return :DO, matched
426
+ end
427
+ else
428
+ if old_state == :expr_beg or old_state == :expr_value
429
+ return [kw.id[0], matched]
430
+ else
431
+ if kw.id[0] != kw.id[1]
432
+ @lex_state = :expr_beg
433
+ end
434
+
435
+ return [kw.id[1], matched]
436
+ end
437
+ end
438
+ end
439
+
440
+ if [:expr_beg, :expr_dot, :expr_mid, :expr_arg, :expr_cmdarg].include? @lex_state
441
+ @lex_state = cmd_start ? :expr_cmdarg : :expr_arg
442
+ else
443
+ @lex_state = :expr_end
444
+ end
445
+
446
+ return [matched =~ /^[A-Z]/ ? :CONSTANT : :IDENTIFIER, matched]
447
+ end
448
+
449
+ def yylex
297
450
  scanner = @scanner
298
451
  @space_seen = false
299
452
  cmd_start = false
300
453
  c = ''
301
454
 
455
+ if self.strterm
456
+ return next_string_token
457
+ end
458
+
302
459
  while true
303
460
  if scanner.scan(/\ |\t|\r/)
304
461
  @space_seen = true
@@ -370,8 +527,8 @@ module Opal
370
527
  return :OP_ASGN, '*'
371
528
  else
372
529
  result = '*'
373
- if @lex_state == :expr_fname
374
- @lex_state = :expr_end
530
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
531
+ @lex_state = :expr_arg
375
532
  return '*', result
376
533
  elsif @space_seen && scanner.check(/\S/)
377
534
  @lex_state = :expr_beg
@@ -409,6 +566,7 @@ module Opal
409
566
  if @lex_state == :expr_beg and !@space_seen
410
567
  if scanner.scan(/begin/) and space?
411
568
  scanner.scan(/(.*)/) # end of line
569
+ line_count = 0
412
570
 
413
571
  while true
414
572
  if scanner.eos?
@@ -416,10 +574,12 @@ module Opal
416
574
  end
417
575
 
418
576
  if scanner.scan(/\=end/) and space?
577
+ @line += line_count
419
578
  return next_token
420
579
  end
421
580
 
422
581
  if scanner.scan(/\n/)
582
+ line_count += 1
423
583
  next
424
584
  end
425
585
 
@@ -451,15 +611,15 @@ module Opal
451
611
  return '=', '='
452
612
 
453
613
  elsif scanner.scan(/\"/)
454
- @string_parse = { :beg => '"', :end => '"', :interpolate => true }
614
+ self.strterm = { :type => :dquote, :beg => '"', :end => '"' }
455
615
  return :STRING_BEG, scanner.matched
456
616
 
457
617
  elsif scanner.scan(/\'/)
458
- @string_parse = { :beg => "'", :end => "'" }
618
+ self.strterm = { :type => :squote, :beg => "'", :end => "'" }
459
619
  return :STRING_BEG, scanner.matched
460
620
 
461
621
  elsif scanner.scan(/\`/)
462
- @string_parse = { :beg => "`", :end => "`", :interpolate => true }
622
+ self.strterm = { :type => :xquote, :beg => "`", :end => "`" }
463
623
  return :XSTRING_BEG, scanner.matched
464
624
 
465
625
  elsif scanner.scan(/\&/)
@@ -509,48 +669,48 @@ module Opal
509
669
  elsif scanner.scan(/\%W/)
510
670
  start_word = scanner.scan(/./)
511
671
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
512
- @string_parse = { :beg => 'W', :end => end_word, :interpolate => true }
672
+ self.strterm = { :type => :dword, :beg => 'W', :end => end_word }
513
673
  scanner.scan(/\s*/)
514
674
  return :WORDS_BEG, scanner.matched
515
675
 
516
- elsif scanner.scan(/\%w/)
676
+ elsif scanner.scan(/\%w/) or scanner.scan(/\%i/)
517
677
  start_word = scanner.scan(/./)
518
678
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
519
- @string_parse = { :beg => 'w', :end => end_word }
679
+ self.strterm = { :type => :sword, :beg => 'w', :end => end_word }
520
680
  scanner.scan(/\s*/)
521
681
  return :AWORDS_BEG, scanner.matched
522
682
 
523
683
  elsif scanner.scan(/\%[Qq]/)
524
- interpolate = scanner.matched.end_with? 'Q'
684
+ type = scanner.matched.end_with?('Q') ? :dquote : :squote
525
685
  start_word = scanner.scan(/./)
526
686
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
527
- @string_parse = { :beg => start_word, :end => end_word, :balance => true, :nesting => 0, :interpolate => interpolate }
687
+ self.strterm = { :type => type, :beg => start_word, :end => end_word, :balance => true, :nesting => 0 }
528
688
  return :STRING_BEG, scanner.matched
529
689
 
530
690
  elsif scanner.scan(/\%x/)
531
691
  start_word = scanner.scan(/./)
532
692
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
533
- @string_parse = { :beg => start_word, :end => end_word, :balance => true, :nesting => 0, :interpolate => true }
693
+ self.strterm = { :type => :xquote, :beg => start_word, :end => end_word, :balance => true, :nesting => 0 }
534
694
  return :XSTRING_BEG, scanner.matched
535
695
 
536
696
  elsif scanner.scan(/\%r/)
537
697
  start_word = scanner.scan(/./)
538
698
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
539
- @string_parse = { :beg => start_word, :end => end_word, :regexp => true, :balance => true, :nesting => 0, :interpolate => true }
699
+ self.strterm = { :type => :regexp, :beg => start_word, :end => end_word, :regexp => true, :balance => true, :nesting => 0 }
540
700
  return :REGEXP_BEG, scanner.matched
541
701
 
542
702
  elsif scanner.scan(/\//)
543
703
  if [:expr_beg, :expr_mid].include? @lex_state
544
- @string_parse = { :beg => '/', :end => '/', :interpolate => true, :regexp => true }
704
+ self.strterm = { :type => :regexp, :beg => '/', :end => '/', :regexp => true }
545
705
  return :REGEXP_BEG, scanner.matched
546
706
  elsif scanner.scan(/\=/)
547
707
  @lex_state = :expr_beg
548
708
  return :OP_ASGN, '/'
549
- elsif @lex_state == :expr_fname
550
- @lex_state = :expr_end
709
+ elsif @lex_state == :expr_fname or @lex_state == :expr_dot
710
+ @lex_state = :expr_arg
551
711
  elsif @lex_state == :expr_cmdarg || @lex_state == :expr_arg
552
712
  if !scanner.check(/\s/) && @space_seen
553
- @string_parse = { :beg => '/', :end => '/', :interpolate => true, :regexp => true }
713
+ self.strterm = { :type => :regexp, :beg => '/', :end => '/', :regexp => true }
554
714
  return :REGEXP_BEG, scanner.matched
555
715
  end
556
716
  else
@@ -565,14 +725,15 @@ module Opal
565
725
  return :OP_ASGN, '%'
566
726
  elsif scanner.check(/[^\s]/)
567
727
  if @lex_state == :expr_beg or (@lex_state == :expr_arg && @space_seen)
568
- interpolate = true
569
728
  start_word = scanner.scan(/./)
570
729
  end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
571
- @string_parse = { :beg => start_word, :end => end_word, :balance => true, :nesting => 0, :interpolate => interpolate }
730
+ self.strterm = { :type => :dquote, :beg => start_word, :end => end_word, :balance => true, :nesting => 0 }
572
731
  return :STRING_BEG, scanner.matched
573
732
  end
574
733
  end
575
- @lex_state = @lex_state == :expr_fname ? :expr_end : :expr_beg
734
+
735
+ @lex_state = after_operator? ? :expr_arg : :expr_beg
736
+
576
737
  return '%', '%'
577
738
 
578
739
  elsif scanner.scan(/\\/)
@@ -667,7 +828,7 @@ module Opal
667
828
  return '::', scanner.matched
668
829
 
669
830
  elsif scanner.scan(/\:/)
670
- if [:expr_end, :expr_endarg].include?(@lex_state) || scanner.check(/\s/)
831
+ if end? || scanner.check(/\s/)
671
832
  unless scanner.check(/\w/)
672
833
  @lex_state = :expr_beg
673
834
  return ':', ':'
@@ -678,9 +839,9 @@ module Opal
678
839
  end
679
840
 
680
841
  if scanner.scan(/\'/)
681
- @string_parse = { :beg => "'", :end => "'" }
842
+ self.strterm = { :type => :ssym, :beg => "'", :end => "'" }
682
843
  elsif scanner.scan(/\"/)
683
- @string_parse = { :beg => '"', :end => '"', :interpolate => true }
844
+ self.strterm = { :type => :dsym, :beg => '"', :end => '"' }
684
845
  end
685
846
 
686
847
  @lex_state = :expr_fname
@@ -690,8 +851,8 @@ module Opal
690
851
  @lex_state = :expr_beg
691
852
  return :OP_ASGN, '^'
692
853
  elsif scanner.scan(/\^/)
693
- if @lex_state == :expr_fname
694
- @lex_state = :expr_end
854
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
855
+ @lex_state = :expr_arg
695
856
  return '^', scanner.matched
696
857
  end
697
858
 
@@ -703,40 +864,41 @@ module Opal
703
864
  @lex_state = :expr_beg
704
865
  return :OP_ASGN, '<<'
705
866
  elsif scanner.scan(/\<\</)
706
- if @lex_state == :expr_fname
707
- @lex_state = :expr_end
867
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
868
+ @lex_state = :expr_arg
708
869
  return '<<', '<<'
709
- elsif ![:expr_end, :expr_dot, :expr_endarg, :expr_class].include?(@lex_state) && @space_seen
710
- if scanner.scan(/(-?)['"]?(\w+)['"]?/)
711
- heredoc = scanner[2]
712
- # for now just scrap rest of line + skip down one line for
713
- # string content
714
- scanner.scan(/.*\n/)
715
- @string_parse = { :beg => heredoc, :end => heredoc, :interpolate => true }
716
- return :STRING_BEG, heredoc
870
+ elsif ![:expr_dot, :expr_class].include?(@lex_state) && !end? && (!arg? || @space_seen)
871
+ if token = heredoc_identifier
872
+ return token
717
873
  end
874
+
718
875
  @lex_state = :expr_beg
719
876
  return '<<', '<<'
720
877
  end
721
878
  @lex_state = :expr_beg
722
879
  return '<<', '<<'
723
880
  elsif scanner.scan(/\<\=\>/)
724
- if @lex_state == :expr_fname
725
- @lex_state = :expr_end
881
+ if after_operator?
882
+ @lex_state = :expr_arg
726
883
  else
884
+ if @lex_state == :expr_class
885
+ cmd_start = true
886
+ end
887
+
727
888
  @lex_state = :expr_beg
728
889
  end
890
+
729
891
  return '<=>', '<=>'
730
892
  elsif scanner.scan(/\<\=/)
731
- if @lex_state == :expr_fname
732
- @lex_state = :expr_end
893
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
894
+ @lex_state = :expr_arg
733
895
  else
734
896
  @lex_state = :expr_beg
735
897
  end
736
898
  return '<=', '<='
737
899
  elsif scanner.scan(/\</)
738
- if @lex_state == :expr_fname
739
- @lex_state = :expr_end
900
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
901
+ @lex_state = :expr_arg
740
902
  else
741
903
  @lex_state = :expr_beg
742
904
  end
@@ -754,14 +916,14 @@ module Opal
754
916
  end
755
917
  return '>>', '>>'
756
918
  elsif scanner.scan(/\>\=/)
757
- if @lex_state == :expr_fname
919
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
758
920
  @lex_state = :expr_end
759
921
  else
760
922
  @lex_state = :expr_beg
761
923
  end
762
924
  return '>=', scanner.matched
763
925
  elsif scanner.scan(/\>/)
764
- if @lex_state == :expr_fname
926
+ if @lex_state == :expr_fname or @lex_state == :expr_dot
765
927
  @lex_state = :expr_arg
766
928
  else
767
929
  @lex_state = :expr_beg
@@ -782,8 +944,8 @@ module Opal
782
944
  if @lex_state == :expr_beg || @lex_state == :expr_mid
783
945
  @lex_state = :expr_mid
784
946
  return [sign, sign]
785
- elsif @lex_state == :expr_fname
786
- @lex_state = :expr_end
947
+ elsif @lex_state == :expr_fname or @lex_state == :expr_dot
948
+ @lex_state = :expr_arg
787
949
  return [:IDENTIFIER, result + scanner.matched] if scanner.scan(/@/)
788
950
  return [result, result]
789
951
  end
@@ -804,12 +966,12 @@ module Opal
804
966
  return [result, result]
805
967
 
806
968
  elsif scanner.scan(/\?/)
807
- if [:expr_end, :expr_endarg].include?(@lex_state)
969
+ if end?
808
970
  @lex_state = :expr_beg
809
971
  return '?', scanner.matched
810
972
  end
811
973
 
812
- unless scanner.check(/\ |\t|\r/)
974
+ unless scanner.check(/\ |\t|\r|\s/)
813
975
  @lex_state = :expr_end
814
976
  return :STRING, scanner.scan(/./)
815
977
  end
@@ -896,229 +1058,18 @@ module Opal
896
1058
  end
897
1059
 
898
1060
  elsif scanner.scan(/(\w)+[\?\!]?/)
899
- matched = scanner.matched
900
- if scanner.peek(2) != '::' && scanner.scan(/:/)
901
- @lex_state = :expr_beg
902
- return :LABEL, "#{matched}"
903
- end
904
-
905
- case matched
906
- when 'class'
907
- if @lex_state == :expr_dot
908
- @lex_state = :expr_end
909
- return :IDENTIFIER, matched
910
- end
911
- @lex_state = :expr_class
912
- return :CLASS, matched
913
-
914
- when 'module'
915
- return :IDENTIFIER, matched if @lex_state == :expr_dot
916
- @lex_state = :expr_class
917
- return :MODULE, matched
918
-
919
- when 'defined?'
920
- return :IDENTIFIER, matched if @lex_state == :expr_dot
921
- @lex_state = :expr_arg
922
- return :DEFINED, 'defined?'
923
-
924
- when 'def'
925
- @lex_state = :expr_fname
926
- @scope_line = @line
927
- return :DEF, matched
928
-
929
- when 'undef'
930
- @lex_state = :expr_fname
931
- return :UNDEF, matched
932
-
933
- when 'end'
934
- if [:expr_dot, :expr_fname].include? @lex_state
935
- @lex_state = :expr_end
936
- return :IDENTIFIER, matched
937
- end
938
-
939
- @lex_state = :expr_end
940
- return :END, matched
941
-
942
- when 'do'
943
- #puts cond?
944
- #puts cmdarg?
945
- #nputs @lex_state
946
- if @start_of_lambda
947
- @start_of_lambda = false
948
- @lex_state = :expr_beg
949
- return [:DO_LAMBDA, scanner.matched]
950
- elsif cond?
951
- @lex_state = :expr_beg
952
- return :DO_COND, matched
953
- elsif cmdarg? && @lex_state != :expr_cmdarg
954
- @lex_state = :expr_beg
955
- return :DO_BLOCK, matched
956
- elsif @lex_state == :expr_endarg
957
- return :DO_BLOCK, matched
958
- else
959
- @lex_state = :expr_beg
960
- return :DO, matched
961
- end
962
-
963
- when 'if'
964
- return :IF, matched if @lex_state == :expr_beg
965
- @lex_state = :expr_beg
966
- return :IF_MOD, matched
967
-
968
- when 'unless'
969
- return :UNLESS, matched if @lex_state == :expr_beg
970
- @lex_state = :expr_beg
971
- return :UNLESS_MOD, matched
972
-
973
- when 'else'
974
- return :ELSE, matched
975
-
976
- when 'elsif'
977
- return :ELSIF, matched
978
-
979
- when 'self'
980
- @lex_state = :expr_end unless @lex_state == :expr_fname
981
- return :SELF, matched
982
-
983
- when 'true'
984
- @lex_state = :expr_end
985
- return :TRUE, matched
986
-
987
- when 'false'
988
- @lex_state = :expr_end
989
- return :FALSE, matched
990
-
991
- when 'nil'
992
- @lex_state = :expr_end
993
- return :NIL, matched
994
-
995
- when '__LINE__'
996
- @lex_state = :expr_end
997
- return :LINE, @line.to_s
998
-
999
- when '__FILE__'
1000
- @lex_state = :expr_end
1001
- return :FILE, matched
1002
-
1003
- when 'begin'
1004
- if [:expr_dot, :expr_fname].include? @lex_state
1005
- @lex_state = :expr_end
1006
- return :IDENTIFIER, matched
1007
- end
1008
- @lex_state = :expr_beg
1009
- return :BEGIN, matched
1010
-
1011
- when 'rescue'
1012
- return :IDENTIFIER, matched if [:expr_dot, :expr_fname].include? @lex_state
1013
- if @lex_state == :expr_beg
1014
- @lex_state = :expr_mid
1015
- return :RESCUE, matched
1016
- end
1017
- @lex_state = :expr_beg
1018
- return :RESCUE_MOD, matched
1019
-
1020
- when 'ensure'
1021
- @lex_state = :expr_beg
1022
- return :ENSURE, matched
1023
-
1024
- when 'case'
1025
- @lex_state = :expr_beg
1026
- return :CASE, matched
1027
-
1028
- when 'when'
1029
- @lex_state = :expr_beg
1030
- return :WHEN, matched
1031
-
1032
- when 'or'
1033
- @lex_state = :expr_beg
1034
- return :OR, matched
1035
-
1036
- when 'and'
1037
- @lex_state = :expr_beg
1038
- return :AND, matched
1039
-
1040
- when 'not'
1041
- @lex_state = :expr_arg
1042
- return :NOT, matched
1043
-
1044
- when 'return'
1045
- @lex_state = :expr_mid
1046
- return :RETURN, matched
1047
-
1048
- when 'next'
1049
- if @lex_state == :expr_dot || @lex_state == :expr_fname
1050
- @lex_state = :expr_end
1051
- return :IDENTIFIER, matched
1052
- end
1053
-
1054
- @lex_state = :expr_mid
1055
- return :NEXT, matched
1056
-
1057
- when 'redo'
1058
- if @lex_state == :expr_dot || @lex_state == :expr_fname
1059
- @lex_state = :expr_end
1060
- return :IDENTIFIER, matched
1061
- end
1062
-
1063
- @lex_state = :expr_mid
1064
- return :REDO, matched
1065
-
1066
- when 'break'
1067
- @lex_state = :expr_mid
1068
- return :BREAK, matched
1069
-
1070
- when 'super'
1071
- @lex_state = :expr_arg
1072
- return :SUPER, matched
1073
-
1074
- when 'then'
1075
- @lex_state = :expr_beg
1076
- return :THEN, matched
1077
-
1078
- when 'while'
1079
- return :WHILE, matched if @lex_state == :expr_beg
1080
- @lex_state = :expr_beg
1081
- return :WHILE_MOD, matched
1082
-
1083
- when 'until'
1084
- return :UNTIL, matched if @lex_state == :expr_beg
1085
- @lex_state = :expr_beg
1086
- return :UNTIL_MOD, matched
1087
-
1088
- when 'yield'
1089
- @lex_state = :expr_arg
1090
- return :YIELD, matched
1091
-
1092
- when 'alias'
1093
- @lex_state = :expr_fname
1094
- return :ALIAS, matched
1095
- end
1096
-
1097
- matched = matched
1098
- if scanner.peek(2) != '::' && scanner.scan(/\:/)
1099
- return :LABEL, matched
1100
- end
1101
-
1102
- if @lex_state == :expr_fname
1103
- if scanner.scan(/\=/)
1104
- @lex_state = :expr_end
1105
- return :IDENTIFIER, matched + scanner.matched
1106
- end
1107
- end
1061
+ return process_identifier scanner.matched, cmd_start
1062
+ end
1108
1063
 
1109
- if [:expr_beg, :expr_dot, :expr_mid, :expr_arg, :expr_cmdarg].include? @lex_state
1110
- # old:
1111
- #@lex_state = :expr_cmdarg
1112
- # new:
1113
- @lex_state = cmd_start ? :expr_cmdarg : :expr_arg
1114
- else
1115
- @lex_state = :expr_end
1064
+ if scanner.eos?
1065
+ if @scanner_stack.size == 1 # our main scanner, we cant pop this
1066
+ return [false, false]
1067
+ else # we were probably parsing a heredoc, so pop that parser and continue
1068
+ @scanner_stack.pop
1069
+ @scanner = @scanner_stack.last
1070
+ return next_token
1116
1071
  end
1117
-
1118
- return [matched =~ /^[A-Z]/ ? :CONSTANT : :IDENTIFIER, matched]
1119
-
1120
1072
  end
1121
- return [false, false] if scanner.eos?
1122
1073
 
1123
1074
  raise "Unexpected content in parsing stream `#{scanner.peek 5}` :#{@file}:#{@line}"
1124
1075
  end