opal 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. data/.rspec +3 -0
  2. data/.travis.yml +0 -4
  3. data/README.md +6 -0
  4. data/Rakefile +30 -6
  5. data/bin/opal +6 -82
  6. data/corelib/{opal/array.rb → array.rb} +40 -56
  7. data/corelib/{opal/basic_object.rb → basic_object.rb} +2 -2
  8. data/corelib/{opal/boolean.rb → boolean.rb} +0 -8
  9. data/corelib/class.rb +47 -0
  10. data/corelib/{opal/comparable.rb → comparable.rb} +0 -0
  11. data/corelib/{opal/enumerable.rb → enumerable.rb} +208 -141
  12. data/corelib/{opal/enumerator.rb → enumerator.rb} +3 -3
  13. data/corelib/{opal/error.rb → error.rb} +1 -0
  14. data/corelib/{opal/hash.rb → hash.rb} +67 -56
  15. data/corelib/io.rb +39 -0
  16. data/corelib/{opal/kernel.rb → kernel.rb} +35 -31
  17. data/corelib/{opal/class.rb → module.rb} +29 -57
  18. data/corelib/native.rb +148 -0
  19. data/corelib/{opal/nil_class.rb → nil_class.rb} +2 -10
  20. data/corelib/{opal/numeric.rb → numeric.rb} +39 -14
  21. data/corelib/opal.rb +42 -25
  22. data/corelib/{opal/proc.rb → proc.rb} +3 -3
  23. data/corelib/{opal/range.rb → range.rb} +5 -1
  24. data/corelib/{opal/regexp.rb → regexp.rb} +0 -0
  25. data/corelib/{opal/runtime.js → runtime.js} +96 -188
  26. data/corelib/{opal/string.rb → string.rb} +20 -15
  27. data/corelib/struct.rb +139 -0
  28. data/corelib/{opal/time.rb → time.rb} +0 -0
  29. data/lib/opal.rb +4 -0
  30. data/lib/opal/cli.rb +79 -32
  31. data/lib/opal/cli_options.rb +91 -0
  32. data/lib/opal/erb.rb +41 -8
  33. data/lib/opal/grammar.rb +24 -10
  34. data/lib/opal/grammar.y +15 -4
  35. data/lib/opal/grammar_helpers.rb +4 -0
  36. data/lib/opal/lexer.rb +214 -143
  37. data/lib/opal/parser.rb +596 -562
  38. data/lib/opal/require_parser.rb +1 -1
  39. data/lib/opal/source_map.rb +15 -30
  40. data/lib/opal/target_scope.rb +24 -5
  41. data/lib/opal/version.rb +1 -1
  42. data/mri_spec/cli_spec.rb +18 -0
  43. data/mri_spec/fixtures/opal_file.rb +2 -0
  44. data/mri_spec/spec_helper.rb +17 -0
  45. data/opal.gemspec +5 -2
  46. data/spec/{rubyspec/filters → filters}/bugs/alias.rb +0 -0
  47. data/spec/{rubyspec/filters → filters}/bugs/ancestors.rb +0 -0
  48. data/spec/{rubyspec/filters → filters}/bugs/array.rb +0 -0
  49. data/spec/filters/bugs/array/combination.rb +11 -0
  50. data/spec/filters/bugs/array/count.rb +3 -0
  51. data/spec/filters/bugs/array/delete_if.rb +3 -0
  52. data/spec/filters/bugs/array/drop.rb +3 -0
  53. data/spec/filters/bugs/array/drop_while.rb +5 -0
  54. data/spec/filters/bugs/array/eql.rb +3 -0
  55. data/spec/filters/bugs/array/flatten.rb +9 -0
  56. data/spec/filters/bugs/array/minus.rb +5 -0
  57. data/spec/filters/bugs/array/multipliy.rb +9 -0
  58. data/spec/filters/bugs/array/new.rb +3 -0
  59. data/spec/filters/bugs/array/pop.rb +6 -0
  60. data/spec/filters/bugs/array/rassoc.rb +4 -0
  61. data/spec/filters/bugs/array/rindex.rb +6 -0
  62. data/spec/filters/bugs/array/select.rb +3 -0
  63. data/spec/filters/bugs/array/shift.rb +7 -0
  64. data/spec/filters/bugs/array/shuffle.rb +11 -0
  65. data/spec/filters/bugs/array/slice.rb +7 -0
  66. data/spec/filters/bugs/array/take.rb +3 -0
  67. data/spec/filters/bugs/array/to_a.rb +3 -0
  68. data/spec/filters/bugs/array/try_convert.rb +7 -0
  69. data/spec/filters/bugs/array/uniq.rb +10 -0
  70. data/spec/filters/bugs/array/zip.rb +4 -0
  71. data/spec/{rubyspec/filters → filters}/bugs/array_delete.rb +1 -0
  72. data/spec/{rubyspec/filters → filters}/bugs/array_fetch.rb +0 -0
  73. data/spec/{rubyspec/filters → filters}/bugs/array_first.rb +0 -0
  74. data/spec/{rubyspec/filters → filters}/bugs/array_flatten.rb +0 -0
  75. data/spec/{rubyspec/filters → filters}/bugs/array_intersection.rb +0 -0
  76. data/spec/{rubyspec/filters → filters}/bugs/array_join.rb +0 -0
  77. data/spec/{rubyspec/filters → filters}/bugs/break.rb +0 -0
  78. data/spec/filters/bugs/case.rb +4 -0
  79. data/spec/{rubyspec/filters → filters}/bugs/coerce_integer.rb +0 -0
  80. data/spec/filters/bugs/enumerable_sort_by.rb +3 -0
  81. data/spec/{rubyspec/filters → filters}/bugs/kernel/instance_variables.rb +0 -0
  82. data/spec/filters/bugs/kernel/rand.rb +4 -0
  83. data/spec/filters/bugs/language/array.rb +3 -0
  84. data/spec/filters/bugs/language/block.rb +6 -0
  85. data/spec/filters/bugs/language/break.rb +3 -0
  86. data/spec/{rubyspec/filters → filters}/bugs/language/class.rb +3 -0
  87. data/spec/{rubyspec/filters → filters}/bugs/language/class_variables.rb +0 -0
  88. data/spec/filters/bugs/language/def.rb +27 -0
  89. data/spec/filters/bugs/language/defined.rb +3 -0
  90. data/spec/filters/bugs/language/ensure.rb +4 -0
  91. data/spec/filters/bugs/language/execution.rb +4 -0
  92. data/spec/filters/bugs/language/for.rb +18 -0
  93. data/spec/filters/bugs/language/if.rb +13 -0
  94. data/spec/filters/bugs/language/loop.rb +4 -0
  95. data/spec/filters/bugs/language/metaclass.rb +14 -0
  96. data/spec/filters/bugs/language/module.rb +6 -0
  97. data/spec/filters/bugs/language/next.rb +3 -0
  98. data/spec/filters/bugs/language/or.rb +3 -0
  99. data/spec/filters/bugs/language/order.rb +4 -0
  100. data/spec/filters/bugs/language/precedence.rb +10 -0
  101. data/spec/filters/bugs/language/proc.rb +24 -0
  102. data/spec/filters/bugs/language/redo.rb +5 -0
  103. data/spec/filters/bugs/language/rescue.rb +9 -0
  104. data/spec/filters/bugs/language/retry.rb +5 -0
  105. data/spec/filters/bugs/language/send.rb +10 -0
  106. data/spec/filters/bugs/language/super.rb +9 -0
  107. data/spec/filters/bugs/language/until.rb +8 -0
  108. data/spec/filters/bugs/language/variables.rb +37 -0
  109. data/spec/filters/bugs/language/while.rb +6 -0
  110. data/spec/filters/bugs/language/yield.rb +5 -0
  111. data/spec/{rubyspec/filters → filters}/bugs/module/class_variables.rb +0 -0
  112. data/spec/filters/bugs/module/method_defined.rb +6 -0
  113. data/spec/filters/bugs/parser.rb +10 -0
  114. data/spec/{rubyspec/filters → filters}/bugs/public_methods.rb +1 -0
  115. data/spec/filters/bugs/return.rb +7 -0
  116. data/spec/filters/bugs/singleton/instance.rb +4 -0
  117. data/spec/filters/bugs/source_map.rb +3 -0
  118. data/spec/filters/bugs/string/center.rb +4 -0
  119. data/spec/filters/bugs/string/lines.rb +3 -0
  120. data/spec/{rubyspec/filters → filters}/mspec/mocks.rb +0 -0
  121. data/spec/{rubyspec/filters → filters}/mspec/ruby_exe.rb +0 -0
  122. data/spec/{rubyspec/filters → filters}/mspec/should_receive.rb +0 -0
  123. data/spec/{rubyspec/filters → filters}/parser/block_args.rb +0 -0
  124. data/spec/{rubyspec/filters → filters}/unsupported/array_subclasses.rb +1 -0
  125. data/spec/filters/unsupported/frozen.rb +32 -0
  126. data/spec/filters/unsupported/immutable_strings.rb +3 -0
  127. data/spec/filters/unsupported/tainted.rb +17 -0
  128. data/spec/filters/unsupported/trusted.rb +15 -0
  129. data/spec/opal/class/constants_spec.rb +7 -0
  130. data/spec/opal/erb/erb_spec.rb +7 -1
  131. data/spec/opal/erb/inline_block.opalerb +3 -0
  132. data/spec/opal/hash/allocate_spec.rb +16 -0
  133. data/spec/opal/hash/new_spec.rb +10 -0
  134. data/spec/opal/hash/to_s_spec.rb +9 -0
  135. data/spec/opal/kernel/instance_variable_defined_spec.rb +15 -0
  136. data/spec/opal/kernel/rand_spec.rb +5 -5
  137. data/spec/opal/kernel/respond_to_spec.rb +14 -1
  138. data/spec/opal/language/block_spec.rb +13 -0
  139. data/spec/opal/language/rescue_spec.rb +27 -0
  140. data/spec/opal/language/return_spec.rb +38 -0
  141. data/spec/opal/language/singleton_class_spec.rb +13 -0
  142. data/spec/opal/language/super_spec.rb +99 -0
  143. data/spec/opal/language/variables_spec.rb +20 -0
  144. data/spec/opal/module/attr_accessor_spec.rb +8 -0
  145. data/spec/opal/module/constants_spec.rb +2 -2
  146. data/spec/opal/native/alias_native_spec.rb +18 -0
  147. data/spec/opal/native/each_spec.rb +14 -0
  148. data/spec/opal/native/element_reference_spec.rb +14 -0
  149. data/spec/opal/native/method_missing_spec.rb +39 -0
  150. data/spec/opal/native/new_spec.rb +19 -0
  151. data/spec/opal/native/nil_spec.rb +14 -0
  152. data/spec/opal/runtime2/class_hierarchy_spec.rb +2 -2
  153. data/spec/opal/source_map_spec.rb +3 -7
  154. data/spec/ospec/main.rb.erb +2 -5
  155. data/spec/parser/alias_spec.rb +4 -4
  156. data/spec/parser/and_spec.rb +2 -2
  157. data/spec/parser/array_spec.rb +6 -6
  158. data/spec/parser/attrasgn_spec.rb +8 -8
  159. data/spec/parser/begin_spec.rb +11 -11
  160. data/spec/parser/block_spec.rb +3 -3
  161. data/spec/parser/break_spec.rb +4 -4
  162. data/spec/parser/call_spec.rb +50 -48
  163. data/spec/parser/class_spec.rb +2 -2
  164. data/spec/parser/const_spec.rb +1 -1
  165. data/spec/parser/cvar_spec.rb +1 -1
  166. data/spec/parser/def_spec.rb +5 -5
  167. data/spec/parser/gvar_spec.rb +2 -2
  168. data/spec/parser/hash_spec.rb +4 -4
  169. data/spec/parser/iasgn_spec.rb +3 -3
  170. data/spec/parser/if_spec.rb +6 -6
  171. data/spec/parser/iter_spec.rb +6 -6
  172. data/spec/parser/lambda_spec.rb +5 -5
  173. data/spec/parser/lasgn_spec.rb +2 -2
  174. data/spec/parser/line_spec.rb +2 -2
  175. data/spec/parser/lvar_spec.rb +5 -5
  176. data/spec/parser/masgn_spec.rb +1 -1
  177. data/spec/parser/module_spec.rb +2 -2
  178. data/spec/parser/not_spec.rb +4 -4
  179. data/spec/parser/op_asgn1_spec.rb +2 -2
  180. data/spec/parser/op_asgn2_spec.rb +2 -2
  181. data/spec/parser/or_spec.rb +2 -2
  182. data/spec/parser/parse_spec.rb +66 -0
  183. data/spec/parser/parser_spec.rb +32 -38
  184. data/spec/parser/regexp_spec.rb +4 -4
  185. data/spec/parser/return_spec.rb +4 -4
  186. data/spec/parser/sclass_spec.rb +4 -4
  187. data/spec/parser/str_spec.rb +3 -3
  188. data/spec/parser/super_spec.rb +6 -6
  189. data/spec/parser/undef_spec.rb +3 -3
  190. data/spec/parser/unless_spec.rb +4 -4
  191. data/spec/parser/while_spec.rb +3 -3
  192. data/spec/parser/xstr_spec.rb +3 -3
  193. data/spec/parser/yield_spec.rb +6 -6
  194. data/spec/rubyspec/core/array/drop_spec.rb +1 -1
  195. data/spec/rubyspec/core/array/keep_if_spec.rb +1 -3
  196. data/spec/rubyspec/core/array/length_spec.rb +1 -3
  197. data/spec/rubyspec/core/array/map_spec.rb +2 -6
  198. data/spec/rubyspec/core/array/minus_spec.rb +3 -3
  199. data/spec/rubyspec/core/array/multiply_spec.rb +14 -16
  200. data/spec/rubyspec/core/array/new_spec.rb +3 -5
  201. data/spec/rubyspec/core/array/plus_spec.rb +2 -2
  202. data/spec/rubyspec/core/array/pop_spec.rb +4 -4
  203. data/spec/rubyspec/core/array/rassoc_spec.rb +2 -2
  204. data/spec/rubyspec/core/array/reject_spec.rb +2 -6
  205. data/spec/rubyspec/core/array/replace_spec.rb +1 -3
  206. data/spec/rubyspec/core/array/reverse_each_spec.rb +1 -3
  207. data/spec/rubyspec/core/array/reverse_spec.rb +4 -4
  208. data/spec/rubyspec/core/array/rindex_spec.rb +1 -1
  209. data/spec/rubyspec/core/array/select_spec.rb +3 -7
  210. data/spec/rubyspec/core/array/shared/collect.rb +7 -0
  211. data/spec/rubyspec/core/array/shared/index.rb +1 -1
  212. data/spec/rubyspec/core/array/shared/keep_if.rb +3 -0
  213. data/spec/rubyspec/core/array/shared/length.rb +3 -0
  214. data/spec/rubyspec/core/array/shared/replace.rb +3 -0
  215. data/spec/rubyspec/core/array/shared/slice.rb +3 -0
  216. data/spec/rubyspec/core/array/shuffle_spec.rb +1 -1
  217. data/spec/rubyspec/core/array/size_spec.rb +1 -3
  218. data/spec/rubyspec/core/array/slice_spec.rb +4 -6
  219. data/spec/rubyspec/core/array/sort_spec.rb +2 -2
  220. data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
  221. data/spec/rubyspec/core/array/try_convert_spec.rb +7 -7
  222. data/spec/rubyspec/core/array/uniq_spec.rb +7 -7
  223. data/spec/rubyspec/core/array/zip_spec.rb +1 -1
  224. data/spec/rubyspec/core/enumerable/collect_spec.rb +24 -0
  225. data/spec/rubyspec/core/enumerable/count_spec.rb +35 -19
  226. data/spec/rubyspec/core/enumerable/find_spec.rb +5 -0
  227. data/spec/rubyspec/core/hash/each_pair_spec.rb +7 -7
  228. data/spec/rubyspec/core/hash/each_spec.rb +13 -7
  229. data/spec/rubyspec/core/module/method_defined_spec.rb +4 -4
  230. data/spec/rubyspec/core/module/public_method_defined_spec.rb +19 -0
  231. data/spec/rubyspec/core/module/remove_const_spec.rb +23 -0
  232. data/spec/rubyspec/core/numeric/step_spec.rb +14 -0
  233. data/spec/rubyspec/core/string/center_spec.rb +43 -65
  234. data/spec/rubyspec/core/string/lines_spec.rb +1 -1
  235. data/spec/rubyspec/core/string/ljust_spec.rb +25 -9
  236. data/spec/rubyspec/core/string/rjust_spec.rb +26 -10
  237. data/spec/rubyspec/core/struct/fixtures/classes.rb +26 -0
  238. data/spec/rubyspec/core/struct/initialize_spec.rb +11 -0
  239. data/spec/rubyspec/core/struct/new_spec.rb +24 -0
  240. data/spec/rubyspec/fixtures/constants.rb +7 -0
  241. data/spec/rubyspec/language/break_spec.rb +1 -1
  242. data/spec/rubyspec/language/case_spec.rb +30 -30
  243. data/spec/rubyspec/language/def_spec.rb +34 -34
  244. data/spec/rubyspec/language/defined_spec.rb +2 -2
  245. data/spec/rubyspec/language/ensure_spec.rb +2 -2
  246. data/spec/rubyspec/language/execution_spec.rb +2 -2
  247. data/spec/rubyspec/language/for_spec.rb +17 -17
  248. data/spec/rubyspec/language/hash_spec.rb +3 -3
  249. data/spec/rubyspec/language/if_spec.rb +11 -11
  250. data/spec/rubyspec/language/loop_spec.rb +3 -3
  251. data/spec/rubyspec/language/metaclass_spec.rb +14 -14
  252. data/spec/rubyspec/language/module_spec.rb +6 -6
  253. data/spec/rubyspec/language/next_spec.rb +5 -5
  254. data/spec/rubyspec/language/not_spec.rb +1 -1
  255. data/spec/rubyspec/language/or_spec.rb +1 -1
  256. data/spec/rubyspec/language/order_spec.rb +3 -5
  257. data/spec/rubyspec/language/precedence_spec.rb +19 -19
  258. data/spec/rubyspec/language/proc_spec.rb +29 -29
  259. data/spec/rubyspec/language/redo_spec.rb +3 -5
  260. data/spec/rubyspec/language/rescue_spec.rb +7 -7
  261. data/spec/rubyspec/language/retry_spec.rb +2 -2
  262. data/spec/rubyspec/language/return_spec.rb +12 -12
  263. data/spec/rubyspec/language/send_spec.rb +9 -9
  264. data/spec/rubyspec/language/singleton_class_spec.rb +3 -4
  265. data/spec/rubyspec/language/super_spec.rb +7 -11
  266. data/spec/rubyspec/language/until_spec.rb +10 -10
  267. data/spec/rubyspec/language/variables_spec.rb +59 -67
  268. data/spec/rubyspec/language/versions/array_1.9.rb +1 -1
  269. data/spec/rubyspec/language/versions/block_1.9.rb +0 -0
  270. data/spec/rubyspec/language/versions/break_1.9.rb +0 -0
  271. data/spec/rubyspec/language/versions/literal_lambda_1.9.rb +12 -12
  272. data/spec/rubyspec/language/versions/send_1.9.rb +23 -23
  273. data/spec/rubyspec/language/versions/symbol_1.9.rb +2 -2
  274. data/spec/rubyspec/language/versions/variables_1.9.rb +1 -1
  275. data/spec/rubyspec/language/while_spec.rb +4 -4
  276. data/spec/rubyspec/language/yield_spec.rb +3 -3
  277. data/spec/rubyspec/library/erb/util/html_escape_spec.rb +10 -0
  278. data/spec/rubyspec/library/singleton/clone_spec.rb +8 -0
  279. data/spec/rubyspec/library/singleton/dup_spec.rb +8 -0
  280. data/spec/rubyspec/library/singleton/fixtures/classes.rb +18 -0
  281. data/spec/rubyspec/library/singleton/instance_spec.rb +30 -0
  282. data/spec/spec_helper.rb +214 -0
  283. data/stdlib/buffer.rb +40 -0
  284. data/stdlib/buffer/array.rb +66 -0
  285. data/stdlib/buffer/view.rb +70 -0
  286. data/stdlib/erb.rb +11 -20
  287. data/stdlib/forwardable.rb +71 -0
  288. data/stdlib/json.rb +78 -0
  289. data/stdlib/ostruct.rb +69 -0
  290. data/stdlib/rbconfig.rb +1 -0
  291. data/stdlib/singleton.rb +40 -0
  292. data/stdlib/stringio.rb +173 -0
  293. data/stdlib/template.rb +44 -0
  294. metadata +285 -79
  295. data/corelib/opal/native.rb +0 -31
  296. data/spec/opal/class/bridge_class_spec.rb +0 -39
  297. data/spec/opal/native_spec.rb +0 -209
  298. data/spec/ospec/runner.rb +0 -223
  299. data/spec/rubyspec/filters/bugs/block_args.rb +0 -3
  300. data/spec/rubyspec/filters/bugs/case.rb +0 -8
  301. data/spec/rubyspec/filters/bugs/language/module.rb +0 -3
  302. data/spec/rubyspec/filters/unsupported/frozen.rb +0 -4
  303. data/spec/rubyspec/filters/unsupported/tainted.rb +0 -7
