opal 0.10.0 → 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 (460) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.rspec +1 -2
  6. data/.travis.yml +28 -18
  7. data/.yardopts +3 -1
  8. data/CHANGELOG.md +139 -1
  9. data/Gemfile +16 -9
  10. data/HACKING.md +2 -0
  11. data/README.md +7 -6
  12. data/Rakefile +1 -1
  13. data/appveyor.yml +30 -0
  14. data/benchmark/bm_constant_lookup_big.rb +799 -0
  15. data/benchmark/bm_constant_lookup_small.rb +59 -0
  16. data/benchmark/bm_module_definition_big.rb +400 -0
  17. data/benchmark/bm_module_definition_small.rb +30 -0
  18. data/benchmark-ips/bm_case.rb +33 -0
  19. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  20. data/benchmark-ips/bm_is_number.rb +29 -0
  21. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  22. data/bin/opal +4 -2
  23. data/bin/opal-repl +23 -1
  24. data/docs/compiled_ruby.md +16 -14
  25. data/docs/faq.md +3 -3
  26. data/docs/rspec.md +2 -1
  27. data/docs/unsupported_features.md +6 -4
  28. data/examples/rack/Gemfile +1 -0
  29. data/examples/rack/Gemfile.lock +11 -7
  30. data/examples/rack/app/application.rb +14 -3
  31. data/examples/rack/app/user.rb +2 -0
  32. data/examples/rack/config.ru +1 -1
  33. data/examples/rack/index.html.erb +1 -0
  34. data/examples/sinatra/Gemfile +1 -1
  35. data/examples/sinatra/Gemfile.lock +8 -11
  36. data/examples/sinatra/app/application.rb +2 -0
  37. data/lib/opal/ast/builder.rb +17 -0
  38. data/lib/opal/ast/node.rb +30 -0
  39. data/lib/opal/builder.rb +14 -3
  40. data/lib/opal/builder_processors.rb +1 -0
  41. data/lib/opal/cli.rb +45 -59
  42. data/lib/opal/cli_options.rb +18 -11
  43. data/lib/opal/cli_runners/applescript.rb +3 -3
  44. data/lib/opal/cli_runners/nashorn.rb +1 -0
  45. data/lib/opal/cli_runners/nodejs.rb +4 -1
  46. data/lib/opal/cli_runners/phantom.js +1 -2
  47. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  48. data/lib/opal/cli_runners/server.rb +1 -0
  49. data/lib/opal/cli_runners.rb +1 -0
  50. data/lib/opal/compiler.rb +145 -94
  51. data/lib/opal/config.rb +114 -36
  52. data/lib/opal/deprecations.rb +18 -0
  53. data/lib/opal/erb.rb +1 -0
  54. data/lib/opal/errors.rb +1 -0
  55. data/lib/opal/fragment.rb +1 -0
  56. data/lib/opal/hike_path_finder.rb +1 -0
  57. data/lib/opal/nodes/arglist.rb +2 -1
  58. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  59. data/lib/opal/nodes/args/kwarg.rb +7 -7
  60. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  61. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  62. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  63. data/lib/opal/nodes/args/normarg.rb +6 -7
  64. data/lib/opal/nodes/args/optarg.rb +5 -7
  65. data/lib/opal/nodes/args/post_args.rb +6 -5
  66. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  67. data/lib/opal/nodes/args/restarg.rb +7 -7
  68. data/lib/opal/nodes/array.rb +1 -0
  69. data/lib/opal/nodes/base.rb +24 -3
  70. data/lib/opal/nodes/call.rb +167 -155
  71. data/lib/opal/nodes/call_special.rb +31 -217
  72. data/lib/opal/nodes/case.rb +36 -22
  73. data/lib/opal/nodes/class.rb +4 -3
  74. data/lib/opal/nodes/constants.rb +28 -48
  75. data/lib/opal/nodes/csend.rb +25 -0
  76. data/lib/opal/nodes/def.rb +57 -17
  77. data/lib/opal/nodes/defined.rb +170 -60
  78. data/lib/opal/nodes/definitions.rb +40 -133
  79. data/lib/opal/nodes/defs.rb +29 -0
  80. data/lib/opal/nodes/for.rb +52 -25
  81. data/lib/opal/nodes/hash.rb +12 -35
  82. data/lib/opal/nodes/helpers.rb +27 -54
  83. data/lib/opal/nodes/if.rb +21 -32
  84. data/lib/opal/nodes/inline_args.rb +12 -13
  85. data/lib/opal/nodes/iter.rb +61 -36
  86. data/lib/opal/nodes/literal.rb +194 -114
  87. data/lib/opal/nodes/logic.rb +20 -25
  88. data/lib/opal/nodes/masgn.rb +20 -18
  89. data/lib/opal/nodes/module.rb +10 -11
  90. data/lib/opal/nodes/node_with_args.rb +14 -17
  91. data/lib/opal/nodes/rescue.rb +37 -70
  92. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  93. data/lib/opal/nodes/scope.rb +9 -5
  94. data/lib/opal/nodes/singleton_class.rb +4 -3
  95. data/lib/opal/nodes/super.rb +115 -87
  96. data/lib/opal/nodes/top.rb +7 -2
  97. data/lib/opal/nodes/variables.rb +46 -35
  98. data/lib/opal/nodes/while.rb +11 -1
  99. data/lib/opal/nodes/yield.rb +1 -17
  100. data/lib/opal/nodes.rb +3 -0
  101. data/lib/opal/parser.rb +28 -770
  102. data/lib/opal/path_reader.rb +5 -1
  103. data/lib/opal/paths.rb +10 -4
  104. data/lib/opal/regexp_anchors.rb +1 -0
  105. data/lib/opal/rewriter.rb +60 -0
  106. data/lib/opal/rewriters/base.rb +60 -0
  107. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  108. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  109. data/lib/opal/rewriters/break_finder.rb +34 -0
  110. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  111. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  112. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  113. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  114. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  115. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  116. data/lib/opal/server.rb +4 -0
  117. data/lib/opal/simple_server.rb +100 -0
  118. data/lib/opal/source_map.rb +1 -1
  119. data/lib/opal/util.rb +5 -5
  120. data/lib/opal/version.rb +2 -1
  121. data/lib/opal.rb +6 -1
  122. data/lib/tilt/opal.rb +1 -0
  123. data/opal/README.md +1 -1
  124. data/opal/corelib/array.rb +137 -83
  125. data/opal/corelib/basic_object.rb +6 -6
  126. data/opal/corelib/class.rb +14 -11
  127. data/opal/corelib/complex.rb +5 -1
  128. data/opal/corelib/constants.rb +3 -3
  129. data/opal/corelib/enumerable.rb +129 -11
  130. data/opal/corelib/error.rb +35 -17
  131. data/opal/corelib/file.rb +65 -170
  132. data/opal/corelib/hash.rb +128 -13
  133. data/opal/corelib/helpers.rb +12 -15
  134. data/opal/corelib/io.rb +1 -0
  135. data/opal/corelib/kernel.rb +40 -21
  136. data/opal/corelib/marshal/read_buffer.rb +1 -1
  137. data/opal/corelib/method.rb +33 -13
  138. data/opal/corelib/module.rb +134 -82
  139. data/opal/corelib/number.rb +141 -25
  140. data/opal/corelib/numeric.rb +0 -8
  141. data/opal/corelib/process.rb +44 -4
  142. data/opal/corelib/random/seedrandom.js.rb +15 -0
  143. data/opal/corelib/random.rb +117 -0
  144. data/opal/corelib/range.rb +133 -10
  145. data/opal/corelib/regexp.rb +37 -9
  146. data/opal/corelib/runtime.js +604 -394
  147. data/opal/corelib/string/encoding.rb +51 -7
  148. data/opal/corelib/string.rb +39 -8
  149. data/opal/corelib/struct.rb +20 -0
  150. data/opal/corelib/time.rb +2 -2
  151. data/opal/corelib/variables.rb +1 -1
  152. data/opal/opal.rb +1 -0
  153. data/opal.gemspec +9 -8
  154. data/spec/filters/bugs/array.rb +5 -1
  155. data/spec/filters/bugs/basicobject.rb +2 -5
  156. data/spec/filters/bugs/bigdecimal.rb +8 -22
  157. data/spec/filters/bugs/class.rb +2 -1
  158. data/spec/filters/bugs/comparable.rb +5 -0
  159. data/spec/filters/bugs/date.rb +3 -3
  160. data/spec/filters/bugs/enumerable.rb +4 -11
  161. data/spec/filters/bugs/enumerator.rb +2 -4
  162. data/spec/filters/bugs/exception.rb +16 -2
  163. data/spec/filters/bugs/file.rb +8 -0
  164. data/spec/filters/bugs/float.rb +7 -1
  165. data/spec/filters/bugs/hash.rb +6 -2
  166. data/spec/filters/bugs/integer.rb +2 -0
  167. data/spec/filters/bugs/io.rb +8 -0
  168. data/spec/filters/bugs/kernel.rb +9 -138
  169. data/spec/filters/bugs/language.rb +89 -174
  170. data/spec/filters/bugs/marshal.rb +33 -35
  171. data/spec/filters/bugs/method.rb +0 -24
  172. data/spec/filters/bugs/module.rb +19 -57
  173. data/spec/filters/bugs/numeric.rb +0 -119
  174. data/spec/filters/bugs/pathname.rb +2 -0
  175. data/spec/filters/bugs/proc.rb +5 -4
  176. data/spec/filters/bugs/random.rb +7 -0
  177. data/spec/filters/bugs/range.rb +12 -120
  178. data/spec/filters/bugs/rational.rb +1 -1
  179. data/spec/filters/bugs/regexp.rb +2 -40
  180. data/spec/filters/bugs/set.rb +0 -1
  181. data/spec/filters/bugs/string.rb +5 -8
  182. data/spec/filters/bugs/stringscanner.rb +11 -19
  183. data/spec/filters/bugs/time.rb +7 -1
  184. data/spec/filters/bugs/unboundmethod.rb +1 -11
  185. data/spec/filters/unsupported/array.rb +5 -1
  186. data/spec/filters/unsupported/basicobject.rb +1 -1
  187. data/spec/filters/unsupported/bignum.rb +4 -1
  188. data/spec/filters/unsupported/class.rb +1 -1
  189. data/spec/filters/unsupported/delegator.rb +1 -1
  190. data/spec/filters/unsupported/enumerable.rb +1 -1
  191. data/spec/filters/unsupported/enumerator.rb +1 -1
  192. data/spec/filters/unsupported/file.rb +4 -0
  193. data/spec/filters/unsupported/fixnum.rb +1 -1
  194. data/spec/filters/unsupported/float.rb +4 -1
  195. data/spec/filters/unsupported/freeze.rb +27 -5
  196. data/spec/filters/unsupported/hash.rb +7 -15
  197. data/spec/filters/unsupported/integer.rb +1 -1
  198. data/spec/filters/unsupported/kernel.rb +2 -1
  199. data/spec/filters/unsupported/language.rb +6 -1
  200. data/spec/filters/unsupported/marshal.rb +1 -1
  201. data/spec/filters/unsupported/matchdata.rb +4 -1
  202. data/spec/filters/unsupported/math.rb +1 -1
  203. data/spec/filters/unsupported/pathname.rb +1 -1
  204. data/spec/filters/unsupported/privacy.rb +141 -9
  205. data/spec/filters/unsupported/proc.rb +1 -1
  206. data/spec/filters/unsupported/random.rb +4 -0
  207. data/spec/filters/unsupported/range.rb +7 -0
  208. data/spec/filters/unsupported/regexp.rb +25 -15
  209. data/spec/filters/unsupported/set.rb +1 -1
  210. data/spec/filters/unsupported/singleton.rb +1 -1
  211. data/spec/filters/unsupported/string.rb +110 -101
  212. data/spec/filters/unsupported/struct.rb +1 -1
  213. data/spec/filters/unsupported/symbol.rb +2 -1
  214. data/spec/filters/unsupported/taint.rb +22 -7
  215. data/spec/filters/unsupported/thread.rb +1 -1
  216. data/spec/filters/unsupported/time.rb +1 -1
  217. data/spec/lib/builder_spec.rb +17 -0
  218. data/spec/lib/cli_runners/phantomjs_spec.rb +2 -2
  219. data/spec/lib/cli_spec.rb +37 -8
  220. data/spec/lib/compiler/call_spec.rb +98 -66
  221. data/spec/lib/compiler_spec.rb +41 -32
  222. data/spec/lib/config_spec.rb +97 -0
  223. data/spec/lib/dependency_resolver_spec.rb +2 -2
  224. data/spec/lib/deprecations_spec.rb +16 -0
  225. data/spec/lib/fixtures/source_location_test.rb +7 -0
  226. data/spec/lib/path_reader_spec.rb +3 -3
  227. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  228. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  229. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  230. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  231. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  232. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  233. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  234. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  235. data/spec/lib/simple_server_spec.rb +54 -0
  236. data/spec/lib/spec_helper.rb +88 -4
  237. data/spec/mspec-opal/formatters.rb +65 -17
  238. data/spec/mspec-opal/runner.rb +47 -67
  239. data/spec/opal/core/date_spec.rb +14 -0
  240. data/spec/opal/core/exception_spec.rb +10 -0
  241. data/spec/opal/core/hash/internals_spec.rb +10 -10
  242. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  243. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  244. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  245. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  246. data/spec/opal/core/language/send_spec.rb +1 -9
  247. data/spec/opal/core/language/string_spec.rb +8 -8
  248. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  249. data/spec/opal/core/language_spec.rb +32 -0
  250. data/spec/opal/core/module/const_get_spec.rb +1 -1
  251. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  252. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  253. data/spec/opal/core/runtime_spec.rb +4 -4
  254. data/spec/opal/core/string_spec.rb +8 -8
  255. data/spec/opal/core/time_spec.rb +38 -0
  256. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  257. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  258. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  259. data/spec/ruby_specs +2 -1
  260. data/spec/spec_helper.rb +1 -0
  261. data/spec/support/rewriters_helper.rb +24 -0
  262. data/stdlib/base64.rb +4 -2
  263. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  264. data/stdlib/date.rb +18 -19
  265. data/stdlib/json.rb +16 -4
  266. data/stdlib/nashorn/file.rb +15 -0
  267. data/stdlib/native.rb +21 -12
  268. data/stdlib/nodejs/dir.rb +1 -1
  269. data/stdlib/nodejs/file.rb +49 -20
  270. data/stdlib/nodejs/io.rb +22 -1
  271. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  272. data/stdlib/nodejs/kernel.rb +3 -1
  273. data/stdlib/nodejs/package.json +0 -1
  274. data/stdlib/nodejs/stacktrace.rb +163 -0
  275. data/stdlib/nodejs/yaml.rb +2 -1
  276. data/stdlib/opal/platform.rb +5 -13
  277. data/stdlib/opal-platform.rb +15 -0
  278. data/stdlib/pathname.rb +1 -1
  279. data/stdlib/strscan.rb +15 -1
  280. data/stdlib/yaml.rb +1 -1
  281. data/tasks/benchmarking.rake +9 -0
  282. data/tasks/building.rake +24 -20
  283. data/tasks/linting.rake +24 -13
  284. data/tasks/testing/mspec_special_calls.rb +44 -15
  285. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  286. data/tasks/testing.rake +322 -205
  287. data/test/nodejs/fixtures/hello.rb +1 -0
  288. data/test/nodejs/test_file.rb +57 -0
  289. data/test/nodejs/test_io.rb +18 -0
  290. data/test/nodejs/test_opal_builder.rb +12 -0
  291. data/test/opal/unsupported_and_bugs.rb +9 -0
  292. metadata +131 -242
  293. data/lib/opal/parser/grammar.rb +0 -6157
  294. data/lib/opal/parser/grammar.y +0 -2011
  295. data/lib/opal/parser/keywords.rb +0 -66
  296. data/lib/opal/parser/lexer.rb +0 -1352
  297. data/lib/opal/parser/parser_scope.rb +0 -28
  298. data/lib/opal/parser/sexp.rb +0 -90
  299. data/lib/opal/sprockets/environment.rb +0 -23
  300. data/lib/opal/sprockets/erb.rb +0 -23
  301. data/lib/opal/sprockets/path_reader.rb +0 -36
  302. data/lib/opal/sprockets/processor.rb +0 -145
  303. data/lib/opal/sprockets/server.rb +0 -133
  304. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  305. data/lib/opal/sprockets/source_map_server.rb +0 -115
  306. data/lib/opal/sprockets.rb +0 -91
  307. data/spec/filters/bugs/compiler_opal.rb +0 -5
  308. data/spec/filters/bugs/language_opal.rb +0 -88
  309. data/spec/filters/unsupported/module.rb +0 -8
  310. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  311. data/spec/lib/lexer_spec.rb +0 -110
  312. data/spec/lib/parser/alias_spec.rb +0 -26
  313. data/spec/lib/parser/and_spec.rb +0 -13
  314. data/spec/lib/parser/aref_spec.rb +0 -10
  315. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  316. data/spec/lib/parser/begin_spec.rb +0 -42
  317. data/spec/lib/parser/block_spec.rb +0 -12
  318. data/spec/lib/parser/break_spec.rb +0 -17
  319. data/spec/lib/parser/call_spec.rb +0 -201
  320. data/spec/lib/parser/class_spec.rb +0 -35
  321. data/spec/lib/parser/comments_spec.rb +0 -11
  322. data/spec/lib/parser/def_spec.rb +0 -109
  323. data/spec/lib/parser/if_spec.rb +0 -26
  324. data/spec/lib/parser/iter_spec.rb +0 -59
  325. data/spec/lib/parser/lambda_spec.rb +0 -219
  326. data/spec/lib/parser/literal_spec.rb +0 -118
  327. data/spec/lib/parser/masgn_spec.rb +0 -37
  328. data/spec/lib/parser/module_spec.rb +0 -27
  329. data/spec/lib/parser/not_spec.rb +0 -21
  330. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  331. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  332. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  333. data/spec/lib/parser/or_spec.rb +0 -13
  334. data/spec/lib/parser/return_spec.rb +0 -22
  335. data/spec/lib/parser/sclass_spec.rb +0 -21
  336. data/spec/lib/parser/string_spec.rb +0 -286
  337. data/spec/lib/parser/super_spec.rb +0 -20
  338. data/spec/lib/parser/unary_spec.rb +0 -52
  339. data/spec/lib/parser/undef_spec.rb +0 -19
  340. data/spec/lib/parser/unless_spec.rb +0 -13
  341. data/spec/lib/parser/variables_spec.rb +0 -116
  342. data/spec/lib/parser/while_spec.rb +0 -15
  343. data/spec/lib/parser/yield_spec.rb +0 -20
  344. data/spec/lib/sprockets/erb_spec.rb +0 -38
  345. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  346. data/spec/lib/sprockets/processor_spec.rb +0 -79
  347. data/spec/lib/sprockets/server_spec.rb +0 -102
  348. data/spec/lib/sprockets_spec.rb +0 -32
  349. data/spec/lib/tilt/opal_spec.rb +0 -37
  350. data/spec/opal/core/language/block_spec.rb +0 -538
  351. data/spec/opal/core/language/proc_spec.rb +0 -263
  352. data/spec/opal/core/language/variables_spec.rb +0 -1366
  353. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  354. data/spec/opal/core/runtime/send_spec.rb +0 -34
  355. data/spec/support/parser_helpers.rb +0 -37
  356. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  357. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  358. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  359. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  360. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  361. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  362. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  363. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  364. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  365. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  366. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  367. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  368. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  389. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  390. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  391. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  392. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  393. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  394. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  395. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  396. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  397. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  450. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  451. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  452. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  453. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  454. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  455. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  456. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  457. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  458. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  459. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
  460. /data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  require 'set'
