mirah 0.1.4-java → 0.2.0-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.
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