mirah 0.1.4-java → 0.2.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/History.txt +531 -0
  5. data/README.md +23 -10
  6. data/Rakefile +239 -156
  7. data/TODO.md +71 -10
  8. data/bin/mirah +1 -1
  9. data/bin/mirahc +1 -1
  10. data/dist/mirahc.jar +0 -0
  11. data/examples/bintrees.mirah +2 -2
  12. data/examples/construction.mirah +2 -2
  13. data/examples/fields.mirah +1 -1
  14. data/examples/fractal.mirah +1 -1
  15. data/examples/fractal.rb +70 -0
  16. data/examples/interfaces.mirah +1 -1
  17. data/examples/java_thing.mirah +1 -1
  18. data/examples/macros/square.mirah +3 -3
  19. data/examples/macros/square_int.mirah +3 -3
  20. data/examples/macros/string_each_char.mirah +6 -6
  21. data/examples/rosettacode/100-doors.mirah +0 -2
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
  23. data/examples/rosettacode/empty-string.mirah +1 -1
  24. data/examples/rosettacode/fizz-buzz.mirah +4 -4
  25. data/examples/rosettacode/is-string-numeric.mirah +7 -7
  26. data/examples/rosettacode/palindrome.mirah +2 -2
  27. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  28. data/examples/rosettacode/rot-13.mirah +1 -1
  29. data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
  30. data/examples/rosettacode/string-case.mirah +2 -2
  31. data/examples/rosettacode/string-length.mirah +1 -1
  32. data/examples/swing.mirah +9 -14
  33. data/extensions_and_macros.md +117 -0
  34. data/lib/mirah.rb +1 -1
  35. data/lib/mirah/errors.rb +3 -1
  36. data/lib/mirah/transform/ast_ext.rb +3 -2
  37. data/lib/mirah/util/process_errors.rb +1 -2
  38. data/lib/mirah/version.rb +1 -1
  39. data/test/A.class +0 -0
  40. data/test/core/util/jvm_version_test.rb +10 -0
  41. data/test/core/util/mirah_arguments_test.rb +51 -4
  42. data/test/fixtures/cp1251_test.mirah +7 -0
  43. data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
  44. data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
  45. data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
  46. data/test/fixtures/org/foo/IntAnno.class +0 -0
  47. data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
  48. data/test/fixtures/utf8_test.mirah +7 -0
  49. data/test/jvm/access_levels_test.rb +31 -0
  50. data/test/jvm/annotations_test.rb +3 -6
  51. data/test/jvm/blocks_test.rb +303 -120
  52. data/test/jvm/cast_test.rb +123 -50
  53. data/test/jvm/closure_test.rb +242 -0
  54. data/test/jvm/constructors_test.rb +1 -3
  55. data/test/jvm/example_test.rb +6 -2
  56. data/test/jvm/extensions/array_extensions_test.rb +181 -0
  57. data/test/jvm/extensions/collection_extensions_test.rb +195 -0
  58. data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
  59. data/test/jvm/extensions/hash_extensions_test.rb +56 -0
  60. data/test/jvm/extensions/list_extensions_test.rb +143 -0
  61. data/test/jvm/extensions/lock_extensions_test.rb +43 -0
  62. data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
  63. data/test/jvm/extensions/numeric_operators_test.rb +86 -0
  64. data/test/jvm/extensions/object_extensions_test.rb +122 -0
  65. data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
  66. data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
  67. data/test/jvm/generics_test.rb +14 -6
  68. data/test/jvm/import_test.rb +38 -1
  69. data/test/jvm/interface_test.rb +17 -0
  70. data/test/jvm/jvm_commands_test.rb +9 -0
  71. data/test/jvm/jvm_compiler_test.rb +568 -43
  72. data/test/jvm/macros_test.rb +343 -19
  73. data/test/jvm/main_method_test.rb +1 -3
  74. data/test/jvm/new_backend_test_helper.rb +54 -7
  75. data/test/jvm/rescue_test.rb +20 -5
  76. data/test/jvm/static_fields_test.rb +52 -10
  77. data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
  78. data/test/jvm/varargs_test.rb +6 -16
  79. data/test/mirrors/base_type_test.rb +20 -7
  80. data/test/mirrors/bytecode_mirror_test.rb +8 -3
  81. data/test/mirrors/generics_test.rb +89 -10
  82. data/test/mirrors/member_test.rb +1 -1
  83. data/test/mirrors/method_lookup_test.rb +10 -3
  84. data/test/mirrors/mirrors_test.rb +20 -20
  85. data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
  86. data/test/mirrors/simple_mirror_loader_test.rb +1 -1
  87. data/test/newMirahClass$Closure2.class +0 -0
  88. data/test/newMirahClass.class +0 -0
  89. data/test/test_helper.rb +8 -1
  90. metadata +31 -16
  91. data/bin/bundler +0 -16
  92. data/bin/rake +0 -16
  93. data/examples/ant/example-build.xml~ +0 -7
  94. data/examples/test.edb +0 -9
  95. data/lib/mirah/compiler.rb +0 -67
  96. data/lib/mirah/parser.rb +0 -224
  97. data/lib/mirah/util/delegate.rb +0 -65
  98. data/test/jvm/list_extensions_test.rb +0 -23