@@ -6,11 +6,11 @@ describe "The class keyword" do
6
6
  end
7
7
 
8
8
  it "does not place single expressions into a s(:block)" do
9
- opal_parse('class A; 1; end').should == [:class, :A, nil, [:scope, [:lit, 1]]]
9
+ opal_parse('class A; 1; end').should == [:class, :A, nil, [:scope, [:int, 1]]]
10
10
  end
11
11
 
12
12
  it "adds multiple body expressions into a s(:block)" do
13
- opal_parse('class A; 1; 2; end').should == [:class, :A, nil, [:scope, [:block, [:lit, 1], [:lit, 2]]]]
13
+ opal_parse('class A; 1; 2; end').should == [:class, :A, nil, [:scope, [:block, [:int, 1], [:int, 2]]]]
14
14
  end
15
15
 
16
16
  it "uses nil as a placeholder when no superclass is given" do
@@ -7,7 +7,7 @@ describe "Constants" do
7
7
  end
8
8
 
9
9
  it "should be returned as s(:cdecl) on assignment" do
10
- opal_parse("FOO = 1").should == [:cdecl, :FOO, [:lit, 1]]
10
+ opal_parse("FOO = 1").should == [:cdecl, :FOO, [:int, 1]]
11
11
  opal_parse("FOO = BAR").should == [:cdecl, :FOO, [:const, :BAR]]
