opal 1.4.1 → 1.5.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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +5 -3
  3. data/.rubocop.yml +1 -0
  4. data/UNRELEASED.md +37 -2
  5. data/benchmark-ips/bm_js_symbols_vs_strings.rb +39 -14
  6. data/docs/releasing.md +10 -2
  7. data/lib/opal/ast/matcher.rb +77 -0
  8. data/lib/opal/cache.rb +1 -1
  9. data/lib/opal/cli_runners/applescript.rb +2 -0
  10. data/lib/opal/compiler.rb +18 -9
  11. data/lib/opal/nodes/call.rb +73 -28
  12. data/lib/opal/nodes/def.rb +31 -27
  13. data/lib/opal/nodes/definitions.rb +2 -0
  14. data/lib/opal/nodes/helpers.rb +4 -23
  15. data/lib/opal/nodes/if.rb +222 -0
  16. data/lib/opal/nodes/iter.rb +41 -37
  17. data/lib/opal/nodes/literal.rb +2 -2
  18. data/lib/opal/nodes/masgn.rb +15 -17
  19. data/lib/opal/nodes/node_with_args/shortcuts.rb +100 -0
  20. data/lib/opal/nodes/node_with_args.rb +1 -0
  21. data/lib/opal/nodes/top.rb +26 -10
  22. data/lib/opal/nodes.rb +0 -1
  23. data/lib/opal/parser/default_config.rb +3 -2
  24. data/lib/opal/repl.rb +1 -1
  25. data/lib/opal/rewriter.rb +13 -6
  26. data/lib/opal/rewriters/base.rb +12 -1
  27. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +1 -0
  28. data/lib/opal/version.rb +1 -1
  29. data/opal/corelib/array.rb +23 -28
  30. data/opal/corelib/binding.rb +14 -4
  31. data/opal/corelib/constants.rb +3 -3
  32. data/opal/corelib/hash.rb +2 -2
  33. data/opal/corelib/irb.rb +192 -0
  34. data/opal/corelib/math/polyfills.rb +127 -0
  35. data/opal/corelib/math.rb +14 -194
  36. data/opal/corelib/module.rb +23 -25
  37. data/opal/corelib/number.rb +63 -14
  38. data/opal/corelib/regexp.rb +2 -0
  39. data/opal/corelib/runtime.js +56 -20
  40. data/opal/corelib/string.rb +38 -59
  41. data/opal/corelib/time.rb +106 -68
  42. data/opal/opal/full.rb +0 -1
  43. data/opal/opal.rb +4 -1
  44. data/spec/filters/bugs/date.rb +0 -3
  45. data/spec/filters/bugs/datetime.rb +65 -0
  46. data/spec/filters/bugs/float.rb +0 -18
  47. data/spec/filters/bugs/hash.rb +0 -2
  48. data/spec/filters/bugs/language.rb +0 -3
  49. data/spec/filters/bugs/marshal.rb +0 -1
  50. data/spec/filters/bugs/string.rb +0 -30
  51. data/spec/filters/bugs/time.rb +18 -8
  52. data/spec/lib/cli_spec.rb +2 -2
  53. data/spec/lib/compiler_spec.rb +8 -8
  54. data/spec/lib/rewriters/base_spec.rb +1 -1
  55. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +34 -59
  56. data/spec/lib/rewriters/block_to_iter_spec.rb +3 -6
  57. data/spec/lib/rewriters/dot_js_syntax_spec.rb +2 -5
  58. data/spec/lib/rewriters/for_rewriter_spec.rb +0 -1
  59. data/spec/lib/rewriters/forward_args_spec.rb +2 -3
  60. data/spec/lib/rewriters/js_reserved_words_spec.rb +2 -15
  61. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +64 -89
  62. data/spec/lib/rewriters/numblocks_spec.rb +3 -5
  63. data/spec/lib/rewriters/opal_engine_check_spec.rb +2 -14
  64. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +10 -2
  65. data/spec/opal/compiler/irb_spec.rb +4 -0
  66. data/spec/opal/core/language/super_spec.rb +26 -0
  67. data/spec/opal/core/regexp/assertions_spec.rb +19 -0
  68. data/spec/opal/core/string/to_proc_spec.rb +19 -0
  69. data/spec/ruby_specs +4 -0
  70. data/spec/support/rewriters_helper.rb +43 -23
  71. data/stdlib/date/date_time.rb +71 -0
  72. data/stdlib/date/formatters.rb +28 -0
  73. data/stdlib/date/infinity.rb +73 -0
  74. data/stdlib/date.rb +77 -214
  75. data/stdlib/opal/repl_js.rb +1 -1
  76. data/stdlib/{opal/replutils.rb → opal-replutils.rb} +3 -3
  77. data/stdlib/time.rb +39 -2
  78. data/stdlib/uri.rb +53 -0
  79. data/tasks/performance/asciidoctor_test.rb.erb +3 -1
  80. data/tasks/performance/optimization_status.rb +3 -2
  81. data/tasks/performance.rake +69 -35
  82. data/tasks/testing.rake +1 -0
  83. data/test/opal/test_uri.rb +35 -0
  84. data/yarn.lock +27 -5
  85. metadata +31 -18
  86. data/lib/opal/nodes/csend.rb +0 -24
  87. data/lib/opal/rewriters/explicit_writer_return.rb +0 -59
  88. data/spec/lib/rewriters/explicit_writer_return_spec.rb +0 -186
  89. data/stdlib/nodejs/irb.rb +0 -43
