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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/History.txt +531 -0
- data/README.md +23 -10
- data/Rakefile +239 -156
- data/TODO.md +71 -10
- data/bin/mirah +1 -1
- data/bin/mirahc +1 -1
- data/dist/mirahc.jar +0 -0
- data/examples/bintrees.mirah +2 -2
- data/examples/construction.mirah +2 -2
- data/examples/fields.mirah +1 -1
- data/examples/fractal.mirah +1 -1
- data/examples/fractal.rb +70 -0
- data/examples/interfaces.mirah +1 -1
- data/examples/java_thing.mirah +1 -1
- data/examples/macros/square.mirah +3 -3
- data/examples/macros/square_int.mirah +3 -3
- data/examples/macros/string_each_char.mirah +6 -6
- data/examples/rosettacode/100-doors.mirah +0 -2
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
- data/examples/rosettacode/empty-string.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +7 -7
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +1 -1
- data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
- data/examples/rosettacode/string-case.mirah +2 -2
- data/examples/rosettacode/string-length.mirah +1 -1
- data/examples/swing.mirah +9 -14
- data/extensions_and_macros.md +117 -0
- data/lib/mirah.rb +1 -1
- data/lib/mirah/errors.rb +3 -1
- data/lib/mirah/transform/ast_ext.rb +3 -2
- data/lib/mirah/util/process_errors.rb +1 -2
- data/lib/mirah/version.rb +1 -1
- data/test/A.class +0 -0
- data/test/core/util/jvm_version_test.rb +10 -0
- data/test/core/util/mirah_arguments_test.rb +51 -4
- data/test/fixtures/cp1251_test.mirah +7 -0
- data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
- data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
- data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
- data/test/fixtures/org/foo/IntAnno.class +0 -0
- data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
- data/test/fixtures/utf8_test.mirah +7 -0
- data/test/jvm/access_levels_test.rb +31 -0
- data/test/jvm/annotations_test.rb +3 -6
- data/test/jvm/blocks_test.rb +303 -120
- data/test/jvm/cast_test.rb +123 -50
- data/test/jvm/closure_test.rb +242 -0
- data/test/jvm/constructors_test.rb +1 -3
- data/test/jvm/example_test.rb +6 -2
- data/test/jvm/extensions/array_extensions_test.rb +181 -0
- data/test/jvm/extensions/collection_extensions_test.rb +195 -0
- data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
- data/test/jvm/extensions/hash_extensions_test.rb +56 -0
- data/test/jvm/extensions/list_extensions_test.rb +143 -0
- data/test/jvm/extensions/lock_extensions_test.rb +43 -0
- data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
- data/test/jvm/extensions/numeric_operators_test.rb +86 -0
- data/test/jvm/extensions/object_extensions_test.rb +122 -0
- data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
- data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
- data/test/jvm/generics_test.rb +14 -6
- data/test/jvm/import_test.rb +38 -1
- data/test/jvm/interface_test.rb +17 -0
- data/test/jvm/jvm_commands_test.rb +9 -0
- data/test/jvm/jvm_compiler_test.rb +568 -43
- data/test/jvm/macros_test.rb +343 -19
- data/test/jvm/main_method_test.rb +1 -3
- data/test/jvm/new_backend_test_helper.rb +54 -7
- data/test/jvm/rescue_test.rb +20 -5
- data/test/jvm/static_fields_test.rb +52 -10
- data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
- data/test/jvm/varargs_test.rb +6 -16
- data/test/mirrors/base_type_test.rb +20 -7
- data/test/mirrors/bytecode_mirror_test.rb +8 -3
- data/test/mirrors/generics_test.rb +89 -10
- data/test/mirrors/member_test.rb +1 -1
- data/test/mirrors/method_lookup_test.rb +10 -3
- data/test/mirrors/mirrors_test.rb +20 -20
- data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
- data/test/mirrors/simple_mirror_loader_test.rb +1 -1
- data/test/newMirahClass$Closure2.class +0 -0
- data/test/newMirahClass.class +0 -0
- data/test/test_helper.rb +8 -1
- metadata +31 -16
- data/bin/bundler +0 -16
- data/bin/rake +0 -16
- data/examples/ant/example-build.xml~ +0 -7
- data/examples/test.edb +0 -9
- data/lib/mirah/compiler.rb +0 -67
- data/lib/mirah/parser.rb +0 -224
- data/lib/mirah/util/delegate.rb +0 -65
- data/test/jvm/list_extensions_test.rb +0 -23
@@ -17,6 +17,7 @@ require 'test_helper'
|
|
17
17
|
module JVMCompiler
|
18
18
|
java_import 'org.mirah.tool.RunCommand'
|
19
19
|
java_import 'org.mirah.util.SimpleDiagnostics'
|
20
|
+
|
20
21
|
System = java.lang.System
|
21
22
|
JVM_VERSION = ENV['MIRAH_TEST_JVM_VERSION'] || '1.7'
|
22
23
|
|
@@ -24,7 +25,22 @@ module JVMCompiler
|
|
24
25
|
java_import 'java.util.Locale'
|
25
26
|
def report(diagnostic)
|
26
27
|
if diagnostic.kind.name == "ERROR"
|
27
|
-
|
28
|
+
source = if diagnostic.source
|
29
|
+
|
30
|
+
line_no = [0, diagnostic.getLineNumber - diagnostic.source.initial_line].max
|
31
|
+
line = diagnostic.source.contents.lines.to_a[line_no]
|
32
|
+
start_col = if line_no == 0
|
33
|
+
diagnostic.column_number - diagnostic.source.initial_column
|
34
|
+
else
|
35
|
+
diagnostic.column_number - 1
|
36
|
+
end
|
37
|
+
end_col = [start_col + (diagnostic.end_position - diagnostic.start_position),
|
38
|
+
line.size - 1].min
|
39
|
+
line[start_col..end_col]
|
40
|
+
else
|
41
|
+
"<unknown>"
|
42
|
+
end
|
43
|
+
raise Mirah::MirahError.new(diagnostic.getMessage(Locale.getDefault), source, diagnostic)
|
28
44
|
end
|
29
45
|
super
|
30
46
|
end
|
@@ -38,13 +54,23 @@ module JVMCompiler
|
|
38
54
|
def compile(code, options = {})
|
39
55
|
name = options.fetch :name, tmp_script_name
|
40
56
|
|
41
|
-
java_version = options.fetch :java_version, JVMCompiler::JVM_VERSION
|
42
57
|
args = ["-d", TEST_DEST,
|
43
58
|
"--vmodule", "org.mirah.jvm.compiler.ClassCompiler=OFF",
|
59
|
+
# "--verbose",
|
44
60
|
"--classpath", Mirah::Env.encode_paths([FIXTURE_TEST_DEST, TEST_DEST]) ]
|
61
|
+
|
62
|
+
java_version = options.fetch :java_version, JVMCompiler::JVM_VERSION
|
45
63
|
if java_version
|
46
64
|
args += ["--jvm", java_version]
|
47
65
|
end
|
66
|
+
if options[:verbose]
|
67
|
+
args << '--verbose'
|
68
|
+
end
|
69
|
+
if options[:separate_macro_dest]
|
70
|
+
macro_dest = TEST_DEST.sub('classes','macro_classes')
|
71
|
+
args += ["--macro-dest", macro_dest,
|
72
|
+
"--macroclasspath", Mirah::Env.encode_paths([macro_dest])]
|
73
|
+
end
|
48
74
|
|
49
75
|
cmd = build_command name, code
|
50
76
|
compile_or_raise cmd, args
|
@@ -56,7 +82,13 @@ module JVMCompiler
|
|
56
82
|
|
57
83
|
def build_command(name, code)
|
58
84
|
cmd = RunCommand.new
|
59
|
-
|
85
|
+
if code.is_a?(Array)
|
86
|
+
code.each.with_index do |c,i|
|
87
|
+
cmd.addFakeFile("#{name}_#{i}", c)
|
88
|
+
end
|
89
|
+
else
|
90
|
+
cmd.addFakeFile(name, code)
|
91
|
+
end
|
60
92
|
cmd.setDiagnostics(TestDiagnostics.new(false))
|
61
93
|
cmd
|
62
94
|
end
|
@@ -65,9 +97,6 @@ module JVMCompiler
|
|
65
97
|
if 0 != cmd.compile(args)
|
66
98
|
raise Mirah::MirahError, "Compilation failed"
|
67
99
|
end
|
68
|
-
rescue => e
|
69
|
-
raise e.cause if e.respond_to?(:cause) && e.cause
|
70
|
-
raise e
|
71
100
|
end
|
72
101
|
|
73
102
|
def compiler_name
|
@@ -76,7 +105,11 @@ module JVMCompiler
|
|
76
105
|
|
77
106
|
def clean_tmp_files
|
78
107
|
return unless @tmp_classes
|
79
|
-
|
108
|
+
begin
|
109
|
+
File.unlink(*@tmp_classes)
|
110
|
+
rescue
|
111
|
+
JavaFile.unlink *@tmp_classes
|
112
|
+
end
|
80
113
|
end
|
81
114
|
|
82
115
|
def dump_class_files class_map
|
@@ -107,6 +140,20 @@ module JVMCompiler
|
|
107
140
|
end
|
108
141
|
ex
|
109
142
|
end
|
143
|
+
|
144
|
+
class JavaFile
|
145
|
+
java_import 'java.io.File'
|
146
|
+
|
147
|
+
def self.unlink *files
|
148
|
+
files.each do |f|
|
149
|
+
jf = File.new(f)
|
150
|
+
unless jf.delete
|
151
|
+
jf.deleteOnExit
|
152
|
+
puts "\nwarn: locked #{jf}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
110
157
|
end
|
111
158
|
|
112
159
|
class Test::Unit::TestCase
|
data/test/jvm/rescue_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
|
2
2
|
# All contributing project authors may be found in the NOTICE file.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,6 +15,23 @@
|
|
15
15
|
|
16
16
|
class RescueTest < Test::Unit::TestCase
|
17
17
|
|
18
|
+
def test_rescue_with_import
|
19
|
+
cls, = compile(<<-EOF)
|
20
|
+
def foo
|
21
|
+
begin
|
22
|
+
raise "some error"
|
23
|
+
rescue Exception => e
|
24
|
+
import java.util.Collections
|
25
|
+
x = [3, 1, 2]
|
26
|
+
Collections.sort x
|
27
|
+
x
|
28
|
+
end
|
29
|
+
end
|
30
|
+
EOF
|
31
|
+
|
32
|
+
assert_equal [1, 2, 3], cls.foo.to_a
|
33
|
+
end
|
34
|
+
|
18
35
|
def test_rescue_with_no_raise_runs_begin_and_not_rescue
|
19
36
|
cls, = compile(<<-EOF)
|
20
37
|
def foo
|
@@ -254,9 +271,7 @@ class RescueTest < Test::Unit::TestCase
|
|
254
271
|
puts "else"
|
255
272
|
end
|
256
273
|
EOF
|
257
|
-
|
258
|
-
cls.main nil
|
259
|
-
end
|
274
|
+
assert_run_output("else\n", cls)
|
260
275
|
end
|
261
276
|
|
262
277
|
def test_ensure
|
@@ -313,6 +328,6 @@ class RescueTest < Test::Unit::TestCase
|
|
313
328
|
end
|
314
329
|
EOF
|
315
330
|
|
316
|
-
|
331
|
+
assert_run_output("a\nb\nc\nensure\n", cls)
|
317
332
|
end
|
318
333
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
|
2
2
|
# All contributing project authors may be found in the NOTICE file.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -21,9 +21,7 @@ class StaticFieldsTest < Test::Unit::TestCase
|
|
21
21
|
puts GregorianCalendar.AM
|
22
22
|
EOF
|
23
23
|
|
24
|
-
|
25
|
-
cls.main(nil)
|
26
|
-
end
|
24
|
+
assert_run_output("0\n", cls)
|
27
25
|
end
|
28
26
|
|
29
27
|
def test_static_field_inheritance_lookup_with_double_colon
|
@@ -34,9 +32,7 @@ class StaticFieldsTest < Test::Unit::TestCase
|
|
34
32
|
puts GregorianCalendar::AM
|
35
33
|
EOF
|
36
34
|
|
37
|
-
|
38
|
-
cls.main(nil)
|
39
|
-
end
|
35
|
+
assert_run_output("0\n", cls)
|
40
36
|
}
|
41
37
|
end
|
42
38
|
|
@@ -45,8 +41,54 @@ class StaticFieldsTest < Test::Unit::TestCase
|
|
45
41
|
CONSTANT = 1
|
46
42
|
puts CONSTANT
|
47
43
|
EOF
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
assert_run_output("1\n", cls)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_static_final_constant
|
48
|
+
cls, = compile(<<-EOF)
|
49
|
+
class Bar
|
50
|
+
|
51
|
+
static_final :serialVersionUID, -1234567890123456789
|
52
|
+
|
53
|
+
class << self
|
54
|
+
def reflect
|
55
|
+
field = Bar.class.getDeclaredField("serialVersionUID")
|
56
|
+
puts field.getModifiers
|
57
|
+
puts field.get(nil)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
Bar.reflect
|
63
|
+
EOF
|
64
|
+
assert_run_output("26\n-1234567890123456789\n", cls)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_transient
|
68
|
+
cls, = compile(%q[
|
69
|
+
class Bar implements java::io::Serializable
|
70
|
+
|
71
|
+
static_final :serialVersionUID, -1234567890123456789
|
72
|
+
|
73
|
+
transient :b
|
74
|
+
|
75
|
+
def initialize(a:int,b:int)
|
76
|
+
@a = a
|
77
|
+
@b = b
|
78
|
+
end
|
79
|
+
|
80
|
+
def toString
|
81
|
+
"Bar(#{@a},#{@b})"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
bout = java::io::ByteArrayOutputStream.new
|
86
|
+
oout = java::io::ObjectOutputStream.new(bout)
|
87
|
+
oout.writeObject(Bar.new(5,7))
|
88
|
+
oout.close
|
89
|
+
bin = java::io::ObjectInputStream.new(java::io::ByteArrayInputStream.new(bout.toByteArray))
|
90
|
+
puts Bar(bin.readObject)
|
91
|
+
])
|
92
|
+
assert_run_output("Bar(5,0)\n", cls) # b=7 should be forgotten, because b is a transient field.
|
51
93
|
end
|
52
94
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
|
2
2
|
# All contributing project authors may be found in the NOTICE file.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -12,13 +12,14 @@
|
|
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 'new_backend_test_helper'
|
16
|
-
require 'stringio'
|
17
|
-
require 'fileutils'
|
18
15
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
class StringTest < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def test_string_interpolation_subsequence
|
19
|
+
cls, = compile(%q[
|
20
|
+
puts "#{begin; "a"; "b"; "c"; end}"
|
21
|
+
])
|
22
|
+
assert_run_output("c\n", cls)
|
23
23
|
end
|
24
|
-
end
|
24
|
+
end
|
25
|
+
|
data/test/jvm/varargs_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c)
|
1
|
+
# Copyright (c) 2015 The Mirah project authors. All Rights Reserved.
|
2
2
|
# All contributing project authors may be found in the NOTICE file.
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -19,36 +19,28 @@ class VarargsTest < Test::Unit::TestCase
|
|
19
19
|
cls, = compile(<<-EOF)
|
20
20
|
puts String.format("%s %s's", "rocking", "banana")
|
21
21
|
EOF
|
22
|
-
|
23
|
-
cls.main nil
|
24
|
-
end
|
22
|
+
assert_run_output("rocking banana's\n", cls)
|
25
23
|
end
|
26
24
|
|
27
25
|
def test_varargs_method_with_passed_including_int_varargs
|
28
26
|
cls, = compile(<<-EOF)
|
29
27
|
puts String.format("%s %d's", "rocking", 3)
|
30
28
|
EOF
|
31
|
-
|
32
|
-
cls.main nil
|
33
|
-
end
|
29
|
+
assert_run_output("rocking 3's\n", cls)
|
34
30
|
end
|
35
31
|
|
36
32
|
def test_varargs_method_with_passed_including_integer_varargs
|
37
33
|
cls, = compile(<<-EOF)
|
38
34
|
puts String.format("%s %d's", "rocking", Integer.valueOf(3))
|
39
35
|
EOF
|
40
|
-
|
41
|
-
cls.main nil
|
42
|
-
end
|
36
|
+
assert_run_output("rocking 3's\n", cls)
|
43
37
|
end
|
44
38
|
|
45
39
|
def test_varargs_method_lookup_without_passed_varargs
|
46
40
|
cls, = compile(<<-EOF)
|
47
41
|
puts String.format("rocking with no args")
|
48
42
|
EOF
|
49
|
-
|
50
|
-
cls.main nil
|
51
|
-
end
|
43
|
+
assert_run_output("rocking with no args\n", cls)
|
52
44
|
end
|
53
45
|
|
54
46
|
def test_varargs_method_lookup_when_passed_array
|
@@ -57,9 +49,7 @@ class VarargsTest < Test::Unit::TestCase
|
|
57
49
|
args[0] = "an array"
|
58
50
|
puts String.format("rocking with %s", args)
|
59
51
|
EOF
|
60
|
-
|
61
|
-
cls.main nil
|
62
|
-
end
|
52
|
+
assert_run_output("rocking with an array\n", cls)
|
63
53
|
end
|
64
54
|
|
65
55
|
end
|
@@ -13,14 +13,13 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
require '
|
17
|
-
require 'java'
|
18
|
-
require 'dist/mirahc.jar'
|
16
|
+
require 'test_helper'
|
19
17
|
|
20
18
|
class BaseTypeTest < Test::Unit::TestCase
|
21
19
|
java_import 'org.objectweb.asm.Type'
|
22
20
|
java_import 'org.objectweb.asm.Opcodes'
|
23
21
|
java_import 'org.mirah.jvm.mirrors.BaseType'
|
22
|
+
java_import 'org.mirah.jvm.mirrors.VoidType'
|
24
23
|
java_import 'org.mirah.jvm.mirrors.Member'
|
25
24
|
java_import 'org.mirah.jvm.mirrors.MirrorTypeSystem'
|
26
25
|
java_import 'org.mirah.jvm.types.MemberKind'
|
@@ -29,7 +28,7 @@ class BaseTypeTest < Test::Unit::TestCase
|
|
29
28
|
def setup
|
30
29
|
@types = MirrorTypeSystem.new
|
31
30
|
@type = BaseType.new(@types.context, Type.getType("LFooBar;"), 0, nil)
|
32
|
-
@void =
|
31
|
+
@void = VoidType.new
|
33
32
|
end
|
34
33
|
|
35
34
|
def type(name)
|
@@ -89,9 +88,23 @@ class BaseTypeTest < Test::Unit::TestCase
|
|
89
88
|
assert_equal(object, map.widen(int))
|
90
89
|
end
|
91
90
|
|
92
|
-
def
|
91
|
+
def test_widen_void_to_map_is_error
|
93
92
|
map = type('java.util.Map')
|
94
|
-
assert(@void.widen(map).isError)
|
95
|
-
|
93
|
+
assert(@void.widen(map).isError, @void.widen(map).to_s)
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_widen_to_void_is_error
|
97
|
+
map = type('java.util.Map')
|
98
|
+
assert(map.widen(@void).isError, map.widen(@void).to_s)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_void_assignable_from_map
|
102
|
+
map = type('java.util.Map')
|
103
|
+
refute(@void.assignableFrom(map))
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_map_assignable_from_void
|
107
|
+
map = type('java.util.Map')
|
108
|
+
refute(map.assignableFrom(@void))
|
96
109
|
end
|
97
110
|
end
|
@@ -13,9 +13,7 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
require '
|
17
|
-
require 'java'
|
18
|
-
require 'dist/mirahc.jar'
|
16
|
+
require 'test_helper'
|
19
17
|
|
20
18
|
class BytecodeMirrorTest < Test::Unit::TestCase
|
21
19
|
java_import 'org.objectweb.asm.Type'
|
@@ -83,6 +81,13 @@ class BytecodeMirrorTest < Test::Unit::TestCase
|
|
83
81
|
assert_equal('FIELD_ACCESS', field.kind.name)
|
84
82
|
end
|
85
83
|
|
84
|
+
def test_declared_field_signature
|
85
|
+
mirror = load(Type.getType("Ljava/lang/String;"))
|
86
|
+
field = mirror.getDeclaredField 'CASE_INSENSITIVE_ORDER'
|
87
|
+
|
88
|
+
assert_equal('Ljava/util/Comparator<Ljava/lang/String;>;', field.signature)
|
89
|
+
end
|
90
|
+
|
86
91
|
def test_array
|
87
92
|
mirror = load(Type.getType("[Ljava/lang/Object;"))
|
88
93
|
assert(JVMTypeUtils.isArray(mirror))
|
@@ -16,26 +16,30 @@
|
|
16
16
|
require 'java'
|
17
17
|
require 'test/unit'
|
18
18
|
require 'java'
|
19
|
-
require 'dist/mirahc.jar
|
19
|
+
require ENV.fetch('MIRAHC_JAR',File.expand_path("../../../dist/mirahc.jar",__FILE__))
|
20
|
+
require File.expand_path("../../jvm/new_backend_test_helper",__FILE__)
|
20
21
|
|
21
22
|
class GenericsTest < Test::Unit::TestCase
|
22
23
|
java_import 'java.util.HashSet'
|
24
|
+
java_import 'javax.lang.model.util.Types'
|
25
|
+
java_import 'org.objectweb.asm.Type'
|
26
|
+
|
27
|
+
java_import 'org.mirah.jvm.mirrors.BaseType'
|
23
28
|
java_import 'org.mirah.jvm.mirrors.generics.Constraints'
|
24
29
|
java_import 'org.mirah.jvm.mirrors.generics.LubFinder'
|
30
|
+
java_import 'org.mirah.jvm.mirrors.generics.TypeInvocation'
|
31
|
+
java_import 'org.mirah.jvm.mirrors.generics.TypeInvoker'
|
25
32
|
java_import 'org.mirah.jvm.mirrors.generics.TypeParameterInference'
|
26
33
|
java_import 'org.mirah.jvm.mirrors.generics.TypeVariable'
|
27
|
-
java_import 'org.mirah.jvm.mirrors.generics.TypeInvocation'
|
28
34
|
java_import 'org.mirah.jvm.mirrors.generics.Wildcard'
|
29
|
-
java_import 'org.mirah.jvm.mirrors.BaseType'
|
30
|
-
java_import 'org.mirah.jvm.mirrors.NullType'
|
31
35
|
java_import 'org.mirah.jvm.mirrors.MirrorTypeSystem'
|
36
|
+
java_import 'org.mirah.jvm.mirrors.NullType'
|
32
37
|
java_import 'org.mirah.jvm.model.Cycle'
|
33
38
|
java_import 'org.mirah.jvm.model.IntersectionType'
|
34
39
|
java_import 'org.mirah.typer.BaseTypeFuture'
|
35
|
-
java_import 'org.objectweb.asm.Type'
|
36
|
-
java_import 'javax.lang.model.util.Types'
|
37
40
|
|
38
41
|
def setup
|
42
|
+
super
|
39
43
|
@types = MirrorTypeSystem.new
|
40
44
|
@type_utils = @types.context.get(Types.java_class)
|
41
45
|
@tpi = TypeParameterInference.new(@type_utils)
|
@@ -57,7 +61,7 @@ class GenericsTest < Test::Unit::TestCase
|
|
57
61
|
def g(name, params)
|
58
62
|
klass = future(name)
|
59
63
|
params = params.map {|x| future(x)}
|
60
|
-
@types.parameterize(klass, params).resolve
|
64
|
+
@types.parameterize(klass, params, {}).resolve
|
61
65
|
end
|
62
66
|
|
63
67
|
def future(x)
|
@@ -310,7 +314,7 @@ class GenericsTest < Test::Unit::TestCase
|
|
310
314
|
assert_nil(@tpi.findMatchingSupertype(string, abstract_list))
|
311
315
|
|
312
316
|
array_list = @types.loadNamedType('java.util.ArrayList').resolve
|
313
|
-
assert_equal(abstract_list, @tpi.findMatchingSupertype(array_list, abstract_list))
|
317
|
+
assert_equal(abstract_list.name, @tpi.findMatchingSupertype(array_list, abstract_list).name)
|
314
318
|
end
|
315
319
|
|
316
320
|
def test_equal_variable
|
@@ -666,7 +670,7 @@ class GenericsTest < Test::Unit::TestCase
|
|
666
670
|
a = @types.getArrayType(s)
|
667
671
|
assert_equal('java.util.Set<java.lang.String>[]', a.toString)
|
668
672
|
supertypes = a.directSupertypes
|
669
|
-
assert_equal('[java.util.Set[], java.util.Collection<java.lang.String>[]]',
|
673
|
+
assert_equal('[java.lang.Object, java.util.Set[], java.util.Collection<java.lang.String>[]]',
|
670
674
|
supertypes.toString)
|
671
675
|
|
672
676
|
end
|
@@ -782,4 +786,79 @@ class GenericsTest < Test::Unit::TestCase
|
|
782
786
|
assert_equal(["java.lang.Comparable<java.lang.String>"],
|
783
787
|
interfaces.grep(/Comparable/))
|
784
788
|
end
|
785
|
-
|
789
|
+
|
790
|
+
def test_type_invoker_simple_signature
|
791
|
+
invoker = invoker_for_signature('Ljava/lang/Object;')
|
792
|
+
assert_equal(0,invoker.getFormalTypeParameters.size)
|
793
|
+
end
|
794
|
+
|
795
|
+
def test_type_invoker_array_as_type_parameter_signature
|
796
|
+
invoker = invoker_for_signature('<T:Ljava/lang/Object;>Ljava/lang/Class<[TT;>;')
|
797
|
+
assert_equal(1,invoker.getFormalTypeParameters.size)
|
798
|
+
end
|
799
|
+
|
800
|
+
def test_type_invoker_class_with_self_referential_bounds
|
801
|
+
invoker = invoker_for_signature('<P:LAnotherClassWithSelfReferencingTypeParameter<TP;>;>Ljava/lang/Object;')
|
802
|
+
assert_equal(1,invoker.getFormalTypeParameters.size)
|
803
|
+
end
|
804
|
+
|
805
|
+
def test_ClassWithSelfReferencingTypeParameter
|
806
|
+
cls, = compile(%q[
|
807
|
+
import org.foo.ClassWithSelfReferencingTypeParameter
|
808
|
+
|
809
|
+
ClassWithSelfReferencingTypeParameter.new.foo.bar.baz
|
810
|
+
])
|
811
|
+
assert_run_output("baz\n", cls)
|
812
|
+
end
|
813
|
+
|
814
|
+
def test_issue_417_npe
|
815
|
+
omit_if JVMCompiler::JVM_VERSION.to_f < 1.8
|
816
|
+
pend "fix NPE in generic inference" do
|
817
|
+
cls, = compile(%q[
|
818
|
+
import org.foo.TypeFixtureJava8
|
819
|
+
import java.util.function.BiConsumer
|
820
|
+
import java.util.Map
|
821
|
+
import java.util.List
|
822
|
+
|
823
|
+
class Issue417Test
|
824
|
+
|
825
|
+
def initialize(filters:List, flags:int)
|
826
|
+
@filters = filters
|
827
|
+
@flags = flags
|
828
|
+
@loader = TypeFixtureJava8.new
|
829
|
+
@future = nil
|
830
|
+
end
|
831
|
+
|
832
|
+
def run():void
|
833
|
+
@future = @loader.load(@filters, @flags)
|
834
|
+
end
|
835
|
+
|
836
|
+
def handle(block:BiConsumer):Issue417Test
|
837
|
+
@future.whenComplete(block)
|
838
|
+
self
|
839
|
+
end
|
840
|
+
|
841
|
+
def join():void
|
842
|
+
@future.join
|
843
|
+
end
|
844
|
+
|
845
|
+
end
|
846
|
+
])
|
847
|
+
end
|
848
|
+
end
|
849
|
+
|
850
|
+
def test_type_invoker_recursive_reference_signature
|
851
|
+
omit_if JVMCompiler::JVM_VERSION.to_f < 1.8
|
852
|
+
# Stream API is needed here
|
853
|
+
invoker = invoker_for_signature('<T:Ljava/lang/Object;S::Ljava/util/stream/BaseStream<TT;TS;>;>Ljava/lang/Object;Ljava/lang/AutoCloseable;')
|
854
|
+
assert_equal(2,invoker.getFormalTypeParameters.size)
|
855
|
+
end
|
856
|
+
|
857
|
+
def invoker_for_signature(signature)
|
858
|
+
context = @types.context
|
859
|
+
invoker = TypeInvoker.new(context, nil, [], {})
|
860
|
+
invoker.read(signature)
|
861
|
+
invoker
|
862
|
+
end
|
863
|
+
end
|
864
|
+
|