opal-cj 0.7.0.beta1

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 (470) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +27 -0
  4. data/.rspec +3 -0
  5. data/.spectator +2 -0
  6. data/.spectator-mspec +3 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.md +406 -0
  9. data/CONTRIBUTING.md +41 -0
  10. data/Gemfile +27 -0
  11. data/Guardfile +77 -0
  12. data/LICENSE +19 -0
  13. data/README.md +178 -0
  14. data/Rakefile +116 -0
  15. data/benchmarks/operators.rb +11 -0
  16. data/bin/opal +22 -0
  17. data/bin/opal-build +77 -0
  18. data/bin/opal-mspec +10 -0
  19. data/bin/opal-repl +72 -0
  20. data/config.ru +14 -0
  21. data/examples/rack/Gemfile +3 -0
  22. data/examples/rack/app/application.rb +13 -0
  23. data/examples/rack/app/user.rb +21 -0
  24. data/examples/rack/config.ru +7 -0
  25. data/examples/rack/index.html.erb +10 -0
  26. data/examples/sinatra/Gemfile +4 -0
  27. data/examples/sinatra/app/application.rb +7 -0
  28. data/examples/sinatra/config.ru +28 -0
  29. data/lib/mspec/opal/main.rb.erb +9 -0
  30. data/lib/mspec/opal/rake_task.rb +278 -0
  31. data/lib/mspec/opal/runner.rb +206 -0
  32. data/lib/mspec/opal/sprockets.js +57 -0
  33. data/lib/opal.rb +11 -0
  34. data/lib/opal/builder.rb +135 -0
  35. data/lib/opal/builder_processors.rb +165 -0
  36. data/lib/opal/cli.rb +145 -0
  37. data/lib/opal/cli_options.rb +149 -0
  38. data/lib/opal/cli_runners.rb +10 -0
  39. data/lib/opal/cli_runners/nodejs.rb +56 -0
  40. data/lib/opal/cli_runners/phantom.js +35 -0
  41. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  42. data/lib/opal/cli_runners/server.rb +54 -0
  43. data/lib/opal/compiler.rb +307 -0
  44. data/lib/opal/erb.rb +64 -0
  45. data/lib/opal/fragment.rb +41 -0
  46. data/lib/opal/hike_path_finder.rb +18 -0
  47. data/lib/opal/nodes.rb +26 -0
  48. data/lib/opal/nodes/arglist.rb +56 -0
  49. data/lib/opal/nodes/array.rb +54 -0
  50. data/lib/opal/nodes/base.rb +151 -0
  51. data/lib/opal/nodes/call.rb +283 -0
  52. data/lib/opal/nodes/call_special.rb +178 -0
  53. data/lib/opal/nodes/case.rb +96 -0
  54. data/lib/opal/nodes/class.rb +42 -0
  55. data/lib/opal/nodes/constants.rb +78 -0
  56. data/lib/opal/nodes/def.rb +157 -0
  57. data/lib/opal/nodes/defined.rb +113 -0
  58. data/lib/opal/nodes/definitions.rb +168 -0
  59. data/lib/opal/nodes/for.rb +35 -0
  60. data/lib/opal/nodes/hash.rb +67 -0
  61. data/lib/opal/nodes/helpers.rb +114 -0
  62. data/lib/opal/nodes/if.rb +67 -0
  63. data/lib/opal/nodes/iter.rb +131 -0
  64. data/lib/opal/nodes/literal.rb +230 -0
  65. data/lib/opal/nodes/logic.rb +217 -0
  66. data/lib/opal/nodes/masgn.rb +62 -0
  67. data/lib/opal/nodes/module.rb +46 -0
  68. data/lib/opal/nodes/rescue.rb +135 -0
  69. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  70. data/lib/opal/nodes/scope.rb +293 -0
  71. data/lib/opal/nodes/singleton_class.rb +25 -0
  72. data/lib/opal/nodes/super.rb +97 -0
  73. data/lib/opal/nodes/top.rb +101 -0
  74. data/lib/opal/nodes/variables.rb +158 -0
  75. data/lib/opal/nodes/while.rb +65 -0
  76. data/lib/opal/nodes/yield.rb +95 -0
  77. data/lib/opal/parser.rb +658 -0
  78. data/lib/opal/parser/grammar.rb +5452 -0
  79. data/lib/opal/parser/grammar.y +1684 -0
  80. data/lib/opal/parser/keywords.rb +66 -0
  81. data/lib/opal/parser/lexer.rb +1208 -0
  82. data/lib/opal/parser/parser_scope.rb +25 -0
  83. data/lib/opal/parser/sexp.rb +75 -0
  84. data/lib/opal/path_reader.rb +28 -0
  85. data/lib/opal/paths.rb +38 -0
  86. data/lib/opal/source_map.rb +70 -0
  87. data/lib/opal/sprockets.rb +4 -0
  88. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  89. data/lib/opal/sprockets/environment.rb +37 -0
  90. data/lib/opal/sprockets/erb.rb +37 -0
  91. data/lib/opal/sprockets/path_reader.rb +34 -0
  92. data/lib/opal/sprockets/processor.rb +124 -0
  93. data/lib/opal/sprockets/server.rb +180 -0
  94. data/lib/opal/util.rb +64 -0
  95. data/lib/opal/version.rb +3 -0
  96. data/opal.gemspec +36 -0
  97. data/opal/README.md +6 -0
  98. data/opal/corelib/array.rb +1556 -0
  99. data/opal/corelib/array/inheritance.rb +113 -0
  100. data/opal/corelib/basic_object.rb +73 -0
  101. data/opal/corelib/boolean.rb +41 -0
  102. data/opal/corelib/class.rb +55 -0
  103. data/opal/corelib/comparable.rb +56 -0
  104. data/opal/corelib/complex.rb +3 -0
  105. data/opal/corelib/dir.rb +20 -0
  106. data/opal/corelib/enumerable.rb +1132 -0
  107. data/opal/corelib/enumerator.rb +422 -0
  108. data/opal/corelib/error.rb +63 -0
  109. data/opal/corelib/file.rb +56 -0
  110. data/opal/corelib/hash.rb +728 -0
  111. data/opal/corelib/helpers.rb +102 -0
  112. data/opal/corelib/io.rb +59 -0
  113. data/opal/corelib/kernel.rb +569 -0
  114. data/opal/corelib/main.rb +7 -0
  115. data/opal/corelib/match_data.rb +114 -0
  116. data/opal/corelib/method.rb +58 -0
  117. data/opal/corelib/module.rb +462 -0
  118. data/opal/corelib/nil_class.rb +62 -0
  119. data/opal/corelib/numeric.rb +532 -0
  120. data/opal/corelib/proc.rb +52 -0
  121. data/opal/corelib/range.rb +116 -0
  122. data/opal/corelib/rational.rb +3 -0
  123. data/opal/corelib/regexp.rb +133 -0
  124. data/opal/corelib/runtime.js +1240 -0
  125. data/opal/corelib/string.rb +1212 -0
  126. data/opal/corelib/string/inheritance.rb +78 -0
  127. data/opal/corelib/struct.rb +141 -0
  128. data/opal/corelib/time.rb +584 -0
  129. data/opal/corelib/variables.rb +24 -0
  130. data/opal/opal.rb +32 -0
  131. data/package.json +9 -0
  132. data/spec/filters/bugs/array.rb +232 -0
  133. data/spec/filters/bugs/basic_object.rb +14 -0
  134. data/spec/filters/bugs/class.rb +21 -0
  135. data/spec/filters/bugs/enumerable.rb +69 -0
  136. data/spec/filters/bugs/enumerator.rb +3 -0
  137. data/spec/filters/bugs/hash.rb +128 -0
  138. data/spec/filters/bugs/kernel.rb +10 -0
  139. data/spec/filters/bugs/language.rb +415 -0
  140. data/spec/filters/bugs/math.rb +95 -0
  141. data/spec/filters/bugs/module.rb +14 -0
  142. data/spec/filters/bugs/nil.rb +7 -0
  143. data/spec/filters/bugs/numeric.rb +20 -0
  144. data/spec/filters/bugs/opal.rb +14 -0
  145. data/spec/filters/bugs/regexp.rb +11 -0
  146. data/spec/filters/bugs/set.rb +7 -0
  147. data/spec/filters/bugs/singleton.rb +6 -0
  148. data/spec/filters/bugs/string.rb +360 -0
  149. data/spec/filters/bugs/stringscanner.rb +22 -0
  150. data/spec/filters/bugs/struct.rb +45 -0
  151. data/spec/filters/bugs/time.rb +177 -0
  152. data/spec/filters/bugs/unknown.rb +11 -0
  153. data/spec/filters/unsupported/encoding.rb +95 -0
  154. data/spec/filters/unsupported/enumerator.rb +14 -0
  155. data/spec/filters/unsupported/float.rb +5 -0
  156. data/spec/filters/unsupported/frozen.rb +90 -0
  157. data/spec/filters/unsupported/hash_compare_by_identity.rb +16 -0
  158. data/spec/filters/unsupported/integer_size.rb +7 -0
  159. data/spec/filters/unsupported/method_added.rb +10 -0
  160. data/spec/filters/unsupported/mutable_strings.rb +361 -0
  161. data/spec/filters/unsupported/private_constants.rb +30 -0
  162. data/spec/filters/unsupported/private_methods.rb +44 -0
  163. data/spec/filters/unsupported/random.rb +4 -0
  164. data/spec/filters/unsupported/ruby_exe.rb +5 -0
  165. data/spec/filters/unsupported/tainted.rb +155 -0
  166. data/spec/filters/unsupported/time.rb +21 -0
  167. data/spec/filters/unsupported/trusted.rb +80 -0
  168. data/spec/lib/builder_processors_spec.rb +27 -0
  169. data/spec/lib/builder_spec.rb +66 -0
  170. data/spec/lib/cli_spec.rb +134 -0
  171. data/spec/lib/compiler_spec.rb +197 -0
  172. data/spec/lib/dependency_resolver_spec.rb +40 -0
  173. data/spec/lib/fixtures/no_requires.rb +1 -0
  174. data/spec/lib/fixtures/opal_file.rb +2 -0
  175. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  176. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  177. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  178. data/spec/lib/fixtures/requires.rb +7 -0
  179. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  180. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  181. data/spec/lib/hike_path_finder_spec.rb +23 -0
  182. data/spec/lib/lexer_spec.rb +110 -0
  183. data/spec/lib/parser/alias_spec.rb +26 -0
  184. data/spec/lib/parser/and_spec.rb +13 -0
  185. data/spec/lib/parser/attrasgn_spec.rb +28 -0
  186. data/spec/lib/parser/begin_spec.rb +42 -0
  187. data/spec/lib/parser/block_spec.rb +12 -0
  188. data/spec/lib/parser/break_spec.rb +17 -0
  189. data/spec/lib/parser/call_spec.rb +139 -0
  190. data/spec/lib/parser/class_spec.rb +35 -0
  191. data/spec/lib/parser/comments_spec.rb +11 -0
  192. data/spec/lib/parser/def_spec.rb +61 -0
  193. data/spec/lib/parser/if_spec.rb +26 -0
  194. data/spec/lib/parser/iter_spec.rb +59 -0
  195. data/spec/lib/parser/lambda_spec.rb +64 -0
  196. data/spec/lib/parser/literal_spec.rb +118 -0
  197. data/spec/lib/parser/masgn_spec.rb +37 -0
  198. data/spec/lib/parser/module_spec.rb +27 -0
  199. data/spec/lib/parser/not_spec.rb +27 -0
  200. data/spec/lib/parser/op_asgn1_spec.rb +23 -0
  201. data/spec/lib/parser/op_asgn2_spec.rb +23 -0
  202. data/spec/lib/parser/or_spec.rb +13 -0
  203. data/spec/lib/parser/return_spec.rb +17 -0
  204. data/spec/lib/parser/sclass_spec.rb +21 -0
  205. data/spec/lib/parser/string_spec.rb +276 -0
  206. data/spec/lib/parser/super_spec.rb +20 -0
  207. data/spec/lib/parser/unary_spec.rb +48 -0
  208. data/spec/lib/parser/undef_spec.rb +15 -0
  209. data/spec/lib/parser/unless_spec.rb +13 -0
  210. data/spec/lib/parser/variables_spec.rb +92 -0
  211. data/spec/lib/parser/while_spec.rb +15 -0
  212. data/spec/lib/parser/yield_spec.rb +20 -0
  213. data/spec/lib/path_reader_spec.rb +24 -0
  214. data/spec/lib/shared/path_finder_shared.rb +19 -0
  215. data/spec/lib/shared/path_reader_shared.rb +31 -0
  216. data/spec/lib/spec_helper.rb +9 -0
  217. data/spec/lib/sprockets/environment_spec.rb +30 -0
  218. data/spec/lib/sprockets/erb_spec.rb +25 -0
  219. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  220. data/spec/lib/sprockets/processor_spec.rb +35 -0
  221. data/spec/lib/sprockets/server_spec.rb +20 -0
  222. data/spec/opal/compiler/irb_spec.rb +44 -0
  223. data/spec/opal/core/array/select_spec.rb +14 -0
  224. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  225. data/spec/opal/core/date_spec.rb +122 -0
  226. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  227. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  228. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  229. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  230. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  231. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  232. data/spec/opal/core/enumerable/each_slice_break.rb +6 -0
  233. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  234. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  235. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  238. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  242. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  246. data/spec/opal/core/fixtures/class.rb +124 -0
  247. data/spec/opal/core/fixtures/class_variables.rb +0 -0
  248. data/spec/opal/core/fixtures/constants.rb +33 -0
  249. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  250. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  251. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  252. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  253. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  254. data/spec/opal/core/kernel/Array_spec.rb +10 -0
  255. data/spec/opal/core/kernel/block_given_spec.rb +30 -0
  256. data/spec/opal/core/kernel/class_spec.rb +6 -0
  257. data/spec/opal/core/kernel/define_singleton_method_spec.rb +21 -0
  258. data/spec/opal/core/kernel/equal_value_spec.rb +12 -0
  259. data/spec/opal/core/kernel/extend_spec.rb +21 -0
  260. data/spec/opal/core/kernel/format_spec.rb +122 -0
  261. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  262. data/spec/opal/core/kernel/instance_eval_spec.rb +28 -0
  263. data/spec/opal/core/kernel/instance_variable_defined_spec.rb +15 -0
  264. data/spec/opal/core/kernel/instance_variable_get_spec.rb +14 -0
  265. data/spec/opal/core/kernel/instance_variable_set_spec.rb +10 -0
  266. data/spec/opal/core/kernel/loop_spec.rb +23 -0
  267. data/spec/opal/core/kernel/match_spec.rb +5 -0
  268. data/spec/opal/core/kernel/method_spec.rb +31 -0
  269. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  270. data/spec/opal/core/kernel/nil_spec.rb +7 -0
  271. data/spec/opal/core/kernel/p_spec.rb +15 -0
  272. data/spec/opal/core/kernel/printf_spec.rb +11 -0
  273. data/spec/opal/core/kernel/proc_spec.rb +13 -0
  274. data/spec/opal/core/kernel/rand_spec.rb +23 -0
  275. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  276. data/spec/opal/core/kernel/respond_to_spec.rb +41 -0
  277. data/spec/opal/core/kernel/send_spec.rb +56 -0
  278. data/spec/opal/core/kernel/sprintf_spec.rb +5 -0
  279. data/spec/opal/core/language/block_spec.rb +538 -0
  280. data/spec/opal/core/language/fixtures/array.rb +11 -0
  281. data/spec/opal/core/language/fixtures/block.rb +57 -0
  282. data/spec/opal/core/language/fixtures/break.rb +240 -0
  283. data/spec/opal/core/language/fixtures/ensure.rb +72 -0
  284. data/spec/opal/core/language/fixtures/literal_lambda.rb +7 -0
  285. data/spec/opal/core/language/fixtures/metaclass.rb +33 -0
  286. data/spec/opal/core/language/fixtures/module.rb +24 -0
  287. data/spec/opal/core/language/fixtures/next.rb +128 -0
  288. data/spec/opal/core/language/fixtures/return.rb +118 -0
  289. data/spec/opal/core/language/fixtures/send.rb +110 -0
  290. data/spec/opal/core/language/fixtures/send_1.9.rb +22 -0
  291. data/spec/opal/core/language/fixtures/super.rb +308 -0
  292. data/spec/opal/core/language/fixtures/variables.rb +58 -0
  293. data/spec/opal/core/language/fixtures/yield.rb +28 -0
  294. data/spec/opal/core/language/predefined_spec.rb +85 -0
  295. data/spec/opal/core/language/proc_spec.rb +263 -0
  296. data/spec/opal/core/language/regexp_spec.rb +20 -0
  297. data/spec/opal/core/language/send_spec.rb +225 -0
  298. data/spec/opal/core/language/string_spec.rb +44 -0
  299. data/spec/opal/core/language/symbol_spec.rb +40 -0
  300. data/spec/opal/core/language/variables_spec.rb +1366 -0
  301. data/spec/opal/core/language/versions/array_1.9.rb +39 -0
  302. data/spec/opal/core/language/versions/block_1.9.rb +0 -0
  303. data/spec/opal/core/language/versions/break_1.9.rb +0 -0
  304. data/spec/opal/core/language/versions/case_1.9.rb +20 -0
  305. data/spec/opal/core/language/versions/hash_1.9.rb +18 -0
  306. data/spec/opal/core/language/versions/literal_lambda_1.9.rb +143 -0
  307. data/spec/opal/core/language/versions/not_1.9.rb +22 -0
  308. data/spec/opal/core/language/versions/send_1.9.rb +241 -0
  309. data/spec/opal/core/language/versions/symbol_1.9.rb +15 -0
  310. data/spec/opal/core/language/versions/variables_1.9.rb +8 -0
  311. data/spec/opal/core/module/alias_method_spec.rb +28 -0
  312. data/spec/opal/core/module/ancestors_spec.rb +11 -0
  313. data/spec/opal/core/module/append_features_spec.rb +14 -0
  314. data/spec/opal/core/module/attr_accessor_spec.rb +26 -0
  315. data/spec/opal/core/module/const_defined_spec.rb +85 -0
  316. data/spec/opal/core/module/const_get_spec.rb +85 -0
  317. data/spec/opal/core/module/const_missing_spec.rb +17 -0
  318. data/spec/opal/core/module/const_set_spec.rb +64 -0
  319. data/spec/opal/core/module/constants_spec.rb +49 -0
  320. data/spec/opal/core/module/fixtures/classes.rb +434 -0
  321. data/spec/opal/core/module/method_defined_spec.rb +48 -0
  322. data/spec/opal/core/module/module_function_spec.rb +25 -0
  323. data/spec/opal/core/module/name_spec.rb +52 -0
  324. data/spec/opal/core/module/public_method_defined_spec.rb +18 -0
  325. data/spec/opal/core/module/remove_const_spec.rb +22 -0
  326. data/spec/opal/core/module/undef_method_spec.rb +66 -0
  327. data/spec/opal/core/numeric/bit_and_spec.rb +7 -0
  328. data/spec/opal/core/numeric/bit_or_spec.rb +8 -0
  329. data/spec/opal/core/numeric/bit_xor_spec.rb +6 -0
  330. data/spec/opal/core/numeric/ceil_spec.rb +8 -0
  331. data/spec/opal/core/numeric/chr_spec.rb +8 -0
  332. data/spec/opal/core/numeric/comparison_spec.rb +24 -0
  333. data/spec/opal/core/numeric/complement_spec.rb +8 -0
  334. data/spec/opal/core/numeric/divide_spec.rb +10 -0
  335. data/spec/opal/core/numeric/eql_spec.rb +9 -0
  336. data/spec/opal/core/numeric/exponent_spec.rb +33 -0
  337. data/spec/opal/core/numeric/floor_spec.rb +8 -0
  338. data/spec/opal/core/numeric/gt_spec.rb +11 -0
  339. data/spec/opal/core/numeric/gte_spec.rb +12 -0
  340. data/spec/opal/core/numeric/integer_spec.rb +9 -0
  341. data/spec/opal/core/numeric/left_shift_spec.rb +21 -0
  342. data/spec/opal/core/numeric/lt_spec.rb +11 -0
  343. data/spec/opal/core/numeric/lte_spec.rb +12 -0
  344. data/spec/opal/core/numeric/minus_spec.rb +8 -0
  345. data/spec/opal/core/numeric/modulo_spec.rb +19 -0
  346. data/spec/opal/core/numeric/multiply_spec.rb +9 -0
  347. data/spec/opal/core/numeric/next_spec.rb +9 -0
  348. data/spec/opal/core/numeric/ord_spec.rb +9 -0
  349. data/spec/opal/core/numeric/plus_spec.rb +8 -0
  350. data/spec/opal/core/numeric/pred_spec.rb +7 -0
  351. data/spec/opal/core/numeric/right_shift_spec.rb +25 -0
  352. data/spec/opal/core/numeric/step_spec.rb +11 -0
  353. data/spec/opal/core/numeric/succ_spec.rb +9 -0
  354. data/spec/opal/core/numeric/times_spec.rb +36 -0
  355. data/spec/opal/core/numeric/to_f_spec.rb +7 -0
  356. data/spec/opal/core/numeric/to_i_spec.rb +7 -0
  357. data/spec/opal/core/numeric/to_json_spec.rb +8 -0
  358. data/spec/opal/core/numeric/to_s_spec.rb +26 -0
  359. data/spec/opal/core/numeric/uminus_spec.rb +9 -0
  360. data/spec/opal/core/numeric/upto_spec.rb +19 -0
  361. data/spec/opal/core/numeric/zero_spec.rb +7 -0
  362. data/spec/opal/core/proc/call_spec.rb +21 -0
  363. data/spec/opal/core/proc/element_reference_spec.rb +21 -0
  364. data/spec/opal/core/proc/proc_tricks_spec.rb +7 -0
  365. data/spec/opal/core/runtime/begin_spec.rb +39 -0
  366. data/spec/opal/core/runtime/block_send_spec.rb +28 -0
  367. data/spec/opal/core/runtime/block_spec.rb +23 -0
  368. data/spec/opal/core/runtime/bridged_classes_spec.rb +64 -0
  369. data/spec/opal/core/runtime/constants_spec.rb +13 -0
  370. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  371. data/spec/opal/core/runtime/main_methods_spec.rb +27 -0
  372. data/spec/opal/core/runtime/method_missing_spec.rb +62 -0
  373. data/spec/opal/core/runtime/method_spec.rb +31 -0
  374. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  375. data/spec/opal/core/runtime/paren_spec.rb +14 -0
  376. data/spec/opal/core/runtime/rescue_spec.rb +38 -0
  377. data/spec/opal/core/runtime/return_spec.rb +38 -0
  378. data/spec/opal/core/runtime/send_spec.rb +34 -0
  379. data/spec/opal/core/runtime/singleton_class_spec.rb +13 -0
  380. data/spec/opal/core/runtime/super_spec.rb +212 -0
  381. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  382. data/spec/opal/core/runtime/variables_spec.rb +20 -0
  383. data/spec/opal/core/source_map_spec.rb +15 -0
  384. data/spec/opal/core/string_spec.rb +11 -0
  385. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  386. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  387. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  388. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  389. data/spec/opal/stdlib/json/ext_spec.rb +48 -0
  390. data/spec/opal/stdlib/json/parse_spec.rb +33 -0
  391. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  392. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  393. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  394. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  395. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  396. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  397. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  398. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  399. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  400. data/spec/opal/stdlib/native/new_spec.rb +8 -0
  401. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  402. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  403. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  404. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  405. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  406. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  407. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  408. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  409. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  410. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  411. data/spec/rubyspecs +329 -0
  412. data/spec/spec_helper.rb +42 -0
  413. data/spec/support/mspec_rspec_adapter.rb +33 -0
  414. data/spec/support/parser_helpers.rb +37 -0
  415. data/stdlib/README.md +3 -0
  416. data/stdlib/base64.rb +152 -0
  417. data/stdlib/benchmark.rb +10 -0
  418. data/stdlib/buffer.rb +40 -0
  419. data/stdlib/buffer/array.rb +66 -0
  420. data/stdlib/buffer/view.rb +70 -0
  421. data/stdlib/date.rb +170 -0
  422. data/stdlib/delegate.rb +29 -0
  423. data/stdlib/dir.rb +1 -0
  424. data/stdlib/encoding.rb +166 -0
  425. data/stdlib/enumerator.rb +1 -0
  426. data/stdlib/erb.rb +16 -0
  427. data/stdlib/file.rb +1 -0
  428. data/stdlib/forwardable.rb +71 -0
  429. data/stdlib/json.rb +182 -0
  430. data/stdlib/math.rb +370 -0
  431. data/stdlib/native.rb +530 -0
  432. data/stdlib/nodejs.rb +5 -0
  433. data/stdlib/nodejs/dir.rb +13 -0
  434. data/stdlib/nodejs/file.rb +98 -0
  435. data/stdlib/nodejs/fileutils.rb +26 -0
  436. data/stdlib/nodejs/io.rb +2 -0
  437. data/stdlib/nodejs/irb.rb +45 -0
  438. data/stdlib/nodejs/process.rb +16 -0
  439. data/stdlib/nodejs/require.rb +32 -0
  440. data/stdlib/nodejs/rubygems.rb +68 -0
  441. data/stdlib/nodejs/runtime.rb +25 -0
  442. data/stdlib/nodejs/yaml.rb +11 -0
  443. data/stdlib/observer.rb +202 -0
  444. data/stdlib/opal-parser.rb +53 -0
  445. data/stdlib/opal-source-maps.rb +2 -0
  446. data/stdlib/ostruct.rb +69 -0
  447. data/stdlib/pathname.rb +31 -0
  448. data/stdlib/phantomjs.rb +8 -0
  449. data/stdlib/pp.rb +12 -0
  450. data/stdlib/process.rb +10 -0
  451. data/stdlib/promise.rb +300 -0
  452. data/stdlib/racc/parser.rb +215 -0
  453. data/stdlib/rbconfig.rb +20 -0
  454. data/stdlib/securerandom.rb +12 -0
  455. data/stdlib/set.rb +116 -0
  456. data/stdlib/singleton.rb +40 -0
  457. data/stdlib/source_map.rb +5 -0
  458. data/stdlib/source_map/map.rb +220 -0
  459. data/stdlib/source_map/mapping.rb +26 -0
  460. data/stdlib/source_map/offset.rb +88 -0
  461. data/stdlib/source_map/version.rb +3 -0
  462. data/stdlib/source_map/vlq.rb +98 -0
  463. data/stdlib/sourcemap.rb +1 -0
  464. data/stdlib/stringio.rb +181 -0
  465. data/stdlib/strscan.rb +155 -0
  466. data/stdlib/template.rb +46 -0
  467. data/stdlib/thread.rb +160 -0
  468. data/stdlib/time.rb +9 -0
  469. data/tasks/github.rake +19 -0
  470. metadata +690 -0
