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
data/lib/opal/cli.rb CHANGED
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal'
2
- require 'rack'
3
3
  require 'opal/builder'
4
4
  require 'opal/cli_runners'
5
5
 
@@ -9,18 +9,6 @@ module Opal
9
9
  :output, :requires, :gems, :stubs, :verbose, :port, :preload,
10
10
  :filename, :debug, :no_exit, :lib_only
11
11
 
12
- def compile?
13
- @compile
14
- end
15
-
16
- def sexp?
17
- @sexp
18
- end
19
-
20
- def skip_opal_require?
21
- @skip_opal_require
22
- end
23
-
24
12
  class << self
25
13
  attr_accessor :stdout
26
14
  end
@@ -29,8 +17,8 @@ module Opal
29
17
  options ||= {}
30
18
 
31
19
  # Runner
32
- @runner_type = options.delete(:runner) || :nodejs
33
- @port = options.delete(:port) || 3000
20
+ @runner_type = options.delete(:runner) || :nodejs
21
+ @port = options.delete(:port) || 3000
34
22
 
35
23
  @options = options
36
24
  @compile = !!options.delete(:compile)
@@ -41,7 +29,6 @@ module Opal
41
29
  @lib_only = options.delete(:lib_only)
42
30
  @argv = options.delete(:argv) || []
43
31
  @evals = options.delete(:evals) || []
44
- @requires = options.delete(:requires) || []
45
32
  @load_paths = options.delete(:load_paths) || []
46
33
  @gems = options.delete(:gems) || []
47
34
  @stubs = options.delete(:stubs) || []
@@ -50,7 +37,10 @@ module Opal
50
37
  @verbose = options.fetch(:verbose, false); options.delete(:verbose)
51
38
  @debug = options.fetch(:debug, false); options.delete(:debug)
52
39
  @filename = options.fetch(:filename) { @file && @file.path }; options.delete(:filename)
53
- @skip_opal_require = options.delete(:skip_opal_require)
40
+
41
+ @requires = options.delete(:requires) || []
42
+ @requires.unshift('opal') unless options.delete(:skip_opal_require)
43
+
54
44
  @compiler_options = Hash[
55
45
  *compiler_option_names.map do |option|
56
46
  key = option.to_sym
@@ -60,18 +50,23 @@ module Opal
60
50
  end.compact.flatten
61
51
  ]
62
52
 
53
+ raise ArgumentError, "no libraries to compile" if @lib_only and @requires.length == 0
63
54
  raise ArgumentError, "no runnable code provided (evals or file)" if @evals.empty? and @file.nil? and not(@lib_only)
64
55
  raise ArgumentError, "can't accept evals or file in `library only` mode" if (@evals.any? or @file) and @lib_only
65
56
  raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
66
57
  end
67
58
 
68
59
  def run
69
- case
70
- when @map; show_source_map
71
- when sexp?; show_sexp
72
- when compile?; show_compiled_source
73
- else run_code
74
- end
60
+ return show_sexp if @sexp
61
+
62
+ compiled_source = builder.to_s
63
+
64
+ File.write @map, builder.source_map if @map
65
+
66
+ return puts compiled_source if @compile
67
+
68
+ runner.run(compiled_source, argv)
69
+ @exit_status = runner.exit_status
75
70
  end
76
71
 
77
72
  def runner
@@ -83,65 +78,51 @@ module Opal
83
78
  end
84
79
  end
85
80
 
86
- def run_code
87
- runner.run(compiled_source, argv)
88
- @exit_status = runner.exit_status
89
- end
90
-
91
81
  attr_reader :exit_status
92
82
 
93
- def build
83
+ def builder
84
+ @builder ||= create_builder
85
+ end
86
+
87
+ def create_builder
94
88
  builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
89
+
90
+ # --include
95
91
  builder.append_paths(*load_paths)
92
+
93
+ # --gem
96
94
  gems.each { |gem_name| builder.use_gem gem_name }
97
95
 