12
12
  end
13
13
  end
@@ -6,6 +6,6 @@ describe "Class variables" do
6
6
  end
7
7
 
8
8
  it "should always be converted to s(:cvdecl) on assignment" do
9
- opal_parse("@@foo = 100").should == [:cvdecl, :@@foo, [:lit, 100]]
9
+ opal_parse("@@foo = 100").should == [:cvdecl, :@@foo, [:int, 100]]
10
10
  end
11
11
  end
@@ -31,14 +31,14 @@ describe "The def keyword" do
31
31
 
32
32
  describe "with opt args" do
33
33
  it "should list all opt args as well as block with each lasgn" do
34
- opal_parse("def foo(a = 1); end")[2].should == [:args, :a, [:block, [:lasgn, :a, [:lit, 1]]]]
35
- opal_parse("def foo(a = 1, b = 2); end")[2].should == [:args, :a, :b, [:block, [:lasgn, :a, [:lit, 1]], [:lasgn, :b, [:lit, 2]]]]
34
+ opal_parse("def foo(a = 1); end")[2].should == [:args, :a, [:block, [:lasgn, :a, [:int, 1]]]]
35
+ opal_parse("def foo(a = 1, b = 2); end")[2].should == [:args, :a, :b, [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]
36
36
  end
37
37
 
38
38
  it "should list lasgn block after all other args" do
39
- opal_parse("def foo(a, b = 1); end")[2].should == [:args, :a, :b, [:block, [:lasgn, :b, [:lit, 1]]]]
40
- opal_parse("def foo(b = 1, *c); end")[2].should == [:args, :b, :"*c", [:block, [:lasgn, :b, [:lit, 1]]]]
41
- opal_parse("def foo(b = 1, &block); end")[2].should == [:args, :b, :"&block", [:block, [:lasgn, :b, [:lit, 1]]]]
39
+ opal_parse("def foo(a, b = 1); end")[2].should == [:args, :a, :b, [:block, [:lasgn, :b, [:int, 1]]]]
40
+ opal_parse("def foo(b = 1, *c); end")[2].should == [:args, :b, :"*c", [:block, [:lasgn, :b, [:int, 1]]]]
41
+ opal_parse("def foo(b = 1, &block); end")[2].should == [:args, :b, :"&block", [:block, [:lasgn, :b, [:int, 1]]]]
42
42
  end
43
43
  end
44
44
 
@@ -7,7 +7,7 @@ describe "Global variables" do
7
7
  end
8
8
 
9
9
  it "should return s(:gasgn) on assignment" do
10
- opal_parse("$foo = 1").should == [:gasgn, :$foo, [:lit, 1]]
11
- opal_parse("$: = 1").should == [:gasgn, :$:, [:lit, 1]]
10
+ opal_parse("$foo = 1").should == [:gasgn, :$foo, [:int, 1]]
11
+ opal_parse("$: = 1").should == [:gasgn, :$:, [:int, 1]]
12
12
  end
13
13
  end
@@ -6,12 +6,12 @@ describe "Hash literals" do
6
6
  end
7
7
 
8
8
  it "adds each assoc pair as individual args onto sexp" do
9
- opal_parse("{1 => 2}").should == [:hash, [:lit, 1], [:lit, 2]]
10
- opal_parse("{1 => 2, 3 => 4}").should == [:hash, [:lit, 1], [:lit, 2], [:lit, 3], [:lit, 4]]
9
+ opal_parse("{1 => 2}").should == [:hash, [:int, 1], [:int, 2]]
10
+ opal_parse("{1 => 2, 3 => 4}").should == [:hash, [:int, 1], [:int, 2], [:int, 3], [:int, 4]]
11
11
  end
12
12
 
13
13
  it "supports 1.9 style hash keys" do
14
- opal_parse("{ a: 1 }").should == [:hash, [:lit, :a], [:lit, 1]]
15
- opal_parse("{ a: 1, b: 2 }").should == [:hash, [:lit, :a], [:lit, 1], [:lit, :b], [:lit, 2]]
14
+ opal_parse("{ a: 1 }").should == [:hash, [:sym, :a], [:int, 1]]
15
+ opal_parse("{ a: 1, b: 2 }").should == [:hash, [:sym, :a], [:int, 1], [:sym, :b], [:int, 2]]
16
16
  end
17
17
  end
@@ -2,8 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe "Instance variable assignment" do
4
4
  it "always returns an s(:iasgn)" do
5
- opal_parse("@a = 1").should == [:iasgn, :@a, [:lit, 1]]
6
- opal_parse("@A = 1").should == [:iasgn, :@A, [:lit, 1]]
7
- opal_parse("@class = 1").should == [:iasgn, :@class, [:lit, 1]]
5
+ opal_parse("@a = 1").should == [:iasgn, :@a, [:int, 1]]
6
+ opal_parse("@A = 1").should == [:iasgn, :@A, [:int, 1]]
7
+ opal_parse("@class = 1").should == [:iasgn, :@class, [:int, 1]]
8
8
  end
9
9
  end
@@ -2,25 +2,25 @@ require 'spec_helper'
2
2
 
3
3
  describe "The if keyword" do
4
4
  it "should return an s(:if) with given truthy and falsy bodies" do
5
- opal_parse("if 1; 2; else; 3; end").should == [:if, [:lit, 1], [:lit, 2], [:lit, 3]]
5
+ opal_parse("if 1; 2; else; 3; end").should == [:if, [:int, 1], [:int, 2], [:int, 3]]
6
6
  end
7
7
 
8
8
  it "uses nil as fasly body if not given else-then" do
9
- opal_parse("if 1; 2; end").should == [:if, [:lit, 1], [:lit, 2], nil]
9
+ opal_parse("if 1; 2; end").should == [:if, [:int, 1], [:int, 2], nil]
10
10
  end
11
11
 
12
12
  it "is treats elsif parts as sub if expressions for else body" do
13
- opal_parse("if 1; 2; elsif 3; 4; else; 5; end").should == [:if, [:lit, 1], [:lit, 2], [:if, [:lit, 3], [:lit, 4], [:lit, 5]]]
14
- opal_parse("if 1; 2; elsif 3; 4; end").should == [:if, [:lit, 1], [:lit, 2], [:if, [:lit, 3], [:lit, 4], nil]]
13
+ opal_parse("if 1; 2; elsif 3; 4; else; 5; end").should == [:if, [:int, 1], [:int, 2], [:if, [:int, 3], [:int, 4], [:int, 5]]]
14
+ opal_parse("if 1; 2; elsif 3; 4; end").should == [:if, [:int, 1], [:int, 2], [:if, [:int, 3], [:int, 4], nil]]
15
15
  end
16
16
 
17
17
  it "returns a simple s(:if) with nil else body for prefix if statement" do
18
- opal_parse("1 if 2").should == [:if, [:lit, 2], [:lit, 1], nil]
18
+ opal_parse("1 if 2").should == [:if, [:int, 2], [:int, 1], nil]
19
19
  end
20
20
  end
21
21
 
22
22
  describe "The ternary operator" do
23
23
  it "gets converted into an if statement with true and false parts" do
24
- opal_parse("1 ? 2 : 3").should == [:if, [:lit, 1], [:lit, 2], [:lit, 3]]
24
+ opal_parse("1 ? 2 : 3").should == [:if, [:int, 1], [:int, 2], [:int, 3]]
25
25
  end
26
26
  end
@@ -4,7 +4,7 @@ describe "Iters" do
4
4
  describe "Iter on a command" do
5
5
  it "the outer command call gets the iter" do
6
6
  opal_parse("a b do; end").should == [:iter, [:call, nil, :a, [:arglist, [:call, nil, :b, [:arglist]]]], nil]
7
- opal_parse("a 1, b do; end").should == [:iter, [:call, nil, :a, [:arglist, [:lit, 1], [:call, nil, :b, [:arglist]]]], nil]
7
+ opal_parse("a 1, b do; end").should == [:iter, [:call, nil, :a, [:arglist, [:int, 1], [:call, nil, :b, [:arglist]]]], nil]
8
8
  end
9
9
  end
10
10
 
@@ -40,14 +40,14 @@ describe "Iters" do
40
40
 
41
41
  describe "with opt args" do
42
42
  it "adds a s(:block) arg to end of s(:masgn) for each lasgn" do
43
- opal_parse("proc do |a = 1|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:lit, 1]]]]]
44
- opal_parse("proc do |a = 1, b = 2|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:lit, 1]], [:lasgn, :b, [:lit, 2]]]]]
43
+ opal_parse("proc do |a = 1|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:int, 1]]]]]
44
+ opal_parse("proc do |a = 1, b = 2|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]]
45
45
  end
46
46
 
47
47
  it "should add lasgn block after all other args" do
48
- opal_parse("proc do |a, b = 1|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :b, [:lit, 1]]]]]
49
- opal_parse("proc do |b = 1, *c|; end")[2].should == [:masgn, [:array, [:lasgn, :b], [:splat, [:lasgn, :c]], [:block, [:lasgn, :b, [:lit, 1]]]]]
50
- opal_parse("proc do |b = 1, &c|; end")[2].should == [:masgn, [:array, [:lasgn, :b], [:block_pass, [:lasgn, :c]], [:block, [:lasgn, :b, [:lit, 1]]]]]
48
+ opal_parse("proc do |a, b = 1|; end")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :b, [:int, 1]]]]]
49
+ opal_parse("proc do |b = 1, *c|; end")[2].should == [:masgn, [:array, [:lasgn, :b], [:splat, [:lasgn, :c]], [:block, [:lasgn, :b, [:int, 1]]]]]
50
+ opal_parse("proc do |b = 1, &c|; end")[2].should == [:masgn, [:array, [:lasgn, :b], [:block_pass, [:lasgn, :c]], [:block, [:lasgn, :b, [:int, 1]]]]]
51
51
  end
52
52
  end
53
53
 
@@ -39,8 +39,8 @@ describe "Lambda literals" do
39
39
  end
40
40
 
41
41
  it "parses opt args" do
42
- opal_parse("-> a = 1 {}")[2].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:lit, 1]]]]]
43
- opal_parse("-> a = 1, b = 2 {}")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:lit, 1]], [:lasgn, :b, [:lit, 2]]]]]
42
+ opal_parse("-> a = 1 {}")[2].should == [:masgn, [:array, [:lasgn, :a], [:block, [:lasgn, :a, [:int, 1]]]]]
43
+ opal_parse("-> a = 1, b = 2 {}")[2].should == [:masgn, [:array, [:lasgn, :a], [:lasgn, :b], [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]]]
44
44
  end