@@ -0,0 +1,215 @@
1
+ # Opal port of racc/parser.rb.
2
+ #
3
+ # Original license:
4
+ #
5
+ # $originalId: parser.rb,v 1.8 2006/07/06 11:42:07 aamine Exp $
6
+ #
7
+ # Copyright (c) 1999-2006 Minero Aoki
8
+ #
9
+ # This program is free software.
10
+ # You can distribute/modify this program under the same terms of ruby.
11
+ #
12
+ # As a special exception, when this code is copied by Racc
13
+ # into a Racc output file, you may use that output file
14
+ # without restriction.
15
+ module Racc
16
+
17
+ class Parser
18
+
19
+ def _racc_setup
20
+ self.class::Racc_arg
21
+ end
22
+
23
+ def do_parse
24
+ _racc_do_parse_rb _racc_setup, false
25
+ end
26
+
27
+ def _racc_do_parse_rb(arg, in_debug)
28
+ action_table = arg[0]
29
+ action_check = arg[1]
30
+ action_default = arg[2]
31
+ action_pointer = arg[3]
32
+
33
+ goto_table = arg[4]
34
+ goto_check = arg[5]
35
+ goto_default = arg[6]
36
+ goto_pointer = arg[7]
37
+
38
+ nt_base = arg[8]
39
+ reduce_table = arg[9]
40
+ token_table = arg[10]
41
+ shift_n = arg[11]
42
+ reduce_n = arg[12]
43
+
44
+ use_result = arg[13]
45
+
46
+ # racc sys vars
47
+ racc_state = [0]
48
+ racc_tstack = []
49
+ racc_vstack = []
50
+
51
+ racc_t = nil
52
+ racc_tok = nil
53
+ racc_val = nil
54
+ racc_read_next = true
55
+
56
+ racc_user_yyerror = false
57
+ racc_error_status = 0
58
+
59
+ token = nil; act = nil; i = nil; nerr = nil; custate = nil
60
+
61
+ while true
62
+ i = action_pointer[racc_state[-1]]
63
+
64
+ if i
65
+ if racc_read_next
66
+ if racc_t != 0 # not EOF
67
+ token = next_token
68
+
69
+ racc_tok = token[0]
70
+ racc_val = token[1]
71
+
72
+ if racc_tok == false # EOF
73
+ racc_t = 0
74
+ else
75
+ racc_t = token_table[racc_tok]
76
+ racc_t = 1 unless racc_t
77
+ # racc_t ||= 1
78
+ end
79
+
80
+ racc_read_token(racc_t, racc_tok, racc_val) if @yydebug
81
+ racc_read_next = false
82
+ end
83
+ end
84
+
85
+ i += racc_t
86
+
87
+ if (i < 0) || (act = action_table[i]).nil? || (action_check[i] != racc_state[-1])
88
+ act = action_default[racc_state[-1]]
89
+ end
90
+
91
+ else
92
+ act = action_default[racc_state[-1]]
93
+ end
94
+
95
+ puts "(act: #{act}, shift_n: #{shift_n}, reduce_n: #{reduce_n})" if @yydebug
96
+ if act > 0 && act < shift_n
97
+ if racc_error_status > 0
98
+ if racc_t != 1
99
+ racc_error_status -= 1
100
+ end
101
+ end
102
+
103
+ racc_vstack.push racc_val
104
+ curstate = act
105
+ racc_state << act
106
+ racc_read_next = true
107
+
108
+ if @yydebug
109
+ racc_tstack.push racc_t
110
+ racc_shift racc_t, racc_tstack, racc_vstack
111
+ end
112
+
113
+ elsif act < 0 && act > -reduce_n
114
+ reduce_i = act * -3
115
+ reduce_len = reduce_table[reduce_i]
116
+ reduce_to = reduce_table[reduce_i + 1]
117
+ method_id = reduce_table[reduce_i + 2]
118
+
119
+ tmp_t = racc_tstack.last reduce_len
120
+ tmp_v = racc_vstack.last reduce_len
121
+
122
+ racc_state.pop reduce_len
123
+ racc_vstack.pop reduce_len
124
+ racc_tstack.pop reduce_len
125
+
126
+ if use_result
127
+ reduce_call_result = self.__send__ method_id, tmp_v, nil, tmp_v[0]
128
+ racc_vstack.push reduce_call_result
129
+ else
130
+ raise "not using result??"
131
+ end
132
+
133
+ racc_tstack.push reduce_to
134
+
135
+ if @yydebug
136
+ racc_reduce tmp_t, reduce_to, racc_tstack, racc_vstack
137
+ end
138
+
139
+ k1 = reduce_to - nt_base
140
+
141
+ if (reduce_i = goto_pointer[k1]) != nil
142
+ reduce_i += racc_state[-1]
143
+
144
+ if (reduce_i >= 0) && ((curstate = goto_table[reduce_i]) != nil) && (goto_check[reduce_i] == k1)
145
+ racc_state.push curstate
146
+ else
147
+ racc_state.push goto_default[k1]
148
+ end
149
+
150
+ else
151
+ racc_state.push goto_default[k1]
152
+ end
153
+
154
+ elsif act == shift_n
155
+ # action
156
+ return racc_vstack[0]
157
+
158
+ elsif act == -reduce_n
159
+ # reduce
160
+ raise SyntaxError, "unexpected '#{racc_tok.inspect}'"
161
+
162
+ else
163
+ raise "Rac: unknown action: #{act}"
164
+ end
165
+
166
+ if @yydebug
167
+ racc_next_state racc_state[-1], racc_state
168
+ end
169
+ # raise "and finished loop"
170
+ end
171
+
172
+ end # _racc_do_parse_rb
173
+
174
+ def racc_read_token(t, tok, val)
175
+ puts "read #{tok}(#{racc_token2str(t)}) #{val.inspect}"
176
+ puts "\n"
177
+ end
178
+
179
+ def racc_shift(tok, tstack, vstack)
180
+ puts "shift #{racc_token2str tok}"
181
+ racc_print_stacks tstack, vstack
182
+ puts "\n"
183
+ end
184
+
185
+ def racc_reduce(toks, sim, tstack, vstack)
186
+ puts "reduce #{toks.empty? ? '<none>' : toks.map { |t| racc_token2str(t) }}"
187
+ puts " --> #{racc_token2str(sim)}"
188
+ racc_print_stacks tstack, vstack
189
+ end
190
+
191
+ def racc_next_state(curstate, state)
192
+ puts "goto #{curstate}"
193
+ racc_print_states state
194
+ puts "\n"
195
+ end
196
+
197
+ def racc_token2str(tok)
198
+ self.class::Racc_token_to_s_table[tok]
199
+ end
200
+
201
+ def racc_print_stacks(t, v)
202
+ puts ' ['
203
+ t.each_index do |i|
204
+ puts " (#{racc_token2str(t[i])} #{v[i].inspect})"
205
+ end
206
+ puts ' ]'
207
+ end
208
+
209
+ def racc_print_states(s)
210
+ puts ' ['
211
+ s.each { |st| puts " #{st}" }
212
+ puts ' ]'
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,20 @@
1
+ module RbConfig
2
+ versions = RUBY_VERSION.split('.')
3
+ CONFIG = {
4
+ 'ruby_version' => RUBY_VERSION,
5
+ 'MAJOR' => versions[0],
6
+ 'MINOR' => versions[1],
7
+ 'TEENY' => versions[2],
8
+ 'RUBY' => RUBY_ENGINE,
9
+ 'RUBY_INSTALL_NAME' => RUBY_ENGINE,
10
+ 'RUBY_SO_NAME' => RUBY_ENGINE,
11
+ 'target_os' => 'ECMA-262',
12
+ 'host_os' => 'ECMA-262',
13
+ 'PATH_SEPARATOR' => ':'
14
+ }
15
+ end
16
+
17
+ # required for mspec it would appear
18
+ RUBY_NAME = 'opal'
19
+ RUBY_EXE = 'opal'
20
+ RUBY_PATCHLEVEL = "327"
@@ -0,0 +1,12 @@
1
+ module SecureRandom
2
+ def self.uuid
3
+ "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".gsub /[xy]/ do |ch,|
4
+ %x{
5
+ var r = Math.random() * 16 | 0,
6
+ v = ch == "x" ? r : (r & 3 | 8);
7
+
8
+ return v.toString(16);
9
+ }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,116 @@
1
+ class Set
2
+ include Enumerable
3
+
4
+ def self.[](*ary)
5
+ new(ary)
6
+ end
7
+
8
+ def initialize(enum = nil, &block)
9
+ @hash = Hash.new
10
+
11
+ return if enum.nil?
12
+ raise ArgumentError, 'value must be enumerable' unless Enumerable === enum
13
+
14
+ if block
15
+ do_with_enum(enum) { |o| add(block[o]) }
16
+ else
17
+ merge(enum)
18
+ end
19
+ end
20
+
21
+ def inspect
22
+ "#<Set: {#{to_a.join(',')}}>"
23
+ end
24
+
25
+ def ==(other)
26
+ if self.equal?(other)
27
+ true
28
+ elsif other.instance_of?(self.class)
29
+ @hash == other.instance_variable_get(:@hash)
30
+ elsif other.is_a?(Set) && self.size == other.size
31
+ other.all? { |o| @hash.include?(o) }
32
+ else
33
+ false
34
+ end
35
+ end
36
+
37
+ def add(o)
38
+ @hash[o] = true
39
+ self
40
+ end
41
+ alias << add
42
+
43
+ def delete(o)
44
+ @hash.delete(o)
45
+ self
46
+ end
47
+
48
+ def delete?(o)
49
+ if include?(o)
50
+ delete(o)
51
+ self
52
+ else
53
+ nil
54
+ end
55
+ end
56
+
57
+ def delete_if
58
+ block_given? or return enum_for(__method__)
59
+ # @hash.delete_if should be faster, but using it breaks the order
60
+ # of enumeration in subclasses.
61
+ select { |o| yield o }.each { |o| @hash.delete(o) }
62
+ self
63
+ end
64
+
65
+ def add?(o)
66
+ if include?(o)
67
+ nil
68
+ else
69
+ add(o)
70
+ end
71
+ end
72
+
73
+ def each(&block)
74
+ return enum_for :each unless block_given?
75
+ @hash.each_key(&block)
76
+ self
77
+ end
78
+
79
+ def empty?
80
+ @hash.empty?
81
+ end
82
+
83
+ def clear
84
+ @hash.clear
85
+ self
86
+ end
87
+
88
+ def include?(o)
89
+ @hash.include?(o)
90
+ end
91
+ alias member? include?
92
+
93
+ def merge(enum)
94
+ do_with_enum(enum) { |o| add o }
95
+ self
96
+ end
97
+
98
+ def do_with_enum(enum, &block)
99
+ enum.each(&block)
100
+ end
101
+
102
+ def size
103
+ @hash.size
104
+ end
105
+ alias length size
106
+
107
+ def to_a
108
+ @hash.keys
109
+ end
110
+ end
111
+
112
+ module Enumerable
113
+ def to_set(klass = Set, *args, &block)
114
+ klass.new(self, *args, &block)
115
+ end
116
+ end
@@ -0,0 +1,40 @@
1
+ module Singleton
2
+ def clone
3
+ raise TypeError, "can't clone instance of singleton #{self.class}"
4
+ end
5
+
6
+ def dup
7
+ raise TypeError, "can't dup instance of singleton #{self.class}"
8
+ end
9
+
10
+ module SingletonClassMethods
11
+
12
+ def clone
13
+ Singleton.__init__(super)
14
+ end
15
+
16
+ def inherited(sub_klass)
17
+ super
18
+ Singleton.__init__(sub_klass)
19
+ end
20
+ end
21
+
22
+ class << Singleton
23
+ def __init__(klass)
24
+ klass.instance_eval {
25
+ @singleton__instance__ = nil
26
+ }
27
+ def klass.instance
28
+ return @singleton__instance__ if @singleton__instance__
29
+ @singleton__instance__ = new()
30
+ end
31
+ klass
32
+ end
33
+
34
+ def included(klass)
35
+ super
36
+ klass.extend SingletonClassMethods
37
+ Singleton.__init__(klass)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ require 'source_map/map'
2
+ require 'source_map/mapping'
3
+ require 'source_map/offset'
4
+ require 'source_map/version'
5
+ require 'source_map/vlq'
@@ -0,0 +1,220 @@
1
+ require 'json'
2
+
3
+ require 'source_map/offset'
4
+ require 'source_map/mapping'
5
+ require 'source_map/vlq'
6
+
7
+ module SourceMap
8
+ class Map
9
+ include Enumerable
10
+
11
+ def self.from_json(json)
12
+ from_hash JSON.parse(json)
13
+ end
14
+
15
+ def self.from_hash(hash)
16
+ str = hash['mappings']
17
+ sources = hash['sources']
18
+ names = hash['names']
19
+
20
+ mappings = decode_vlq_mappings(str, sources, names)
21
+ new(mappings, hash['file'])
22
+ end
23
+
24
+ # Internal: Decode VLQ mappings and match up sources and symbol names.
25
+ #
26
+ # str - VLQ string from 'mappings' attribute
27
+ # sources - Array of Strings from 'sources' attribute
28
+ # names - Array of Strings from 'names' attribute
29
+ #
30
+ # Returns an Array of Mappings.
31
+ def self.decode_vlq_mappings(str, sources = [], names = [])
32
+ mappings = []
33
+
34
+ source_id = 0
35
+ original_line = 1
36
+ original_column = 0
37
+ name_id = 0
38
+
39
+ VLQ.decode_mappings(str).each_with_index do |group, index|
40
+ generated_column = 0
41
+ generated_line = index + 1
42
+
43
+ group.each do |segment|
44
+ generated_column += segment[0]
45
+ generated = Offset.new(generated_line, generated_column)
46
+
47
+ if segment.size >= 4
48
+ source_id += segment[1]
49
+ original_line += segment[2]
50
+ original_column += segment[3]
51
+
52
+ source = sources[source_id]
53
+ original = Offset.new(original_line, original_column)
54
+ else
55
+ # TODO: Research this case
56
+ next
57
+ end
58
+
59
+ if segment[4]
60
+ name_id += segment[4]
61
+ name = names[name_id]
62
+ end
63
+
64
+ mappings << Mapping.new(source, generated, original, name)
65
+ end
66
+ end
67
+
68
+ mappings
69
+ end
70
+
71
+ def initialize(mappings = [], filename = nil)
72
+ @mappings, @filename = mappings, filename
73
+ end
74
+
75
+ attr_reader :filename
76
+
77
+ def size
78
+ @mappings.size
79
+ end
80
+
81
+ def [](i)
82
+ @mappings[i]
83
+ end
84
+
85
+ def each(&block)
86
+ @mappings.each(&block)
87
+ end
88
+
89
+ def to_s
90
+ @string ||= build_vlq_string
91
+ end
92
+
93
+ def sources
94
+ @sources ||= @mappings.map(&:source).uniq.compact
95
+ end
96
+
97
+ def names
98
+ @names ||= @mappings.map(&:name).uniq.compact
99
+ end
100
+
101
+ def ==(other)
102
+ eql?(other)
103
+ end
104
+
105
+ def eql?(other)
106
+ other.is_a?(self.class) &&
107
+ self.mappings == other.mappings &&
108
+ self.filename == other.filename
109
+ end
110
+
111
+ def +(other)
112
+ mappings = @mappings.dup
113
+ offset = @mappings.any? ? @mappings.last.generated.line+1 : 0
114
+ other.each do |m|
115
+ mappings << Mapping.new(
116
+ m.source, m.generated + offset,
117
+ m.original, m.name
118
+ )
119
+ end
120
+ self.class.new(mappings, other.filename)
121
+ end
122
+
123
+ def |(other)
124
+ return other.dup if self.mappings.empty?
125
+
126
+ mappings = []
127
+
128
+ other.each do |m|
129
+ om = bsearch(m.original)
130
+ next unless om
131
+
132
+ mappings << Mapping.new(
133
+ om.source, m.generated,
134
+ om.original, om.name
135
+ )
136
+ end
137
+
138
+ self.class.new(mappings, other.filename)
139
+ end
140
+
141
+ def bsearch(offset, from = 0, to = size - 1)
142
+ mid = (from + to) / 2
143
+
144
+ # We haven't found a match
145
+ if from > to
146
+ return from < 1 ? nil : self[from-1]
147
+ end
148
+
149
+ # We found an exact match
150
+ if offset == self[mid].generated
151
+ self[mid]
152
+
153
+ # We need to filter more
154
+ elsif offset < self[mid].generated
155
+ bsearch(offset, from, mid - 1)
156
+ elsif offset > self[mid].generated
157
+ bsearch(offset, mid + 1, to)
158
+ end
159
+ end
160
+
161
+ def as_json
162
+ {
163
+ "version" => 3,
164
+ "file" => filename,
165
+ "mappings" => to_s,
166
+ "sources" => sources,
167
+ "names" => names
168
+ }
169
+ end
170
+
171
+ # Public: Get a pretty inspect output for debugging purposes.
172
+ #
173
+ # Returns a String.
174
+ def inspect
175
+ str = "#<#{self.class}"
176
+ str << " filename=#{filename.inspect}" if filename
177
+ str << " mappings=#{mappings.map(&:to_s).inspect}" if mappings.any?
178
+ str << ">"
179
+ str
180
+ end
181
+
182
+ protected
183
+ attr_reader :mappings
184
+
185
+ def build_vlq_string
186
+ source_id = 0
187
+ source_line = 1
188
+ source_column = 0
189
+ name_id = 0
190
+
191
+ by_lines = @mappings.group_by { |m| m.generated.line }
192
+
193
+ sources_index = Hash[sources.each_with_index.to_a]
194
+ names_index = Hash[names.each_with_index.to_a]
195
+
196
+ ary = (1..(by_lines.keys.max || 1)).map do |line|
197
+ generated_column = 0
198
+
199
+ (by_lines[line] || []).map do |mapping|
200
+ group = []
201
+ group << mapping.generated.column - generated_column
202
+ group << sources_index[mapping.source] - source_id
203
+ group << mapping.original.line - source_line
204
+ group << mapping.original.column - source_column
205
+ group << names_index[mapping.name] - name_id if mapping.name
206
+
207
+ generated_column = mapping.generated.column
208
+ source_id = sources_index[mapping.source]
209
+ source_line = mapping.original.line
210
+ source_column = mapping.original.column
211
+ name_id = names_index[mapping.name] if mapping.name
212
+
213
+ group
214
+ end
215
+ end
216
+
217
+ VLQ.encode_mappings(ary)
218
+ end
219
+ end
220
+ end