@@ -12,67 +12,68 @@
12
12
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
+ require 'test_helper'
15
16
 
16
17
  class CastTest < Test::Unit::TestCase
17
18
 
18
19
  def test_cast
19
20
  cls, = compile(<<-EOF)
20
- def f2b; byte(1.0); end
21
- def f2s; short(1.0); end
22
- def f2c; char(1.0); end
23
- def f2i; int(1.0); end
24
- def f2l; long(1.0); end
25
- def f2d; int(1.0); end
26
-
27
- def i2b; byte(1); end
28
- def i2s; short(1); end
29
- def i2c; char(1); end
30
- def i2l; long(1); end
31
- def i2f; float(1); end
32
- def i2d; int(1); end
33
-
34
- def b2s; short(byte(1)); end
35
- def b2c; char(byte(1)); end
36
- def b2i; int(byte(1)); end
37
- def b2l; long(byte(1)); end
38
- def b2f; float(byte(1)); end
39
- def b2d; double(byte(1)); end
40
-
41
- def s2b; byte(short(1)); end
42
- def s2c; char(short(1)); end
43
- def s2i; int(short(1)); end
44
- def s2l; long(short(1)); end
45
- def s2f; float(short(1)); end
46
- def s2d; double(short(1)); end
47
-
48
- def c2b; byte(char(1)); end
49
- def c2s; short(char(1)); end
50
- def c2i; int(char(1)); end
51
- def c2l; long(char(1)); end
52
- def c2f; float(char(1)); end
53
- def c2d; double(char(1)); end
54
-
55
- def l2b; byte(long(1)); end
56
- def l2c; char(long(1)); end
57
- def l2i; int(long(1)); end
58
- def l2l; long(long(1)); end
59
- def l2f; float(long(1)); end
60
- def l2d; double(long(1)); end
61
-
62
- def d2b; byte(1.0); end
63
- def d2s; short(1.0); end
64
- def d2c; char(1.0); end
65
- def d2i; int(1.0); end
66
- def d2l; long(1.0); end
67
- def d2f; float(1.0); end
21
+ def f2b; 1.0.as!(byte); end
22
+ def f2s; 1.0.as!(short); end
23
+ def f2c; 1.0.as!(char); end
24
+ def f2i; 1.0.as!(int); end
25
+ def f2l; 1.0.as!(long); end
26
+ def f2d; 1.0.as!(int); end
27
+
28
+ def i2b; 1.as!(byte); end
29
+ def i2s; 1.as!(short); end
30
+ def i2c; 1.as!(char); end
31
+ def i2l; 1.as!(long); end
32
+ def i2f; 1.as!(float); end
33
+ def i2d; 1.as!(int); end
34
+
35
+ def b2s; 1.as!(byte).as!(short); end
36
+ def b2c; 1.as!(byte).as!(char); end
37
+ def b2i; 1.as!(byte).as!(int); end
38
+ def b2l; 1.as!(byte).as!(long); end
39
+ def b2f; 1.as!(byte).as!(float); end
40
+ def b2d; 1.as!(byte).as!(double); end
41
+
42
+ def s2b; 1.as!(short).as!(byte); end
43
+ def s2c; 1.as!(short).as!(char); end
44
+ def s2i; 1.as!(short).as!(int); end
45
+ def s2l; 1.as!(short).as!(long); end
46
+ def s2f; 1.as!(short).as!(float); end
47
+ def s2d; 1.as!(short).as!(double); end
48
+
49
+ def c2b; 1.as!(char).as!(byte); end
50
+ def c2s; 1.as!(char).as!(short); end
51
+ def c2i; 1.as!(char).as!(int); end
52
+ def c2l; 1.as!(char).as!(long); end
53
+ def c2f; 1.as!(char).as!(float); end
54
+ def c2d; 1.as!(char).as!(double); end
55
+
56
+ def l2b; 1.as!(long).as!(byte); end
57
+ def l2c; 1.as!(long).as!(char); end
58
+ def l2i; 1.as!(long).as!(int); end
59
+ def l2l; 1.as!(long).as!(long); end
60
+ def l2f; 1.as!(long).as!(float); end
61
+ def l2d; 1.as!(long).as!(double); end
62
+
63
+ def d2b; 1.0.as!(byte); end
64
+ def d2s; 1.0.as!(short); end
65
+ def d2c; 1.0.as!(char); end
66
+ def d2i; 1.0.as!(int); end
67
+ def d2l; 1.0.as!(long); end
68
+ def d2f; 1.0.as!(float); end
68
69
 
