mirah 0.0.9-java → 0.0.10-java
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.
- data/History.txt +40 -0
- data/Rakefile +3 -2
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah/ast.rb +22 -12
- data/lib/mirah/ast/flow.rb +28 -14
- data/lib/mirah/ast/intrinsics.rb +20 -17
- data/lib/mirah/ast/method.rb +9 -3
- data/lib/mirah/ast/scope.rb +3 -3
- data/lib/mirah/ast/structure.rb +16 -13
- data/lib/mirah/commands/base.rb +6 -2
- data/lib/mirah/jvm/compiler/java_source.rb +4 -4
- data/lib/mirah/jvm/source_generator/builder.rb +6 -0
- data/lib/mirah/jvm/types/intrinsics.rb +8 -3
- data/lib/mirah/transform/helper.rb +1 -1
- data/lib/mirah/typer/simple.rb +1 -1
- data/lib/mirah/util/argument_processor.rb +2 -2
- data/lib/mirah/util/process_errors.rb +2 -1
- data/lib/mirah/version.rb +1 -1
- data/test/core/test_ast.rb +4 -6
- data/test/core/test_commands.rb +80 -0
- data/test/core/test_compilation.rb +2 -6
- data/test/core/test_env.rb +1 -3
- data/test/core/test_macros.rb +15 -3
- data/test/core/test_typer.rb +17 -4
- data/test/jvm/bytecode_test_helper.rb +6 -7
- data/test/jvm/javac_test_helper.rb +0 -7
- data/test/jvm/test_annotations.rb +58 -0
- data/test/jvm/test_blocks.rb +62 -0
- data/test/jvm/test_jvm_compiler.rb +40 -188
- data/test/jvm/test_macros.rb +13 -0
- data/test/jvm/test_rescue.rb +152 -0
- data/test/plugins/test_gwt.rb +1 -3
- data/test/test_helper.rb +19 -0
- metadata +13 -5
@@ -14,6 +14,13 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
class TestJVMCompiler < Test::Unit::TestCase
|
17
|
+
def assert_raise_java(type, message="")
|
18
|
+
ex = assert_raise(NativeException) do
|
19
|
+
yield
|
20
|
+
end
|
21
|
+
assert_equal type, ex.cause.class
|
22
|
+
assert_equal message, ex.cause.message.to_s
|
23
|
+
end
|
17
24
|
|
18
25
|
def test_local
|
19
26
|
cls, = compile("def foo; a = 1; a; end")
|
@@ -876,21 +883,13 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
876
883
|
end
|
877
884
|
end
|
878
885
|
|
879
|
-
def assert_throw(type, message="")
|
880
|
-
ex = assert_raise(NativeException) do
|
881
|
-
yield
|
882
|
-
end
|
883
|
-
assert_equal type, ex.cause.class
|
884
|
-
assert_equal message, ex.cause.message.to_s
|
885
|
-
end
|
886
|
-
|
887
886
|
def test_raise
|
888
887
|
cls, = compile(<<-EOF)
|
889
888
|
def foo
|
890
889
|
raise
|
891
890
|
end
|
892
891
|
EOF
|
893
|
-
|
892
|
+
assert_raise_java(java.lang.RuntimeException) do
|
894
893
|
cls.foo
|
895
894
|
end
|
896
895
|
|
@@ -899,7 +898,7 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
899
898
|
raise "Oh no!"
|
900
899
|
end
|
901
900
|
EOF
|
902
|
-
ex =
|
901
|
+
ex = assert_raise_java(java.lang.RuntimeException, 'Oh no!') do
|
903
902
|
cls.foo
|
904
903
|
end
|
905
904
|
|
@@ -908,7 +907,7 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
908
907
|
raise IllegalArgumentException
|
909
908
|
end
|
910
909
|
EOF
|
911
|
-
ex =
|
910
|
+
ex = assert_raise_java(java.lang.IllegalArgumentException) do
|
912
911
|
cls.foo
|
913
912
|
end
|
914
913
|
|
@@ -918,7 +917,7 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
918
917
|
raise Exception, "oops"
|
919
918
|
end
|
920
919
|
EOF
|
921
|
-
ex =
|
920
|
+
ex = assert_raise_java(java.lang.Exception, "oops") do
|
922
921
|
cls.foo
|
923
922
|
end
|
924
923
|
|
@@ -928,128 +927,9 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
928
927
|
raise Throwable.new("darn")
|
929
928
|
end
|
930
929
|
EOF
|
931
|
-
ex =
|
932
|
-
cls.foo
|
933
|
-
end
|
934
|
-
end
|
935
|
-
|
936
|
-
def test_rescue
|
937
|
-
cls, = compile(<<-EOF)
|
938
|
-
def foo
|
939
|
-
begin
|
940
|
-
puts "body"
|
941
|
-
rescue
|
942
|
-
puts "rescue"
|
943
|
-
end
|
944
|
-
end
|
945
|
-
EOF
|
946
|
-
|
947
|
-
output = capture_output do
|
948
|
-
cls.foo
|
949
|
-
end
|
950
|
-
assert_equal("body\n", output)
|
951
|
-
|
952
|
-
cls, = compile(<<-EOF)
|
953
|
-
def foo
|
954
|
-
begin
|
955
|
-
puts "body"
|
956
|
-
raise
|
957
|
-
rescue
|
958
|
-
puts "rescue"
|
959
|
-
end
|
960
|
-
end
|
961
|
-
EOF
|
962
|
-
|
963
|
-
output = capture_output do
|
964
|
-
cls.foo
|
965
|
-
end
|
966
|
-
assert_equal("body\nrescue\n", output)
|
967
|
-
|
968
|
-
cls, = compile(<<-EOF)
|
969
|
-
def foo(a:int)
|
970
|
-
begin
|
971
|
-
puts "body"
|
972
|
-
if a == 0
|
973
|
-
raise IllegalArgumentException
|
974
|
-
else
|
975
|
-
raise
|
976
|
-
end
|
977
|
-
rescue IllegalArgumentException
|
978
|
-
puts "IllegalArgumentException"
|
979
|
-
rescue
|
980
|
-
puts "rescue"
|
981
|
-
end
|
982
|
-
end
|
983
|
-
EOF
|
984
|
-
|
985
|
-
output = capture_output do
|
986
|
-
cls.foo(1)
|
987
|
-
cls.foo(0)
|
988
|
-
end
|
989
|
-
assert_equal("body\nrescue\nbody\nIllegalArgumentException\n", output)
|
990
|
-
|
991
|
-
cls, = compile(<<-EOF)
|
992
|
-
def foo(a:int)
|
993
|
-
begin
|
994
|
-
puts "body"
|
995
|
-
if a == 0
|
996
|
-
raise IllegalArgumentException
|
997
|
-
elsif a == 1
|
998
|
-
raise Throwable
|
999
|
-
else
|
1000
|
-
raise
|
1001
|
-
end
|
1002
|
-
rescue IllegalArgumentException, RuntimeException
|
1003
|
-
puts "multi"
|
1004
|
-
rescue Throwable
|
1005
|
-
puts "other"
|
1006
|
-
end
|
1007
|
-
end
|
1008
|
-
EOF
|
1009
|
-
|
1010
|
-
output = capture_output do
|
1011
|
-
cls.foo(0)
|
1012
|
-
cls.foo(1)
|
1013
|
-
cls.foo(2)
|
1014
|
-
end
|
1015
|
-
assert_equal("body\nmulti\nbody\nother\nbody\nmulti\n", output)
|
1016
|
-
|
1017
|
-
cls, = compile(<<-EOF)
|
1018
|
-
def foo
|
1019
|
-
begin
|
1020
|
-
raise "foo"
|
1021
|
-
rescue => ex
|
1022
|
-
puts ex.getMessage
|
1023
|
-
end
|
1024
|
-
end
|
1025
|
-
EOF
|
1026
|
-
|
1027
|
-
output = capture_output do
|
930
|
+
ex = assert_raise_java(java.lang.Throwable, "darn") do
|
1028
931
|
cls.foo
|
1029
932
|
end
|
1030
|
-
assert_equal("foo\n", output)
|
1031
|
-
|
1032
|
-
|
1033
|
-
cls, = compile(<<-EOF)
|
1034
|
-
def foo(x:boolean)
|
1035
|
-
throws Exception
|
1036
|
-
if x
|
1037
|
-
raise Exception, "x"
|
1038
|
-
end
|
1039
|
-
rescue Exception
|
1040
|
-
"x"
|
1041
|
-
else
|
1042
|
-
raise Exception, "!x"
|
1043
|
-
end
|
1044
|
-
EOF
|
1045
|
-
|
1046
|
-
assert_equal "x", cls.foo(true)
|
1047
|
-
begin
|
1048
|
-
cls.foo(false)
|
1049
|
-
fail
|
1050
|
-
rescue java.lang.Exception => ex
|
1051
|
-
assert_equal "java.lang.Exception: !x", ex.message
|
1052
|
-
end
|
1053
933
|
end
|
1054
934
|
|
1055
935
|
def test_ensure
|
@@ -1654,38 +1534,6 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
1654
1534
|
cls.main(nil)
|
1655
1535
|
end
|
1656
1536
|
end
|
1657
|
-
|
1658
|
-
def test_annotations
|
1659
|
-
deprecated = java.lang.Deprecated.java_class
|
1660
|
-
cls, = compile(<<-EOF)
|
1661
|
-
$Deprecated
|
1662
|
-
def foo
|
1663
|
-
'foo'
|
1664
|
-
end
|
1665
|
-
EOF
|
1666
|
-
|
1667
|
-
assert_not_nil cls.java_class.java_method('foo').annotation(deprecated)
|
1668
|
-
assert_nil cls.java_class.annotation(deprecated)
|
1669
|
-
|
1670
|
-
script, cls = compile(<<-EOF)
|
1671
|
-
$Deprecated
|
1672
|
-
class Annotated
|
1673
|
-
end
|
1674
|
-
EOF
|
1675
|
-
assert_not_nil cls.java_class.annotation(deprecated)
|
1676
|
-
|
1677
|
-
cls, = compile(<<-EOF)
|
1678
|
-
class AnnotatedField
|
1679
|
-
def initialize
|
1680
|
-
$Deprecated
|
1681
|
-
@foo = 1
|
1682
|
-
end
|
1683
|
-
end
|
1684
|
-
EOF
|
1685
|
-
|
1686
|
-
assert_not_nil cls.java_class.declared_fields[0].annotation(deprecated)
|
1687
|
-
end
|
1688
|
-
|
1689
1537
|
def test_super
|
1690
1538
|
cls, = compile(<<-EOF)
|
1691
1539
|
class Foo
|
@@ -2191,6 +2039,33 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2191
2039
|
assert_equal("foo", cls.set("foo"))
|
2192
2040
|
end
|
2193
2041
|
|
2042
|
+
def test_hash_with_value_from_static_method
|
2043
|
+
cls, = compile(<<-EOF)
|
2044
|
+
def foo1
|
2045
|
+
{a: a, b:"B"}
|
2046
|
+
end
|
2047
|
+
def a
|
2048
|
+
return "A"
|
2049
|
+
end
|
2050
|
+
EOF
|
2051
|
+
assert_equal("A", cls.foo1["a"])
|
2052
|
+
end
|
2053
|
+
|
2054
|
+
def test_hash_with_value_from_instance_method
|
2055
|
+
cls, = compile(<<-EOF)
|
2056
|
+
class HashTesty
|
2057
|
+
def foo1
|
2058
|
+
{a: a, b:"B"}
|
2059
|
+
end
|
2060
|
+
def a
|
2061
|
+
return "A"
|
2062
|
+
end
|
2063
|
+
end
|
2064
|
+
EOF
|
2065
|
+
assert_equal("A", cls.new.foo1["a"])
|
2066
|
+
end
|
2067
|
+
|
2068
|
+
|
2194
2069
|
def test_loop_in_ensure
|
2195
2070
|
cls, = compile(<<-EOF)
|
2196
2071
|
begin
|
@@ -2246,11 +2121,8 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2246
2121
|
a.foo
|
2247
2122
|
a.bar
|
2248
2123
|
end
|
2249
|
-
|
2124
|
+
assert_raise_java java.lang.InstantiationException do
|
2250
2125
|
abstract_class.new
|
2251
|
-
fail "Expected InstantiationException"
|
2252
|
-
rescue java.lang.InstantiationException
|
2253
|
-
# expected
|
2254
2126
|
end
|
2255
2127
|
end
|
2256
2128
|
|
@@ -2478,29 +2350,9 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2478
2350
|
EOF
|
2479
2351
|
end
|
2480
2352
|
|
2481
|
-
def test_empty_rescues
|
2482
|
-
cls, = compile(<<-EOF)
|
2483
|
-
begin
|
2484
|
-
rescue
|
2485
|
-
nil
|
2486
|
-
end
|
2487
|
-
EOF
|
2488
|
-
|
2489
|
-
cls, = compile(<<-EOF)
|
2490
|
-
begin
|
2491
|
-
""
|
2492
|
-
rescue
|
2493
|
-
nil
|
2494
|
-
end
|
2495
|
-
nil
|
2496
|
-
EOF
|
2497
|
-
end
|
2498
|
-
|
2499
2353
|
def test_missing_class_with_block_raises_inference_error
|
2500
2354
|
assert_raises Typer::InferenceError do
|
2501
2355
|
compile("Interface Implements_Go do; end")
|
2502
2356
|
end
|
2503
2357
|
end
|
2504
|
-
|
2505
|
-
|
2506
2358
|
end
|
data/test/jvm/test_macros.rb
CHANGED
@@ -144,4 +144,17 @@ class TestMacros < Test::Unit::TestCase
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
+
def test_method_def_after_macro_def_with_same_name_raises_error
|
148
|
+
assert_raises Mirah::InferenceError do
|
149
|
+
compile(<<-EOF)
|
150
|
+
macro def foo
|
151
|
+
quote { puts :z }
|
152
|
+
end
|
153
|
+
def foo
|
154
|
+
:bar
|
155
|
+
end
|
156
|
+
EOF
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
147
160
|
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
# Copyright (c) 2010 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 TestRescue < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def test_rescue
|
19
|
+
cls, = compile(<<-EOF)
|
20
|
+
def foo
|
21
|
+
begin
|
22
|
+
puts "body"
|
23
|
+
rescue
|
24
|
+
puts "rescue"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
EOF
|
28
|
+
|
29
|
+
output = capture_output do
|
30
|
+
cls.foo
|
31
|
+
end
|
32
|
+
assert_equal("body\n", output)
|
33
|
+
|
34
|
+
cls, = compile(<<-EOF)
|
35
|
+
def foo
|
36
|
+
begin
|
37
|
+
puts "body"
|
38
|
+
raise
|
39
|
+
rescue
|
40
|
+
puts "rescue"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
EOF
|
44
|
+
|
45
|
+
output = capture_output do
|
46
|
+
cls.foo
|
47
|
+
end
|
48
|
+
assert_equal("body\nrescue\n", output)
|
49
|
+
|
50
|
+
cls, = compile(<<-EOF)
|
51
|
+
def foo(a:int)
|
52
|
+
begin
|
53
|
+
puts "body"
|
54
|
+
if a == 0
|
55
|
+
raise IllegalArgumentException
|
56
|
+
else
|
57
|
+
raise
|
58
|
+
end
|
59
|
+
rescue IllegalArgumentException
|
60
|
+
puts "IllegalArgumentException"
|
61
|
+
rescue
|
62
|
+
puts "rescue"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
EOF
|
66
|
+
|
67
|
+
output = capture_output do
|
68
|
+
cls.foo(1)
|
69
|
+
cls.foo(0)
|
70
|
+
end
|
71
|
+
assert_equal("body\nrescue\nbody\nIllegalArgumentException\n", output)
|
72
|
+
|
73
|
+
cls, = compile(<<-EOF)
|
74
|
+
def foo(a:int)
|
75
|
+
begin
|
76
|
+
puts "body"
|
77
|
+
if a == 0
|
78
|
+
raise IllegalArgumentException
|
79
|
+
elsif a == 1
|
80
|
+
raise Throwable
|
81
|
+
else
|
82
|
+
raise
|
83
|
+
end
|
84
|
+
rescue IllegalArgumentException, RuntimeException
|
85
|
+
puts "multi"
|
86
|
+
rescue Throwable
|
87
|
+
puts "other"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
EOF
|
91
|
+
|
92
|
+
output = capture_output do
|
93
|
+
cls.foo(0)
|
94
|
+
cls.foo(1)
|
95
|
+
cls.foo(2)
|
96
|
+
end
|
97
|
+
assert_equal("body\nmulti\nbody\nother\nbody\nmulti\n", output)
|
98
|
+
|
99
|
+
cls, = compile(<<-EOF)
|
100
|
+
def foo
|
101
|
+
begin
|
102
|
+
raise "foo"
|
103
|
+
rescue => ex
|
104
|
+
puts ex.getMessage
|
105
|
+
end
|
106
|
+
end
|
107
|
+
EOF
|
108
|
+
|
109
|
+
output = capture_output do
|
110
|
+
cls.foo
|
111
|
+
end
|
112
|
+
assert_equal("foo\n", output)
|
113
|
+
|
114
|
+
|
115
|
+
cls, = compile(<<-EOF)
|
116
|
+
def foo(x:boolean)
|
117
|
+
throws Exception
|
118
|
+
if x
|
119
|
+
raise Exception, "x"
|
120
|
+
end
|
121
|
+
rescue Exception
|
122
|
+
"x"
|
123
|
+
else
|
124
|
+
raise Exception, "!x"
|
125
|
+
end
|
126
|
+
EOF
|
127
|
+
|
128
|
+
assert_equal "x", cls.foo(true)
|
129
|
+
ex = assert_raise NativeException do
|
130
|
+
cls.foo(false)
|
131
|
+
end
|
132
|
+
assert_equal "java.lang.Exception: !x", ex.message
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_empty_rescues
|
136
|
+
cls, = compile(<<-EOF)
|
137
|
+
begin
|
138
|
+
rescue
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
EOF
|
142
|
+
|
143
|
+
cls, = compile(<<-EOF)
|
144
|
+
begin
|
145
|
+
""
|
146
|
+
rescue
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
nil
|
150
|
+
EOF
|
151
|
+
end
|
152
|
+
end
|