98
- builder.build 'opal' unless skip_opal_require?
96
+ # --require
97
+ requires.each { |required| builder.build(required) }
99
98
 
99
+ # --preload
100
100
  preload.each { |path| builder.build_require(path) }
101
101
 
102
- # FLAGS
102
+ # --verbose
103
103
  builder.build_str '$VERBOSE = true', '(flags)' if verbose
104
- builder.build_str '$DEBUG = true', '(flags)' if debug
105
104
 
106
- # REQUIRES: -r
107
- requires.each do |local_require|
108
- builder.build(local_require)
109
- end
105
+ # --debug
106
+ builder.build_str '$DEBUG = true', '(flags)' if debug
110
107
 
111
- unless lib_only
112
- evals_or_file do |contents, filename|
113
- builder.build_str(contents, filename)
114
- end
115
- end
108
+ # --eval / stdin / file
109
+ evals_or_file { |source, filename| builder.build_str(source, filename) }
116
110
 
111
+ # --no-exit
117
112
  builder.build_str 'Kernel.exit', '(exit)' unless no_exit
118
113
 
119
114
  builder
120
115
  end
121
116
 
122
- def compiled_source
123
- build.to_s
124
- end
125
-
126
- def show_compiled_source
127
- puts compiled_source
128
- end
129
-
130
117
  def show_sexp
131
118
  evals_or_file do |contents, filename|
132
- sexp = Opal::Parser.new.parse(contents, filename)
119
+ buffer = ::Parser::Source::Buffer.new(filename)
120
+ buffer.source = contents
121
+ sexp = Opal::Parser.default_parser.parse(buffer)
133
122
  puts sexp.inspect
134
123
  end
135
124
  end
136
125
 
137
- def show_source_map
138
- evals_or_file do |contents, filename|
139
- compiler = Opal::Compiler.new(contents, options.merge(file: filename))
140
- compiler.compile
141
- puts compiler.source_map.to_json
142
- end
143
- end
144
-
145
126
  def compiler_option_names
146
127
  %w[
147
128
  method_missing
@@ -150,12 +131,17 @@ module Opal
150
131
  source_map_enabled
151
132
  irb_enabled
152
133
  inline_operators
134
+ enable_source_location
135
+ parse_comments
153
136
  ]
154
137
  end
155
138
 
156
- # Internal: Yelds a string of source code and the proper filename for either
139
+ # Internal: Yields a string of source code and the proper filename for either
157
140
  # evals, stdin or a filepath.
158
141
  def evals_or_file
142
+ # --library
143
+ return if lib_only
144
+
159
145
  if evals.any?
160
146
  yield evals.join("\n"), '-e'
161
147
  else
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'optparse'
2
3
 
3
4
  module Opal
@@ -76,10 +77,6 @@ module Opal
76
77
  options[:sexp] = true
77
78
  end
78
79
 
79
- on('-m', '--map', 'Show sourcemap') do
80
- options[:map] = true
81
- end
82
-
83
80
  on('-c', '--compile', 'Compile to JavaScript') do
84
81
  options[:compile] = true
85
82
  end
@@ -97,10 +94,6 @@ module Opal
97
94
  options[:no_exit] = true
98
95
  end
99
96
 
100
- on('-L', '--library', 'Generate only the code of the library. Omit [programfile] and [-e]') do |no_exit|
101
- options[:lib_only] = true
102
- end
103
-
104
97
  section 'Compilation Options:'
105
98
 
106
99
  on('-M', '--no-method-missing', 'Enable/Disable method missing') do
@@ -126,19 +119,33 @@ module Opal
126
119
  options[:dynamic_require_severity] = level.to_sym
127
120
  end
128
121
 
129
- on('-P', '--source-map [FILE]', 'Enable/Disable source map') do |file|
130
- options[:source_map_enabled] = true
131
- options[:source_map_file] = file if file
122
+ on('-P', '--map FILE', 'Enable/Disable source map') do |file|
123
+ options[:map] = file
132
124
  end
133
125
 