69
70
  def hard_i2f(a:int)
70
- float(if a < 0
71
+ if a < 0
71
72
  a *= -1
72
73
  a * 2
73
74
  else
74
75
  a * 2
75
- end)
76
+ end.as! float
76
77
  end
77
78
  EOF
78
79
 
@@ -133,6 +134,22 @@ class CastTest < Test::Unit::TestCase
133
134
  end
134
135
 
135
136
  def test_array_cast
137
+ cls, = compile(<<-EOF)
138
+ def foo(a: Object)
139
+ bar(a.as!(String[]))
140
+ end
141
+
142
+ def bar(a: String[])
143
+ a[0]
144
+ end
145
+ EOF
146
+
147
+ assert_equal("foo", cls.foo(["foo", "bar"].to_java(:string)))
148
+ end
149
+
150
+
151
+ def test_warn_on_array_cast
152
+ # TODO
136
153
  cls, = compile(<<-EOF)
137
154
  def foo(a:Object)
138
155
  bar(String[].cast(a))
@@ -146,6 +163,20 @@ class CastTest < Test::Unit::TestCase
146
163
  assert_equal("foo", cls.foo(["foo", "bar"].to_java(:string)))
147
164
  end
148
165
 
166
+ def test_cast_array_as_primitive
167
+ cls, = compile(<<-EOF)
168
+ def foo(a:Object)
169
+ bar(a.as!(int[]))
170
+ end
171
+
172
+ def bar(a:int[])
173
+ a[0]
174
+ end
175
+ EOF
176
+
177
+ assert_equal(2, cls.foo([2, 3].to_java(:int)))
178
+ end
179
+
149
180
  def test_array_cast_primitive
150
181
  cls, = compile(<<-EOF)
151
182
  def foo(a:Object)
@@ -159,4 +190,46 @@ class CastTest < Test::Unit::TestCase
159
190
 
160
191
  assert_equal(2, cls.foo([2, 3].to_java(:int)))
161
192
  end