2
3
  require 'pathname'
3
4
  require 'opal/nodes/base'
4
5
  require 'opal/nodes/runtime_helpers'
6
+ require 'opal/rewriters/break_finder'
5
7
 
6
8
  module Opal
7
9
  module Nodes
8
10
  class CallNode < Base
9
- handle :call
11
+ handle :send
10
12
 
11
- children :recvr, :meth, :arglist, :iter
13
+ attr_reader :recvr, :meth, :arglist, :iter
12
14
 
13
15
  SPECIALS = {}
14
16
 
@@ -21,127 +23,134 @@ module Opal
21
23
  define_method("handle_#{name}", &handler)
22
24
  end
23
25
 
24
- def compile
25
- # handle some methods specially
26
- handle_special
27
-
28
- # some special methods need to skip compilation
29
- return unless compile_default?
26
+ def initialize(*)
27
+ super
28
+ @recvr, @meth, *args = *@sexp
30
29
 
31
- compiler.method_calls << meth.to_sym if record_method?
30
+ *rest, last_arg = *args
32
31
 
33
- # if trying to access an lvar in irb mode
34
- return compile_irb_var if using_irb?
32
+ if last_arg && [:iter, :block_pass].include?(last_arg.type)
33
+ @iter = last_arg
34
+ args = rest
35
+ end
35
36
 
