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
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 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 HashExtensionsTest < Test::Unit::TestCase
17
+
18
+ def test_hash_each_untyped
19
+ cls, = compile(%q{
20
+ res = java::util::TreeSet.new # stable sort order of the results
21
+
22
+ {
23
+ a: "b",
24
+ "c" => "d",
25
+ "e" => 3,
26
+ [4] => "h"
27
+ }.each do |k,v|
28
+ res.add("#{v},#{k}")
29
+ end
30
+
31
+ res.each do |r|
32
+ puts r
33
+ end
34
+ })
35
+ assert_run_output("3,e\nb,a\nd,c\nh,[4]\n", cls)
36
+ end
37
+
38
+ def test_hash_each_typed
39
+ cls, = compile(%q{
40
+ res = java::util::TreeSet.new # stable sort order of the results
41
+
42
+ {
43
+ "a" => 3,
44
+ "b" => 2
45
+ }.each do |k:String,v:int|
46
+ res.add("#{v+1},#{k}")
47
+ end
48
+
49
+ res.each do |r|
50
+ puts r
51
+ end
52
+ })
53
+ assert_run_output("3,b\n4,a\n", cls)
54
+ end
55
+ end
56
+
@@ -0,0 +1,143 @@
1
+ class ListExtensionsTest < Test::Unit::TestCase
2
+ def test_empty_q
3
+ cls, = compile(<<-EOF)
4
+ x = []
5
+ puts x.empty?
6
+ EOF
7
+ assert_run_output("true\n", cls)
8
+ end
9
+
10
+ def test_bracket_getter
11
+ cls, = compile(<<-EOF)
12
+ x = [1,2]
13
+ puts x[0]
14
+ EOF
15
+ assert_run_output("1\n", cls)
16
+ end
17
+
18
+ def test_bracket_assignment
19
+ cls, = compile(<<-EOF)
20
+ import java.util.ArrayList
21
+ x = ArrayList.new
22
+ x[0]= "2"
23
+ puts x
24
+ EOF
25
+ assert_run_output("[2]\n", cls)
26
+ end
27
+
28
+ def test_sort_with_block
29
+ cls, = compile(<<-EOF)
30
+ puts ([3,1,2].sort do |o0:Comparable,o1:Comparable|
31
+ -o0.compareTo(o1)
32
+ end)
33
+ EOF
34
+ assert_run_output("[3, 2, 1]\n", cls)
35
+ end
36
+
37
+ def test_sort_bang_with_block
38
+ cls, = compile(<<-EOF)
39
+ puts ([3,1,2].sort! do |o0:Comparable,o1:Comparable|
40
+ -o0.compareTo(o1)
41
+ end)
42
+ EOF
43
+ assert_run_output("[3, 2, 1]\n", cls)
44
+ end
45
+
46
+ def test_sort_with_comparator
47
+ cls, = compile(<<-EOF)
48
+ class Co implements java::util::Comparator
49
+ def compare(o0:Object,o1:Object)
50
+ compare(Comparable(o0),Comparable(o1))
51
+ end
52
+ def compare(o0:Comparable,o1:Comparable)
53
+ -o0.compareTo(o1)
54
+ end
55
+ end
56
+ puts [3,1,2].sort(Co.new)
57
+ EOF
58
+ assert_run_output("[3, 2, 1]\n", cls)
59
+ end
60
+
61
+ def test_sort_bang_with_comparator
62
+ cls, = compile(<<-EOF)
63
+ class Co implements java::util::Comparator
64
+ def compare(o0:Object,o1:Object)
65
+ compare(Comparable(o0),Comparable(o1))
66
+ end
67
+ def compare(o0:Comparable,o1:Comparable)
68
+ -o0.compareTo(o1)
69
+ end
70
+ end
71
+ puts [3,1,2].sort!(Co.new)
72
+ EOF
73
+ assert_run_output("[3, 2, 1]\n", cls)
74
+ end
75
+
76
+ def test_sort_without_comparator
77
+ cls, = compile(<<-EOF)
78
+ puts [5,1,3].sort
79
+ EOF
80
+ assert_run_output("[1, 3, 5]\n", cls)
81
+ end
82
+
83
+ def test_first
84
+ cls, = compile(<<-EOF)
85
+ puts [5,1,3].first
86
+ EOF
87
+ assert_run_output("5\n", cls)
88
+ end
89
+
90
+ def test_empty_list_first
91
+ cls, = compile(<<-EOF)
92
+ puts [].first
93
+ EOF
94
+ assert_run_output("null\n", cls)
95
+ end
96
+
97
+ def test_last
98
+ cls, = compile(<<-EOF)
99
+ puts [5,1,3].last
100
+ EOF
101
+ assert_run_output("3\n", cls)
102
+ end
103
+
104
+ def test_empty_list_last
105
+ cls, = compile(<<-EOF)
106
+ puts [].last
107
+ EOF
108
+ assert_run_output("null\n", cls)
109
+ end
110
+
111
+ def test_first!
112
+ cls, = compile(<<-EOF)
113
+ puts [5,1,3].first!
114
+ EOF
115
+ assert_run_output("5\n", cls)
116
+ end
117
+
118
+ def test_empty_list_first!
119
+ cls, = compile(<<-EOF)
120
+ puts [].first!
121
+ EOF
122
+ assert_raise_java(java.lang.IndexOutOfBoundsException) do
123
+ cls.main nil
124
+ end
125
+ end
126
+
127
+ def test_last!
128
+ cls, = compile(<<-EOF)
129
+ puts [5,1,3].last!
130
+ EOF
131
+ assert_run_output("3\n", cls)
132
+ end
133
+
134
+ def test_empty_list_last!
135
+ cls, = compile(<<-EOF)
136
+ puts [].last!
137
+ EOF
138
+ assert_raise_java(java.lang.ArrayIndexOutOfBoundsException) do
139
+ cls.main nil
140
+ end
141
+ end
142
+
143
+ end
@@ -0,0 +1,43 @@
1
+ # Copyright (c) 2015 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
+ require 'test_helper'
17
+
18
+ class LockExtensionsTest < Test::Unit::TestCase
19
+
20
+ def test_synchronize_happy
21
+ cls, = compile(<<-EOF)
22
+ import java.util.concurrent.locks.ReentrantLock
23
+ lock = ReentrantLock.new
24
+ lock.synchronize do
25
+ puts "synchronized. Yay!"
26
+ end
27
+ EOF
28
+ assert_run_output("synchronized. Yay!\n", cls)
29
+ end
30
+
31
+ def test_synchronize_lock_unlocks_after_exception
32
+ cls, = compile(<<-EOF)
33
+ import java.util.concurrent.locks.ReentrantLock
34
+ lock = ReentrantLock.new
35
+ begin
36
+ lock.synchronize { raise "wut" }
37
+ rescue
38
+ end
39
+ Thread.new { puts lock.tryLock }.start.join
40
+ EOF
41
+ assert_run_output("true\n", cls)
42
+ end
43
+ end
@@ -0,0 +1,86 @@
1
+ # Copyright (c) 2015 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
+ require 'test_helper'
17
+
18
+ class NumericOperatorsTest < Test::Unit::TestCase
19
+
20
+ OPERATORS = ['+', '-', '/', '*', '%', '>', '<', '!=', '==', '>=', '<=']
21
+ # Note! signed right shift is not supported due to parser issue:
22
+ # macro def >>>(n);end
23
+ # wont parse
24
+ BITWISE_OPERATORS = ['&', '|', '&', '^']
25
+ SHIFT_OPERATORS = ['>>', '<<']
26
+ # mirah fixnum constants defaults to int
27
+ FIXNUM_TYPES = ['Integer', 'Short', 'Byte', 'Long']
28
+ # need to cast constants to primitives
29
+ FLOAT_TYPES = ['Float', 'Double']
30
+
31
+ def self.define_test_methods(cast, i, numeric_class, operator , assert)
32
+ define_method "test_#{numeric_class}_left_arithmetic_#{i}".to_sym do
33
+ cls, = compile(<<-EOF)
34
+ puts #{numeric_class}.new(#{cast}(5)) #{operator} #{cast}(7)
35
+ EOF
36
+ assert_run_output("#{assert}\n", cls)
37
+ end
38
+ define_method "test_#{numeric_class}_right_arithmetic_#{i}".to_sym do
39
+ cls, = compile(<<-EOF)
40
+ puts #{cast}(5) #{operator} #{numeric_class}.new(#{cast}(7))
41
+ EOF
42
+ assert_run_output("#{assert}\n", cls)
43
+ end
44
+ end
45
+
46
+ def self.define_shift_test_methods(cast, i, numeric_class, operator , assert)
47
+ define_method "test_#{numeric_class}_left_arithmetic_#{i}".to_sym do
48
+ cls, = compile(<<-EOF)
49
+ puts #{numeric_class}.new(#{cast}(5)) #{operator} 7
50
+ EOF
51
+ assert_run_output("#{assert}\n", cls)
52
+ end
53
+ define_method "test_#{numeric_class}_right_arithmetic_#{i}".to_sym do
54
+ cls, = compile(<<-EOF)
55
+ puts 5 #{operator} #{numeric_class}.new(#{cast}(7)).intValue
56
+ EOF
57
+ assert_run_output("#{assert}\n", cls)
58
+ end
59
+ end
60
+
61
+ FIXNUM_TYPES.each do |numeric_class|
62
+ test_num = 0
63
+ cast = ('Integer' == numeric_class ? 'int' : numeric_class.downcase)
64
+ (OPERATORS + BITWISE_OPERATORS).each do |operator|
65
+ assert = eval "5#{operator}7"
66
+ define_test_methods(cast, test_num+=1, numeric_class, operator, assert)
67
+ end
68
+ SHIFT_OPERATORS.each do |operator|
69
+ assert = eval "5#{operator}7"
70
+ define_shift_test_methods(cast, test_num+=1, numeric_class, operator, assert)
71
+ end
72
+ end
73
+
74
+ # have to
75
+ FLOAT_TYPES.each do |numeric_class|
76
+ OPERATORS.each_with_index do |operator, i|
77
+ cast = numeric_class.downcase
78
+ assert = eval "5.0#{operator}7.0"
79
+ if numeric_class == 'Float' and operator == '/'
80
+ assert = '0.71428573'
81
+ end
82
+ define_test_methods(cast, i, numeric_class, operator, assert)
83
+ end
84
+ end
85
+
86
+ end
@@ -0,0 +1,122 @@
1
+ # Copyright (c) 2015 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 ObjectExtensionsTest < Test::Unit::TestCase
17
+
18
+ def test_tap
19
+ cls, = compile(%q[
20
+ def taptest
21
+ StringBuilder.new("abc").tap do |sb|
22
+ sb.append("xyz")
23
+ StringBuilder.new("ijk")
24
+ end
25
+ end
26
+ ])
27
+ assert_equal("abcxyz", cls.taptest.toString)
28
+ end
29
+
30
+ def test_equals_each_side_is_evaluated_exactly_once
31
+ cls, = compile(%q[
32
+ def foo
33
+ puts "foo"
34
+ "1"
35
+ end
36
+
37
+ def bar
38
+ puts "bar"
39
+ "2"
40
+ end
41
+
42
+ puts foo==bar
43
+ puts nil==bar # right side is always evaluated exactly once, even in the presence of nil on the other side
44
+ puts bar==nil # left side is always evaluated exactly once, even in the presence of nil on the other side
45
+ ])
46
+ assert_run_output("foo\nbar\nfalse\nbar\nfalse\nbar\nfalse\n", cls)
47
+ end
48
+
49
+ def test_equals_method_is_evaluated_as_necessary
50
+ cls, = compile(%q[
51
+ class Foo
52
+ attr_accessor counter:int
53
+ def equals(o:Object)
54
+ self.counter += 1
55
+ true
56
+ end
57
+ end
58
+
59
+ class Bar < Foo
60
+ end
61
+
62
+ class Baz < Foo
63
+ end
64
+
65
+ bar = Bar.new
66
+ baz = Baz.new
67
+ puts bar==baz
68
+ puts bar.counter
69
+ puts baz.counter
70
+ puts nil==bar
71
+ puts bar.counter
72
+ puts bar==nil
73
+ puts bar.counter
74
+ puts bar==bar
75
+ puts bar.counter
76
+ ])
77
+ assert_run_output("true\n1\n0\nfalse\n1\ntrue\n2\ntrue\n3\n", cls)
78
+ end
79
+
80
+ def test_equals_method_is_evaluated_exactly_once_even_on_identical_objects
81
+ cls, = compile(%q[
82
+ class NaN
83
+ def equals(o:Object)
84
+ false
85
+ end
86
+ end
87
+
88
+ nan = NaN.new
89
+ puts nan==nan
90
+ ])
91
+ assert_run_output("false\n", cls)
92
+ end
93
+
94
+ def test_boxing_for_equals
95
+ cls, = compile(%q[
96
+ puts true==true
97
+ puts false==true
98
+ puts nil==true
99
+
100
+ obj = Boolean true
101
+ puts obj == true
102
+ puts obj == false
103
+
104
+ b = true
105
+ puts obj == b
106
+ puts obj == 1
107
+ puts true == obj
108
+ ])
109
+ assert_run_output("true\nfalse\nfalse\ntrue\nfalse\ntrue\nfalse\ntrue\n", cls)
110
+ end
111
+
112
+ def test_boxing_for_numerics
113
+ cls, = compile(%q[
114
+ puts 1==Long.new(1)
115
+ puts Long(nil)==Long.new(1)
116
+ puts 1==Long.new(2)
117
+ puts nil == Long.new(2)
118
+ ])
119
+ assert_run_output("true\nfalse\nfalse\nfalse\n", cls)
120
+ end
121
+
122
+ end