134
126
  on('-F', '--file FILE', 'Set filename for compiled code') do |file|
135
127
  options[:file] = file
136
128
  end
137
129
 
130
+ on('-L', '--library', 'Compile only required libraries. Omit [programfile] and [-e]. Assumed [-cOE].') do
131
+ options[:lib_only] = true
132
+ options[:no_exit] = true
133
+ options[:compile] = true
134
+ options[:skip_opal_require] = true
135
+ end
136
+
138
137
  on("--irb", "Enable IRB var mode") do
139
138
  options[:irb] = true
140
139
  end
141
140
 
141
+ on('--enable-source-location', 'Compiles source location for each method definition.') do
142
+ options[:enable_source_location] = true
143
+ end
144
+
145
+ on('--parse-comments', 'Compiles comments for each method definition.') do
146
+ options[:parse_comments] = true
147
+ end
148
+
142
149
  separator ''
143
150
  end
144
151
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/cli_runners'
2
3
 
3
4
  module Opal
@@ -22,15 +23,14 @@ module Opal
22
23
  # tempfile = File.new('opal-applescript-runner.js', 'w') # for debugging
23
24
  tempfile.write code
24
25
  tempfile.close
25
- successful = system_with_output('osascript', '-l', 'JavaScript', tempfile.path , *argv)
26
-
26
+ _successful = system_with_output('osascript', '-l', 'JavaScript', tempfile.path , *argv)
27
27
  rescue Errno::ENOENT
28
28
  raise MissingAppleScript, 'AppleScript is only available on Mac OS X.'
29
29
  end
30
30
 
31
31
  # Let's support fake IO objects like StringIO
32
32
  def system_with_output(env, *cmd)
33
- if (io_output = IO.try_convert(output))
33
+ if (_io_output = IO.try_convert(output))
34
34
  system(env,*cmd)
35
35
  @exit_status = $?.exitstatus
36
36
  return
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/cli_runners'
2
3
  require 'opal/paths'
3
4
 
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/cli_runners'
2
3
  require 'opal/paths'
4
+ require 'shellwords'
3
5
 
4
6
  module Opal
5
7
  module CliRunners
@@ -25,7 +27,8 @@ module Opal
25
27
  # tempfile = File.new('opal-nodejs-runner.js', 'w') # for debugging
26
28
  tempfile.write code
27
29
  tempfile.close
28
- system_with_output({'NODE_PATH' => node_modules}, 'node', tempfile.path , *argv)
30
+ node_opt = ENV['NODE_OPT'].to_s.shellsplit
31
+ system_with_output({'NODE_PATH' => node_modules}, 'node', *node_opt, tempfile.path, *argv)
29
32
  rescue Errno::ENOENT
30
33
  raise MissingNodeJS, 'Please install Node.js to be able to run Opal scripts.'
31
34
  end
@@ -6,7 +6,7 @@ page.onConsoleMessage = function(msg) {
6
6
  system.stdout.write(msg);
7
7
  };
8
8
 
9
- var opal_code = fs.read('/dev/stdin');
9
+ var opal_code = system.stdin.read();
10
10
 