36
- default_compile
37
+ @arglist = s(:arglist, *args)
37
38
  end
38
39
 
39
- private
40
-
41
- def default_compile
42
- # blocks need to be assigned to temp variables in order to pass them
43
- block_temp = scope.new_temp if block_being_passed
44
-
45
- # can't use self for splats or blocks
46
- temporary_receiver = scope.new_temp if splat? || block_temp
40
+ def compile
41
+ # handle some methods specially
42
+ # some special methods need to skip compilation, so we pass the default as a block
43
+ handle_special do
44
+ compiler.method_calls << meth.to_sym if record_method?
47
45
 
48
- # must do this after assigning temp variables
49
- has_break = compiler.has_break? { @block_being_passed = expr(@block_being_passed) } if block_being_passed
46
+ # if trying to access an lvar in irb mode
47
+ return compile_irb_var if using_irb?
50
48
 
51
- add_method temporary_receiver
49
+ default_compile
50
+ end
51
+ end
52
52
 
53
- add_block block_temp if block_temp
53
+ private
54
54
 
55
- add_invocation temporary_receiver
55
+ def iter_has_break?
56
+ return false unless iter
57
+
58
+ finder = Opal::Rewriters::BreakFinder.new
59
+ finder.process(iter)
60
+ finder.found_break?
61
+ end
62
+
63
+ # Opal has a runtime helper 'Opal.send_method_name' that assigns
64
+ # provided block to a '$$p' property of the method body
65
+ # and invokes a method using 'apply'.
66
+ #
67
+ # We have to compile a method call using this 'Opal.send_method_name' when a method:
68
+ # 1. takes a splat
69
+ # 2. takes a block
70
+ #
71
+ # Arguments that contain splat must be handled in a different way.
72
+ # @see #compile_arguments
73
+ #
74
+ # When a method takes a block we have to calculate all arguments
75
+ # **before** asigning '$$p' property (that stores a passed block)
76
+ # to a method body. This is some kind of protection from method calls
77
+ # like 'a(a {}) { 1 }'.
78
+ def invoke_using_send?
79
+ iter || splat?
80
+ end
56
81
 
