opal 0.4.3 → 0.4.4

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 (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
@@ -28,7 +28,7 @@ module Opal
28
28
  def handle_require(sexp)
29
29
  str = handle_require_sexp sexp
30
30
  @requires << str unless str.nil? if @requires
31
- fragment("", sexp)
31
+ f("", sexp)
32
32
  end
33
33
 
34
34
  def handle_require_sexp(sexp)
@@ -3,45 +3,31 @@ require 'source_map'
3
3
 
4
4
  module Opal
5
5
  class SourceMap
6
- LINE_REGEXP = %r{/\*:(\d+)\*/}.freeze
7
- FILE_REGEXP = %r{/\*-file:(.+?)-\*/}.freeze
6
+ attr_reader :fragments
7
+ attr_reader :file
8
8
 
9
- attr_reader :generated, :file
10
-
11
- def initialize generated, file
12
- @generated = generated
9
+ def initialize(fragments, file)
10
+ @fragments = fragments
13
11
  @file = file
14
12
  end
15
13
 
16
14
  def map
17
15
  @map ||= ::SourceMap.new.tap do |map|
18
- source_file = file
19
- generated.lines.each_with_index do |line, index|
20
- generated_line = index+1
21
- if line =~ FILE_REGEXP
22
- source_file = "file://#{$1}"
23
- map.add_mapping(
24
- :generated_line => generated_line,
25
- :generated_col => 0,
26
- :source_line => 1,
27
- :source_col => 0,
28
- :source => source_file
29
- )
30
- end
16
+ line, column = 1, 0
31
17
 
32
- pos = 0
33
- while (pos = line.index(LINE_REGEXP, pos))
34
- pos += $~.size
35
- source_line = $1.to_i + 1
36
- source_col = 0 # until column info will be available
37
- generated_col = pos
18
+ @fragments.each do |fragment|
19
+ if source_line = fragment.line
38
20
  map.add_mapping(
39
- :generated_line => generated_line,
40
- :generated_col => generated_col,
21
+ :generated_line => line,
22
+ :generated_col => column,
41
23
  :source_line => source_line,
42
- :source_col => source_col,
43
- :source => source_file
24
+ :source_col => 0,
25
+ :source => file
44
26
  )
27
+
28
+ new_lines = fragment.code.count "\n"
29
+ line += new_lines
30
+ column = 0
45
31
  end
46
32
  end
47
33
  end
@@ -59,5 +45,4 @@ module Opal
59
45
  "\n//@ sourceMappingURL=file://#{map_path}"
60
46
  end
61
47
  end
62
-
63
48
  end
@@ -33,6 +33,9 @@ module Opal
33
33
 
34
34
  # uses parents super method
35
35
  attr_accessor :uses_super
36
+ attr_accessor :uses_zuper
37
+
38
+ attr_accessor :catch_return
36
39
 
37
40
  # @param [Symbol] type the scope type (:class, :module, :iter, :def, :top)
38
41
  # @param [Opal::Parser] parser a parser instance used to create this scope
@@ -88,6 +91,10 @@ module Opal
88
91
  @type == :iter
89
92
  end
90
93
 
94
+ def def?
95
+ @type == :def
96
+ end
97
+
91
98
  # Is this a normal def method directly inside a class? This is
92
99
  # used for optimizing ivars as we can set them to nil in the
93
100
  # class body
@@ -133,19 +140,19 @@ module Opal
133
140
  result = str
134
141
  end
135
142
 
136
- fragment(result)
143
+ f(result)
137
144
  end
138
145
 
139
- def fragment(code, sexp = nil)
140
- @parser.fragment code
146
+ def f(code, sexp = nil)
147
+ @parser.f code
141
148
  end
142
149
 
143
150
  # Generates code for this module to donate methods
144
151
  def to_donate_methods
145
152
  if should_donate? and !@methods.empty?
146
- fragment("%s;__opal.donate(#{@name}, [%s]);" % [@parser.parser_indent, @methods.map(&:inspect).join(', ')])
153
+ f("%s;$opal.donate(#{@name}, [%s]);" % [@parser.parser_indent, @methods.map(&:inspect).join(', ')])
147
154
  else
148
- fragment("")
155
+ f("")
149
156
  end
150
157
  end
151
158
 
@@ -163,6 +170,7 @@ module Opal
163
170
 
164
171
  def add_arg(arg)
165
172
  @args << arg unless @args.include? arg
173
+ arg
166
174
  end
167
175
 
168
176
  def add_local(local)
@@ -235,6 +243,17 @@ module Opal
235
243
  @identity
236
244
  end
237
245
 
246
+ def find_parent_def
247
+ scope = self
248
+ while scope = scope.parent
249
+ if scope.def?
250
+ return scope
251
+ end
252
+ end
253
+
254
+ nil
255
+ end
256
+
238
257
  def get_super_chain
239
258
  chain, scope, defn, mid = [], self, 'null', 'null'
240
259
 
data/lib/opal/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Opal
2
- VERSION = '0.4.3'
2
+ VERSION = '0.4.4'
3
3
  end
@@ -0,0 +1,18 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'opal/cli'
3
+ require 'stringio'
4
+
5
+ describe Opal::CLI do
6
+ let(:output) { StringIO.new }
7
+
8
+ context 'with a file' do
9
+ let(:file) { File.expand_path('../fixtures/opal_file.rb', __FILE__) }
10
+ subject(:cli) { described_class.new(file, :output => output) }
11
+
12
+ it 'runs the file' do
13
+ cli.run
14
+ output.rewind
15
+ expect(output.read).to eq("hi from opal!\n")
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,2 @@
1
+ require 'opal'
2
+ puts 'hi from opal!'
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ RSpec.configure do |config|
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.run_all_when_everything_filtered = true
10
+ config.filter_run :focus
11
+
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+ end
data/opal.gemspec CHANGED
@@ -1,5 +1,7 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/opal/version', __FILE__)
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'opal/version'
3
5
 
4
6
  Gem::Specification.new do |s|
5
7
  s.name = 'opal'
@@ -22,4 +24,5 @@ Gem::Specification.new do |s|
22
24
  s.add_development_dependency 'rake'
23
25
  s.add_development_dependency 'racc'
24
26
  s.add_development_dependency 'opal-sprockets', '~> 0.1.1'
27
+ s.add_development_dependency 'rspec', '~> 2.14'
25
28
  end
File without changes
File without changes
@@ -0,0 +1,11 @@
1
+ opal_filter "Array#combination" do
2
+ fails "Array#combination generates from a defensive copy, ignoring mutations"
3
+ fails "Array#combination yields a partition consisting of only singletons"
4
+ fails "Array#combination yields [] when length is 0"
5
+ fails "Array#combination yields a copy of self if the argument is the size of the receiver"
6
+ fails "Array#combination yields nothing if the argument is out of bounds"
7
+ fails "Array#combination yields the expected combinations"
8
+ fails "Array#combination yields nothing for out of bounds length and return self"
9
+ fails "Array#combination returns self when a block is given"
10
+ fails "Array#combination returns an enumerator when no block is provided"
11
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#count" do
2
+ fails "Array#count returns the number of element for which the block evaluates to true"
3
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#delete_if" do
2
+ fails "Array#delete_if returns an Enumerator if no block given, and the enumerator can modify the original array"
3
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#drop" do
2
+ fails "Array#drop raises an ArgumentError if the number of elements specified is negative"
3
+ end
@@ -0,0 +1,5 @@
1
+ opal_filter "Array#drop_while" do
2
+ fails "Array#drop_while removes elements from the start of the array until the block returns false"
3
+ fails "Array#drop_while removes elements from the start of the array until the block returns nil"
4
+ fails "Array#drop_while removes elements from the start of the array while the block evaluates to true"
5
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#eql?" do
2
+ fails "Array#eql? returns false if any corresponding elements are not #eql?"
3
+ end
@@ -0,0 +1,9 @@
1
+ opal_filter "Array#flatten" do
2
+ fails "Array#flatten raises a TypeError when the passed Object can't be converted to an Integer"
3
+ fails "Array#flatten tries to convert passed Objects to Integers using #to_int"
4
+ end
5
+
6
+ opal_filter "Array#flatten!" do
7
+ fails "Array#flatten! raises a TypeError when the passed Object can't be converted to an Integer"
8
+ fails "Array#flatten! tries to convert passed Objects to Integers using #to_int"
9
+ end
@@ -0,0 +1,5 @@
1
+ opal_filter "Array#-" do
2
+ fails "Array#- removes an identical item even when its #eql? isn't reflexive"
3
+ fails "Array#- doesn't remove an item with the same hash but not #eql?"
4
+ fails "Array#- removes an item identified as equivalent via #hash and #eql?"
5
+ end
@@ -0,0 +1,9 @@
1
+ opal_filter "Array#*" do
2
+ fails "Array#* with an integer with a subclass of Array returns a subclass instance"
3
+ fails "Array#* with an integer raises an ArgumentError when passed a negative integer"
4
+ fails "Array#* raises a TypeError is the passed argument is nil"
5
+ fails "Array#* converts the passed argument to a String rather than an Integer"
6
+ fails "Array#* raises a TypeError if the argument can neither be converted to a string nor an integer"
7
+ fails "Array#* tires to convert the passed argument to an Integer using #to_int"
8
+ fails "Array#* tries to convert the passed argument to a String using #to_str"
9
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array.new" do
2
+ fails "Array.new with (size, object=nil) raises an ArgumentError if size is too large"
3
+ end
@@ -0,0 +1,6 @@
1
+ opal_filter "Array#pop" do
2
+ fails "Array#pop passed a number n as an argument raises an ArgumentError if more arguments are passed"
3
+ fails "Array#pop passed a number n as an argument raises a TypeError when the passed n can be coerced to Integer"
4
+ fails "Array#pop passed a number n as an argument tries to convert n to an Integer using #to_int"
5
+ fails "Array#pop passed a number n as an argument raises an ArgumentError if n is negative"
6
+ end
@@ -0,0 +1,4 @@
1
+ opal_filter "Array#rassoc" do
2
+ fails "Array#rassoc does not check the last element in each contained but speficically the second"
3
+ fails "Array#rassoc calls elem == obj on the second element of each contained array"
4
+ end
@@ -0,0 +1,6 @@
1
+ opal_filter "Array#rindex" do
2
+ fails "Array#rindex given no argument and no block produces an Enumerator"
3
+ fails "Array#rindex rechecks the array size during iteration"
4
+ fails "Array#rindex ignore the block if there is an argument"
5
+ fails "Array#rindex returns the first index backwards from the end where element == to object"
6
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#select" do
2
+ fails "Array#select returns a new array of elements for which block is true"
3
+ end
@@ -0,0 +1,7 @@
1
+ opal_filter "Array#shift" do
2
+ fails "Array#shift passed a number n as an argument raises an ArgumentError if more arguments are passed"
3
+ fails "Array#shift passed a number n as an argument raises a TypeError when the passed n can be coerced to Integer"
4
+ fails "Array#shift passed a number n as an argument tries to convert n to an Integer using #to_int"
5
+ fails "Array#shift passed a number n as an argument raises an ArgumentError if n is negative"
6
+ fails "Array#shift passed a number n as an argument returns a new empty array if there are no more elements"
7
+ end
@@ -0,0 +1,11 @@
1
+ opal_filter "Array#shuffle" do
2
+ fails "Array#shuffle uses given random generator"
3
+ fails "Array#shuffle uses default random generator"
4
+ fails "Array#shuffle attempts coercion via #to_hash"
5
+ fails "Array#shuffle is not destructive"
6
+ fails "Array#shuffle returns the same values, in a usually different order"
7
+ end
8
+
9
+ opal_filter "Array#shuffle!" do
10
+ fails "Array#shuffle! returns the same values, in a usually different order"
11
+ end
@@ -0,0 +1,7 @@
1
+ opal_filter "Array#slice!" do
2
+ fails "Array#slice! does not expand array with negative indices out of bounds"
3
+ fails "Array#slice! does not expand array with indices out of bounds"
4
+ fails "Array#slice! calls to_int on range arguments"
5
+ fails "Array#slice! removes and return elements in range"
6
+ fails "Array#slice! calls to_int on start and length arguments"
7
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#take" do
2
+ fails "Array#take raises an ArgumentError when the argument is negative"
3
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Array#to_a" do
2
+ fails "Array#to_a does not return subclass instance on Array subclasses"
3
+ end
@@ -0,0 +1,7 @@
1
+ opal_filter "Array.try_convert" do
2
+ fails "Array.try_convert does not rescue exceptions raised by #to_ary"
3
+ fails "Array.try_convert sends #to_ary to the argument and raises TypeError if it's not a kind of Array"
4
+ fails "Array.try_convert sends #to_ary to the argument and returns the result if it's a kind of Array"
5
+ fails "Array.try_convert sends #to_ary to the argument and returns the result if it's an Array"
6
+ fails "Array.try_convert sends #to_ary to the argument and returns the result if it's nil"
7
+ end
@@ -0,0 +1,10 @@
1
+ opal_filter "Array#uniq" do
2
+ fails "Array#uniq compares elements based on the value returned from the block"
3
+ fails "Array#uniq compares elements with matching hash codes with #eql?"
4
+ fails "Array#uniq uses eql? semantics"
5
+ end
6
+
7
+ opal_filter "Array#uniq!" do
8
+ fails "Array#uniq! compares elements based on the value returned from the block"
9
+ fails "Array#uniq! properly handles recursive arrays"
10
+ end
@@ -0,0 +1,4 @@
1
+ opal_filter "Array#zip" do
2
+ fails "Array#zip calls #to_ary to convert the argument to an Array"
3
+ fails "Array#zip uses #each to extract arguments' elements when #to_ary fails"
4
+ end
@@ -1,3 +1,4 @@
1
1
  opal_filter "Array#delete accepting blocks" do
2
2
  fails "Array#delete may be given a block that is executed if no element matches object"
3
+ fails "Array#delete returns the last element in the array for which object is equal under #=="
3
4
  end
File without changes
@@ -0,0 +1,4 @@
1
+ opal_filter "case" do
2
+ fails "The 'case'-construct lets you define a method after the case statement"
3
+ fails "The 'case'-construct with no target expression evaluates true as only 'true' when true is the first clause"
4
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "Enumerable#sort_by" do
2
+ fails "Enumerable#sort_by returns an Enumerator when a block is not supplied"
3
+ end
@@ -0,0 +1,4 @@
1
+ opal_filter "Kernel#rand" do
2
+ fails "Kernel.rand returns a float if no argument is passed"
3
+ fails "Kernel.rand returns an integer for an integer argument"
4
+ end
@@ -0,0 +1,3 @@
1
+ opal_filter "array" do
2
+ fails "The unpacking splat operator (*) when applied to a non-Array value attempts to coerce it to Array if the object respond_to?(:to_a)"
3
+ end