45
45
 
46
46
  it "parses block args" do
@@ -54,11 +54,11 @@ describe "Lambda literals" do
54
54
  end
55
55
 
56
56
  it "should be the single sexp when given one statement" do
57
- opal_parse("-> { 42 }")[3].should == [:lit, 42]
57
+ opal_parse("-> { 42 }")[3].should == [:int, 42]
58
58
  end
59
59
 
60
60
  it "should wrap multiple statements into a s(:block)" do
61
- opal_parse("-> { 42; 3.142 }")[3].should == [:block, [:lit, 42], [:lit, 3.142]]
61
+ opal_parse("-> { 42; 3.142 }")[3].should == [:block, [:int, 42], [:float, 3.142]]
62
62
  end
63
63
  end
64
- end
64
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "Local assignment" do
4
4
  it "returns an s(:lasgn)" do
5
- opal_parse("a = 1").should == [:lasgn, :a, [:lit, 1]]
6
- opal_parse("a = 1; b = 2").should == [:block, [:lasgn, :a, [:lit, 1]], [:lasgn, :b, [:lit, 2]]]
5
+ opal_parse("a = 1").should == [:lasgn, :a, [:int, 1]]
6
+ opal_parse("a = 1; b = 2").should == [:block, [:lasgn, :a, [:int, 1]], [:lasgn, :b, [:int, 2]]]
7
7
  end