57
- if has_break
58
- unshift 'return '
59
- unshift '(function(){var $brk = Opal.new_brk(); try {'
60
- line '} catch (err) { if (err === $brk) { return err.$v } else { throw err } }})()'
82
+ def default_compile
83
+ if invoke_using_send?
84
+ compile_using_send
85
+ else
86
+ compile_simple_call_chain
61
87
  end
62
88
 
63
- scope.queue_temp block_temp if block_temp
89
+ compile_break_catcher
64
90
  end
65
91
 
66
- def redefine_this?(temporary_receiver)
67
- temporary_receiver != nil
68
- end
92
+ # Compiles method call using `Opal.send`
93
+ #
94
+ # @example
95
+ # a.b(c, &block)
96
+ #
97
+ # Opal.send(a, 'b', [c], block)
98
+ #
99
+ def compile_using_send
100
+ helper :send
69
101
 
70
- def apply_call_target(temporary_receiver)
71
- temporary_receiver || receiver_fragment
102
+ push '$send('
103
+ compile_receiver
104
+ compile_method_name
105
+ compile_arguments
106
+ compile_block_pass
107
+ push ')'
72
108
  end
73
109
 
74
- def arguments_array?
75
- splat?
110
+ def compile_receiver
111
+ push recv(receiver_sexp)
76
112
  end