11
11
  /*
12
12
  * Exit phantom instance "safely" see - https://github.com/ariya/phantomjs/issues/12697
@@ -67,4 +67,3 @@ page.setContent("<!doctype html>\n"+
67
67
  "<head><meta charset='utf-8'/></head><body>"+
68
68
  "</body></html>",
69
69
  'http://www.example.com');
70
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'shellwords'
2
3
 
3
4
  module Opal
@@ -11,13 +12,13 @@ module Opal
11
12
  attr_reader :output, :exit_status
12
13
 
13
14
  def run(code, argv)
14
- command = [
15
+ phantomjs_command = [
15
16
  'phantomjs',
16
17
  SCRIPT_PATH.shellescape,
17
18
  *argv.map(&:shellescape)
18
19
  ].join(' ')
19
20
 
20
- phantomjs = IO.popen(command, 'w', out: output) do |io|
21
+ IO.popen(phantomjs_command, 'w', out: output) do |io|
21
22
  io.write(code)
22
23
  end
23
24
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/cli_runners'
2
3
 
3
4
  module Opal
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Opal
2
3
  # `Opal::CliRunners` is the namespace in which JavaScript runners can be
3
4
  # defined for use by `Opal::CLI`. The API for classes defined under
data/lib/opal/compiler.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'set'
2
3
  require 'opal/parser'
3
4
  require 'opal/fragment'
@@ -106,7 +107,7 @@ module Opal
106
107
  # @!method dynamic_require_severity
107
108
  #
108
109
  # how to handle dynamic requires (:error, :warning, :ignore)
109
- compiler_option :dynamic_require_severity, :warning, :valid_values => [:error, :warning, :ignore]
110
+ compiler_option :dynamic_require_severity, :ignore, :valid_values => [:error, :warning, :ignore]
110
111
 
111
112
  # @!method requirable?
112
113
  #
@@ -120,6 +121,16 @@ module Opal
120
121
 
121
122
  compiler_option :eval, false, as: :eval?
122
123
 
124
+ # @!method enable_source_location?
125
+ #
126
+ # Adds source_location for every method definition
127
+ compiler_option :enable_source_location, false, :as => :enable_source_location?
128
+
129
+ # @!method parse_comments?
130
+ #
131
+ # Adds comments for every method definition
132
+ compiler_option :parse_comments, false, :as => :parse_comments?
133
+
123
134
  # @return [String] The compiled ruby code
124
135
  attr_reader :result
125
136
 
@@ -135,34 +146,47 @@ module Opal
135
146
  # Any content in __END__ special construct
136
147
  attr_reader :eof_content
137
148
 
149
+ # Comments from the source code
150
+ attr_reader :comments
151
+
138
152
  def initialize(source, options = {})
139
153
  @source = source
140
154
  @indent = ''
141
155
  @unique = 0
142
156
  @options = options
157
+ @comments = Hash.new([])
143
158
  end
144
159
 
145
160
  # Compile some ruby code to a string.
146
161
  #
147
162
  # @return [String] javascript code
148
163
  def compile
149
- @parser = Parser.new
150
-
151
- parsed = begin
152
- @parser.parse(@source, self.file)
153
- rescue => error
154
- raise SyntaxError, error.message, error.backtrace
155
- end
156
-
157
- @sexp = s(:top, parsed || s(:nil))
158
- @eof_content = @parser.lexer.eof_content
164
+ parse
159
165
 
160
166
  @fragments = process(@sexp).flatten
161
167
 
162
168
  @result = @fragments.map(&:code).join('')
163
- rescue Exception => error
164
- message = "An error occurred while compiling: #{self.file}\n#{error.message}"
165
- raise error.class, message, error.backtrace
169
+ end
170
+
171
+ def parse
172
+ buffer = ::Parser::Source::Buffer.new(file)
173
+ buffer.source = @source
174
+
175
+ @parser = Opal::Parser.default_parser
176
+
177
+ begin
178
+ if parse_comments?
179
+ sexp, comments = @parser.parse_with_comments(buffer)
180
+ @comments = ::Parser::Source::Comment.associate_locations(sexp, comments)
181
+ else
182
+ sexp = @parser.parse(buffer)
183
+ end
184
+ rescue ::Parser::SyntaxError => error
185
+ raise ::SyntaxError, error.message, error.backtrace
186
+ end
187
+
188
+ @sexp = s(:top, sexp || s(:nil))
189
+ @eof_content = extract_eof_content
166
190
  end
167
191
 
168
192
  # Returns a source map that can be used in the browser to map back to
@@ -217,8 +241,8 @@ module Opal
217
241
  # Create a new sexp using the given parts. Even though this just
218
242
  # returns an array, it must be used incase the internal structure
219
243
  # of sexps does change.
220
- def s(*parts)
221
- Sexp.new(parts)
244
+ def s(type, *children)
245
+ ::Opal::AST::Node.new(type, children)
222
246
  end
223
247
 
224
248
  def fragment(str, scope, sexp = nil)
@@ -227,8 +251,19 @@ module Opal
227
251
 
228
252
  # Used to generate a unique id name per file. These are used
229
253
  # mainly to name method bodies for methods that use blocks.
230
- def unique_temp
231
- "TMP_#{@unique += 1}"
254
+ def unique_temp(name)
255
+ name = name.to_s
256
+ if name && !name.empty?
257
+ name = "_#{name}"
258
+ .gsub('?', '$q')
259
+ .gsub('!', '$B')
260
+ .gsub('=', '$eq')
261
+ .gsub('<', '$lt')
262
+ .gsub('>', '$gt')
263
+ .gsub(/[^\w\$]/, '$')
264
+ end
265
+ unique = (@unique += 1)
266
+ "TMP#{name}_#{unique}"
232
267
  end
233
268
 
234
269
  # Use the given helper
@@ -266,14 +301,14 @@ module Opal
266
301
  def in_while
267
302
  return unless block_given?
268
303
  @while_loop = @scope.push_while
269
- result = yield
304
+ result = indent { yield }
270
305
  @scope.pop_while
271
-
272
306
  result
273
307
  end
274
308
 
275
309
  def in_ensure
276
310
  return unless block_given?
311
+
277
312
  @in_ensure = true
278
313
  result = yield
279
314
  @in_ensure = false
@@ -282,31 +317,7 @@ module Opal
282
317
  end
283
318
 
284
319
  def in_ensure?
285
- @in_ensure
286
- end
287
-
288
- # With a block will detect a break in the sexp processed from within
289
- # the block (see BreakNode).
290
- #
291
- # Without a block (but inside a `#has_break?(&block)` call) returns the
292
- # current result.
293
- #
294
- # Works in conjunction with #has_break!
295
- #
296
- # @return [Boolean] whether a block has been detected
297
- def has_break?
298
- return @break_detected unless block_given?
299
- @break_detected = false
300
- result = yield
301
- detected = @break_detected
302
- @break_detected = nil
303
- detected
304
- end
305
-
306
- # Marks the current block has having detected a break, but only from inside
307
- # a `#has_break?(&block)` block.
308
- def has_break!
309
- @break_detected = true if @break_detected == false
320
+ !!@in_ensure
310
321
  end
311
322
 
312
323
  def in_case
@@ -365,69 +376,101 @@ module Opal
365
376
  return returns s(:nil) unless sexp
366
377
 
367
378
  case sexp.type
368
- # Undefs go from 1 ruby undef a,b,c to multiple JS Opal.udef() calls, so need to treat them as individual statements
369
- # and put the return on the last one
370
379
  when :undef
371
- last = sexp.pop
372
- sexp << returns(last)
380
+ # undef :method_name always returns nil
381
+ returns s(:begin, sexp, s(:nil))
373
382
  when :break, :next, :redo
374
383
  sexp
375
384
  when :yield
376
- sexp[0] = :returnable_yield
377
- sexp
378
- when :scope
379
- sexp[1] = returns sexp[1]
380
- sexp
381
- when :block
382
- if sexp.length > 1
383
- sexp[-1] = returns sexp[-1]
384
- else
385
- sexp << returns(s(:nil))
386
- end
387
- sexp
385
+ sexp.updated(:returnable_yield, nil)
388
386
  when :when
389
- sexp[2] = returns(sexp[2])
390
- sexp
387
+ *when_sexp, then_sexp = *sexp
388
+ sexp.updated(nil,
389
+ [*when_sexp, returns(then_sexp)]
390
+ )
391
391
  when :rescue
392
- sexp[1] = returns sexp[1]
392
+ body_sexp, *resbodies, else_sexp = *sexp
393
393
 
394
- if sexp[2] and sexp[2][0] == :resbody
395
- if sexp[2][2]
396
- sexp[2][2] = returns sexp[2][2]
397
- else
398
- sexp[2][2] = returns s(:nil)
399
- end
394
+ resbodies = resbodies.map do |resbody|
395
+ returns(resbody)
400
396
  end
401
- sexp
397
+
398
+ if else_sexp
399
+ else_sexp = returns(else_sexp)
400
+ end
401
+
402
+ sexp.updated(nil, [
403
+ returns(body_sexp),
404
+ *resbodies,
405
+ else_sexp
406
+ ])
407
+ when :resbody
408
+ klass, lvar, body = *sexp
409
+ sexp.updated(nil, [klass, lvar, returns(body)])
402
410
  when :ensure
403
- sexp[1] = returns sexp[1]
404
- sexp
405
- when :begin
406
- sexp[1] = returns sexp[1]
407
- sexp
408
- when :rescue_mod
409
- sexp[1] = returns sexp[1]
410
- sexp[2] = returns sexp[2]
411
+ rescue_sexp, ensure_body = *sexp
412
+ sexp = sexp.updated(nil,
413
+ [returns(rescue_sexp), ensure_body]
414
+ )
415
+ s(:js_return, sexp)
416
+ when :begin, :kwbegin
417
+ # Wrapping last expression with s(:js_return, ...)
418
+ *rest, last = *sexp
419
+ sexp.updated(
420
+ nil,
421
+ [*rest, returns(last)]
422
+ )
423
+ when :while, :until, :while_post, :until_post
411
424
  sexp
412
- when :while
413
- # sexp[2] = returns(sexp[2])
414
- sexp
415
- when :return, :js_return
425
+ when :return, :js_return, :returnable_yield
416
426
  sexp
417
427
  when :xstr
418
- sexp[1] = "return #{sexp[1]};" unless /return|;/ =~ sexp[1]
419
- sexp
420
- when :dxstr
421
- sexp[1] = "return #{sexp[1]}" unless /return|;|\n/ =~ sexp[1]
422
- sexp
428
+ if sexp.children.any?
429
+ strs = sexp.
430
+ children.
431
+ select { |child| child.type == :str }.
432
+ map { |child| child.children[0] }
433
+
434
+ multiline = strs.any? { |str| str.end_with?(";\n") }
435
+
436
+ first_child, *rest_children = *sexp
437
+
438
+ if multiline
439
+ # xstr starts with interpolation
440
+ # then it must contain js_return inside
441
+ sexp
442
+ else
443
+ if first_child.type == :str
444
+ old_value = first_child.children[0]
445
+ if old_value.include?('return')
446
+ # 'return' is already there
447
+ sexp
448
+ else
449
+ first_child = s(:js_return, first_child)
450
+ sexp.updated(nil, [first_child, *rest_children])
451
+ end
452
+ else
453
+ s(:js_return, sexp)
454
+ end
455
+ end
456
+ else
457
+ returns s(:str, '')
458
+ end
423
459
  when :if
424
- sexp[2] = returns(sexp[2] || s(:nil))
425
- sexp[3] = returns(sexp[3] || s(:nil))
426
- sexp
460
+ cond, true_body, false_body = *sexp
461
+ sexp.updated(
462
+ nil, [
463
+ cond,
464
+ returns(true_body),
465
+ returns(false_body)
466
+ ]
467
+ )
427
468
  else
428
- return_sexp = s(:js_return, sexp)
429
- return_sexp.source = sexp.source
430
- return_sexp
469
+ s(:js_return, sexp).updated(
470
+ nil,
471
+ nil,
472
+ location: sexp.loc
473
+ )
431
474
  end
432
475
  end
433
476
 
@@ -441,5 +484,13 @@ module Opal
441
484
  fragment("false", scope, sexp)
442
485
  end
443
486
  end
487
+
488
+ # Extracts all the content after __END__ directive
489
+ #
490
+ # @return [String, nil]
491
+ def extract_eof_content
492
+ matches = @source.match(/\n__END__\n?([\w\s]*)/)
493
+ matches && matches[1]
494
+ end
444
495
  end
445
496
  end