8
8
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe "The __LINE__ keyword" do
4
4
  it "should always return a literal number of the current line" do
5
- opal_parse("__LINE__").should == [:lit, 1]
6
- opal_parse("\n__LINE__").should == [:lit, 2]
5
+ opal_parse("__LINE__").should == [:int, 1]
6
+ opal_parse("\n__LINE__").should == [:int, 2]
7
7
  end
8
8
  end
@@ -3,13 +3,13 @@ require 'spec_helper'
3
3
  describe "An lvar" do
4
4
  describe "in any scope" do
5
5
  it "should be created when an identifier is previously assigned to" do
6
- opal_parse("a = 1; a").should == [:block, [:lasgn, :a, [:lit, 1]], [:lvar, :a]]
7
- opal_parse("a = 1; a; a").should == [:block, [:lasgn, :a, [:lit, 1]], [:lvar, :a], [:lvar, :a]]
6
+ opal_parse("a = 1; a").should == [:block, [:lasgn, :a, [:int, 1]], [:lvar, :a]]
7
+ opal_parse("a = 1; a; a").should == [:block, [:lasgn, :a, [:int, 1]], [:lvar, :a], [:lvar, :a]]
8
8
  end
9
9
 
10
10
  it "should not be created when no lasgn is previously used on name" do