77
113
 
78
- def add_invocation(temporary_receiver)
79
- args = arguments_fragment
80
- if redefine_this?(temporary_receiver) || arguments_array?
81
- if arguments_array?
82
- push ".apply("
83
- else
84
- push ".call("
85
- end
86
-
87
- push apply_call_target(temporary_receiver)
114
+ def compile_method_name
115
+ push ", '#{meth}'"
116
+ end
88
117
 
89
- if args.any?
90
- push ", ", args
91
- end
118
+ def compile_arguments
119
+ push ", "
92
120
 
93
- push ")"
121
+ if splat?
122
+ push expr(arglist)
123
+ elsif arglist.children.empty?
124
+ push '[]'
94
125
  else
95
- push "(", args, ")"
126
+ push '[', expr(arglist), ']'
96
127
  end
97
128
  end
98
129
 
99
- def add_method(temporary_receiver)
100
- if temporary_receiver
101
- push "(#{temporary_receiver} = ", receiver_fragment, ")#{method_jsid}"
102
- else
103
- push receiver_fragment, method_jsid
130
+ def compile_block_pass
131
+ if iter
132
+ push ", ", expr(iter)
104
133
  end
105
134
  end
106
135
 
107
- def add_block(block_temp)
108
- unshift "(#{block_temp} = "
109
- push ", #{block_temp}.$$p = ", block_being_passed, ", #{block_temp})"
110
- end
111
-
112
- def splat?
113
- arguments_without_block.any? { |a| a.first == :splat }
114
- end
115
-
116
- def recv_sexp
117
- recvr || s(:self)
118
- end
119
-
120
- def receiver_fragment
121
- recv recv_sexp
122
- end
123
-
124
- def arguments_fragment
125
- expr arguments_sexp
136
+ def compile_break_catcher
137
+ if iter_has_break?
138
+ unshift 'return '
139
+ unshift '(function(){var $brk = Opal.new_brk(); try {'
140
+ line '} catch (err) { if (err === $brk) { return err.$v } else { throw err } }})()'
141
+ end
126
142
  end
