opal 1.4.0.alpha1 → 1.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +5 -3
  3. data/.github/workflows/build.yml +20 -18
  4. data/.rubocop.yml +1 -0
  5. data/CHANGELOG.md +98 -7
  6. data/UNRELEASED.md +31 -59
  7. data/benchmark-ips/bm_js_symbols_vs_strings.rb +39 -14
  8. data/docs/releasing.md +11 -4
  9. data/lib/opal/ast/matcher.rb +77 -0
  10. data/lib/opal/cache.rb +1 -1
  11. data/lib/opal/cli_runners/applescript.rb +2 -0
  12. data/lib/opal/compiler.rb +18 -9
  13. data/lib/opal/nodes/call.rb +73 -28
  14. data/lib/opal/nodes/def.rb +31 -27
  15. data/lib/opal/nodes/definitions.rb +2 -0
  16. data/lib/opal/nodes/helpers.rb +4 -23
  17. data/lib/opal/nodes/if.rb +226 -0
  18. data/lib/opal/nodes/iter.rb +41 -37
  19. data/lib/opal/nodes/literal.rb +2 -2
  20. data/lib/opal/nodes/masgn.rb +15 -17
  21. data/lib/opal/nodes/node_with_args/shortcuts.rb +100 -0
  22. data/lib/opal/nodes/node_with_args.rb +1 -0
  23. data/lib/opal/nodes/super.rb +9 -9
  24. data/lib/opal/nodes/top.rb +26 -10
  25. data/lib/opal/nodes/x_string.rb +27 -28
  26. data/lib/opal/nodes.rb +0 -1
  27. data/lib/opal/parser/default_config.rb +3 -2
  28. data/lib/opal/repl.rb +1 -1
  29. data/lib/opal/rewriter.rb +13 -6
  30. data/lib/opal/rewriters/base.rb +12 -1
  31. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +1 -0
  32. data/lib/opal/version.rb +1 -1
  33. data/opal/corelib/array.rb +23 -28
  34. data/opal/corelib/binding.rb +14 -4
  35. data/opal/corelib/constants.rb +3 -3
  36. data/opal/corelib/hash.rb +2 -2
  37. data/opal/corelib/irb.rb +192 -0
  38. data/opal/corelib/math/polyfills.rb +127 -0
  39. data/opal/corelib/math.rb +14 -194
  40. data/opal/corelib/module.rb +25 -40
  41. data/opal/corelib/number.rb +63 -14
  42. data/opal/corelib/regexp.rb +2 -0
  43. data/opal/corelib/runtime.js +56 -20
  44. data/opal/corelib/string.rb +38 -59
  45. data/opal/corelib/time.rb +106 -68
  46. data/opal/opal/full.rb +0 -1
  47. data/opal/opal.rb +4 -1
  48. data/spec/filters/bugs/date.rb +0 -3
  49. data/spec/filters/bugs/datetime.rb +65 -0
  50. data/spec/filters/bugs/float.rb +0 -18
  51. data/spec/filters/bugs/hash.rb +0 -2
  52. data/spec/filters/bugs/language.rb +0 -3
  53. data/spec/filters/bugs/marshal.rb +0 -1
  54. data/spec/filters/bugs/string.rb +0 -30
  55. data/spec/filters/bugs/time.rb +18 -8
  56. data/spec/lib/cli_spec.rb +2 -2
  57. data/spec/lib/compiler_spec.rb +8 -8
  58. data/spec/lib/rewriters/base_spec.rb +1 -1
  59. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +34 -59
  60. data/spec/lib/rewriters/block_to_iter_spec.rb +3 -6
  61. data/spec/lib/rewriters/dot_js_syntax_spec.rb +2 -5
  62. data/spec/lib/rewriters/for_rewriter_spec.rb +0 -1
  63. data/spec/lib/rewriters/forward_args_spec.rb +2 -3
  64. data/spec/lib/rewriters/js_reserved_words_spec.rb +2 -15
  65. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +64 -89
  66. data/spec/lib/rewriters/numblocks_spec.rb +3 -5
  67. data/spec/lib/rewriters/opal_engine_check_spec.rb +2 -14
  68. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +10 -2
  69. data/spec/opal/compiler/irb_spec.rb +4 -0
  70. data/spec/opal/core/language/super_spec.rb +40 -17
  71. data/spec/opal/core/language/xstring_spec.rb +13 -0
  72. data/spec/opal/core/regexp/assertions_spec.rb +19 -0
  73. data/spec/opal/core/string/to_proc_spec.rb +19 -0
  74. data/spec/ruby_specs +4 -0
  75. data/spec/support/rewriters_helper.rb +43 -23
  76. data/stdlib/date/date_time.rb +71 -0
  77. data/stdlib/date/formatters.rb +28 -0
  78. data/stdlib/date/infinity.rb +73 -0
  79. data/stdlib/date.rb +77 -214
  80. data/stdlib/opal/repl_js.rb +1 -1
  81. data/stdlib/{opal/replutils.rb → opal-replutils.rb} +3 -3
  82. data/stdlib/promise/v2.rb +0 -7
  83. data/stdlib/time.rb +39 -2
  84. data/stdlib/uri.rb +53 -0
  85. data/tasks/performance/asciidoctor_test.rb.erb +3 -1
  86. data/tasks/performance/optimization_status.rb +3 -2
  87. data/tasks/performance.rake +69 -35
  88. data/tasks/testing.rake +1 -0
  89. data/test/opal/test_uri.rb +35 -0
  90. data/yarn.lock +27 -5
  91. metadata +30 -16
  92. data/lib/opal/nodes/csend.rb +0 -24
  93. data/lib/opal/rewriters/explicit_writer_return.rb +0 -59
  94. data/spec/lib/rewriters/explicit_writer_return_spec.rb +0 -186
  95. 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 }