11
11
  opal_parse("a").should == [:call, nil, :a, [:arglist]]
12
- opal_parse("a = 1; b").should == [:block, [:lasgn, :a, [:lit, 1]], [:call, nil, :b, [:arglist]]]
12
+ opal_parse("a = 1; b").should == [:block, [:lasgn, :a, [:int, 1]], [:call, nil, :b, [:arglist]]]
13
13
  end
14
14
  end
15
15
 
@@ -20,7 +20,7 @@ describe "An lvar" do
20
20
  end
21
21
 
22
22
  it "should be created by an opt arg" do
23
- opal_parse("def a(b=10); b; end").should == [:defn, :a, [:args, :b, [:block, [:lasgn, :b, [:lit, 10]]]], [:scope, [:block, [:lvar, :b]]]]
23
+ opal_parse("def a(b=10); b; end").should == [:defn, :a, [:args, :b, [:block, [:lasgn, :b, [:int, 10]]]], [:scope, [:block, [:lvar, :b]]]]
24
24
  end
25
25
 
26
26
  it "should be created by a rest arg" do
@@ -32,7 +32,7 @@ describe "An lvar" do
32
32
  end
33
33
 
34
34
  it "should not be created from locals outside the def" do
35
- opal_parse("a = 10; def b; a; end").should == [:block, [:lasgn, :a, [:lit, 10]], [:defn, :b, [:args], [:scope, [:block, [:call, nil, :a, [:arglist]]]]]]
35
+ opal_parse("a = 10; def b; a; end").should == [:block, [:lasgn, :a, [:int, 10]], [:defn, :b, [:args], [:scope, [:block, [:call, nil, :a, [:arglist]]]]]]
36
36
  end