193
+
194
+ def test_explicit_block_argument_cast_in_array_iteration
195
+ cls, = compile(<<-EOF)
196
+ def foo():int
197
+ list = [1,2,3]
198
+ m = 0
199
+ list.each do |x: int|
200
+ m += x
201
+ end
202
+ return m
203
+ end
204
+ EOF
205
+ assert_equal 6, cls.foo
206
+ end
207
+
208
+ def test_explicit_call_cast_in_array_iteration
209
+ cls, = compile(<<-EOF)
210
+ def foo():int
211
+ list = [1,2,3]
212
+ m = 0
213
+ list.each do |x|
214
+ m = int(x) + m
215
+ end
216
+ return m
217
+ end
218
+ EOF
219
+ assert_equal 6, cls.foo
220
+ end
221
+
222
+ def test_explicit_as_macro_cast_in_array_iteration
223
+ cls, = compile(<<-EOF)
224
+ def foo():int
225
+ list = [1,2,3]
226
+ m = 0
227
+ list.each do |x|
228
+ m = x.as!(int) + m
229
+ end
230
+ return m
231
+ end
232
+ EOF
233
+ assert_equal 6, cls.foo
234
+ end
162
235
  end
@@ -0,0 +1,242 @@
1
+ # Copyright (c) 2010-2013 The Mirah project authors. All Rights Reserved.
2
+ # All contributing project authors may be found in the NOTICE file.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ class ClosureTest < Test::Unit::TestCase
17
+
18
+ def test_interface_defined_after_used
19
+ cls, = compile(%q{
20
+ class FooTest1
21
+ def self.main(argv:String[]):void
22
+ FooB.new.action do
23
+ puts "executed foo1"
24
+ end
25
+ end
26
+ end
27
+
28
+ class FooB
29
+ def action(foo_param:Foo_Interface):void
30
+ foo_param.anymethod
31
+ end
32
+ end
33
+
34
+ interface Foo_Interface
35
+ def anymethod():void; end
36
+ end
37
+
38
+ class FooTest2
39
+ def self.main(argv:String[]):void
40
+ FooB.new.action do
41
+ puts "executed foo2"
42
+ end
43
+ end
44
+ end
45
+ FooTest2.main(String[0])
46
+ FooTest1.main(String[0])
47
+ })
48
+ assert_run_output("executed foo2\nexecuted foo1\n", cls)
49
+ end
50
+
51
+ def test_super_is_not_synthesized_when_not_necessary
52
+ cls, = compile(%q{
53
+ class Bar
54
+ def initialize(val:int)
55
+ puts "bar"
56
+ end
57
+ end
58
+
59
+ class Foo < Bar
60
+ attr_accessor baz:String
61
+
62
+ def initialize(val:int)
63
+ super
64
+ foo = 5
65
+ puts "foo"
66
+ perform do
67
+ puts foo
68
+ end
69
+ end
70
+
71
+ def perform(runnable:Runnable)
72
+ runnable.run
73
+ end
74
+ end
75
+ Foo.new(3)
76
+ })
77
+ assert_run_output("bar\nfoo\n5\n", cls)
78
+ end
79
+
80
+ def test_lambda_and_other_closures_coexist
81
+ cls, = compile(%q[
82
+ class Foo
83
+
84
+ def anymethod()
85
+ foo = 5
86
+ perform do
87
+ puts "1: #{foo}"
88
+ end
89
+ a = lambda(Runnable) do
90
+ puts "2: #{foo}"
91
+ end
92
+ perform(a)
93
+ end
94
+
95
+ def perform(runnable:Runnable)
96
+ runnable.run
97
+ end
98
+ end
99
+ Foo.new.anymethod
100
+ ])
101
+ assert_run_output("1: 5\n2: 5\n", cls)
102
+ end
103
+
104
+ def test_doubly_nested_lambda
105
+ cls, = compile(%q[
106
+ class Foo
107
+ abstract def test(param:String); end
108
+ end
109
+
110
+ class Bar < Foo
111
+ def test(param)
112
+ y = 5
113
+ x = lambda(Runnable) do
114
+ puts "so: #{param}"
115
+ z = lambda(Runnable) do
116
+ puts "hey you #{y}"
117
+ end
118
+ z.run
119
+ end
120
+ x.run
121
+ end
122
+ end
123
+
124
+ Bar.new.test("bar")
125
+ ])
126
+ assert_run_output("so: bar\nhey you 5\n", cls)
127
+ end
128
+
129
+ def test_direct_invoke_on_lambda
130
+ cls, = compile(%q[
131
+ lambda(Runnable) do
132
+ puts "abc"
133
+ end.run
134
+ ])
135
+ assert_run_output("abc\n", cls)
136
+ end
137
+
138
+ def test_lambda_contains_methods
139
+ cls, = compile(%q[
140
+ foo = 3
141
+
142
+ lambda(Runnable) do
143
+ def run
144
+ puts foo
145
+ end
146
+ end.run
147
+ ])
148
+ assert_run_output("3\n", cls)
149
+ end
150
+
151
+ def test_closure_over_array_parameter
152
+ cls, = compile(%q{
153
+ def bar(param:byte[])
154
+ runnable = lambda(Runnable) do
155
+ puts param[0]
156
+ end
157
+
158
+ runnable.run
159
+ end
160
+
161
+ bar(byte[1])
162
+ })
163
+ assert_run_output("0\n", cls)
164
+ end
165
+
166
+ def test_closure_with_typed_parameter
167
+ cls, = compile(%q{
168
+ class Bar
169
+ end
170
+
171
+ interface Foo
172
+ def action(bar:Bar); end
173
+ end
174
+
175
+ class FooCaller
176
+
177
+ def with_foo(foo:Foo):void
178
+ foo.action(Bar.new)
179
+ end
180
+
181
+ def call_with_foo
182
+ with_foo do |bar:Bar|
183
+ puts "Closure called."
184
+ end
185
+ end
186
+ end
187
+
188
+ FooCaller.new.call_with_foo
189
+ })
190
+ assert_run_output("Closure called.\n", cls)
191
+ end
192
+
193
+ def test_deep_nested_runnable_with_binding
194
+ cls, = compile(%q{
195
+ class TestBuilder
196
+ def self.create(b: Runnable):void
197
+ b.run()
198
+ end
199
+
200
+ def self.main(args:String[]):void
201
+ level_0 = "level_0"
202
+ b = create do
203
+ level_1="level_1"
204
+ TestBuilder.create do
205
+ level_2="level_2"
206
+ TestBuilder.create do
207
+ level_3="level_3"
208
+ puts "#{level_0} #{level_1} #{level_2} #{level_3}"
209
+ end
210
+ TestBuilder.create do
211
+ level_2="level_2_3"
212
+ puts "#{level_0} #{level_1} #{level_2}"
213
+ end
214
+ puts "#{level_0} #{level_1} #{level_2}"
215
+ end
216
+ end
217
+ end
218
+ end
219
+
220
+ TestBuilder.main(String[0])
221
+ })
222
+ assert_run_output("level_0 level_1 level_2 level_3\nlevel_0 level_1 level_2_3\nlevel_0 level_1 level_2_3\n", cls)
223
+ end
224
+
225
+ def test_closure_with_assignment_in_rescue
226
+ cls, = compile(%q{
227
+ foo = nil
228
+ t = Thread.new do
229
+ begin
230
+ raise Exception
231
+ rescue => e
232
+ foo = Integer.new(3)
233
+ end
234
+ end
235
+ t.start
236
+ t.join
237
+ puts foo
238
+ })
239
+ assert_run_output("3\n", cls)
240
+ end
241
+ end
242
+
@@ -161,8 +161,6 @@ class ConstructorsTest < Test::Unit::TestCase
161
161
  System.out.print DefaultConstructable.new.foo
162
162
  EOF
163
163
 
164
- assert_output("foo") do
165
- script.main(nil)
166
- end
164
+ assert_run_output("foo", script)
167
165
  end
168
166
  end