127
143
 
128
- def arguments_sexp
129
- # arguments_without_block is an array, not an sexp
130
- only_args = arguments_without_block
131
- s(:arglist, *only_args)
144
+ def compile_simple_call_chain
145
+ push recv(receiver_sexp), method_jsid, "(", expr(arglist), ")"
132
146
  end
133
147
 
134
- def arguments_without_block
135
- @arguments_without_block ||= begin
136
- arglist[1..-1]
137
- end
148
+ def splat?
149
+ arglist.children.any? { |a| a.type == :splat }
138
150
  end
139
151
 
140
- def block_being_passed
141
- @block_being_passed ||= begin
142
- args = arguments_without_block
143
- Sexp === args.last && args.last.type == :block_pass ? args.pop : iter
144
- end
152
+ def receiver_sexp
153
+ recvr || s(:self)
145
154
  end
146
155
 
147
156
  def method_jsid
@@ -152,67 +161,45 @@ module Opal
152
161
  true
153
162
  end
154
163
 
155
- def attr_assignment?
156
- @assignment ||= meth.to_s =~ /#{REGEXP_START}[\da-z]+\=#{REGEXP_END}/i
157
- end
158
-
159
164
  # Used to generate the code to use this sexp as an ivar var reference
160
165
  def compile_irb_var
