opal 0.10.6 → 0.11.0.rc1

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 (450) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.travis.yml +26 -18
  6. data/CHANGELOG.md +89 -23
  7. data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  8. data/Gemfile +19 -21
  9. data/HACKING.md +2 -0
  10. data/README.md +7 -6
  11. data/Rakefile +1 -1
  12. data/appveyor.yml +21 -4
  13. data/benchmark-ips/bm_case.rb +33 -0
  14. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  15. data/benchmark-ips/bm_is_number.rb +29 -0
  16. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  17. data/benchmark/bm_constant_lookup_big.rb +799 -0
  18. data/benchmark/bm_constant_lookup_small.rb +59 -0
  19. data/benchmark/bm_module_definition_big.rb +400 -0
  20. data/benchmark/bm_module_definition_small.rb +30 -0
  21. data/bin/opal-repl +23 -1
  22. data/docs/compiled_ruby.md +16 -14
  23. data/docs/faq.md +3 -3
  24. data/docs/rspec.md +2 -1
  25. data/docs/unsupported_features.md +6 -4
  26. data/examples/rack/Gemfile +1 -0
  27. data/examples/rack/app/application.rb +14 -3
  28. data/examples/rack/app/user.rb +2 -0
  29. data/examples/rack/config.ru +1 -1
  30. data/examples/rack/index.html.erb +1 -0
  31. data/lib/opal.rb +6 -1
  32. data/lib/opal/ast/builder.rb +17 -0
  33. data/lib/opal/ast/node.rb +30 -0
  34. data/lib/opal/builder.rb +14 -3
  35. data/lib/opal/builder_processors.rb +1 -0
  36. data/lib/opal/cli.rb +45 -59
  37. data/lib/opal/cli_options.rb +11 -7
  38. data/lib/opal/cli_runners.rb +1 -0
  39. data/lib/opal/cli_runners/applescript.rb +3 -3
  40. data/lib/opal/cli_runners/nashorn.rb +1 -0
  41. data/lib/opal/cli_runners/nodejs.rb +4 -1
  42. data/lib/opal/cli_runners/phantom.js +1 -2
  43. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  44. data/lib/opal/cli_runners/server.rb +1 -0
  45. data/lib/opal/compiler.rb +145 -94
  46. data/lib/opal/config.rb +1 -0
  47. data/lib/opal/deprecations.rb +18 -0
  48. data/lib/opal/erb.rb +1 -0
  49. data/lib/opal/errors.rb +1 -0
  50. data/lib/opal/fragment.rb +1 -0
  51. data/lib/opal/hike_path_finder.rb +1 -0
  52. data/lib/opal/nodes.rb +3 -0
  53. data/lib/opal/nodes/arglist.rb +2 -1
  54. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  55. data/lib/opal/nodes/args/kwarg.rb +7 -7
  56. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  57. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  58. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  59. data/lib/opal/nodes/args/normarg.rb +6 -7
  60. data/lib/opal/nodes/args/optarg.rb +5 -7
  61. data/lib/opal/nodes/args/post_args.rb +6 -5
  62. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  63. data/lib/opal/nodes/args/restarg.rb +7 -7
  64. data/lib/opal/nodes/array.rb +1 -0
  65. data/lib/opal/nodes/base.rb +24 -3
  66. data/lib/opal/nodes/call.rb +167 -155
  67. data/lib/opal/nodes/call_special.rb +31 -217
  68. data/lib/opal/nodes/case.rb +36 -22
  69. data/lib/opal/nodes/class.rb +4 -3
  70. data/lib/opal/nodes/constants.rb +28 -48
  71. data/lib/opal/nodes/csend.rb +25 -0
  72. data/lib/opal/nodes/def.rb +49 -16
  73. data/lib/opal/nodes/defined.rb +170 -60
  74. data/lib/opal/nodes/definitions.rb +40 -133
  75. data/lib/opal/nodes/defs.rb +29 -0
  76. data/lib/opal/nodes/for.rb +52 -25
  77. data/lib/opal/nodes/hash.rb +12 -35
  78. data/lib/opal/nodes/helpers.rb +27 -54
  79. data/lib/opal/nodes/if.rb +21 -32
  80. data/lib/opal/nodes/inline_args.rb +12 -13
  81. data/lib/opal/nodes/iter.rb +61 -36
  82. data/lib/opal/nodes/literal.rb +189 -116
  83. data/lib/opal/nodes/logic.rb +20 -25
  84. data/lib/opal/nodes/masgn.rb +20 -18
  85. data/lib/opal/nodes/module.rb +10 -11
  86. data/lib/opal/nodes/node_with_args.rb +14 -17
  87. data/lib/opal/nodes/rescue.rb +37 -70
  88. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  89. data/lib/opal/nodes/scope.rb +9 -5
  90. data/lib/opal/nodes/singleton_class.rb +4 -3
  91. data/lib/opal/nodes/super.rb +115 -87
  92. data/lib/opal/nodes/top.rb +7 -2
  93. data/lib/opal/nodes/variables.rb +46 -35
  94. data/lib/opal/nodes/while.rb +11 -1
  95. data/lib/opal/nodes/yield.rb +1 -17
  96. data/lib/opal/parser.rb +28 -770
  97. data/lib/opal/path_reader.rb +5 -1
  98. data/lib/opal/paths.rb +10 -4
  99. data/lib/opal/regexp_anchors.rb +1 -0
  100. data/lib/opal/rewriter.rb +60 -0
  101. data/lib/opal/rewriters/base.rb +60 -0
  102. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  103. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  104. data/lib/opal/rewriters/break_finder.rb +34 -0
  105. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  106. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  107. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  108. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  109. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  110. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  111. data/lib/opal/server.rb +4 -0
  112. data/lib/opal/simple_server.rb +100 -0
  113. data/lib/opal/source_map.rb +1 -1
  114. data/lib/opal/util.rb +5 -5
  115. data/lib/opal/version.rb +2 -1
  116. data/lib/tilt/opal.rb +1 -0
  117. data/opal.gemspec +8 -7
  118. data/opal/README.md +1 -1
  119. data/opal/corelib/array.rb +137 -83
  120. data/opal/corelib/basic_object.rb +6 -6
  121. data/opal/corelib/class.rb +14 -11
  122. data/opal/corelib/complex.rb +5 -1
  123. data/opal/corelib/constants.rb +3 -3
  124. data/opal/corelib/enumerable.rb +129 -11
  125. data/opal/corelib/error.rb +35 -17
  126. data/opal/corelib/file.rb +65 -170
  127. data/opal/corelib/hash.rb +128 -13
  128. data/opal/corelib/helpers.rb +12 -15
  129. data/opal/corelib/io.rb +1 -0
  130. data/opal/corelib/kernel.rb +40 -21
  131. data/opal/corelib/marshal/read_buffer.rb +1 -1
  132. data/opal/corelib/method.rb +33 -13
  133. data/opal/corelib/module.rb +133 -81
  134. data/opal/corelib/number.rb +141 -25
  135. data/opal/corelib/numeric.rb +0 -8
  136. data/opal/corelib/process.rb +44 -4
  137. data/opal/corelib/random.rb +117 -0
  138. data/opal/corelib/random/seedrandom.js.rb +15 -0
  139. data/opal/corelib/range.rb +133 -10
  140. data/opal/corelib/regexp.rb +37 -9
  141. data/opal/corelib/runtime.js +601 -390
  142. data/opal/corelib/string.rb +39 -8
  143. data/opal/corelib/string/encoding.rb +51 -7
  144. data/opal/corelib/struct.rb +20 -0
  145. data/opal/corelib/time.rb +3 -3
  146. data/opal/corelib/variables.rb +1 -1
  147. data/opal/opal.rb +1 -0
  148. data/spec/filters/bugs/array.rb +5 -1
  149. data/spec/filters/bugs/basicobject.rb +2 -5
  150. data/spec/filters/bugs/bigdecimal.rb +8 -22
  151. data/spec/filters/bugs/class.rb +2 -1
  152. data/spec/filters/bugs/comparable.rb +5 -0
  153. data/spec/filters/bugs/date.rb +3 -3
  154. data/spec/filters/bugs/enumerable.rb +4 -11
  155. data/spec/filters/bugs/enumerator.rb +2 -4
  156. data/spec/filters/bugs/exception.rb +16 -2
  157. data/spec/filters/bugs/file.rb +8 -0
  158. data/spec/filters/bugs/float.rb +7 -1
  159. data/spec/filters/bugs/hash.rb +6 -2
  160. data/spec/filters/bugs/integer.rb +2 -0
  161. data/spec/filters/bugs/io.rb +8 -0
  162. data/spec/filters/bugs/kernel.rb +9 -138
  163. data/spec/filters/bugs/language.rb +89 -174
  164. data/spec/filters/bugs/marshal.rb +33 -35
  165. data/spec/filters/bugs/method.rb +0 -24
  166. data/spec/filters/bugs/module.rb +19 -55
  167. data/spec/filters/bugs/numeric.rb +0 -119
  168. data/spec/filters/bugs/pathname.rb +2 -0
  169. data/spec/filters/bugs/proc.rb +5 -4
  170. data/spec/filters/bugs/random.rb +7 -0
  171. data/spec/filters/bugs/range.rb +12 -120
  172. data/spec/filters/bugs/rational.rb +1 -1
  173. data/spec/filters/bugs/regexp.rb +2 -40
  174. data/spec/filters/bugs/set.rb +0 -1
  175. data/spec/filters/bugs/string.rb +5 -8
  176. data/spec/filters/bugs/stringscanner.rb +11 -19
  177. data/spec/filters/bugs/time.rb +7 -1
  178. data/spec/filters/bugs/unboundmethod.rb +1 -11
  179. data/spec/filters/unsupported/array.rb +5 -1
  180. data/spec/filters/unsupported/basicobject.rb +1 -1
  181. data/spec/filters/unsupported/bignum.rb +4 -1
  182. data/spec/filters/unsupported/class.rb +1 -1
  183. data/spec/filters/unsupported/delegator.rb +1 -1
  184. data/spec/filters/unsupported/enumerable.rb +1 -1
  185. data/spec/filters/unsupported/enumerator.rb +1 -1
  186. data/spec/filters/unsupported/file.rb +4 -0
  187. data/spec/filters/unsupported/fixnum.rb +1 -1
  188. data/spec/filters/unsupported/float.rb +4 -1
  189. data/spec/filters/unsupported/freeze.rb +27 -5
  190. data/spec/filters/unsupported/hash.rb +7 -15
  191. data/spec/filters/unsupported/integer.rb +1 -1
  192. data/spec/filters/unsupported/kernel.rb +2 -1
  193. data/spec/filters/unsupported/language.rb +6 -1
  194. data/spec/filters/unsupported/marshal.rb +1 -1
  195. data/spec/filters/unsupported/matchdata.rb +4 -1
  196. data/spec/filters/unsupported/math.rb +1 -1
  197. data/spec/filters/unsupported/pathname.rb +1 -1
  198. data/spec/filters/unsupported/privacy.rb +141 -9
  199. data/spec/filters/unsupported/proc.rb +1 -1
  200. data/spec/filters/unsupported/random.rb +4 -0
  201. data/spec/filters/unsupported/range.rb +7 -0
  202. data/spec/filters/unsupported/regexp.rb +25 -15
  203. data/spec/filters/unsupported/set.rb +1 -1
  204. data/spec/filters/unsupported/singleton.rb +1 -1
  205. data/spec/filters/unsupported/string.rb +110 -101
  206. data/spec/filters/unsupported/struct.rb +1 -1
  207. data/spec/filters/unsupported/symbol.rb +2 -1
  208. data/spec/filters/unsupported/taint.rb +22 -7
  209. data/spec/filters/unsupported/thread.rb +1 -1
  210. data/spec/filters/unsupported/time.rb +1 -1
  211. data/spec/lib/builder_spec.rb +17 -0
  212. data/spec/lib/cli_spec.rb +37 -8
  213. data/spec/lib/compiler/call_spec.rb +98 -66
  214. data/spec/lib/compiler_spec.rb +39 -30
  215. data/spec/lib/dependency_resolver_spec.rb +2 -2
  216. data/spec/lib/deprecations_spec.rb +16 -0
  217. data/spec/lib/fixtures/source_location_test.rb +7 -0
  218. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  219. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  220. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  221. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  222. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  223. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  224. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  225. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  226. data/spec/lib/simple_server_spec.rb +54 -0
  227. data/spec/mspec-opal/formatters.rb +65 -17
  228. data/spec/mspec-opal/runner.rb +47 -67
  229. data/spec/opal/core/date_spec.rb +14 -0
  230. data/spec/opal/core/exception_spec.rb +10 -0
  231. data/spec/opal/core/hash/internals_spec.rb +10 -10
  232. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  233. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  234. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  235. data/spec/opal/core/language/predefined_spec.rb +1 -1
  236. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  237. data/spec/opal/core/language/send_spec.rb +1 -9
  238. data/spec/opal/core/language/string_spec.rb +8 -8
  239. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  240. data/spec/opal/core/language_spec.rb +32 -0
  241. data/spec/opal/core/module/const_get_spec.rb +1 -1
  242. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  243. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  244. data/spec/opal/core/runtime_spec.rb +4 -4
  245. data/spec/opal/core/string_spec.rb +8 -8
  246. data/spec/opal/core/time_spec.rb +26 -17
  247. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  248. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  249. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  250. data/spec/ruby_specs +2 -1
  251. data/spec/spec_helper.rb +1 -0
  252. data/spec/support/rewriters_helper.rb +24 -0
  253. data/stdlib/base64.rb +4 -2
  254. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  255. data/stdlib/date.rb +18 -19
  256. data/stdlib/json.rb +16 -4
  257. data/stdlib/nashorn/file.rb +15 -0
  258. data/stdlib/native.rb +21 -12
  259. data/stdlib/nodejs/dir.rb +1 -1
  260. data/stdlib/nodejs/file.rb +49 -20
  261. data/stdlib/nodejs/io.rb +22 -1
  262. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  263. data/stdlib/nodejs/kernel.rb +3 -1
  264. data/stdlib/nodejs/package.json +0 -1
  265. data/stdlib/nodejs/stacktrace.rb +163 -0
  266. data/stdlib/nodejs/yaml.rb +2 -1
  267. data/stdlib/opal-platform.rb +15 -0
  268. data/stdlib/opal/platform.rb +5 -13
  269. data/stdlib/pathname.rb +1 -1
  270. data/stdlib/strscan.rb +15 -1
  271. data/stdlib/yaml.rb +1 -1
  272. data/tasks/benchmarking.rake +9 -0
  273. data/tasks/building.rake +24 -20
  274. data/tasks/linting.rake +24 -13
  275. data/tasks/testing.rake +322 -205
  276. data/tasks/testing/mspec_special_calls.rb +44 -15
  277. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  278. data/test/nodejs/fixtures/hello.rb +1 -0
  279. data/test/nodejs/test_file.rb +57 -0
  280. data/test/nodejs/test_io.rb +18 -0
  281. data/test/nodejs/test_opal_builder.rb +12 -0
  282. data/test/opal/unsupported_and_bugs.rb +9 -0
  283. metadata +127 -240
  284. data/lib/opal/parser/grammar.rb +0 -6157
  285. data/lib/opal/parser/grammar.y +0 -2011
  286. data/lib/opal/parser/keywords.rb +0 -66
  287. data/lib/opal/parser/lexer.rb +0 -1352
  288. data/lib/opal/parser/parser_scope.rb +0 -28
  289. data/lib/opal/parser/sexp.rb +0 -90
  290. data/lib/opal/sprockets.rb +0 -77
  291. data/lib/opal/sprockets/environment.rb +0 -23
  292. data/lib/opal/sprockets/erb.rb +0 -28
  293. data/lib/opal/sprockets/path_reader.rb +0 -36
  294. data/lib/opal/sprockets/processor.rb +0 -173
  295. data/lib/opal/sprockets/server.rb +0 -133
  296. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  297. data/lib/opal/sprockets/source_map_server.rb +0 -117
  298. data/spec/filters/bugs/compiler_opal.rb +0 -5
  299. data/spec/filters/bugs/language_opal.rb +0 -88
  300. data/spec/filters/unsupported/module.rb +0 -8
  301. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  302. data/spec/lib/lexer_spec.rb +0 -110
  303. data/spec/lib/parser/alias_spec.rb +0 -26
  304. data/spec/lib/parser/and_spec.rb +0 -13
  305. data/spec/lib/parser/aref_spec.rb +0 -10
  306. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  307. data/spec/lib/parser/begin_spec.rb +0 -42
  308. data/spec/lib/parser/block_spec.rb +0 -12
  309. data/spec/lib/parser/break_spec.rb +0 -17
  310. data/spec/lib/parser/call_spec.rb +0 -201
  311. data/spec/lib/parser/class_spec.rb +0 -35
  312. data/spec/lib/parser/comments_spec.rb +0 -11
  313. data/spec/lib/parser/def_spec.rb +0 -109
  314. data/spec/lib/parser/if_spec.rb +0 -26
  315. data/spec/lib/parser/iter_spec.rb +0 -59
  316. data/spec/lib/parser/lambda_spec.rb +0 -219
  317. data/spec/lib/parser/literal_spec.rb +0 -118
  318. data/spec/lib/parser/masgn_spec.rb +0 -37
  319. data/spec/lib/parser/module_spec.rb +0 -27
  320. data/spec/lib/parser/not_spec.rb +0 -21
  321. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  322. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  323. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  324. data/spec/lib/parser/or_spec.rb +0 -13
  325. data/spec/lib/parser/return_spec.rb +0 -22
  326. data/spec/lib/parser/sclass_spec.rb +0 -21
  327. data/spec/lib/parser/string_spec.rb +0 -286
  328. data/spec/lib/parser/super_spec.rb +0 -20
  329. data/spec/lib/parser/unary_spec.rb +0 -52
  330. data/spec/lib/parser/undef_spec.rb +0 -19
  331. data/spec/lib/parser/unless_spec.rb +0 -13
  332. data/spec/lib/parser/variables_spec.rb +0 -112
  333. data/spec/lib/parser/while_spec.rb +0 -15
  334. data/spec/lib/parser/yield_spec.rb +0 -20
  335. data/spec/lib/sprockets/erb_spec.rb +0 -38
  336. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  337. data/spec/lib/sprockets/processor_spec.rb +0 -79
  338. data/spec/lib/sprockets/server_spec.rb +0 -102
  339. data/spec/lib/sprockets_spec.rb +0 -39
  340. data/spec/lib/tilt/opal_spec.rb +0 -37
  341. data/spec/opal/core/language/block_spec.rb +0 -538
  342. data/spec/opal/core/language/proc_spec.rb +0 -263
  343. data/spec/opal/core/language/variables_spec.rb +0 -1366
  344. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  345. data/spec/opal/core/runtime/send_spec.rb +0 -34
  346. data/spec/support/parser_helpers.rb +0 -37
  347. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  348. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  349. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  350. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  351. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  352. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  353. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  354. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  355. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  356. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  357. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  358. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  359. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  360. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  361. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  362. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  363. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  364. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  365. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  366. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  367. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  368. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  389. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  390. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  391. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  392. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  393. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  394. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  395. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  396. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  397. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  450. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/regexp_anchors'