37
37
  end
38
38
  end
@@ -31,7 +31,7 @@ describe "Masgn" do
31
31
 
32
32
  describe "with a single rhs argument" do
33
33
  it "should wrap rhs in an s(:to_ary)" do
34
- opal_parse('a, b = 1')[2].should == [:to_ary, [:lit, 1]]
34
+ opal_parse('a, b = 1')[2].should == [:to_ary, [:int, 1]]
35
35
  end
36
36
  end
37
37
  end
@@ -6,11 +6,11 @@ describe "The module keyword" do
6
6
  end
7
7
 
8
8
  it "does not place single expressions into a s(:block)" do
9
- opal_parse('module A; 1; end').should == [:module, :A, [:scope, [:lit, 1]]]
9
+ opal_parse('module A; 1; end').should == [:module, :A, [:scope, [:int, 1]]]
10
10
  end
11
11
 
12
12
  it "adds multiple body expressions into a s(:block)" do
13
- opal_parse('module A; 1; 2; end').should == [:module, :A, [:scope, [:block, [:lit, 1], [:lit, 2]]]]
13
+ opal_parse('module A; 1; 2; end').should == [:module, :A, [:scope, [:block, [:int, 1], [:int, 2]]]]
14
14
  end
15
15
 
16
16
  it "should accept just a constant for the module name" do
@@ -3,25 +3,25 @@ require 'spec_helper'
3
3
  describe "The not keyword" do
4
4
  it "returns s(:not) with the single argument" do
5
5
  opal_parse("not self").should == [:not, [:self]]
6
- opal_parse("not 42").should == [:not, [:lit, 42]]
6
+ opal_parse("not 42").should == [:not, [:int, 42]]
7
7
  end
8
8
  end
9
9
 
10
10
  describe "The '!' expression" do
11
11
  it "returns s(:not) with the single argument" do
12
12
  opal_parse("!self").should == [:not, [:self]]
13
- opal_parse("!42").should == [:not, [:lit, 42]]
13
+ opal_parse("!42").should == [:not, [:int, 42]]
14
14
  end
15
15
  end
16
16
 
17
17
  describe "The '!=' expression" do
18
18
  it "rewrites as !(lhs == rhs)" do
19
- opal_parse("1 != 2").should == [:not, [:call, [:lit, 1], :==, [:arglist, [:lit, 2]]]]
19
+ opal_parse("1 != 2").should == [:not, [:call, [:int, 1], :==, [:arglist, [:int, 2]]]]
20
20
  end
21
21
  end
22
22
 
23
23
  describe "The '!~' expression" do
24
24
  it "rewrites as !(lhs =~ rhs)" do
25
- opal_parse("1 !~ 2").should == [:not, [:call, [:lit, 1], :=~, [:arglist, [:lit, 2]]]]
25
+ opal_parse("1 !~ 2").should == [:not, [:call, [:int, 1], :=~, [:arglist, [:int, 2]]]]
26
26
  end
27
27
  end
@@ -10,7 +10,7 @@ describe "op_asgn1" do
10
10
  end
11
11
 
12
12
  it "returns an arglist for args inside braces" do
13
- opal_parse("self[:foo] += 1")[2].should == [:arglist, [:lit, :foo]]
13
+ opal_parse("self[:foo] += 1")[2].should == [:arglist, [:sym, :foo]]
14
14
  end
15
15
 
16
16
  it "only uses the operator, not with '=' appended" do
@@ -18,6 +18,6 @@ describe "op_asgn1" do
18
18
  end
19
19
 
20
20
  it "uses a simple sexp, not an arglist" do
21
- opal_parse("self[:foo] += 1")[4].should == [:lit, 1]
21
+ opal_parse("self[:foo] += 1")[4].should == [:int, 1]
22
22
  end
23
23
  end
@@ -18,6 +18,6 @@ describe "op_asgn2" do
18
18
  end
19
19
 
20
20
  it "uses a simple sexp, not an arglist" do
21
- opal_parse("self.foo += 1")[4].should == [:lit, 1]
21
+ opal_parse("self.foo += 1")[4].should == [:int, 1]
22
22
  end
23
- end
23
+ end
@@ -2,12 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe "The or statement" do
4
4
  it "should always return s(:or)" do
5
- opal_parse("1 or 2").should == [:or, [:lit, 1], [:lit, 2]]
5
+ opal_parse("1 or 2").should == [:or, [:int, 1], [:int, 2]]
6
6
  end
7
7
  end
8
8
 
9
9
  describe "The || expression" do
10
10
  it "should always return s(:or)" do