161
166
  with_temp do |tmp|
162
- lvar = variable(meth)
163
- call = s(:call, s(:self), meth.intern, s(:arglist))
167
+ lvar = meth
168
+ call = s(:send, s(:self), meth.intern, s(:arglist))
164
169
  push "((#{tmp} = Opal.irb_vars.#{lvar}) == null ? ", expr(call), " : #{tmp})"
165
170
  end
166
171
  end
167
172
 
168
- def compile_assignment
169
- with_temp do |args_tmp|
170
- with_temp do |recv_tmp|
171
- args = expr(arglist)
172
- mid = mid_to_jsid meth.to_s
173
- push "((#{args_tmp} = [", args, "]), "+
174
- "#{recv_tmp} = ", recv(recv_sexp), ", ",
175
- recv_tmp, mid, ".apply(#{recv_tmp}, #{args_tmp}), "+
176
- "#{args_tmp}[#{args_tmp}.length-1])"
177
- end
178
- end
179
- end
180
-
181
173
  # a variable reference in irb mode in top scope might be a var ref,
182
174
  # or it might be a method call
183
175
  def using_irb?
184
176
  @compiler.irb? and scope.top? and arglist == s(:arglist) and recvr.nil? and iter.nil?
185
177
  end
186
178
 
179
+ def sexp_with_arglist
180
+ @sexp.updated(nil, [recvr, meth, arglist])
181
+ end
182
+
187
183
  # Handle "special" method calls, e.g. require(). Subclasses can override
188
184
  # this method. If this method returns nil, then the method will continue
189
185
  # to be generated by CallNode.
190
- def handle_special
191
- @compile_default = true
192
-
186
+ def handle_special(&compile_default)
193
187
  if SPECIALS.include? meth
194
- @compile_default = false
195
- __send__("handle_#{meth}")
188
+ method = method("handle_#{meth}")
189
+ method.arity == 1 ? method[compile_default] : method[]
196
190
  elsif RuntimeHelpers.compatible?(recvr, meth, arglist)
197
- @compile_default = false
198
- push(RuntimeHelpers.new(@sexp, @level, @compiler).compile)
191
+ push(RuntimeHelpers.new(sexp_with_arglist, @level, @compiler).compile)
192
+ else
193
+ compile_default.call
199
194
  end
200
195
  end
201
196
 
202
- def compile_default!
203
- @compile_default = true
204
- end
205
-
206
- def compile_default?
207
- @compile_default
208
- end
209
-
210
197
  OPERATORS.each do |operator, name|
211
- add_special(operator.to_sym) do
198
+ add_special(operator.to_sym) do |compile_default|
212
199
  if compiler.inline_operators?
213
200
  compiler.method_calls << operator.to_sym if record_method?
214
201
  compiler.operator_helpers << operator.to_sym
215
- lhs, rhs = expr(recvr), expr(arglist[1])
202
+ lhs, rhs = expr(recvr), expr(arglist)
216
203
 
217
204
  push fragment("$rb_#{name}(")
218
205
  push lhs
@@ -220,58 +207,56 @@ module Opal
220
207
  push rhs
221
208
  push fragment(")")
222
209
  else
223
- compile_default!
210
+ compile_default.call
224
211
  end
225
212
  end
226
213
  end
227
214
 
228
- add_special :require do
229
- compile_default!
230
- str = DependencyResolver.new(compiler, arglist[1]).resolve
215
+ add_special :require do |compile_default|
216
+ str = DependencyResolver.new(compiler, arglist.children[0]).resolve
231
217
  compiler.requires << str unless str.nil?
232
- push fragment('')
218
+ compile_default.call
233
219
  end
234
220
 
235
- add_special :require_relative do
236
- arg = arglist[1]
221
+ add_special :require_relative do |_compile_default|
222
+ arg = arglist.children[0]
237
223
  file = compiler.file
238
- if arg[0] == :str
224
+ if arg.type == :str
239
225
  dir = File.dirname(file)