1
3
  require 'opal/hike_path_finder'
2
4
 
3
5
  module Opal
4
6
  class PathReader
7
+ RELATIVE_PATH_REGEXP = %r{#{Opal::REGEXP_START}\.?\.#{Regexp.quote File::SEPARATOR}}
8
+
5
9
  def initialize(file_finder = HikePathFinder.new)
6
10
  @file_finder = file_finder
7
11
  end
@@ -13,7 +17,7 @@ module Opal
13
17
  end
14
18
 
15
19
  def expand(path)
16
- if Pathname.new(path).absolute? || path =~ %r{\A\.?\.#{File::SEPARATOR}}
20
+ if Pathname.new(path).absolute? || path =~ RELATIVE_PATH_REGEXP
17
21
  path
18
22
  else
19
23
  file_finder.find(path)
@@ -1,14 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  module Opal
2
3
  def self.gem_dir
3
- File.expand_path('../..', __FILE__.untaint)
4
+ File.expand_path("../..", __FILE__.dup.untaint)
4
5
  end
5
6
 
6
7
  def self.core_dir
7
- File.expand_path('../../../opal', __FILE__.untaint)
8
+ File.expand_path("../../../opal", __FILE__.dup.untaint)
8
9
  end
9
10
 
10
11
  def self.std_dir
11
- File.expand_path('../../../stdlib', __FILE__.untaint)
12
+ File.expand_path("../../../stdlib", __FILE__.dup.untaint)
12
13
  end
13
14
 
14
15
  # Add a file path to opals load path. Any gem containing ruby code that Opal
@@ -66,9 +67,14 @@ module Opal
66
67
  @paths.dup.freeze
67
68
  end
68
69
 
69
- # Resets Opal.paths to the default value (includes `corelib`, `stdlib`, `opal/lib`)
70
+ # Resets Opal.paths to the default value
71
+ # (includes `corelib`, `stdlib`, `opal/lib`, `ast` gem and `parser` gem)
70
72
  def self.reset_paths!
71
73
  @paths = [core_dir.untaint, std_dir.untaint, gem_dir.untaint]
74
+ if RUBY_ENGINE != 'opal'
75
+ use_gem 'ast'
76
+ use_gem 'parser'
77
+ end
72
78
  nil
73
79
  end
74
80
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Opal
2
3
  REGEXP_START = RUBY_ENGINE == 'opal' ? '^' : '\A'.freeze
3
4
  REGEXP_END = RUBY_ENGINE == 'opal' ? '$' : '\z'.freeze
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriters/opal_engine_check'
3
+ require 'opal/rewriters/explicit_writer_return'
4
+ require 'opal/rewriters/js_reserved_words'
5
+ require 'opal/rewriters/block_to_iter'
6
+ require 'opal/rewriters/dot_js_syntax'
7
+ require 'opal/rewriters/logical_operator_assignment'
8
+ require 'opal/rewriters/binary_operator_assignment'
9
+
10
+ module Opal
11
+ class Rewriter
12
+ class << self
13
+ def list
14
+ @list ||= []
15
+ end
16
+
17
+ def use(rewriter)
18
+ list << rewriter
19
+ end
20
+
21
+ def delete(rewriter)
22
+ list.delete(rewriter)
23
+ end
24
+
25
+ def disable
26
+ @disabled = true
27
+ yield
28
+ ensure
29
+ @disabled = false
30
+ end
31
+
32
+ def disabled?
33
+ @disabled
34
+ end
35
+ end
36
+
37
+ use Rewriters::OpalEngineCheck
38
+ use Rewriters::BlockToIter
39
+ use Rewriters::DotJsSyntax
40
+ use Rewriters::JsReservedWords
41
+ use Rewriters::LogicalOperatorAssignment
42
+ use Rewriters::BinaryOperatorAssignment
43
+ use Rewriters::ExplicitWriterReturn
44
+
45
+ def initialize(sexp)
46
+ @sexp = sexp
47
+ end
48
+
49
+ def process
50
+ return @sexp if self.class.disabled?
51
+
52
+ self.class.list.each do |rewriter_class|
53
+ rewriter = rewriter_class.new
54
+ @sexp = rewriter.process(@sexp)
55
+ end
56
+
57
+ @sexp
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ require 'parser'
3
+ require 'opal/ast/node'
4
+
5
+ module Opal
6
+ module Rewriters
7
+ class Base < ::Parser::AST::Processor
8
+ def s(type, *children)
9
+ ::Opal::AST::Node.new(type, children)
10
+ end
11
+
12
+ def self.s(type, *children)
13
+ ::Opal::AST::Node.new(type, children)
14
+ end
15
+
16
+ alias on_iter process_regular_node
17
+ alias on_top process_regular_node
18
+
19
+ # TODO: remove patches above after releasing
20
+ # https://github.com/whitequark/parser/commit/cd8d5db
21
+ def on_vasgn(node)
22
+ name, value_node = *node
23
+
24
+ if !value_node.nil?
25
+ node.updated(nil, [
26
+ name, process(value_node)
27
+ ])
28
+ else
29
+ node
30
+ end
31
+ end
32
+
33
+ def on_casgn(node)
34
+ scope_node, name, value_node = *node
35
+
36
+ if !value_node.nil?
37
+ node.updated(nil, [
38
+ process(scope_node), name, process(value_node)
39
+ ])
40
+ else
41
+ node.updated(nil, [
42
+ process(scope_node), name
43
+ ])
44
+ end
45
+ end
46
+
47
+ def on_argument(node)
48
+ arg_name, value_node = *node
49
+
50
+ if !value_node.nil?
51
+ node.updated(nil, [
52
+ arg_name, process(value_node)
53
+ ])
54
+ else
55
+ node
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriters/base'
3
+
4
+ module Opal
5
+ module Rewriters
6
+ class BinaryOperatorAssignment < Base
7
+ def self.reset_tmp_counter!
8
+ @@counter = 0
9
+ end
10
+
11
+ def self.new_temp
12
+ @@counter ||= 0
13
+ @@counter += 1
14
+ :"$binary_op_recvr_tmp_#{@@counter}"
15
+ end
16
+
17
+ GET_SET = ->(get_type, set_type) {
18
+
19
+ ->(lhs, op, rhs) {
20
+ get_node = lhs.updated(get_type) # lhs
21
+ set_node = s(:send, get_node, op, rhs) # lhs + rhs
22
+
23
+ lhs.updated(set_type, [*lhs, set_node]) # lhs = lhs + rhs
24
+ }
25
+
26
+ }
27
+
28
+ # Takes `lhs += rhs`
29
+ # Produces `lhs = lhs + rhs`
30
+ LocalVariableHandler = GET_SET[:lvar, :lvasgn]
31
+
32
+ # Takes `@lhs += rhs`
33
+ # Produces `@lhs = @lhs + rhs`
34
+ InstanceVariableHandler = GET_SET[:ivar, :ivasgn]
35
+
36
+ # Takes `LHS += rhs`
37
+ # Produces `LHS = LHS + rhs`
38
+ ConstantHandler = GET_SET[:const, :casgn]
39
+
40
+ # Takes `$lhs += rhs`
41
+ # Produces `$lhs = $lhs + rhs`
42
+ GlobalVariableHandler = GET_SET[:gvar, :gvasgn]
43
+
44
+ # Takes `@@lhs += rhs`
45
+ # Produces `@@lhs = @@lhs + rhs`
46
+ ClassVariableHandler = GET_SET[:cvar, :cvasgn]
47
+
48
+ # Takes `recvr.meth += rhs`
49
+ # Produces `recvr.meth = recvr.meth + rhs`
50
+ # (lhs is a recvr.meth, op is :+)
51
+ class SendHandler < self
52
+ def self.call(lhs, op, rhs)
53
+ recvr, reader_method, *args = *lhs
54
+
55
+ # If recvr is a complex expression it must be cached.
56
+ # MRI calls recvr in `recvr.meth ||= rhs` only once.
57
+ if recvr && recvr.type == :send
58
+ recvr_tmp = new_temp
59
+ cache_recvr = s(:lvasgn, recvr_tmp, recvr) # $tmp = recvr
60
+ recvr = s(:js_tmp, recvr_tmp)
61
+ end
62
+
63
+ writer_method = :"#{reader_method}="
64
+
65
+ call_reader = lhs.updated(:send, [recvr, reader_method, *args]) # $tmp.meth
66
+ call_op = s(:send, call_reader, op, rhs) # $tmp.meth + rhs
67
+ call_writer = lhs.updated(:send, [recvr, writer_method, *args, call_op]) # $tmp.meth = $tmp.meth + rhs
68
+
69
+ if cache_recvr
70
+ s(:begin, cache_recvr, call_writer)
71
+ else
72
+ call_writer
73
+ end
74
+ end
75
+ end
76
+
77
+ # Takes `recvr.meth += rhs`
78
+ # Produces `recvr.nil? ? nil : recvr.meth += rhs`
79
+ # NOTE: Later output of this handler gets post-processed by this rewriter again
80
+ # using SendHandler to `recvr.nil? ? nil : (recvr.meth = recvr.meth + rhs)`
81
+ class ConditionalSendHandler < self
82
+ def self.call(lhs, op, rhs)
83
+ root_type = :op_asgn
84
+
85
+ recvr, meth, *args = *lhs
86
+
87
+ recvr_tmp = new_temp
88
+ cache_recvr = s(:lvasgn, recvr_tmp, recvr) # $tmp = recvr
89
+ recvr = s(:js_tmp, recvr_tmp)
90
+
91
+ recvr_is_nil = s(:send, recvr, :nil?) # recvr.nil?
92
+ nil_node = s(:nil) # nil
93
+ plain_send = lhs.updated(:send, [recvr, meth, *args]) # recvr.meth
94
+ plain_op_asgn = s(:op_asgn, plain_send, op, rhs) # recvr.meth += rhs
95
+
96
+ s(:begin,
97
+ cache_recvr,
98
+ s(:if, recvr_is_nil, # if recvr.nil?
99
+ s(:nil), # nil
100
+ # else
101
+ plain_op_asgn)) # recvr.meth ||= rhs
102
+ # end
103
+ end
104
+ end
105
+
106
+ HANDLERS = {
107
+ lvasgn: LocalVariableHandler,
108
+ ivasgn: InstanceVariableHandler,
109
+ casgn: ConstantHandler,
110
+ gvasgn: GlobalVariableHandler,
111
+ cvasgn: ClassVariableHandler,
112
+ send: SendHandler,
113
+ csend: ConditionalSendHandler
114
+ }
115
+
116
+ # lhs += rhs
117
+ def on_op_asgn(node)
118
+ lhs, op, rhs = *node
119
+
120
+ result = HANDLERS
121
+ .fetch(lhs.type) { raise NotImplementedError }
122
+ .call(lhs, op, rhs)
123
+
124
+ process(result)
125
+ end
126
+
127
+ ASSIGNMENT_STRING_NODE = s(:str, 'assignment')
128
+
129
+ # Rewrites any or_asgn and and_asgn node like
130
+ # `defined?(a ||= 1)`
131
+ # and
132
+ # `defined?(a &&= 1)`
133
+ # to a static "assignment" string node
134
+ def on_defined?(node)
135
+ inner, _ = *node
136
+ if inner.type == :op_asgn
137
+ ASSIGNMENT_STRING_NODE
138
+ else
139
+ super(node)
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriters/base'
3
+
4
+ module Opal
5
+ module Rewriters
6
+ class BlockToIter < Base
7
+ def on_block(node)
8
+ recvr, args, body = *super
9
+ iter_node = s(:iter, args, body)
10
+ recvr.updated(
11
+ nil,
12
+ recvr.children + [iter_node]
13
+ )
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriter'
3
+
4
+ module Opal
5
+ module Rewriters
6
+ class BreakFinder < Opal::Rewriters::Base
7
+ def initialize
8
+ @found_break = false
9
+ end
10
+
11
+ def found_break?
12
+ @found_break
13
+ end
14
+
15
+ def on_break(node)
16
+ @found_break = true
17
+ node
18
+ end
19
+
20
+ def stop_lookup(node)
21
+ end
22
+
23
+ # regular loops
24
+ alias on_for stop_lookup
25
+ alias on_while stop_lookup
26
+ alias on_while_post stop_lookup
27
+ alias on_until stop_lookup
28
+ alias on_until_post stop_lookup
29
+
30
+ # nested block
31
+ alias on_block stop_lookup
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriters/base'
3
+
4
+ module Opal
5
+ module Rewriters
6
+ class DotJsSyntax < Base
7
+ def on_send(node)
8
+ recv, meth, *args = *node
9
+ if recv && recv.type == :send
10
+ recv_of_recv, meth_of_recv, _ = *recv
11
+ if meth_of_recv == :JS
12
+ case meth
13
+ when :[]
14
+ if args.size != 1
15
+ raise SyntaxError, ".JS[:property] syntax supports only one argument"
16
+ end
17
+ property = args.first
18
+
19
+ node = to_js_attr_call(recv_of_recv, property)
20
+ when :[]=
21
+ if args.size != 2
22
+ raise SyntaxError, '.JS[:property]= syntax supports only two arguments'
23
+ end
24
+
25
+ property, value = *args
26
+ node = to_js_attr_assign_call(recv_of_recv, property, value)
27
+ else
28
+ node = to_native_js_call(recv_of_recv, meth, args)
29
+ end
30
+ super(node)
31
+ else
32
+ super
33
+ end
34
+ else
35
+ super
36
+ end
37
+ end
38
+
39
+ # @param recv [AST::Node] receiver of .JS. method
40
+ # @param meth [Symbol] name of the JS method
41
+ # @param args [Array<AST::Node>] list of the arguments passed to JS method
42
+ def to_native_js_call(recv, meth, args)
43
+ s(:jscall, recv, meth, *args)
44
+ end
45
+
46
+ # @param recv [AST::Node] receiver of .JS[] method
47
+ # @param property [AST::Node] argument passed to .JS[] method
48
+ def to_js_attr_call(recv, property)
49
+ s(:jsattr, recv, property)
50
+ end
51
+
52
+ # @param recv [AST::Node] receiver of .JS[]= method
53
+ # @param property [AST::Node] property passed to brackets
54
+ # @param value [AST::Node] value of assignment
55
+ def to_js_attr_assign_call(recv, property, value)
56
+ s(:jsattrasgn, recv, property, value)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/rewriters/base'
3
+
4
+ module Opal
5
+ module Rewriters
6
+ class ExplicitWriterReturn < Base
7
+ def initialize
8
+ @in_masgn = false
9
+ end
10
+
11
+ TMP_NAME = '$writer'
12
+ GET_ARGS_NODE = s(:lvar, TMP_NAME)
13
+ RETURN_ARGS_NODE = s(:jsattr,
14
+ GET_ARGS_NODE,
15
+ s(:send, s(:jsattr, GET_ARGS_NODE, s(:str, 'length')), :-, s(:int, 1))
16
+ )
17
+
18
+ def on_send(node)
19
+ return super if @in_masgn
20
+
21
+ recv, method_name, *args = *node
22
+
23
+ if method_name.to_s =~ /#{REGEXP_START}\w+=#{REGEXP_END}/ || method_name.to_s == "[]="
24
+ set_args_node = s(:lvasgn, TMP_NAME, s(:array, *process_all(args)))
25
+
26
+ s(:begin,
27
+ set_args_node,
28
+ node.updated(nil, [recv, method_name, s(:splat, GET_ARGS_NODE)]),
29
+ RETURN_ARGS_NODE
30
+ )
31
+ else
32
+ super
33
+ end
34
+ end
35
+
36
+ # Multiple assignment is handled by Opal::Nodes::MassAssignNode
37
+ #
38
+ # For example, "self.a, self.b = 1, 2" parses to:
39
+ # s(:masgn,
40
+ # s(:mlhs,
41
+ # s(:send,
42
+ # s(:self), :a=),
43
+ # s(:send,
44
+ # s(:self), :b=)),
45
+ # s(:array,
46
+ # s(:int, 1),
47
+ # s(:int, 2)))
48
+ #
49
+ # And this AST rewriter skips this node.
50
+ def on_masgn(node)
51
+ @in_masgn = true
52
+ result = super
53
+ @in_masgn = false
54
+ result
55
+ end
56
+ end
57
+ end
58
+ end