@@ -1,186 +0,0 @@
1
- require 'lib/spec_helper'
2
-
3
- RSpec.describe Opal::Rewriters::ExplicitWriterReturn do
4
- def s(type, *children)
5
- ::Opal::AST::Node.new(type, children)
6
- end
7
-
8
- let(:rewriter) { Opal::Rewriters::ExplicitWriterReturn.new }
9
- let(:processed) { rewriter.process(input) }
10
-
11
- def expect_rewritten(sexp)
12
- processed = rewriter.process(sexp)
13
- expect(processed)
14
- end
15
-
16
- def expect_no_rewriting_for(sexp)
17
- expect_rewritten(sexp).to eq(sexp)
18
- end
19
-
20
- let(:receiver) do
21
- # self.a
22
- s(:send, nil, :a)
23
- end
24
-
25
- let(:single_argument) do
26
- # self.c
27
- s(:send, nil, :c)
28
- end
29
-
30
- let(:multiple_arguments) do
31
- # [self.d, self.e]
32
- s(:array,
33
- s(:send, nil, :d),
34
- s(:send, nil, :e)
35
- )
36
- end
37
-
38
- let(:constant_returner) do
39
- # $writer[$writer.length - 1]
40
- s(:jsattr,
41
- s(:lvar, "$writer"),
42
- s(:send, s(:jsattr, s(:lvar, "$writer"), s(:str, "length")), :-, s(:int, 1))
43
- )
44
- end
45
-
46
- shared_examples 'always returns a temporary argument' do
47
- it 'returns a temporary argument' do
48
- expect(processed.children[2]).to eq(constant_returner)
49
- end
50
- end
51
-
52
- describe 'rewriting a.b = c' do
53
- let(:input) do
54
- s(:send, receiver, :b=, single_argument)
55
- end
56
-
57
- it 'generates a temporary argument for a method argument' do
58
- expect(processed.children[0]).to eq(
59
- s(:lvasgn, "$writer", s(:array, single_argument))
60
- )
61
- end
62
-
63
- it 'calls receiver with this temporary argument as a splat' do
64
- expect(processed.children[1]).to eq(
65
- s(:send, receiver, :b=,
66
- s(:splat, s(:lvar, "$writer"))
67
- )
68
- )
69
- end
70
-
71
- include_examples 'always returns a temporary argument'
72
- end
73
-
74
- describe 'rewriting a.b = c, d' do
75
- let(:input) do
76
- s(:send, receiver, :b=, multiple_arguments)
77
- end
78
-
79
- it 'generates a temporary argument for array of method arguments' do
80
- expect(processed.children[0]).to eq(
81
- s(:lvasgn, "$writer", s(:array, multiple_arguments))
82
- )
83
- end
84
-
85
- it 'calls receiver with this temporary argument as a splat' do
86
- expect(processed.children[1]).to eq(
87
- s(:send, receiver, :b=,
88
- s(:splat, s(:lvar, "$writer"))
89
- )
90
- )
91
- end
92
-
93
- include_examples 'always returns a temporary argument'
94
- end
95
-
96
- describe "[]= method" do
97
- let(:idx) { s(:send, nil, :b) }
98
-
99
- describe 'rewriting a[b] = c' do
100
- let(:input) do
101
- s(:send, receiver, :[]=, idx, single_argument)
102
- end
103
-
104
- it 'generates a temporary argument for all passed method arguments' do
105
- expect(processed.children[0]).to eq(
106
- s(:lvasgn, "$writer", s(:array, idx, single_argument))
107
- )
108
- end
109
-
110
- it 'calls receiver with this temporary argument as a splat' do
111
- expect(processed.children[1]).to eq(
112
- s(:send, receiver, :[]=,
113
- s(:splat, s(:lvar, "$writer"))
114
- )
115
- )
116
- end
117
-
118
- include_examples 'always returns a temporary argument'
119
- end
120
-
121
- describe 'rewriting a[b] = c, d' do
122
- let(:input) do
123
- s(:send, receiver, :[]=, idx, multiple_arguments)
124
- end
125
-
126
- it 'generates a temporary argument for array of method arguments' do
127
- expect(processed.children[0]).to eq(
128
- s(:lvasgn, "$writer", s(:array, idx, multiple_arguments))
129
- )
130
- end
131
-
132
- it 'calls receiver with this temporary argument as a splat' do
133
- expect(processed.children[1]).to eq(
134
- s(:send, receiver, :[]=,
135
- s(:splat, s(:lvar, "$writer"))
136
- )
137
- )
138
- end
139
-
140
- include_examples 'always returns a temporary argument'
141
- end
142
- end
143
-
144
- describe 'mass assignment' do
145
- let(:input) do
146
- # a, b = c, d
147
- s(:masgn,
148
- s(:mlhs,
149
- s(:lvasgn, :a),
150
- s(:lvasgn, :b)),
151
- s(:array,
152
- s(:send, nil, :c),
153
- s(:send, nil, :d)))
154
- end
155
-
156
- it 'does not affect it' do
157
- expect_no_rewriting_for(input)
158
- end
159
- end
160
-
161
- describe '.JS. syntax' do
162
- let(:input) do
163
- # a.JS.b = c
164
- s(:jscall,
165
- s(:send, nil, :a), :b=,
166
- s(:send, nil, :c))
167
- end
168
-
169
- it 'does not affect it' do
170
- expect_no_rewriting_for(input)
171
- end
172
- end
173
-
174
- describe '.JS[] syntax' do
175
- let(:input) do
176
- s(:jsattrasgn,
177
- s(:send, nil, :a),
178
- s(:sym, :b),
179
- s(:send, nil, :c))
180
- end
181
-
182
- it 'does not affect it' do
183
- expect_no_rewriting_for(input)
184
- end
185
- end
186
- end
data/stdlib/nodejs/irb.rb DELETED
@@ -1,43 +0,0 @@
1
- require 'native'
2
-
3
- NodeRepl = Native(`OpalNode.node_require('repl')`)
4
-
5
- def NodeRepl.start(options = {})
6
- Native::Object.new(`#{@native}.start(#{options.to_n})`)
7
- end
8
-
9
- line = 1
10
- prompt_interrupted = false
11
-
12
- prompt = ->(context) {
13
- tip = prompt_interrupted ? '*' : '>'
14
- "irb(#{context}):#{line.to_s.rjust(3, '0')}#{tip} "
15
- }
16
-
17
- $repl = NodeRepl.start(
18
- prompt: prompt.call(self),
19
- useGlobal: true,
20
- ignoreUndefined: true,
21
- eval: ->(cmd, context, filename, callback) {
22
- line += 1
23
- cmd = cmd[1...-1].chomp
24
- if cmd.empty?
25
- prompt_interrupted = true
26
- $repl.prompt = prompt.call(self)
27
- callback.call('')
28
- next
29
- end
30
- prompt_interrupted = false
31
- $repl.prompt = prompt.call(self)
32
- begin
33
- result = `OpalNode.run(cmd, filename)`
34
- result = nil if `#{result} == nil`
35
- callback.call('=> ' + result.inspect)
36
- rescue => e
37
- callback.call(e.backtrace.join("\n"))
38
- end
39
- },
40
- )
41
-
42
- # Add a newline before exiting
43
- $repl.on :exit, -> { puts }