mirah 0.0.12-java → 0.1.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.
- data/History.txt +372 -0
- data/README.txt +4 -5
- data/Rakefile +178 -55
- data/examples/appengine/Readme +3 -3
- data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
- data/examples/appengine/src/org/mirah/list.dhtml +1 -1
- data/examples/bintrees.mirah +1 -1
- data/examples/edb.mirah +1 -1
- data/examples/fib.mirah +1 -1
- data/examples/interfaces.mirah +1 -1
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
- data/examples/maven/README.txt +1 -1
- data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
- data/examples/plugins/appengine/Rakefile +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
- data/examples/rosettacode/100-doors.mirah +6 -6
- data/examples/rosettacode/README.txt +3 -3
- data/examples/rosettacode/boolean-values.mirah +1 -1
- data/examples/rosettacode/comments.mirah +1 -1
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
- data/examples/rosettacode/factorial.mirah +1 -1
- data/examples/rosettacode/fibonacci.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +2 -2
- data/examples/rosettacode/flatten-a-list.mirah +4 -4
- data/examples/rosettacode/guess-the-number.mirah +2 -2
- data/examples/rosettacode/hamming-numbers.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +22 -22
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/random-numbers.mirah +1 -1
- data/examples/rosettacode/repeat-a-string.mirah +1 -1
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +5 -5
- data/examples/rosettacode/secure-temporary-file.mirah +2 -2
- data/examples/rosettacode/sleep.mirah +1 -1
- data/examples/rosettacode/string-length.mirah +5 -5
- data/examples/swing.mirah +1 -1
- data/examples/test.edb +1 -1
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/duby.rb +1 -1
- data/lib/mirah.rb +50 -28
- data/lib/mirah/ast.rb +15 -605
- data/lib/mirah/ast/scope.rb +98 -69
- data/lib/mirah/commands.rb +1 -1
- data/lib/mirah/commands/base.rb +7 -7
- data/lib/mirah/commands/compile.rb +3 -3
- data/lib/mirah/commands/parse.rb +7 -5
- data/lib/mirah/commands/run.rb +12 -19
- data/lib/mirah/compiler.rb +15 -23
- data/lib/mirah/errors.rb +16 -1
- data/lib/mirah/generator.rb +79 -39
- data/lib/mirah/jvm/compiler.rb +1 -19
- data/lib/mirah/jvm/compiler/base.rb +233 -90
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
- data/lib/mirah/jvm/method_lookup.rb +134 -65
- data/lib/mirah/jvm/typer.rb +10 -5
- data/lib/mirah/jvm/types.rb +10 -2
- data/lib/mirah/jvm/types/array_type.rb +10 -12
- data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
- data/lib/mirah/jvm/types/basic_types.rb +26 -33
- data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
- data/lib/mirah/jvm/types/block_type.rb +15 -0
- data/lib/mirah/jvm/types/boolean.rb +8 -4
- data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
- data/lib/mirah/jvm/types/enumerable.rb +7 -7
- data/lib/mirah/jvm/types/extensions.rb +11 -6
- data/lib/mirah/jvm/types/factory.rb +624 -94
- data/lib/mirah/jvm/types/floats.rb +21 -15
- data/lib/mirah/jvm/types/generic_type.rb +72 -0
- data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
- data/lib/mirah/jvm/types/integers.rb +26 -71
- data/lib/mirah/jvm/types/interface_definition.rb +3 -3
- data/lib/mirah/jvm/types/intrinsics.rb +203 -168
- data/lib/mirah/jvm/types/literals.rb +6 -6
- data/lib/mirah/jvm/types/meta_type.rb +13 -4
- data/lib/mirah/jvm/types/methods.rb +281 -93
- data/lib/mirah/jvm/types/null_type.rb +17 -5
- data/lib/mirah/jvm/types/number.rb +10 -7
- data/lib/mirah/jvm/types/primitive_type.rb +17 -6
- data/lib/mirah/jvm/types/source_mirror.rb +12 -7
- data/lib/mirah/jvm/types/type.rb +107 -23
- data/lib/mirah/jvm/types/type_definition.rb +25 -10
- data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
- data/lib/mirah/jvm/types/void_type.rb +3 -3
- data/lib/mirah/parser.rb +154 -16
- data/lib/mirah/plugin/edb.rb +1 -1
- data/lib/mirah/transform.rb +1 -2
- data/lib/mirah/transform/ast_ext.rb +24 -43
- data/lib/mirah/transform/transformer.rb +29 -224
- data/lib/mirah/typer.rb +2 -16
- data/lib/mirah/util/argument_processor.rb +25 -10
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/compilation_state.rb +16 -17
- data/lib/mirah/util/delegate.rb +2 -2
- data/lib/mirah/util/logging.rb +110 -0
- data/lib/mirah/util/process_errors.rb +69 -11
- data/lib/mirah/version.rb +1 -1
- data/test/core/commands_test.rb +6 -24
- data/test/core/env_test.rb +5 -5
- data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
- data/test/core/typer_test.rb +196 -158
- data/test/core/util/argument_processor_test.rb +10 -10
- data/test/core/util/class_loader_test.rb +6 -5
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/annotations_test.rb +5 -5
- data/test/jvm/blocks_test.rb +140 -88
- data/test/jvm/bytecode_test_helper.rb +112 -94
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +18 -8
- data/test/jvm/enumerable_test.rb +77 -44
- data/test/jvm/example_test.rb +53 -0
- data/test/jvm/factory_test.rb +7 -1
- data/test/jvm/generics_test.rb +57 -0
- data/test/jvm/hash_test.rb +106 -0
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +73 -0
- data/test/jvm/java_typer_test.rb +92 -66
- data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
- data/test/jvm/jvm_compiler_test.rb +170 -604
- data/test/jvm/list_extensions_test.rb +23 -0
- data/test/jvm/macros_test.rb +197 -32
- data/test/jvm/main_method_test.rb +4 -4
- data/test/jvm/numeric_extensions_test.rb +13 -0
- data/test/jvm/rescue_test.rb +73 -16
- data/test/jvm/varargs_test.rb +65 -0
- data/test/test_helper.rb +1 -2
- metadata +234 -251
- data/examples/SortClosure$__xform_tmp_1.class +0 -0
- data/examples/SortClosure$__xform_tmp_2.class +0 -0
- data/examples/SortClosure.class +0 -0
- data/examples/macros/StringEachChar$Extension1.class +0 -0
- data/lib/mirah/ast/call.rb +0 -345
- data/lib/mirah/ast/class.rb +0 -359
- data/lib/mirah/ast/flow.rb +0 -381
- data/lib/mirah/ast/intrinsics.rb +0 -563
- data/lib/mirah/ast/literal.rb +0 -178
- data/lib/mirah/ast/local.rb +0 -112
- data/lib/mirah/ast/method.rb +0 -408
- data/lib/mirah/ast/structure.rb +0 -387
- data/lib/mirah/ast/type.rb +0 -146
- data/lib/mirah/commands/base.rb~ +0 -57
- data/lib/mirah/compiler/call.rb +0 -45
- data/lib/mirah/compiler/class.rb +0 -81
- data/lib/mirah/compiler/flow.rb +0 -109
- data/lib/mirah/compiler/literal.rb +0 -130
- data/lib/mirah/compiler/local.rb +0 -59
- data/lib/mirah/compiler/method.rb +0 -44
- data/lib/mirah/compiler/structure.rb +0 -65
- data/lib/mirah/jvm/compiler/java_source.rb +0 -787
- data/lib/mirah/jvm/method_lookup.rb~ +0 -247
- data/lib/mirah/jvm/source_generator/builder.rb +0 -468
- data/lib/mirah/jvm/source_generator/loops.rb +0 -131
- data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
- data/lib/mirah/plugin/gwt.rb +0 -189
- data/lib/mirah/plugin/java.rb +0 -70
- data/lib/mirah/transform/error.rb +0 -13
- data/lib/mirah/transform/helper.rb +0 -765
- data/lib/mirah/typer/simple.rb +0 -384
- data/lib/mirah/version.rb~ +0 -18
- data/test/core/ast_test.rb +0 -382
- data/test/core/compilation_test.rb +0 -130
- data/test/core/macros_test.rb +0 -61
- data/test/jvm/javac_test_helper.rb +0 -89
- data/test/jvm/jvm_compiler_test.rb~ +0 -2181
- data/test/plugins/gwt_test.rb +0 -69
|
@@ -12,17 +12,13 @@
|
|
|
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
|
-
module Mirah
|
|
17
|
-
module Typer
|
|
18
|
-
class Base
|
|
19
|
-
include Mirah
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
end
|
|
18
|
+
class JVMCommandsTest < Test::Unit::TestCase
|
|
19
|
+
def test_dash_e_eval
|
|
20
|
+
assert_output "1\n" do
|
|
21
|
+
Mirah::Commands::Run.new(['-e','puts 1']).execute
|
|
26
22
|
end
|
|
27
23
|
end
|
|
28
|
-
end
|
|
24
|
+
end
|
|
@@ -14,13 +14,6 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
class JVMCompilerTest < 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
|
|
24
17
|
|
|
25
18
|
def test_local
|
|
26
19
|
cls, = compile("def foo; a = 1; a; end")
|
|
@@ -238,7 +231,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
238
231
|
cls, = compile(<<-EOF)
|
|
239
232
|
import java.io.*
|
|
240
233
|
def foo
|
|
241
|
-
throws IOException
|
|
234
|
+
# throws IOException
|
|
242
235
|
OutputStreamWriter.new(
|
|
243
236
|
System.out).write("Hello ").write("there\n").flush
|
|
244
237
|
end
|
|
@@ -248,15 +241,13 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
248
241
|
|
|
249
242
|
a, b = compile(<<-EOF)
|
|
250
243
|
class VoidBase
|
|
251
|
-
def foo
|
|
252
|
-
|
|
253
|
-
puts "foo"
|
|
244
|
+
def foo:void
|
|
245
|
+
System.out.println "foo"
|
|
254
246
|
end
|
|
255
247
|
end
|
|
256
248
|
class VoidChain < VoidBase
|
|
257
|
-
def bar
|
|
258
|
-
|
|
259
|
-
puts "bar"
|
|
249
|
+
def bar:void
|
|
250
|
+
System.out.println "bar"
|
|
260
251
|
end
|
|
261
252
|
|
|
262
253
|
def self.foobar
|
|
@@ -268,67 +259,21 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
268
259
|
|
|
269
260
|
end
|
|
270
261
|
|
|
271
|
-
def test_import
|
|
272
|
-
cls, = compile("import 'AL', 'java.util.ArrayList'; def foo; AL.new; end; foo")
|
|
273
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
274
|
-
|
|
275
|
-
cls, = compile("import 'java.util.ArrayList'; def foo; ArrayList.new; end; foo")
|
|
276
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
277
|
-
end
|
|
278
|
-
|
|
279
|
-
def test_no_quote_import
|
|
280
|
-
cls, = compile("import java.util.ArrayList as AL; def foo; AL.new; end; foo")
|
|
281
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
282
|
-
|
|
283
|
-
cls, = compile("import java.util.ArrayList; def foo; ArrayList.new; end; foo")
|
|
284
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
def test_imported_decl
|
|
288
|
-
cls, = compile("import 'java.util.ArrayList'; def foo(a:ArrayList); a.size; end")
|
|
289
|
-
assert_equal 0, cls.foo(java.util.ArrayList.new)
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
def test_import_package
|
|
293
|
-
cls, = compile(<<-EOF)
|
|
294
|
-
import java.util.*
|
|
295
|
-
def foo
|
|
296
|
-
ArrayList.new
|
|
297
|
-
end
|
|
298
|
-
EOF
|
|
299
|
-
assert_equal java.util.ArrayList.java_class, cls.foo.java_class
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
def test_interface
|
|
303
|
-
cls, = compile(<<-EOF)
|
|
304
|
-
import 'java.util.concurrent.Callable'
|
|
305
|
-
def foo(a:Callable)
|
|
306
|
-
throws Exception
|
|
307
|
-
a.call
|
|
308
|
-
end
|
|
309
|
-
EOF
|
|
310
|
-
result = cls.foo {0}
|
|
311
|
-
assert_equal 0, result
|
|
312
|
-
m = cls.java_class.java_method 'foo', java.util.concurrent.Callable
|
|
313
|
-
assert_equal([java.lang.Exception.java_class], m.exception_types)
|
|
314
|
-
|
|
315
|
-
end
|
|
316
|
-
|
|
317
262
|
def test_class_decl
|
|
318
263
|
foo, = compile("class ClassDeclTest;end")
|
|
319
264
|
assert_equal('ClassDeclTest', foo.java_class.name)
|
|
320
265
|
end
|
|
321
|
-
|
|
266
|
+
|
|
322
267
|
def test_class_name_from_file_with_underscore
|
|
323
|
-
foo, = compile("
|
|
268
|
+
foo, = compile("System.out.println 'blah'", :name => 'class_name_test.mirah')
|
|
324
269
|
assert_equal('ClassNameTest', foo.java_class.name)
|
|
325
270
|
end
|
|
326
|
-
|
|
271
|
+
|
|
327
272
|
def test_class_name_from_file_with_dash
|
|
328
|
-
foo, = compile("
|
|
273
|
+
foo, = compile("System.out.println 'blah'", :name => 'class-dash-test.mirah')
|
|
329
274
|
assert_equal('ClassDashTest', foo.java_class.name)
|
|
330
275
|
end
|
|
331
|
-
|
|
276
|
+
|
|
332
277
|
def test_puts
|
|
333
278
|
cls, = compile("def foo;puts 'Hello World!';end")
|
|
334
279
|
output = capture_output do
|
|
@@ -478,29 +423,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
478
423
|
assert_equal '-', cls.foo(-1)
|
|
479
424
|
end
|
|
480
425
|
|
|
481
|
-
|
|
482
|
-
def test_local_decl
|
|
483
|
-
cls, = compile(<<-EOF)
|
|
484
|
-
import 'java.lang.String'
|
|
485
|
-
a = :fixnum
|
|
486
|
-
b = :int
|
|
487
|
-
c = :long
|
|
488
|
-
d = :float
|
|
489
|
-
e = :string
|
|
490
|
-
f = String
|
|
491
|
-
puts a
|
|
492
|
-
puts b
|
|
493
|
-
puts c
|
|
494
|
-
puts d
|
|
495
|
-
puts e
|
|
496
|
-
puts f
|
|
497
|
-
EOF
|
|
498
|
-
output = capture_output do
|
|
499
|
-
cls.main([].to_java(:string))
|
|
500
|
-
end
|
|
501
|
-
assert_equal("0\n0\n0\n0.0\nnull\nnull\n", output)
|
|
502
|
-
end
|
|
503
|
-
|
|
504
426
|
def test_multi_assign
|
|
505
427
|
cls, = compile(<<-EOF)
|
|
506
428
|
def foo
|
|
@@ -517,25 +439,25 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
517
439
|
|
|
518
440
|
def test_loop
|
|
519
441
|
cls, = compile(
|
|
520
|
-
'def foo(a:fixnum);while a > 0; a -= 1;
|
|
442
|
+
'def foo(a:fixnum);while a > 0; a -= 1; System.out.println ".";end;end')
|
|
521
443
|
assert_equal('', capture_output{cls.foo(0)})
|
|
522
444
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
523
445
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
524
446
|
|
|
525
447
|
cls, = compile(
|
|
526
|
-
'def foo(a:fixnum);begin;a -= 1;
|
|
448
|
+
'def foo(a:fixnum);begin;a -= 1; System.out.println ".";end while a > 0;end')
|
|
527
449
|
assert_equal(".\n", capture_output{cls.foo(0)})
|
|
528
450
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
529
451
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
530
452
|
|
|
531
453
|
cls, = compile(
|
|
532
|
-
'def foo(a:fixnum);until a <= 0; a -= 1;
|
|
454
|
+
'def foo(a:fixnum);until a <= 0; a -= 1; System.out.println ".";end;end')
|
|
533
455
|
assert_equal('', capture_output{cls.foo(0)})
|
|
534
456
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
535
457
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
536
458
|
|
|
537
459
|
cls, = compile(
|
|
538
|
-
'def foo(a:fixnum);begin;a -= 1;
|
|
460
|
+
'def foo(a:fixnum);begin;a -= 1; System.out.println ".";end until a <= 0;end')
|
|
539
461
|
assert_equal(".\n", capture_output{cls.foo(0)})
|
|
540
462
|
assert_equal(".\n", capture_output{cls.foo(1)})
|
|
541
463
|
assert_equal(".\n.\n", capture_output{cls.foo(2)})
|
|
@@ -736,11 +658,11 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
736
658
|
def a
|
|
737
659
|
@a
|
|
738
660
|
end
|
|
739
|
-
|
|
661
|
+
|
|
740
662
|
def self.set_b(b:fixnum)
|
|
741
663
|
@@b = b
|
|
742
664
|
end
|
|
743
|
-
|
|
665
|
+
|
|
744
666
|
def b
|
|
745
667
|
@@b
|
|
746
668
|
end
|
|
@@ -752,7 +674,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
752
674
|
second = cls.new(2)
|
|
753
675
|
assert_equal(1, first.a)
|
|
754
676
|
assert_equal(2, second.a)
|
|
755
|
-
|
|
677
|
+
|
|
756
678
|
cls.set_b 0
|
|
757
679
|
assert_equal(0, first.b)
|
|
758
680
|
assert_equal(0, second.b)
|
|
@@ -785,14 +707,12 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
785
707
|
|
|
786
708
|
def test_implements
|
|
787
709
|
cls, = compile(<<-EOF)
|
|
788
|
-
|
|
789
|
-
class Foo; implements Iterable
|
|
710
|
+
class ImplementsTest implements Iterable
|
|
790
711
|
def iterator
|
|
791
712
|
nil
|
|
792
713
|
end
|
|
793
714
|
end
|
|
794
715
|
EOF
|
|
795
|
-
|
|
796
716
|
assert_include java.lang.Iterable.java_class, cls.java_class.interfaces
|
|
797
717
|
end
|
|
798
718
|
|
|
@@ -821,58 +741,52 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
821
741
|
def _Double(a:double)
|
|
822
742
|
a
|
|
823
743
|
end
|
|
824
|
-
|
|
744
|
+
EOF
|
|
825
745
|
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
746
|
+
assert_equal(1.0, cls._Byte(1))
|
|
747
|
+
assert_equal(127.0, cls._Byte(127))
|
|
748
|
+
assert_equal(128.0, cls._Short(128))
|
|
749
|
+
assert_equal(32767.0, cls._Short(32767))
|
|
750
|
+
assert_equal(32768.0, cls._Int(32768))
|
|
751
|
+
assert_equal(2147483648.0, cls._Long(2147483648))
|
|
832
752
|
end
|
|
833
753
|
|
|
834
|
-
def
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
754
|
+
def test_argument_boxing
|
|
755
|
+
[ [:short], [:int,:integer], [:long], [:byte]].each do |types|
|
|
756
|
+
primitive, full = types.first, types.last
|
|
757
|
+
begin
|
|
758
|
+
cls, = compile(<<-EOF)
|
|
759
|
+
def to_#{primitive}(a:#{full.to_s.capitalize}):void
|
|
760
|
+
puts a
|
|
761
|
+
end
|
|
762
|
+
to_#{primitive} #{primitive}(1)
|
|
763
|
+
EOF
|
|
764
|
+
assert_output("1\n") { cls.main nil}
|
|
765
|
+
rescue => e
|
|
766
|
+
raise "#{primitive} #{e.message}"
|
|
846
767
|
end
|
|
847
|
-
|
|
848
|
-
|
|
768
|
+
end
|
|
769
|
+
%w[float double].each do |type|
|
|
770
|
+
begin
|
|
771
|
+
cls, = compile(<<-EOF)
|
|
772
|
+
def to_#{type}(a:#{type.to_s.capitalize}):void
|
|
773
|
+
puts a
|
|
774
|
+
end
|
|
775
|
+
to_#{type} #{type}(1)
|
|
776
|
+
EOF
|
|
777
|
+
assert_output("1.0\n") { cls.main nil}
|
|
778
|
+
rescue => e
|
|
779
|
+
raise "#{type} #{e.message}"
|
|
849
780
|
end
|
|
781
|
+
end
|
|
850
782
|
|
|
851
|
-
|
|
783
|
+
cls, = compile(<<-EOF)
|
|
784
|
+
def to_character(a:Character):void
|
|
785
|
+
puts a
|
|
852
786
|
end
|
|
787
|
+
to_character char(65)
|
|
853
788
|
EOF
|
|
854
|
-
|
|
855
|
-
assert_include(a, c.ancestors)
|
|
856
|
-
assert_include(b, c.ancestors)
|
|
857
|
-
assert_equal('A', a.java_class.name)
|
|
858
|
-
assert_equal('B', b.java_class.name)
|
|
859
|
-
assert_equal('C', c.java_class.name)
|
|
860
|
-
|
|
861
|
-
assert_raise Mirah::Typer::InferenceError do
|
|
862
|
-
compile(<<-EOF)
|
|
863
|
-
interface A do
|
|
864
|
-
def a
|
|
865
|
-
returns :int
|
|
866
|
-
end
|
|
867
|
-
end
|
|
868
|
-
|
|
869
|
-
class Impl; implements A
|
|
870
|
-
def a
|
|
871
|
-
"foo"
|
|
872
|
-
end
|
|
873
|
-
end
|
|
874
|
-
EOF
|
|
875
|
-
end
|
|
789
|
+
assert_output("A\n") { cls.main nil}
|
|
876
790
|
end
|
|
877
791
|
|
|
878
792
|
def test_raise
|
|
@@ -881,7 +795,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
881
795
|
raise
|
|
882
796
|
end
|
|
883
797
|
EOF
|
|
884
|
-
assert_raise_java(java.lang.
|
|
798
|
+
assert_raise_java(java.lang.Exception) do
|
|
885
799
|
cls.foo
|
|
886
800
|
end
|
|
887
801
|
|
|
@@ -890,7 +804,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
890
804
|
raise "Oh no!"
|
|
891
805
|
end
|
|
892
806
|
EOF
|
|
893
|
-
ex = assert_raise_java(java.lang.
|
|
807
|
+
ex = assert_raise_java(java.lang.Exception, 'Oh no!') do
|
|
894
808
|
cls.foo
|
|
895
809
|
end
|
|
896
810
|
|
|
@@ -905,7 +819,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
905
819
|
|
|
906
820
|
cls, = compile(<<-EOF)
|
|
907
821
|
def foo
|
|
908
|
-
throws Exception
|
|
822
|
+
# throws Exception
|
|
909
823
|
raise Exception, "oops"
|
|
910
824
|
end
|
|
911
825
|
EOF
|
|
@@ -915,160 +829,14 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
915
829
|
|
|
916
830
|
cls, = compile(<<-EOF)
|
|
917
831
|
def foo
|
|
918
|
-
throws Throwable
|
|
832
|
+
# throws Throwable
|
|
919
833
|
raise Throwable.new("darn")
|
|
920
834
|
end
|
|
921
835
|
EOF
|
|
922
|
-
ex = assert_raise_java(java.lang.Throwable, "darn") do
|
|
923
|
-
cls.foo
|
|
924
|
-
end
|
|
925
|
-
end
|
|
926
836
|
|
|
927
|
-
|
|
928
|
-
cls, = compile(<<-EOF)
|
|
929
|
-
def foo
|
|
930
|
-
1
|
|
931
|
-
ensure
|
|
932
|
-
puts "Hi"
|
|
933
|
-
end
|
|
934
|
-
EOF
|
|
935
|
-
output = capture_output do
|
|
936
|
-
assert_equal(1, cls.foo)
|
|
937
|
-
end
|
|
938
|
-
assert_equal "Hi\n", output
|
|
939
|
-
|
|
940
|
-
cls, = compile(<<-EOF)
|
|
941
|
-
def foo
|
|
942
|
-
return 1
|
|
943
|
-
ensure
|
|
944
|
-
puts "Hi"
|
|
945
|
-
end
|
|
946
|
-
EOF
|
|
947
|
-
output = capture_output do
|
|
948
|
-
assert_equal(1, cls.foo)
|
|
949
|
-
end
|
|
950
|
-
assert_equal "Hi\n", output
|
|
951
|
-
|
|
952
|
-
cls, = compile(<<-EOF)
|
|
953
|
-
def foo
|
|
954
|
-
begin
|
|
955
|
-
break
|
|
956
|
-
ensure
|
|
957
|
-
puts "Hi"
|
|
958
|
-
end while false
|
|
959
|
-
end
|
|
960
|
-
EOF
|
|
961
|
-
output = capture_output do
|
|
837
|
+
assert_raise_java(java.lang.Throwable, "darn") do
|
|
962
838
|
cls.foo
|
|
963
839
|
end
|
|
964
|
-
assert_equal "Hi\n", output
|
|
965
|
-
end
|
|
966
|
-
|
|
967
|
-
def test_cast
|
|
968
|
-
cls, = compile(<<-EOF)
|
|
969
|
-
def f2b; byte(1.0); end
|
|
970
|
-
def f2s; short(1.0); end
|
|
971
|
-
def f2c; char(1.0); end
|
|
972
|
-
def f2i; int(1.0); end
|
|
973
|
-
def f2l; long(1.0); end
|
|
974
|
-
def f2d; int(1.0); end
|
|
975
|
-
|
|
976
|
-
def i2b; byte(1); end
|
|
977
|
-
def i2s; short(1); end
|
|
978
|
-
def i2c; char(1); end
|
|
979
|
-
def i2l; long(1); end
|
|
980
|
-
def i2f; float(1); end
|
|
981
|
-
def i2d; int(1); end
|
|
982
|
-
|
|
983
|
-
def b2s; short(byte(1)); end
|
|
984
|
-
def b2c; char(byte(1)); end
|
|
985
|
-
def b2i; int(byte(1)); end
|
|
986
|
-
def b2l; long(byte(1)); end
|
|
987
|
-
def b2f; float(byte(1)); end
|
|
988
|
-
def b2d; double(byte(1)); end
|
|
989
|
-
|
|
990
|
-
def s2b; byte(short(1)); end
|
|
991
|
-
def s2c; char(short(1)); end
|
|
992
|
-
def s2i; int(short(1)); end
|
|
993
|
-
def s2l; long(short(1)); end
|
|
994
|
-
def s2f; float(short(1)); end
|
|
995
|
-
def s2d; double(short(1)); end
|
|
996
|
-
|
|
997
|
-
def c2b; byte(char(1)); end
|
|
998
|
-
def c2s; short(char(1)); end
|
|
999
|
-
def c2i; int(char(1)); end
|
|
1000
|
-
def c2l; long(char(1)); end
|
|
1001
|
-
def c2f; float(char(1)); end
|
|
1002
|
-
def c2d; double(char(1)); end
|
|
1003
|
-
|
|
1004
|
-
def l2b; byte(long(1)); end
|
|
1005
|
-
def l2c; char(long(1)); end
|
|
1006
|
-
def l2i; int(long(1)); end
|
|
1007
|
-
def l2l; long(long(1)); end
|
|
1008
|
-
def l2f; float(long(1)); end
|
|
1009
|
-
def l2d; double(long(1)); end
|
|
1010
|
-
|
|
1011
|
-
def d2b; byte(1.0); end
|
|
1012
|
-
def d2s; short(1.0); end
|
|
1013
|
-
def d2c; char(1.0); end
|
|
1014
|
-
def d2i; int(1.0); end
|
|
1015
|
-
def d2l; long(1.0); end
|
|
1016
|
-
def d2f; float(1.0); end
|
|
1017
|
-
|
|
1018
|
-
def hard_i2f(a:int)
|
|
1019
|
-
float(if a < 0
|
|
1020
|
-
a *= -1
|
|
1021
|
-
a * 2
|
|
1022
|
-
else
|
|
1023
|
-
a * 2
|
|
1024
|
-
end)
|
|
1025
|
-
end
|
|
1026
|
-
EOF
|
|
1027
|
-
|
|
1028
|
-
assert_equal 1, cls.b2s
|
|
1029
|
-
assert_equal 1, cls.b2c
|
|
1030
|
-
assert_equal 1, cls.b2i
|
|
1031
|
-
assert_equal 1, cls.b2l
|
|
1032
|
-
assert_equal 1.0, cls.b2f
|
|
1033
|
-
assert_equal 1.0, cls.b2d
|
|
1034
|
-
|
|
1035
|
-
assert_equal 1, cls.s2b
|
|
1036
|
-
assert_equal 1, cls.s2c
|
|
1037
|
-
assert_equal 1, cls.s2i
|
|
1038
|
-
assert_equal 1, cls.s2l
|
|
1039
|
-
assert_equal 1.0, cls.s2f
|
|
1040
|
-
assert_equal 1.0, cls.s2d
|
|
1041
|
-
|
|
1042
|
-
assert_equal 1, cls.c2b
|
|
1043
|
-
assert_equal 1, cls.c2s
|
|
1044
|
-
assert_equal 1, cls.c2i
|
|
1045
|
-
assert_equal 1, cls.c2l
|
|
1046
|
-
assert_equal 1.0, cls.c2f
|
|
1047
|
-
assert_equal 1.0, cls.c2d
|
|
1048
|
-
|
|
1049
|
-
assert_equal 1, cls.i2b
|
|
1050
|
-
assert_equal 1, cls.i2s
|
|
1051
|
-
assert_equal 1, cls.i2c
|
|
1052
|
-
assert_equal 1, cls.i2l
|
|
1053
|
-
assert_equal 1.0, cls.i2f
|
|
1054
|
-
assert_equal 1.0, cls.i2d
|
|
1055
|
-
|
|
1056
|
-
assert_equal 1, cls.f2b
|
|
1057
|
-
assert_equal 1, cls.f2s
|
|
1058
|
-
assert_equal 1, cls.f2c
|
|
1059
|
-
assert_equal 1, cls.f2i
|
|
1060
|
-
assert_equal 1, cls.f2l
|
|
1061
|
-
assert_equal 1.0, cls.f2d
|
|
1062
|
-
|
|
1063
|
-
assert_equal 1, cls.d2b
|
|
1064
|
-
assert_equal 1, cls.d2s
|
|
1065
|
-
assert_equal 1, cls.d2c
|
|
1066
|
-
assert_equal 1, cls.d2i
|
|
1067
|
-
assert_equal 1, cls.d2l
|
|
1068
|
-
assert_equal 1.0, cls.d2f
|
|
1069
|
-
|
|
1070
|
-
assert_equal 2.0, cls.hard_i2f(1)
|
|
1071
|
-
assert_equal 4.0, cls.hard_i2f(-2)
|
|
1072
840
|
end
|
|
1073
841
|
|
|
1074
842
|
def test_set
|
|
@@ -1092,6 +860,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1092
860
|
assert_equal(true, cls.foo("a"))
|
|
1093
861
|
assert_equal(false, cls.foo(nil))
|
|
1094
862
|
end
|
|
863
|
+
|
|
1095
864
|
def test_if_expr
|
|
1096
865
|
cls, = compile(<<-EOF)
|
|
1097
866
|
def foo(a:int)
|
|
@@ -1112,7 +881,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1112
881
|
def test_and
|
|
1113
882
|
cls, = compile(<<-EOF)
|
|
1114
883
|
def bool(n:String, x:boolean)
|
|
1115
|
-
|
|
884
|
+
System.out.println n
|
|
1116
885
|
x
|
|
1117
886
|
end
|
|
1118
887
|
|
|
@@ -1121,7 +890,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1121
890
|
end
|
|
1122
891
|
|
|
1123
892
|
def str(n:String, x:String)
|
|
1124
|
-
|
|
893
|
+
System.out.println n
|
|
1125
894
|
x
|
|
1126
895
|
end
|
|
1127
896
|
|
|
@@ -1231,7 +1000,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1231
1000
|
def test_or
|
|
1232
1001
|
cls, = compile(<<-EOF)
|
|
1233
1002
|
def bool(n:String, x:boolean)
|
|
1234
|
-
|
|
1003
|
+
System.out.println n
|
|
1235
1004
|
x
|
|
1236
1005
|
end
|
|
1237
1006
|
|
|
@@ -1240,7 +1009,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1240
1009
|
end
|
|
1241
1010
|
|
|
1242
1011
|
def str(n:String, x:String)
|
|
1243
|
-
|
|
1012
|
+
System.out.println n
|
|
1244
1013
|
x
|
|
1245
1014
|
end
|
|
1246
1015
|
|
|
@@ -1388,10 +1157,9 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1388
1157
|
assert_equal([nil, "x", nil], f.a.to_a)
|
|
1389
1158
|
end
|
|
1390
1159
|
|
|
1391
|
-
|
|
1392
1160
|
def test_literal_array
|
|
1393
1161
|
cls, = compile(<<-EOF)
|
|
1394
|
-
def foo;
|
|
1162
|
+
def foo; System.out.println "hello"; nil; end
|
|
1395
1163
|
def expr
|
|
1396
1164
|
[foo]
|
|
1397
1165
|
end
|
|
@@ -1433,7 +1201,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1433
1201
|
/foo/.split('barfoobaz')
|
|
1434
1202
|
end
|
|
1435
1203
|
def puts
|
|
1436
|
-
|
|
1204
|
+
System.out.println split
|
|
1437
1205
|
end
|
|
1438
1206
|
EOF
|
|
1439
1207
|
|
|
@@ -1458,17 +1226,18 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1458
1226
|
end
|
|
1459
1227
|
end
|
|
1460
1228
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1229
|
+
System.out.println A1.new.foo("Hi")
|
|
1230
|
+
System.out.println B1.new.foo("There")
|
|
1463
1231
|
EOF
|
|
1464
1232
|
|
|
1465
1233
|
assert_output("Hi\nThere\n") do
|
|
1466
1234
|
cls.main(nil)
|
|
1467
1235
|
end
|
|
1468
1236
|
end
|
|
1237
|
+
|
|
1469
1238
|
def test_super
|
|
1470
1239
|
cls, = compile(<<-EOF)
|
|
1471
|
-
class
|
|
1240
|
+
class SuperEqual
|
|
1472
1241
|
def equals(other:Object); super(other); end
|
|
1473
1242
|
end
|
|
1474
1243
|
EOF
|
|
@@ -1480,7 +1249,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1480
1249
|
|
|
1481
1250
|
def test_method_lookup_with_overrides
|
|
1482
1251
|
cls, = compile(<<-EOF)
|
|
1483
|
-
class Bar
|
|
1252
|
+
class Bar implements Runnable
|
|
1484
1253
|
def foo(x:Bar)
|
|
1485
1254
|
Thread.new(x)
|
|
1486
1255
|
end
|
|
@@ -1496,7 +1265,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1496
1265
|
def test_optional_args
|
|
1497
1266
|
cls, = compile(<<-EOF)
|
|
1498
1267
|
def foo(a:int, b:int = 1, c:int = 2)
|
|
1499
|
-
|
|
1268
|
+
System.out.println a; System.out.println b; System.out.println c
|
|
1500
1269
|
end
|
|
1501
1270
|
foo(0)
|
|
1502
1271
|
foo(0,0)
|
|
@@ -1509,7 +1278,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1509
1278
|
|
|
1510
1279
|
def test_field_read
|
|
1511
1280
|
cls, = compile(<<-EOF)
|
|
1512
|
-
|
|
1281
|
+
System.out.println System.out.getClass.getName
|
|
1513
1282
|
EOF
|
|
1514
1283
|
assert_output("java.io.PrintStream\n") do
|
|
1515
1284
|
cls.main([].to_java :String)
|
|
@@ -1529,101 +1298,10 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1529
1298
|
cls.make_one(nil)
|
|
1530
1299
|
end
|
|
1531
1300
|
|
|
1532
|
-
def test_block_with_duby_interface
|
|
1533
|
-
cls, interface = compile(<<-EOF)
|
|
1534
|
-
interface MyProc do
|
|
1535
|
-
def call; returns :void; end
|
|
1536
|
-
end
|
|
1537
|
-
def foo(b:MyProc)
|
|
1538
|
-
b.call
|
|
1539
|
-
end
|
|
1540
|
-
def bar
|
|
1541
|
-
foo {puts "Hi"}
|
|
1542
|
-
end
|
|
1543
|
-
EOF
|
|
1544
|
-
assert_output("Hi\n") do
|
|
1545
|
-
cls.bar
|
|
1546
|
-
end
|
|
1547
|
-
end
|
|
1548
|
-
|
|
1549
|
-
def test_duby_iterable
|
|
1550
|
-
cls, = compile(<<-EOF)
|
|
1551
|
-
import java.util.Iterator
|
|
1552
|
-
class MyIterator; implements Iterable, Iterator
|
|
1553
|
-
def initialize(x:Object)
|
|
1554
|
-
@next = x
|
|
1555
|
-
end
|
|
1556
|
-
|
|
1557
|
-
def hasNext
|
|
1558
|
-
@next != nil
|
|
1559
|
-
end
|
|
1560
|
-
|
|
1561
|
-
def next
|
|
1562
|
-
result = @next
|
|
1563
|
-
@next = nil
|
|
1564
|
-
result
|
|
1565
|
-
end
|
|
1566
|
-
|
|
1567
|
-
def iterator
|
|
1568
|
-
self
|
|
1569
|
-
end
|
|
1570
|
-
|
|
1571
|
-
def remove
|
|
1572
|
-
raise UnsupportedOperationException
|
|
1573
|
-
end
|
|
1574
|
-
|
|
1575
|
-
def self.test(x:String)
|
|
1576
|
-
MyIterator.new(x).each {|y| puts y}
|
|
1577
|
-
end
|
|
1578
|
-
end
|
|
1579
|
-
EOF
|
|
1580
|
-
|
|
1581
|
-
assert_output("Hi\n") do
|
|
1582
|
-
cls.test("Hi")
|
|
1583
|
-
end
|
|
1584
|
-
end
|
|
1585
|
-
|
|
1586
|
-
def test_java_lang_cast
|
|
1587
|
-
cls, = compile(<<-EOF)
|
|
1588
|
-
def foo(a:Object)
|
|
1589
|
-
Integer(a).intValue
|
|
1590
|
-
end
|
|
1591
|
-
EOF
|
|
1592
|
-
|
|
1593
|
-
assert_equal(2, cls.foo(java.lang.Integer.new(2)))
|
|
1594
|
-
end
|
|
1595
|
-
|
|
1596
|
-
def test_array_cast
|
|
1597
|
-
cls, = compile(<<-EOF)
|
|
1598
|
-
def foo(a:Object)
|
|
1599
|
-
bar(String[].cast(a))
|
|
1600
|
-
end
|
|
1601
|
-
|
|
1602
|
-
def bar(a:String[])
|
|
1603
|
-
a[0]
|
|
1604
|
-
end
|
|
1605
|
-
EOF
|
|
1606
|
-
|
|
1607
|
-
assert_equal("foo", cls.foo(["foo", "bar"].to_java(:string)))
|
|
1608
|
-
|
|
1609
|
-
cls, = compile(<<-EOF)
|
|
1610
|
-
def foo(a:Object)
|
|
1611
|
-
bar(int[].cast(a))
|
|
1612
|
-
end
|
|
1613
|
-
|
|
1614
|
-
def bar(a:int[])
|
|
1615
|
-
a[0]
|
|
1616
|
-
end
|
|
1617
|
-
EOF
|
|
1618
|
-
|
|
1619
|
-
assert_equal(2, cls.foo([2, 3].to_java(:int)))
|
|
1620
|
-
|
|
1621
|
-
end
|
|
1622
|
-
|
|
1623
1301
|
def test_string_interpolation
|
|
1624
1302
|
cls, = compile(<<-EOF)
|
|
1625
1303
|
def foo(name:String)
|
|
1626
|
-
print "Hello \#{name}."
|
|
1304
|
+
System.out.print "Hello \#{name}."
|
|
1627
1305
|
end
|
|
1628
1306
|
EOF
|
|
1629
1307
|
|
|
@@ -1633,7 +1311,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1633
1311
|
|
|
1634
1312
|
cls, = compile(<<-EOF)
|
|
1635
1313
|
def foo(x:int)
|
|
1636
|
-
print "\#{x += 1}"
|
|
1314
|
+
System.out.print "\#{x += 1}"
|
|
1637
1315
|
x
|
|
1638
1316
|
end
|
|
1639
1317
|
EOF
|
|
@@ -1680,9 +1358,9 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1680
1358
|
def test_evaluation_order
|
|
1681
1359
|
cls, = compile(<<-EOF)
|
|
1682
1360
|
def call(a:int, b:int, c:int)
|
|
1683
|
-
print "\#{a}, \#{b}, \#{c}"
|
|
1361
|
+
System.out.print "\#{a}, \#{b}, \#{c}"
|
|
1684
1362
|
end
|
|
1685
|
-
|
|
1363
|
+
|
|
1686
1364
|
def test_call(a:int)
|
|
1687
1365
|
call(a, if a < 10;a+=1;a;else;a;end, a)
|
|
1688
1366
|
end
|
|
@@ -1702,7 +1380,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1702
1380
|
def test_inner_class
|
|
1703
1381
|
cls, = compile(<<-EOF)
|
|
1704
1382
|
def foo
|
|
1705
|
-
Character
|
|
1383
|
+
Character::UnicodeBlock.ARROWS
|
|
1706
1384
|
end
|
|
1707
1385
|
EOF
|
|
1708
1386
|
|
|
@@ -1710,6 +1388,18 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1710
1388
|
assert_equal("java.lang.Character$UnicodeBlock", subset.java_class.name)
|
|
1711
1389
|
end
|
|
1712
1390
|
|
|
1391
|
+
def test_lowercase_inner_class
|
|
1392
|
+
cls, = compile(<<-EOF)
|
|
1393
|
+
import org.foo.LowerCaseInnerClass
|
|
1394
|
+
|
|
1395
|
+
def foo
|
|
1396
|
+
LowerCaseInnerClass.inner.field
|
|
1397
|
+
end
|
|
1398
|
+
EOF
|
|
1399
|
+
|
|
1400
|
+
assert_equal(1234, cls.foo)
|
|
1401
|
+
end
|
|
1402
|
+
|
|
1713
1403
|
def test_class_literal
|
|
1714
1404
|
cls, = compile(<<-EOF)
|
|
1715
1405
|
def foo
|
|
@@ -1725,46 +1415,10 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1725
1415
|
def string(x:Object)
|
|
1726
1416
|
x.kind_of?(String)
|
|
1727
1417
|
end
|
|
1728
|
-
|
|
1729
|
-
def dynamic(c:Class, o:Object)
|
|
1730
|
-
o.kind_of?(c)
|
|
1731
|
-
end
|
|
1732
1418
|
EOF
|
|
1733
1419
|
|
|
1734
1420
|
assert_equal(true, cls.string("foo"))
|
|
1735
1421
|
assert_equal(false, cls.string(2))
|
|
1736
|
-
assert_equal(true, cls.dynamic(java.lang.String, "foo"))
|
|
1737
|
-
assert_equal(true, cls.dynamic(java.lang.Object, "foo"))
|
|
1738
|
-
assert_equal(false, cls.dynamic(java.lang.Object, nil))
|
|
1739
|
-
end
|
|
1740
|
-
|
|
1741
|
-
def test_static_import
|
|
1742
|
-
cls, = compile(<<-EOF)
|
|
1743
|
-
import java.util.Arrays
|
|
1744
|
-
include Arrays
|
|
1745
|
-
def list(x:Object[])
|
|
1746
|
-
asList(x)
|
|
1747
|
-
end
|
|
1748
|
-
EOF
|
|
1749
|
-
|
|
1750
|
-
o = ["1", "2", "3"].to_java(:object)
|
|
1751
|
-
list = cls.list(o)
|
|
1752
|
-
assert_kind_of(Java::JavaUtil::List, list)
|
|
1753
|
-
assert_equal(["1", "2", "3"], list.to_a)
|
|
1754
|
-
|
|
1755
|
-
cls, = compile(<<-EOF)
|
|
1756
|
-
import java.util.Arrays
|
|
1757
|
-
class StaticImports
|
|
1758
|
-
include Arrays
|
|
1759
|
-
def list(x:Object[])
|
|
1760
|
-
asList(x)
|
|
1761
|
-
end
|
|
1762
|
-
end
|
|
1763
|
-
EOF
|
|
1764
|
-
|
|
1765
|
-
list = cls.new.list(o)
|
|
1766
|
-
assert_kind_of(Java::JavaUtil::List, list)
|
|
1767
|
-
assert_equal(["1", "2", "3"], list.to_a)
|
|
1768
1422
|
end
|
|
1769
1423
|
|
|
1770
1424
|
# TODO: need a writable field somewhere...
|
|
@@ -1788,7 +1442,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1788
1442
|
class Append
|
|
1789
1443
|
class << self
|
|
1790
1444
|
def hi
|
|
1791
|
-
print 'Static Hello'
|
|
1445
|
+
System.out.print 'Static Hello'
|
|
1792
1446
|
end
|
|
1793
1447
|
end
|
|
1794
1448
|
end
|
|
@@ -1801,80 +1455,8 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1801
1455
|
assert_equal('Static Hello', output)
|
|
1802
1456
|
end
|
|
1803
1457
|
|
|
1804
|
-
def test_hashes
|
|
1805
|
-
cls, = compile(<<-EOF)
|
|
1806
|
-
def foo1
|
|
1807
|
-
{a:"A", b:"B"}
|
|
1808
|
-
end
|
|
1809
|
-
def foo2
|
|
1810
|
-
return {a:"A", b:"B"}
|
|
1811
|
-
end
|
|
1812
|
-
EOF
|
|
1813
|
-
|
|
1814
|
-
map = cls.foo1
|
|
1815
|
-
assert_equal("A", map["a"])
|
|
1816
|
-
assert_equal("B", map["b"])
|
|
1817
|
-
map = cls.foo2
|
|
1818
|
-
assert_equal("A", map["a"])
|
|
1819
|
-
assert_equal("B", map["b"])
|
|
1820
|
-
|
|
1821
|
-
cls, = compile(<<-'EOF')
|
|
1822
|
-
def set(b:Object)
|
|
1823
|
-
map = { }
|
|
1824
|
-
map["key"] = b
|
|
1825
|
-
map["key"]
|
|
1826
|
-
end
|
|
1827
|
-
EOF
|
|
1828
|
-
|
|
1829
|
-
assert_equal("foo", cls.set("foo"))
|
|
1830
|
-
end
|
|
1831
|
-
|
|
1832
|
-
def test_hash_with_value_from_static_method
|
|
1833
|
-
cls, = compile(<<-EOF)
|
|
1834
|
-
def foo1
|
|
1835
|
-
{a: a, b:"B"}
|
|
1836
|
-
end
|
|
1837
|
-
def a
|
|
1838
|
-
return "A"
|
|
1839
|
-
end
|
|
1840
|
-
EOF
|
|
1841
|
-
assert_equal("A", cls.foo1["a"])
|
|
1842
|
-
end
|
|
1843
|
-
|
|
1844
|
-
def test_hash_with_value_from_instance_method
|
|
1845
|
-
cls, = compile(<<-EOF)
|
|
1846
|
-
class HashTesty
|
|
1847
|
-
def foo1
|
|
1848
|
-
{a: a, b:"B"}
|
|
1849
|
-
end
|
|
1850
|
-
def a
|
|
1851
|
-
return "A"
|
|
1852
|
-
end
|
|
1853
|
-
end
|
|
1854
|
-
EOF
|
|
1855
|
-
assert_equal("A", cls.new.foo1["a"])
|
|
1856
|
-
end
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
def test_loop_in_ensure
|
|
1860
|
-
cls, = compile(<<-EOF)
|
|
1861
|
-
begin
|
|
1862
|
-
puts "a"
|
|
1863
|
-
begin
|
|
1864
|
-
puts "b"
|
|
1865
|
-
break
|
|
1866
|
-
end while false
|
|
1867
|
-
puts "c"
|
|
1868
|
-
ensure
|
|
1869
|
-
puts "ensure"
|
|
1870
|
-
end
|
|
1871
|
-
EOF
|
|
1872
|
-
|
|
1873
|
-
assert_output("a\nb\nc\nensure\n") { cls.main(nil) }
|
|
1874
|
-
end
|
|
1875
|
-
|
|
1876
1458
|
def test_return_type
|
|
1877
|
-
|
|
1459
|
+
assert_raise_kind_of Mirah::MirahError do
|
|
1878
1460
|
compile(<<-EOF)
|
|
1879
1461
|
class ReturnsA
|
|
1880
1462
|
def a:int
|
|
@@ -1884,7 +1466,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1884
1466
|
EOF
|
|
1885
1467
|
end
|
|
1886
1468
|
|
|
1887
|
-
|
|
1469
|
+
assert_raise_kind_of Mirah::MirahError do
|
|
1888
1470
|
compile(<<-EOF)
|
|
1889
1471
|
class ReturnsB
|
|
1890
1472
|
def self.a:String
|
|
@@ -1899,10 +1481,10 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1899
1481
|
abstract_class, concrete_class = compile(<<-EOF)
|
|
1900
1482
|
abstract class Abstract
|
|
1901
1483
|
abstract def foo:void; end
|
|
1902
|
-
def bar;
|
|
1484
|
+
def bar; System.out.println "bar"; end
|
|
1903
1485
|
end
|
|
1904
1486
|
class Concrete < Abstract
|
|
1905
|
-
def foo;
|
|
1487
|
+
def foo; System.out.println :foo; end
|
|
1906
1488
|
end
|
|
1907
1489
|
EOF
|
|
1908
1490
|
|
|
@@ -1919,7 +1501,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1919
1501
|
def test_return_void
|
|
1920
1502
|
script, = compile(<<-EOF)
|
|
1921
1503
|
def foo:void
|
|
1922
|
-
|
|
1504
|
+
System.out.println :hi
|
|
1923
1505
|
return
|
|
1924
1506
|
end
|
|
1925
1507
|
EOF
|
|
@@ -1930,15 +1512,15 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1930
1512
|
def test_package
|
|
1931
1513
|
script, cls = compile(<<-EOF)
|
|
1932
1514
|
package foo
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1515
|
+
|
|
1516
|
+
package foo.bar {
|
|
1517
|
+
class PackagedBar
|
|
1518
|
+
def self.dosomething
|
|
1519
|
+
"bar"
|
|
1520
|
+
end
|
|
1521
|
+
end
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1942
1524
|
def dosomething
|
|
1943
1525
|
"foo"
|
|
1944
1526
|
end
|
|
@@ -1948,9 +1530,8 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1948
1530
|
assert_equal('foo', package)
|
|
1949
1531
|
assert_equal('foo', script.dosomething)
|
|
1950
1532
|
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
# assert_equal("foo.bar.PackagedBar", cls.java_class.name)
|
|
1533
|
+
assert_equal('bar', cls.dosomething)
|
|
1534
|
+
assert_equal("foo.bar.PackagedBar", cls.java_class.name)
|
|
1954
1535
|
end
|
|
1955
1536
|
|
|
1956
1537
|
def test_not
|
|
@@ -1976,52 +1557,16 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
1976
1557
|
begin
|
|
1977
1558
|
raise "Foo"
|
|
1978
1559
|
rescue => b
|
|
1979
|
-
|
|
1980
|
-
|
|
1560
|
+
System.out.println a
|
|
1561
|
+
System.out.println b.getMessage
|
|
1981
1562
|
end
|
|
1982
|
-
|
|
1563
|
+
System.out.println b
|
|
1983
1564
|
end
|
|
1984
1565
|
EOF
|
|
1985
1566
|
|
|
1986
1567
|
assert_output("1\nFoo\n2\n") { cls.foo }
|
|
1987
1568
|
end
|
|
1988
1569
|
|
|
1989
|
-
def test_scoped_self_through_method_call
|
|
1990
|
-
cls, = compile(<<-EOF)
|
|
1991
|
-
class ScopedSelfThroughMethodCall
|
|
1992
|
-
def emptyMap
|
|
1993
|
-
{}
|
|
1994
|
-
end
|
|
1995
|
-
|
|
1996
|
-
def foo
|
|
1997
|
-
emptyMap["a"] = "A"
|
|
1998
|
-
end
|
|
1999
|
-
end
|
|
2000
|
-
EOF
|
|
2001
|
-
|
|
2002
|
-
# just make sure it can execute
|
|
2003
|
-
m = cls.new.foo
|
|
2004
|
-
end
|
|
2005
|
-
|
|
2006
|
-
def test_self_call_preserves_scope
|
|
2007
|
-
cls, = compile(<<-EOF)
|
|
2008
|
-
class SelfCallPreservesScope
|
|
2009
|
-
def key
|
|
2010
|
-
"key"
|
|
2011
|
-
end
|
|
2012
|
-
|
|
2013
|
-
def foo
|
|
2014
|
-
map = {}
|
|
2015
|
-
map[key] = "value"
|
|
2016
|
-
map
|
|
2017
|
-
end
|
|
2018
|
-
end
|
|
2019
|
-
EOF
|
|
2020
|
-
|
|
2021
|
-
map = cls.new.foo
|
|
2022
|
-
assert_equal("value", map["key"])
|
|
2023
|
-
end
|
|
2024
|
-
|
|
2025
1570
|
def test_wide_nonexpressions
|
|
2026
1571
|
script, cls1, cls2 = compile(<<-EOF)
|
|
2027
1572
|
class WideA
|
|
@@ -2029,18 +1574,18 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
2029
1574
|
2.5
|
|
2030
1575
|
end
|
|
2031
1576
|
end
|
|
2032
|
-
|
|
1577
|
+
|
|
2033
1578
|
class WideB < WideA
|
|
2034
1579
|
def a
|
|
2035
1580
|
super
|
|
2036
1581
|
3.5
|
|
2037
1582
|
end
|
|
2038
1583
|
end
|
|
2039
|
-
|
|
1584
|
+
|
|
2040
1585
|
def self.b
|
|
2041
1586
|
1.5
|
|
2042
1587
|
end
|
|
2043
|
-
|
|
1588
|
+
|
|
2044
1589
|
1.5
|
|
2045
1590
|
WideA.new.a
|
|
2046
1591
|
WideB.new.a
|
|
@@ -2050,27 +1595,6 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
2050
1595
|
script.main(nil)
|
|
2051
1596
|
end
|
|
2052
1597
|
|
|
2053
|
-
def test_parameter_used_in_block
|
|
2054
|
-
cls, = compile(<<-EOF)
|
|
2055
|
-
def foo(x:String):void
|
|
2056
|
-
thread = Thread.new do
|
|
2057
|
-
puts "Hello \#{x}"
|
|
2058
|
-
end
|
|
2059
|
-
begin
|
|
2060
|
-
thread.run
|
|
2061
|
-
thread.join
|
|
2062
|
-
rescue
|
|
2063
|
-
puts "Uh Oh!"
|
|
2064
|
-
end
|
|
2065
|
-
end
|
|
2066
|
-
|
|
2067
|
-
foo('there')
|
|
2068
|
-
EOF
|
|
2069
|
-
assert_output("Hello there\n") do
|
|
2070
|
-
cls.main(nil)
|
|
2071
|
-
end
|
|
2072
|
-
end
|
|
2073
|
-
|
|
2074
1598
|
def test_colon2
|
|
2075
1599
|
cls, = compile(<<-EOF)
|
|
2076
1600
|
def foo
|
|
@@ -2091,22 +1615,22 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
2091
1615
|
entry = java.util.HashMap.new(:a => 1).entrySet.iterator.next
|
|
2092
1616
|
assert_equal(entry, cls.foo(entry))
|
|
2093
1617
|
end
|
|
2094
|
-
|
|
1618
|
+
|
|
2095
1619
|
def test_covariant_arrays
|
|
2096
1620
|
cls, = compile(<<-EOF)
|
|
2097
|
-
|
|
1621
|
+
System.out.println java::util::Arrays.toString(String[5])
|
|
2098
1622
|
EOF
|
|
2099
|
-
|
|
1623
|
+
|
|
2100
1624
|
assert_output("[null, null, null, null, null]\n") do
|
|
2101
1625
|
cls.main(nil)
|
|
2102
1626
|
end
|
|
2103
1627
|
end
|
|
2104
|
-
|
|
1628
|
+
|
|
2105
1629
|
def test_getClass_on_object_array
|
|
2106
1630
|
cls, = compile(<<-EOF)
|
|
2107
|
-
|
|
1631
|
+
System.out.println Object[0].getClass.getName
|
|
2108
1632
|
EOF
|
|
2109
|
-
|
|
1633
|
+
|
|
2110
1634
|
assert_output("[Ljava.lang.Object;\n") do
|
|
2111
1635
|
cls.main(nil)
|
|
2112
1636
|
end
|
|
@@ -2125,7 +1649,7 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
2125
1649
|
|
|
2126
1650
|
cls, = compile(<<-EOF)
|
|
2127
1651
|
a = nil
|
|
2128
|
-
|
|
1652
|
+
System.out.println a
|
|
2129
1653
|
EOF
|
|
2130
1654
|
|
|
2131
1655
|
assert_output("null\n") do
|
|
@@ -2136,27 +1660,69 @@ class JVMCompilerTest < Test::Unit::TestCase
|
|
|
2136
1660
|
def test_long_generation
|
|
2137
1661
|
cls, = compile(<<-EOF)
|
|
2138
1662
|
c = 2_000_000_000_000
|
|
2139
|
-
|
|
1663
|
+
System.out.println c
|
|
2140
1664
|
EOF
|
|
2141
1665
|
end
|
|
2142
1666
|
|
|
2143
1667
|
def test_missing_class_with_block_raises_inference_error
|
|
2144
|
-
|
|
1668
|
+
# TODO(ribrdb): What is this test for?
|
|
1669
|
+
ex = assert_raise Mirah::MirahError do
|
|
2145
1670
|
compile("Interface Implements_Go do; end")
|
|
2146
1671
|
end
|
|
1672
|
+
assert_equal("Cannot find class Implements_Go", ex.message)
|
|
2147
1673
|
end
|
|
2148
|
-
|
|
1674
|
+
|
|
2149
1675
|
def test_bool_equality
|
|
2150
|
-
cls, = compile("
|
|
1676
|
+
cls, = compile("System.out.println true == false")
|
|
2151
1677
|
assert_output("false\n") do
|
|
2152
1678
|
cls.main(nil)
|
|
2153
1679
|
end
|
|
2154
1680
|
end
|
|
2155
|
-
|
|
1681
|
+
|
|
2156
1682
|
def test_bool_inequality
|
|
2157
|
-
cls, = compile("
|
|
1683
|
+
cls, = compile("System.out.println true != false")
|
|
2158
1684
|
assert_output("true\n") do
|
|
2159
1685
|
cls.main(nil)
|
|
2160
1686
|
end
|
|
2161
1687
|
end
|
|
1688
|
+
|
|
1689
|
+
def test_field_setter_wit_nil
|
|
1690
|
+
cls, = compile(<<-EOF)
|
|
1691
|
+
import mirah.lang.ast.*
|
|
1692
|
+
a = Arguments.new
|
|
1693
|
+
a.block = nil
|
|
1694
|
+
print "OK"
|
|
1695
|
+
EOF
|
|
1696
|
+
|
|
1697
|
+
assert_output("OK") { cls.main(nil) }
|
|
1698
|
+
end
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
def test_dynamic_works_ok_for_types_widenable_to_object
|
|
1702
|
+
cls, = compile(<<-EOF)
|
|
1703
|
+
def dyno qux:dynamic
|
|
1704
|
+
puts qux
|
|
1705
|
+
end
|
|
1706
|
+
dyno 1
|
|
1707
|
+
dyno "hello"
|
|
1708
|
+
dyno ["im","an","array"]
|
|
1709
|
+
EOF
|
|
1710
|
+
assert_output("1\nhello\n[im, an, array]\n") { cls.main(nil) }
|
|
1711
|
+
end
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
def test_dynamic_fails_reasonably_on_pre_1_7_target
|
|
1715
|
+
ex = assert_raises MirahError do
|
|
1716
|
+
compile(<<-EOF, :java_version => '1.6')
|
|
1717
|
+
def dyno qux:dynamic
|
|
1718
|
+
puts qux
|
|
1719
|
+
qux.toString
|
|
1720
|
+
end
|
|
1721
|
+
dyno 1
|
|
1722
|
+
dyno "hello"
|
|
1723
|
+
dyno ["im","an","array"]
|
|
1724
|
+
EOF
|
|
1725
|
+
end
|
|
1726
|
+
assert_equal "Target JVM version: 1.6 doesn't support invoke dynamic", ex.message
|
|
1727
|
+
end
|
|
2162
1728
|
end
|