240
- compiler.requires << Pathname(dir).join(arg[1]).cleanpath.to_s
226
+ compiler.requires << Pathname(dir).join(arg.children[0]).cleanpath.to_s
241
227
  end
242
228
  push fragment("self.$require(#{file.inspect}+ '/../' + ")
243
229
  push process(arglist)
244
230
  push fragment(')')
245
231
  end
246
232
 
247
- add_special :autoload do
233
+ add_special :autoload do |compile_default|
248
234
  if scope.class_scope?
249
- compile_default!
250
- str = DependencyResolver.new(compiler, arglist[2]).resolve
235
+ str = DependencyResolver.new(compiler, arglist.children[1]).resolve
251
236
  compiler.requires << str unless str.nil?
252
- push fragment('')
237
+ compile_default.call
253
238
  end
254
239
  end
255
240
 
256
- add_special :require_tree do
257
- arg = arglist[1]
258
- if arg[0] == :str
259
- relative_path = arg[1]
241
+ add_special :require_tree do |compile_default|
242
+ first_arg, *rest = *arglist.children
243
+ if first_arg.type == :str
244
+ relative_path = first_arg.children[0]
260
245
  compiler.required_trees << relative_path
261
246
 
262
247
  dir = File.dirname(compiler.file)
263
248
  full_path = Pathname(dir).join(relative_path).cleanpath.to_s
264
- arg[1] = full_path
249
+ first_arg = first_arg.updated(nil, [full_path])
265
250
  end
266
- compile_default!
267
- push fragment('')
251
+ @arglist = arglist.updated(nil, [first_arg] + rest)
252
+ compile_default.call
268
253
  end
269
254
 
270
- add_special :block_given? do
255
+ add_special :block_given? do |compile_default|
271
256
  push compiler.handle_block_given_call @sexp
272
257
  end
273
258
 
274
- add_special :__callee__ do
259
+ add_special :__callee__ do |compile_default|
275
260
  if scope.def?
276
261
  push fragment scope.mid.to_s.inspect
277
262
  else
@@ -279,7 +264,7 @@ module Opal
279
264
  end
280
265
  end
281
266
 
282
- add_special :__method__ do
267
+ add_special :__method__ do |compile_default|
283
268
  if scope.def?
284
269
  push fragment scope.mid.to_s.inspect
285
270
  else
@@ -287,14 +272,41 @@ module Opal
287
272
  end
288
273
  end
289
274
 
290
- add_special :debugger do
275
+ add_special :debugger do |compile_default|
291
276
  push fragment 'debugger'
292
277
  end
293
278
 
294
- add_special :__OPAL_COMPILER_CONFIG__ do
279
+ add_special :__OPAL_COMPILER_CONFIG__ do |compile_default|
295
280
  push fragment "Opal.hash({ arity_check: #{compiler.arity_check?} })"
296
281
  end
297
282
 
283
+ add_special :nesting do |compile_default|
284
+ recv, method, *args = children
285
+ push_nesting = push_nesting?(children)
286
+ push '(Opal.Module.$$nesting = $nesting, ' if push_nesting
287
+ compile_default.call
288
+ push ')' if push_nesting
289
+ end
290
+
291
+ add_special :constants do |compile_default|
292
+ recv, method, *args = children
293
+ push_nesting = push_nesting?(children)
294
+ push '(Opal.Module.$$nesting = $nesting, ' if push_nesting
295
+ compile_default.call
296
+ push ')' if push_nesting
297
+ end
298
+
299
+ def push_nesting?(recv)
300
+ recv = children.first
301
+
302
+ children.size == 2 && ( # only receiver and method
303
+ recv.nil? || ( # and no receiver
304
+ recv.type == :const && # or receiver
305
+ recv.children.last == :Module # is Module
306
+ )
307
+ )
308
+ end
309
+
298
310
  class DependencyResolver
299
311
  def initialize(compiler, sexp)
300
312
  @compiler = compiler
@@ -309,13 +321,13 @@ module Opal
309
321
  type = sexp.type
310
322
 
311
323
  if type == :str
312
- return sexp[1]
313
- elsif type == :call
314
- _, recv, meth, args = sexp
324
+ return sexp.children[0]
325
+ elsif type == :send
326
+ recv, meth, *args = sexp.children
315
327
 
316
- parts = args[1..-1].map { |s| handle_part s }
328
+ parts = args.map { |s| handle_part s }
317
329
 
318
- if recv == [:const, :File]
330
+ if ::Opal::AST::Node === recv && recv.type == :const && recv.children.last == :File
319
331
  if meth == :expand_path
320
332
  return expand_path(*parts)
321
333
  elsif meth == :join