11
- opal_parse("1 || 2").should == [:or, [:lit, 1], [:lit, 2]]
11
+ opal_parse("1 || 2").should == [:or, [:int, 1], [:int, 2]]
12
12
  end
13
13
  end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Opal::Parser do
4
+ it "parses operators before \n in command calls" do
5
+ [:<<, :>>, :|, :^, :&, :<=>, :==, :===, :=~, :>, :>=, :<, :<=, :<<, :>>, :%, :**].each do |mid|
6
+ opal_parse("self #{mid}\nself").should == [:call, [:self], mid, [:arglist, [:self]]]
7
+ end
8
+ end
9
+
10
+ it "should parse simple ruby values" do
11
+ opal_eval('3.142').should == 3.142
12
+ opal_eval('123e1').should == 1230.0
13
+ opal_eval('123E+10').should == 1230000000000.0
14
+ opal_eval('123e-9').should == 0.000000123
15
+ opal_eval('false').should == false
16
+ opal_eval('true').should == true
17
+ opal_eval('nil').should == nil
18
+ end
19
+
20
+ it "should parse ruby strings" do
21
+ opal_eval('"hello world"').should == "hello world"
22
+ opal_eval('"hello #{100}"').should == "hello 100"
23
+ end
24
+
25
+ it "should parse method calls" do
26
+ opal_eval("[1, 2, 3, 4].inspect").should == "[1, 2, 3, 4]"
27
+ opal_eval("[1, 2, 3, 4].map { |a| a + 42 }").should == [43, 44, 45, 46]
28
+ end
29
+
30
+ it "should parse constant lookups" do
31
+ opal_eval("Object").should == Object
32
+ opal_eval("Array").should == Array
33
+ opal_eval("Opal::Parser").should == Opal::Parser
34
+ end
35
+
36
+ it "should parse class and module definitions" do
37
+ opal_eval("class ParserModuleDefinition; end")
38
+ opal_eval <<-STR
39
+ class ParserClassDefinition
40
+ CONSTANT = 500
41
+
42
+ def foo
43
+ 500
44
+ end
45
+
46
+ def self.bar
47
+ 42
48
+ end
49
+ end
50
+ STR
51
+
52
+ ParserClassDefinition.bar.should == 42
53
+ ParserClassDefinition.new.foo.should == 500
54
+ end
55
+
56
+ describe "multiline comments" do
57
+ it "parses multiline comments and ignores them" do
58
+ opal_parse("=begin\nfoo\n=end\n100").should == [:int, 100]
59
+ end
60
+
61
+ it "raises an exception if not closed before end of file" do
62
+ lambda { opal_parse("=begin\nfoo\nbar") }.should raise_error(Exception, /embedded document meets end of file/)
63
+ end
64
+
65
+ end
66
+ end
@@ -1,47 +1,41 @@
1
- describe "Opal::Parser" do
2
- it "should parse simple ruby values" do
3
- opal_eval('3.142').should == 3.142
4
- opal_eval('123e1').should == 1230.0
5
- opal_eval('123E+10').should == 1230000000000.0
6
- opal_eval('123e-9').should == 0.000000123
7
- opal_eval('false').should == false
8
- opal_eval('true').should == true
9
- opal_eval('nil').should == nil
10
- end
1
+ require 'spec_helper'
11
2
 
12
- it "should parse ruby strings" do
13
- opal_eval('"hello world"').should == "hello world"
14
- opal_eval('"hello #{100}"').should == "hello 100"
15
- end
3
+ describe Opal::Parser do
4
+ before { @parser = Opal::Parser.new }
16
5
 
17
- it "should parse method calls" do
18
- opal_eval("[1, 2, 3, 4].inspect").should == "[1, 2, 3, 4]"
19
- opal_eval("[1, 2, 3, 4].map { |a| a + 42 }").should == [43, 44, 45, 46]
20
- end
6
+ describe "extract parser options" do
7
+ it "should return a hash" do
8
+ @parser.extract_parser_options("").should be_kind_of(Hash)
9
+ end
21
10
 
22
- it "should parse constant lookups" do
23
- opal_eval("Object").should == Object
24
- opal_eval("Array").should == Array
25
- opal_eval("Opal::Parser").should == Opal::Parser
26
- end
11
+ it "extracts options when first line starts with '# opal:'" do
12
+ @parser.extract_parser_options("# opal: foo, bar, baz").keys.should == [:foo, :bar, :baz]
13
+ end
14
+
15
+ it "converts any '-' in option name to '_'" do
16
+ @parser.extract_parser_options("# opal: foo, bar-ba, baz-ba").keys.should == [:foo, :bar_ba, :baz_ba]
17
+ end
18
+
19
+ it "sets extracted options as true" do
20
+ @parser.extract_parser_options("# opal: foo, bar").should == { :foo => true, :bar => true }
21
+ end
27
22
 
28
- it "should parse class and module definitions" do
29
- opal_eval("class ParserModuleDefinition; end")
30
- opal_eval <<-STR
31
- class ParserClassDefinition
32
- CONSTANT = 500
23
+ it "removes prefix of 'no-' or 'no_' from options" do
24
+ @parser.extract_parser_options("# opal: no-foo, no_bar").keys.should == [:foo, :bar]
25
+ end
33
26
 
34
- def foo
35
- 500
36
- end
27
+ it "sets extracted no_ options as false" do
28
+ @parser.extract_parser_options("# opal: no-foo, no_bar").should == { :foo => false, :bar => false }
29
+ end
37
30
 
38
- def self.bar
39
- 42
40
- end
41
- end
42
- STR
31
+ it "can have a mixture of false and true options" do
32
+ @parser.extract_parser_options("# opal: no-foo, bar").should == { :foo => false, :bar => true }
33
+ end
43
34
 
44
- ParserClassDefinition.bar.should == 42
45
- ParserClassDefinition.new.foo.should == 500
35
+ it "only extracts options on first line, if present" do
36
+ @parser.extract_parser_options("# hello world").should == {}
37
+ @parser.extract_parser_options("# hello world\n# opal: foo").should == {}
38
+ @parser.extract_parser_options("# opal: ").should == {}
39
+ end
46
40
  end
47
41
  end