mirah 0.1.3-java → 0.1.4-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.
- checksums.yaml +4 -4
- data/History.txt +97 -1
- data/README.md +2 -3
- data/Rakefile +172 -15
- data/TODO.md +293 -49
- data/dist/mirahc.jar +0 -0
- data/examples/ant/README.md +8 -0
- data/examples/ant/build/Fib.class +0 -0
- data/examples/ant/example-build.xml +3 -3
- data/examples/ant/example-build.xml~ +7 -0
- data/examples/rosettacode/100-doors.mirah +2 -2
- data/examples/sort_closure.mirah +1 -1
- data/lib/mirah.rb +0 -2
- data/lib/mirah/version.rb +1 -1
- data/test/core/util/class_loader_test.rb +1 -1
- data/test/core/util/{argument_processor_test.rb → mirah_arguments_test.rb} +2 -2
- data/test/jvm/annotations_test.rb +19 -0
- data/test/jvm/blocks_test.rb +198 -32
- data/test/jvm/import_test.rb +3 -0
- data/test/jvm/interface_test.rb +14 -0
- data/test/jvm/jvm_compiler_test.rb +11 -0
- data/test/jvm/new_backend_test_helper.rb +1 -1
- data/test/jvm/static_fields_test.rb +11 -1
- data/test/mirrors/method_lookup_test.rb +20 -7
- data/test/mirrors/mirrors_test.rb +51 -7
- metadata +6 -5
- data/lib/mirah/util/argument_processor.rb +0 -150
- data/lib/mirah/util/class_loader.rb +0 -14
data/dist/mirahc.jar
CHANGED
Binary file
|
Binary file
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<project name="test">
|
2
|
-
<taskdef name="
|
2
|
+
<taskdef name="mirahc" classname="org.mirah.ant.Compile"/>
|
3
3
|
|
4
|
-
<target name="
|
5
|
-
<
|
4
|
+
<target name="compile">
|
5
|
+
<mirahc src="../fib.mirah" target="build"/>
|
6
6
|
</target>
|
7
7
|
</project>
|
data/examples/sort_closure.mirah
CHANGED
@@ -18,5 +18,5 @@ import java.util.ArrayList
|
|
18
18
|
|
19
19
|
list = ArrayList.new [9,5,2,6,8,5,0,3,6,1,8,3,6,4,7,5,0,8,5,6,7,2,3]
|
20
20
|
puts "unsorted: #{list}"
|
21
|
-
Collections.sort(list) {|a,b|
|
21
|
+
Collections.sort(list) {|a: Integer, b: Integer| a.compareTo(b)}
|
22
22
|
puts "sorted: #{list}"
|
data/lib/mirah.rb
CHANGED
data/lib/mirah/version.rb
CHANGED
@@ -23,7 +23,7 @@ class ClassLoaderTest < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
def test_mirah_class_loader_find_class_in_map_successful
|
25
25
|
class_map = {
|
26
|
-
'org.foo.A' =>
|
26
|
+
'org.foo.A' => File.open(A_CLASS, 'rb') {|f| java.lang.String.new f.read.to_java_bytes, "ISO-8859-1" }
|
27
27
|
}
|
28
28
|
class_loader = MirahClassLoader.new nil, class_map
|
29
29
|
cls = class_loader.load_class 'org.foo.A'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2013 The Mirah project authors. All Rights Reserved.
|
1
|
+
# Copyright (c) 2013-2014 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");
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
require 'test_helper'
|
16
16
|
|
17
|
-
class
|
17
|
+
class MirahArgumentsTest < Test::Unit::TestCase
|
18
18
|
java_import 'org.mirah.tool.MirahArguments'
|
19
19
|
def test_arg_dash_v_prints_version_and_has_exit_0
|
20
20
|
arg_processor = MirahArguments.new
|
@@ -54,5 +54,24 @@ class AnnotationsTest < Test::Unit::TestCase
|
|
54
54
|
cls.main nil
|
55
55
|
end
|
56
56
|
end
|
57
|
+
def test_annotation_from_constant
|
58
|
+
return
|
59
|
+
cls, = compile(<<-EOF)
|
60
|
+
import org.foo.IntAnno
|
61
|
+
class IntValAnnotation
|
62
|
+
Value = 1
|
63
|
+
$IntAnno[name: "bar", value: Value]
|
64
|
+
def bar
|
65
|
+
end
|
66
|
+
end
|
67
|
+
method = IntValAnnotation.class.getMethod("bar")
|
68
|
+
anno = method.getAnnotation(IntAnno.class)
|
69
|
+
puts anno.value
|
70
|
+
EOF
|
71
|
+
|
72
|
+
assert_output "1\n" do
|
73
|
+
cls.main nil
|
74
|
+
end
|
75
|
+
end
|
57
76
|
|
58
77
|
end
|
data/test/jvm/blocks_test.rb
CHANGED
@@ -20,7 +20,7 @@ class BlocksTest < Test::Unit::TestCase
|
|
20
20
|
parse_and_resolve_types name, code
|
21
21
|
end
|
22
22
|
|
23
|
-
#this should probably be a core test
|
23
|
+
# this should probably be a core test
|
24
24
|
def test_empty_block_parses_and_types_without_error
|
25
25
|
assert_nothing_raised do
|
26
26
|
parse_and_type(<<-CODE)
|
@@ -47,7 +47,7 @@ class BlocksTest < Test::Unit::TestCase
|
|
47
47
|
|
48
48
|
class NotEmptyAccepter
|
49
49
|
def initialize; end
|
50
|
-
def foo(a:Bar)
|
50
|
+
def foo(a: Bar)
|
51
51
|
1
|
52
52
|
end
|
53
53
|
end
|
@@ -136,7 +136,7 @@ class BlocksTest < Test::Unit::TestCase
|
|
136
136
|
x.run
|
137
137
|
end
|
138
138
|
def foo a: int
|
139
|
-
run {a += 1}
|
139
|
+
run { a += 1 }
|
140
140
|
a
|
141
141
|
end
|
142
142
|
EOF
|
@@ -202,16 +202,11 @@ class BlocksTest < Test::Unit::TestCase
|
|
202
202
|
end
|
203
203
|
|
204
204
|
def test_parameter_used_in_block
|
205
|
-
cls, = compile(<<-EOF)
|
206
|
-
def
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
begin
|
211
|
-
thread.run
|
212
|
-
thread.join
|
213
|
-
rescue
|
214
|
-
puts "Uh Oh!"
|
205
|
+
cls, = compile(<<-'EOF')
|
206
|
+
def r(r:Runnable); r.run; end
|
207
|
+
def foo(x: String): void
|
208
|
+
r do
|
209
|
+
puts "Hello #{x}"
|
215
210
|
end
|
216
211
|
end
|
217
212
|
|
@@ -239,23 +234,12 @@ class BlocksTest < Test::Unit::TestCase
|
|
239
234
|
end
|
240
235
|
end
|
241
236
|
|
242
|
-
def assert_jraise(klass)
|
243
|
-
assert_block("#{klass} expected, but none thrown") do
|
244
|
-
begin
|
245
|
-
yield
|
246
|
-
rescue klass
|
247
|
-
break
|
248
|
-
end
|
249
|
-
false
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
237
|
def test_block_impling_interface_w_multiple_methods
|
254
238
|
begin
|
255
239
|
parse_and_type(<<-CODE)
|
256
240
|
interface RunOrRun2 do
|
257
241
|
def run:void;end
|
258
|
-
def run2:void;end
|
242
|
+
def run2:void;end
|
259
243
|
end
|
260
244
|
|
261
245
|
class RunOrRun2Fooer
|
@@ -295,7 +279,7 @@ class BlocksTest < Test::Unit::TestCase
|
|
295
279
|
end
|
296
280
|
|
297
281
|
def test_block_with_too_many_params
|
298
|
-
assert_raises Mirah::MirahError do
|
282
|
+
exception = assert_raises Mirah::MirahError do
|
299
283
|
parse_and_type(<<-CODE)
|
300
284
|
interface SingleArgMethod do
|
301
285
|
def run(a:String):void;end
|
@@ -310,10 +294,35 @@ class BlocksTest < Test::Unit::TestCase
|
|
310
294
|
1
|
311
295
|
end
|
312
296
|
CODE
|
313
|
-
|
297
|
+
end
|
298
|
+
assert_equal 'Does not override a method from a supertype.',
|
299
|
+
exception.message
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_call_with_block_assigned_to_macro
|
303
|
+
#cls, = with_finest_logging{compile(<<-CODE)}
|
304
|
+
cls, = compile(<<-CODE)
|
305
|
+
class S
|
306
|
+
def initialize(run: Runnable)
|
307
|
+
run.run
|
308
|
+
end
|
309
|
+
def toString
|
310
|
+
"1"
|
311
|
+
end
|
312
|
+
end
|
313
|
+
if true
|
314
|
+
a = {}
|
315
|
+
a["wut"]= b = S.new { puts "hey" }
|
316
|
+
puts a
|
317
|
+
puts b
|
318
|
+
end
|
319
|
+
CODE
|
320
|
+
assert_output "hey\n{wut=1}\n1\n" do
|
321
|
+
cls.main(nil)
|
322
|
+
end
|
314
323
|
end
|
315
324
|
|
316
|
-
def
|
325
|
+
def test_nested_closure_in_closure_doesnt_raise_error
|
317
326
|
cls, = compile(<<-CODE)
|
318
327
|
interface BarRunner do;def run:void;end;end
|
319
328
|
|
@@ -334,6 +343,32 @@ class BlocksTest < Test::Unit::TestCase
|
|
334
343
|
end
|
335
344
|
end
|
336
345
|
|
346
|
+
def test_nested_closure_with_var_from_outer_closure
|
347
|
+
pend "bindings in nested closures are incorrectly generated" do
|
348
|
+
#cls, = with_finest_logging{compile(<<-'CODE')}
|
349
|
+
cls, = compile(<<-'CODE')
|
350
|
+
interface BarRunner do;def run:void;end;end
|
351
|
+
|
352
|
+
class Nestable
|
353
|
+
def foo(a:BarRunner)
|
354
|
+
a.run
|
355
|
+
end
|
356
|
+
end
|
357
|
+
Nestable.new.foo do
|
358
|
+
c = "closure"
|
359
|
+
puts "first #{c}"
|
360
|
+
Nestable.new.foo do
|
361
|
+
puts "second #{c}"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
CODE
|
365
|
+
assert_output "first closure\nsecond closure\n" do
|
366
|
+
cls.main(nil)
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
|
337
372
|
def test_method_requiring_subclass_of_abstract_class_finds_abstract_method
|
338
373
|
cls, = compile(<<-EOF)
|
339
374
|
import java.io.OutputStream
|
@@ -436,7 +471,6 @@ class BlocksTest < Test::Unit::TestCase
|
|
436
471
|
end
|
437
472
|
|
438
473
|
def test_when_non_local_return_types_incompatible_has_error
|
439
|
-
pend "nlr doesnt work right now" do
|
440
474
|
error = assert_raises Mirah::MirahError do
|
441
475
|
parse_and_type(<<-CODE)
|
442
476
|
class NonLocalMe
|
@@ -446,13 +480,15 @@ class BlocksTest < Test::Unit::TestCase
|
|
446
480
|
end
|
447
481
|
end
|
448
482
|
def nlr: int
|
449
|
-
NonLocalMe.new.foo { return "not an int"}
|
483
|
+
NonLocalMe.new.foo { return "not an int" }
|
450
484
|
5678
|
451
485
|
end
|
452
486
|
|
453
487
|
CODE
|
454
488
|
end
|
455
|
-
|
489
|
+
pend "differing type signatures for nlr" do
|
490
|
+
# could be better, if future knew it was a return type
|
491
|
+
assert_equal "Invalid return type java.lang.String, expected int", error.message
|
456
492
|
end
|
457
493
|
end
|
458
494
|
|
@@ -512,7 +548,6 @@ class BlocksTest < Test::Unit::TestCase
|
|
512
548
|
end
|
513
549
|
ClosureInVoidMethodInClass.new.nlr
|
514
550
|
EOF
|
515
|
-
puts "before running"
|
516
551
|
assert_output "before\n" do
|
517
552
|
cls.main(nil)
|
518
553
|
end
|
@@ -592,6 +627,56 @@ class BlocksTest < Test::Unit::TestCase
|
|
592
627
|
end
|
593
628
|
|
594
629
|
|
630
|
+
def test_method_returning_init_call_with_closure
|
631
|
+
cls, = compile(<<-EOF)
|
632
|
+
class InitWithRunnable
|
633
|
+
def initialize(a: Runnable)
|
634
|
+
a.run
|
635
|
+
end
|
636
|
+
def finish
|
637
|
+
"finish"
|
638
|
+
end
|
639
|
+
end
|
640
|
+
class Huh
|
641
|
+
def wut(i: InitWithRunnable)
|
642
|
+
puts i.finish
|
643
|
+
end
|
644
|
+
def regular
|
645
|
+
InitWithRunnable.new { puts "Closure!"; nil }
|
646
|
+
end
|
647
|
+
end
|
648
|
+
Huh.new.wut(Huh.new.regular)
|
649
|
+
EOF
|
650
|
+
|
651
|
+
assert_output "Closure!\nfinish\n" do
|
652
|
+
cls.main(nil)
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
|
657
|
+
def test_closure_with_or
|
658
|
+
cls, = with_finest_logging{compile(<<-EOF)}
|
659
|
+
def r(run: Runnable) run.run; end
|
660
|
+
r { puts "a" || "b"}
|
661
|
+
EOF
|
662
|
+
|
663
|
+
assert_output "a\n" do
|
664
|
+
cls.main(nil)
|
665
|
+
end
|
666
|
+
end
|
667
|
+
|
668
|
+
def test_closure_with_or_ii
|
669
|
+
cls, = with_finest_logging{compile(<<-EOF)}
|
670
|
+
interface C; def c(): String;end;end
|
671
|
+
def r(cee: C) puts cee.c; end
|
672
|
+
r { "a" || "b"}
|
673
|
+
EOF
|
674
|
+
|
675
|
+
assert_output "a\n" do
|
676
|
+
cls.main(nil)
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
595
680
|
def test_two_closures_in_the_same_method
|
596
681
|
cls, = compile(<<-EOF)
|
597
682
|
def foo(a: Runnable)
|
@@ -609,6 +694,87 @@ class BlocksTest < Test::Unit::TestCase
|
|
609
694
|
end
|
610
695
|
end
|
611
696
|
|
697
|
+
def test_closures_in_a_rescue
|
698
|
+
cls, = compile(<<-EOF)
|
699
|
+
def foo(a: Runnable)
|
700
|
+
a.run
|
701
|
+
end
|
702
|
+
def regular: String
|
703
|
+
begin
|
704
|
+
foo { puts "Closure!" }
|
705
|
+
raise "wut"
|
706
|
+
rescue
|
707
|
+
foo { puts "We Want it" }
|
708
|
+
end
|
709
|
+
"finish"
|
710
|
+
end
|
711
|
+
regular
|
712
|
+
EOF
|
713
|
+
assert_output "Closure!\nWe Want it\n" do
|
714
|
+
cls.main(nil)
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
def test_lambda_with_type_defined_before
|
719
|
+
cls, = compile(<<-EOF)
|
720
|
+
interface Fooable
|
721
|
+
def foo: void; end
|
722
|
+
end
|
723
|
+
x = lambda(Fooable) { puts "hey you" }
|
724
|
+
x.foo
|
725
|
+
EOF
|
726
|
+
assert_output "hey you\n" do
|
727
|
+
cls.main(nil)
|
728
|
+
end
|
729
|
+
end
|
730
|
+
|
731
|
+
def test_lambda_with_type_defined_later
|
732
|
+
pend "I think it'd be nice if this worked" do
|
733
|
+
cls, = compile(<<-EOF)
|
734
|
+
x = lambda(Fooable) { puts "hey you" }
|
735
|
+
interface Fooable
|
736
|
+
def foo: void; end
|
737
|
+
end
|
738
|
+
x.foo
|
739
|
+
EOF
|
740
|
+
assert_output "hey you\n" do
|
741
|
+
cls.main(nil)
|
742
|
+
end
|
743
|
+
end
|
744
|
+
end
|
745
|
+
|
746
|
+
def test_closure_with_primitive_array_param
|
747
|
+
cls, = compile(<<-EOF)
|
748
|
+
interface Byter
|
749
|
+
def byteme(bytes: byte[]): void; end
|
750
|
+
end
|
751
|
+
def r b: Byter
|
752
|
+
b.byteme "yay".getBytes
|
753
|
+
end
|
754
|
+
r {|b| puts String.new(b) }
|
755
|
+
EOF
|
756
|
+
assert_output "yay\n" do
|
757
|
+
cls.main(nil)
|
758
|
+
end
|
759
|
+
end
|
760
|
+
|
761
|
+
|
762
|
+
def test_lambda_closure
|
763
|
+
pend "not working yet" do
|
764
|
+
cls, = compile(<<-EOF)
|
765
|
+
def r b: Runnable
|
766
|
+
b.run
|
767
|
+
end
|
768
|
+
msg = "yay"
|
769
|
+
l = lambda(Runnable) { puts msg }
|
770
|
+
r l
|
771
|
+
EOF
|
772
|
+
assert_output "yay\n" do
|
773
|
+
cls.main(nil)
|
774
|
+
end
|
775
|
+
end
|
776
|
+
end
|
777
|
+
|
612
778
|
# nested nlr scopes
|
613
779
|
|
614
780
|
# works with script as end
|
data/test/jvm/import_test.rb
CHANGED
@@ -62,7 +62,9 @@ class ImportTest < Test::Unit::TestCase
|
|
62
62
|
list = cls.list(o)
|
63
63
|
assert_kind_of(Java::JavaUtil::List, list)
|
64
64
|
assert_equal(["1", "2", "3"], list.to_a)
|
65
|
+
end
|
65
66
|
|
67
|
+
def test_static_import_nested_in_class
|
66
68
|
cls, = compile(<<-EOF)
|
67
69
|
import java.util.Arrays
|
68
70
|
class StaticImports
|
@@ -73,6 +75,7 @@ class ImportTest < Test::Unit::TestCase
|
|
73
75
|
end
|
74
76
|
EOF
|
75
77
|
|
78
|
+
o = ["1", "2", "3"].to_java(:object)
|
76
79
|
list = cls.new.list(o)
|
77
80
|
assert_kind_of(Java::JavaUtil::List, list)
|
78
81
|
assert_equal(["1", "2", "3"], list.to_a)
|