mirah 0.0.5-java → 0.0.6-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 +33 -0
- data/README.txt +2 -3
- data/Rakefile +5 -0
- data/bin/duby +0 -0
- data/bin/dubyc +0 -0
- data/bin/dubyp +0 -0
- data/bin/jrubyp +0 -0
- data/bin/mirah +0 -0
- data/bin/mirah.cmd +14 -14
- data/bin/mirahc +0 -0
- data/bin/mirahc.cmd +14 -14
- data/bin/mirahp +0 -0
- data/bin/mirahp.cmd +14 -14
- data/examples/Dynamic.class +0 -0
- data/examples/SizeThing.class +0 -0
- data/examples/plugins/appengine/Rakefile +3 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +385 -0
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +58 -15
- data/examples/wiki/war/public/javascripts/prettify.js +0 -0
- data/examples/wiki/war/public/stylesheets/prettify.css +0 -0
- data/javalib/dynalink-0.1.jar +0 -0
- data/javalib/jsr292-mock.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/lib/mirah.rb +45 -25
- data/lib/mirah/ast.rb +81 -27
- data/lib/mirah/ast/call.rb +62 -71
- data/lib/mirah/ast/class.rb +23 -26
- data/lib/mirah/ast/flow.rb +38 -62
- data/lib/mirah/ast/intrinsics.rb +59 -37
- data/lib/mirah/ast/literal.rb +16 -14
- data/lib/mirah/ast/local.rb +8 -8
- data/lib/mirah/ast/method.rb +33 -19
- data/lib/mirah/ast/structure.rb +54 -13
- data/lib/mirah/ast/type.rb +8 -11
- data/lib/mirah/compiler.rb +86 -0
- data/lib/mirah/errors.rb +60 -0
- data/lib/mirah/jvm/base.rb +5 -11
- data/lib/mirah/jvm/compiler.rb +12 -1
- data/lib/mirah/jvm/source_compiler.rb +10 -2
- data/lib/mirah/jvm/source_generator/builder.rb +3 -1
- data/lib/mirah/jvm/source_generator/precompile.rb +6 -0
- data/lib/mirah/jvm/typer.rb +6 -1
- data/lib/mirah/jvm/types.rb +8 -0
- data/lib/mirah/jvm/types/factory.rb +34 -10
- data/lib/mirah/jvm/types/intrinsics.rb +12 -5
- data/lib/mirah/jvm/types/methods.rb +5 -9
- data/lib/mirah/plugin/gwt.rb +3 -2
- data/lib/mirah/transform.rb +68 -10
- data/lib/mirah/transform2.rb +10 -1
- data/lib/mirah/typer.rb +5 -10
- data/lib/mirah/version.rb +1 -1
- data/test/test_compilation.rb +1 -1
- data/test/test_java_typer.rb +10 -0
- data/test/test_javac_compiler.rb +4 -2
- data/test/test_jvm_compiler.rb +132 -9
- data/test/test_macros.rb +51 -0
- data/test/test_typer.rb +29 -25
- metadata +13 -21
- data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +0 -390
- data/javalib/JRubyParser.jar +0 -0
- data/javalib/dynalang-invoke-0.1.jar +0 -0
- data/lib/mirah/nbcompiler.rb +0 -44
data/lib/mirah/transform2.rb
CHANGED
@@ -213,7 +213,7 @@ module Mirah::AST
|
|
213
213
|
name = transform(name, nil) unless name.kind_of?(::String)
|
214
214
|
position = position(node)
|
215
215
|
actual_name = name
|
216
|
-
if name =~ /=$/
|
216
|
+
if name =~ /=$/ && name != '[]='
|
217
217
|
actual_name = name[0..-2] + '_set'
|
218
218
|
end
|
219
219
|
if name == 'initialize'
|
@@ -337,6 +337,15 @@ module Mirah::AST
|
|
337
337
|
Constant.new(parent, position(node), node[1])
|
338
338
|
end
|
339
339
|
|
340
|
+
def transform_colon2const(node, parent)
|
341
|
+
name = node[2]
|
342
|
+
name = transform(name, nil) unless name.kind_of?(::String)
|
343
|
+
target = node[1]
|
344
|
+
Colon2.new(parent, position(node), name) do |colon2|
|
345
|
+
[ transform(target, colon2) ]
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
340
349
|
def transform_identifier(node, parent)
|
341
350
|
name = node[1]
|
342
351
|
position = position(node)
|
data/lib/mirah/typer.rb
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
|
16
16
|
require 'mirah/ast'
|
17
17
|
require 'mirah/transform'
|
18
|
+
require 'mirah/errors'
|
18
19
|
|
19
20
|
module Mirah
|
20
21
|
module Typer
|
@@ -26,13 +27,7 @@ module Mirah
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
|
30
|
-
attr_accessor :node
|
31
|
-
def initialize(msg, node = nil)
|
32
|
-
super(msg)
|
33
|
-
@node = node
|
34
|
-
end
|
35
|
-
end
|
30
|
+
InferenceError = Mirah::InferenceError
|
36
31
|
|
37
32
|
class BaseTyper
|
38
33
|
include Mirah
|
@@ -295,14 +290,14 @@ module Mirah
|
|
295
290
|
@deferred_nodes ||= {}
|
296
291
|
end
|
297
292
|
|
298
|
-
def infer(node)
|
293
|
+
def infer(node, expression=true)
|
299
294
|
begin
|
300
|
-
node.infer(self)
|
295
|
+
node.infer(self, expression)
|
301
296
|
rescue InferenceError => ex
|
302
297
|
ex.node ||= node
|
303
298
|
error(node, ex)
|
304
299
|
rescue Exception => ex
|
305
|
-
|
300
|
+
raise Mirah::InternalCompilerError.wrap(ex, node)
|
306
301
|
end
|
307
302
|
end
|
308
303
|
|
data/lib/mirah/version.rb
CHANGED
data/test/test_compilation.rb
CHANGED
@@ -102,7 +102,7 @@ class TestAst < Test::Unit::TestCase
|
|
102
102
|
def test_local_typed
|
103
103
|
new_ast = AST.parse("a = 1").body[0]
|
104
104
|
typer = Typer::Simple.new(:bar)
|
105
|
-
new_ast.infer(typer)
|
105
|
+
new_ast.infer(typer, true)
|
106
106
|
new_ast.compile(@compiler, true)
|
107
107
|
|
108
108
|
assert_equal([[:local_assign, a(Mirah::AST::StaticScope), "a", AST.type(nil, :fixnum), true, AST.fixnum(nil, nil, 1)]], @compiler.calls)
|
data/test/test_java_typer.rb
CHANGED
@@ -195,4 +195,14 @@ class TestJavaTyper < Test::Unit::TestCase
|
|
195
195
|
|
196
196
|
assert_equal(AST.type(nil, 'byte'), java_typer.method_type(nil, ary, "[]", [int]))
|
197
197
|
end
|
198
|
+
|
199
|
+
def test_int
|
200
|
+
ast = AST.parse("#{1 << 16}")
|
201
|
+
assert_equal(AST.type(nil, 'int'), ast.infer(@typer, true))
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_long
|
205
|
+
ast = AST.parse("#{1 << 33}")
|
206
|
+
assert_equal(AST.type(nil, 'long'), ast.infer(@typer, true))
|
207
|
+
end
|
198
208
|
end
|
data/test/test_javac_compiler.rb
CHANGED
@@ -55,12 +55,14 @@ class TestJavacCompiler < TestJVMCompiler
|
|
55
55
|
File.unlink(*@tmp_classes)
|
56
56
|
@tmp_classes.clear
|
57
57
|
AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
58
|
-
|
58
|
+
state = Mirah::CompilationState.new
|
59
|
+
state.save_extensions = false
|
60
|
+
transformer = Mirah::Transform::Transformer.new(state)
|
59
61
|
Java::MirahImpl::Builtin.initialize_builtins(transformer)
|
60
62
|
name = "script" + System.nano_time.to_s
|
61
63
|
ast = AST.parse(code, name, true, transformer)
|
62
64
|
typer = Typer::JVM.new(transformer)
|
63
|
-
ast.infer(typer)
|
65
|
+
ast.infer(typer, true)
|
64
66
|
typer.resolve(true)
|
65
67
|
compiler = Compiler::JavaSource.new
|
66
68
|
ast.compile(compiler, false)
|
data/test/test_jvm_compiler.rb
CHANGED
@@ -71,11 +71,13 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
71
71
|
@tmp_classes.clear
|
72
72
|
AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
73
73
|
name = "script" + System.nano_time.to_s
|
74
|
-
|
74
|
+
state = Mirah::CompilationState.new
|
75
|
+
state.save_extensions = false
|
76
|
+
transformer = Mirah::Transform::Transformer.new(state)
|
75
77
|
Java::MirahImpl::Builtin.initialize_builtins(transformer)
|
76
78
|
ast = AST.parse(code, name, true, transformer)
|
77
79
|
typer = Typer::JVM.new(transformer)
|
78
|
-
ast.infer(typer)
|
80
|
+
ast.infer(typer, true)
|
79
81
|
typer.resolve(true)
|
80
82
|
compiler = Compiler::JVM.new
|
81
83
|
compiler.compile(ast)
|
@@ -2391,14 +2393,11 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2391
2393
|
def test_unquote
|
2392
2394
|
# TODO fix annotation output and create a duby.anno.Extensions annotation.
|
2393
2395
|
return if self.class.name == 'TestJavacCompiler'
|
2394
|
-
|
2395
|
-
|
2396
|
-
return
|
2397
|
-
script, cls = compile(<<-EOF)
|
2398
|
-
import duby.lang.compiler.StringNode
|
2396
|
+
|
2397
|
+
script, cls = compile(<<-'EOF')
|
2399
2398
|
class UnquoteMacros
|
2400
2399
|
macro def make_attr(name_node, type)
|
2401
|
-
name =
|
2400
|
+
name = name_node.string_value
|
2402
2401
|
quote do
|
2403
2402
|
def `name`
|
2404
2403
|
@`name`
|
@@ -2417,7 +2416,7 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2417
2416
|
x.foo = 3
|
2418
2417
|
puts x.foo
|
2419
2418
|
EOF
|
2420
|
-
assert_output("
|
2419
|
+
assert_output("0\n3\n") {script.main(nil)}
|
2421
2420
|
end
|
2422
2421
|
|
2423
2422
|
def test_static_import
|
@@ -2499,6 +2498,16 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2499
2498
|
map = cls.foo2
|
2500
2499
|
assert_equal("A", map["a"])
|
2501
2500
|
assert_equal("B", map["b"])
|
2501
|
+
|
2502
|
+
cls, = compile(<<-'EOF')
|
2503
|
+
def set(b:Object)
|
2504
|
+
map = { }
|
2505
|
+
map["key"] = b
|
2506
|
+
map["key"]
|
2507
|
+
end
|
2508
|
+
EOF
|
2509
|
+
|
2510
|
+
assert_equal("foo", cls.set("foo"))
|
2502
2511
|
end
|
2503
2512
|
|
2504
2513
|
def test_loop_in_ensure
|
@@ -2634,4 +2643,118 @@ class TestJVMCompiler < Test::Unit::TestCase
|
|
2634
2643
|
assert_output("1\nFoo\n2\n") { cls.foo }
|
2635
2644
|
end
|
2636
2645
|
|
2646
|
+
def test_scoped_self_through_method_call
|
2647
|
+
cls, = compile(<<-EOF)
|
2648
|
+
class ScopedSelfThroughMethodCall
|
2649
|
+
def emptyMap
|
2650
|
+
{}
|
2651
|
+
end
|
2652
|
+
|
2653
|
+
def foo
|
2654
|
+
emptyMap["a"] = "A"
|
2655
|
+
end
|
2656
|
+
end
|
2657
|
+
EOF
|
2658
|
+
|
2659
|
+
# just make sure it can execute
|
2660
|
+
m = cls.new.foo
|
2661
|
+
end
|
2662
|
+
|
2663
|
+
def test_self_call_preserves_scope
|
2664
|
+
cls, = compile(<<-EOF)
|
2665
|
+
class SelfCallPreservesScope
|
2666
|
+
def key
|
2667
|
+
"key"
|
2668
|
+
end
|
2669
|
+
|
2670
|
+
def foo
|
2671
|
+
map = {}
|
2672
|
+
map[key] = "value"
|
2673
|
+
map
|
2674
|
+
end
|
2675
|
+
end
|
2676
|
+
EOF
|
2677
|
+
|
2678
|
+
map = cls.new.foo
|
2679
|
+
assert_equal("value", map["key"])
|
2680
|
+
end
|
2681
|
+
|
2682
|
+
def test_macro_hygene
|
2683
|
+
cls, = compile(<<-EOF)
|
2684
|
+
macro def doubleIt(arg)
|
2685
|
+
quote do
|
2686
|
+
x = `arg`
|
2687
|
+
x = x + x
|
2688
|
+
x
|
2689
|
+
end
|
2690
|
+
end
|
2691
|
+
|
2692
|
+
def foo
|
2693
|
+
x = "1"
|
2694
|
+
puts doubleIt(x)
|
2695
|
+
puts x
|
2696
|
+
end
|
2697
|
+
EOF
|
2698
|
+
|
2699
|
+
assert_output("11\n1\n") {cls.foo}
|
2700
|
+
end
|
2701
|
+
|
2702
|
+
def test_wide_nonexpressions
|
2703
|
+
script, cls1, cls2 = compile(<<-EOF)
|
2704
|
+
class WideA
|
2705
|
+
def a
|
2706
|
+
2.5
|
2707
|
+
end
|
2708
|
+
end
|
2709
|
+
|
2710
|
+
class WideB < WideA
|
2711
|
+
def a
|
2712
|
+
super
|
2713
|
+
3.5
|
2714
|
+
end
|
2715
|
+
end
|
2716
|
+
|
2717
|
+
def self.b
|
2718
|
+
1.5
|
2719
|
+
end
|
2720
|
+
|
2721
|
+
1.5
|
2722
|
+
WideA.new.a
|
2723
|
+
WideB.new.a
|
2724
|
+
b
|
2725
|
+
EOF
|
2726
|
+
|
2727
|
+
script.main(nil)
|
2728
|
+
end
|
2729
|
+
|
2730
|
+
def test_parameter_used_in_block
|
2731
|
+
cls, = compile(<<-EOF)
|
2732
|
+
def foo(x:String):void
|
2733
|
+
thread = Thread.new do
|
2734
|
+
puts "Hello \#{x}"
|
2735
|
+
end
|
2736
|
+
begin
|
2737
|
+
thread.run
|
2738
|
+
thread.join
|
2739
|
+
rescue
|
2740
|
+
puts "Uh Oh!"
|
2741
|
+
end
|
2742
|
+
end
|
2743
|
+
|
2744
|
+
foo('there')
|
2745
|
+
EOF
|
2746
|
+
assert_output("Hello there\n") do
|
2747
|
+
cls.main(nil)
|
2748
|
+
end
|
2749
|
+
end
|
2750
|
+
|
2751
|
+
def test_colon2
|
2752
|
+
cls, = compile(<<-EOF)
|
2753
|
+
def foo
|
2754
|
+
java.util::HashSet.new
|
2755
|
+
end
|
2756
|
+
EOF
|
2757
|
+
|
2758
|
+
assert_kind_of(java.util.HashSet, cls.foo)
|
2759
|
+
end
|
2637
2760
|
end
|
data/test/test_macros.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# TODO refactor this and test_jvm_compiler to use mirah.rb
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'mirah'
|
7
|
+
|
8
|
+
class TestMacros < Test::Unit::TestCase
|
9
|
+
java_import 'java.lang.System'
|
10
|
+
|
11
|
+
def parse(code)
|
12
|
+
Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
13
|
+
name = "script" + System.nano_time.to_s
|
14
|
+
state = Mirah::CompilationState.new
|
15
|
+
state.save_extensions = false
|
16
|
+
transformer = Mirah::Transform::Transformer.new(state)
|
17
|
+
Java::MirahImpl::Builtin.initialize_builtins(transformer)
|
18
|
+
ast = Mirah::AST.parse(code, name, true, transformer)
|
19
|
+
typer = Mirah::Typer::JVM.new(transformer)
|
20
|
+
ast.infer(typer, true)
|
21
|
+
typer.resolve(true)
|
22
|
+
ast
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_macro_helper
|
26
|
+
script = parse(<<-EOF)
|
27
|
+
import duby.lang.compiler.Compiler
|
28
|
+
|
29
|
+
def helper(mirah:Compiler)
|
30
|
+
name = "foobar"
|
31
|
+
mirah.quote { `name` }
|
32
|
+
end
|
33
|
+
EOF
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_self_call_in_unquote
|
37
|
+
script = parse(<<-EOF)
|
38
|
+
import duby.lang.compiler.Compiler
|
39
|
+
|
40
|
+
def foobar(name:String)
|
41
|
+
name
|
42
|
+
end
|
43
|
+
|
44
|
+
def helper(mirah:Compiler)
|
45
|
+
name = "foobar"
|
46
|
+
mirah.quote { `foobar(name)` }
|
47
|
+
end
|
48
|
+
EOF
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/test/test_typer.rb
CHANGED
@@ -14,6 +14,9 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
require 'test/unit'
|
17
|
+
|
18
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
19
|
+
|
17
20
|
require 'mirah'
|
18
21
|
|
19
22
|
class TestTyper < Test::Unit::TestCase
|
@@ -22,49 +25,49 @@ class TestTyper < Test::Unit::TestCase
|
|
22
25
|
def test_fixnum
|
23
26
|
ast = AST.parse("1")
|
24
27
|
|
25
|
-
assert_equal(AST::TypeReference.new("fixnum"), ast.infer(Typer::Simple.new(:bar)))
|
28
|
+
assert_equal(AST::TypeReference.new("fixnum"), ast.infer(Typer::Simple.new(:bar), true))
|
26
29
|
end
|
27
30
|
|
28
31
|
def test_float
|
29
32
|
ast = AST.parse("1.0")
|
30
33
|
|
31
|
-
assert_equal(AST::TypeReference.new("float"), ast.infer(Typer::Simple.new(:bar)))
|
34
|
+
assert_equal(AST::TypeReference.new("float"), ast.infer(Typer::Simple.new(:bar), true))
|
32
35
|
end
|
33
36
|
|
34
37
|
def test_string
|
35
38
|
ast = AST.parse("'foo'")
|
36
39
|
|
37
|
-
assert_equal(AST::TypeReference.new("string"), ast.infer(Typer::Simple.new(:bar)))
|
40
|
+
assert_equal(AST::TypeReference.new("string"), ast.infer(Typer::Simple.new(:bar), true))
|
38
41
|
end
|
39
42
|
|
40
43
|
def test_boolean
|
41
44
|
ast1 = AST.parse("true")
|
42
45
|
ast2 = AST.parse("false")
|
43
46
|
|
44
|
-
assert_equal(AST::TypeReference.new("boolean"), ast1.infer(Typer::Simple.new(:bar)))
|
45
|
-
assert_equal(AST::TypeReference.new("boolean"), ast2.infer(Typer::Simple.new(:bar)))
|
47
|
+
assert_equal(AST::TypeReference.new("boolean"), ast1.infer(Typer::Simple.new(:bar), true))
|
48
|
+
assert_equal(AST::TypeReference.new("boolean"), ast2.infer(Typer::Simple.new(:bar), true))
|
46
49
|
end
|
47
50
|
|
48
51
|
def test_body
|
49
52
|
ast1 = AST.parse("'foo'; 1.0; 1")
|
50
53
|
ast2 = AST.parse("begin; end")
|
51
54
|
|
52
|
-
assert_equal(AST::TypeReference.new("fixnum"), ast1.infer(Typer::Simple.new(:bar)))
|
53
|
-
assert_equal(AST::TypeReference::NullType, ast2.infer(Typer::Simple.new(:bar)))
|
55
|
+
assert_equal(AST::TypeReference.new("fixnum"), ast1.infer(Typer::Simple.new(:bar), true))
|
56
|
+
assert_equal(AST::TypeReference::NullType, ast2.infer(Typer::Simple.new(:bar), true))
|
54
57
|
end
|
55
58
|
|
56
59
|
def test_local
|
57
60
|
ast1 = AST.parse("a = 1; a")
|
58
61
|
typer = Typer::Simple.new :bar
|
59
62
|
|
60
|
-
ast1.infer(typer)
|
63
|
+
ast1.infer(typer, true)
|
61
64
|
|
62
65
|
assert_equal(AST::TypeReference.new("fixnum"), typer.local_type(ast1.static_scope, 'a'))
|
63
66
|
assert_equal(AST::TypeReference.new("fixnum"), ast1.body.children[0].inferred_type)
|
64
67
|
assert_equal(AST::TypeReference.new("fixnum"), ast1.body.children[1].inferred_type)
|
65
68
|
|
66
69
|
ast2 = AST.parse("b = a = 1")
|
67
|
-
ast2.infer(typer)
|
70
|
+
ast2.infer(typer, true)
|
68
71
|
|
69
72
|
assert_equal(AST::TypeReference.new("fixnum"), typer.local_type(ast2.static_scope, 'a'))
|
70
73
|
assert_equal(AST::TypeReference.new("fixnum"), ast2.body.children[0].inferred_type)
|
@@ -75,7 +78,7 @@ class TestTyper < Test::Unit::TestCase
|
|
75
78
|
ast1 = AST.parse("#{def_foo}(a:string); end")
|
76
79
|
typer = Typer::Simple.new :bar
|
77
80
|
|
78
|
-
ast1.infer(typer)
|
81
|
+
ast1.infer(typer, true)
|
79
82
|
|
80
83
|
assert_nothing_raised {typer.resolve(true)}
|
81
84
|
assert_nothing_raised {typer.resolve}
|
@@ -95,7 +98,7 @@ class TestTyper < Test::Unit::TestCase
|
|
95
98
|
ast1 = AST.parse("#{def_foo}(a:string); a; end")
|
96
99
|
typer = Typer::Simple.new :bar
|
97
100
|
|
98
|
-
ast1.infer(typer)
|
101
|
+
ast1.infer(typer, true)
|
99
102
|
|
100
103
|
assert_equal(typer.string_type, typer.method_type(type, 'foo', [typer.string_type]))
|
101
104
|
assert_equal(typer.string_type, typer.local_type(ast1.body[0].static_scope, 'a'))
|
@@ -106,7 +109,7 @@ class TestTyper < Test::Unit::TestCase
|
|
106
109
|
typer = Typer::Simple.new :bar
|
107
110
|
|
108
111
|
assert_raise(Typer::InferenceError) do
|
109
|
-
ast1.infer(typer)
|
112
|
+
ast1.infer(typer, true)
|
110
113
|
typer.resolve(true)
|
111
114
|
end
|
112
115
|
end
|
@@ -119,13 +122,13 @@ class TestTyper < Test::Unit::TestCase
|
|
119
122
|
typer.learn_method_type(typer.fixnum_type, "foo", [typer.fixnum_type], typer.string_type, [])
|
120
123
|
assert_equal(typer.string_type, typer.method_type(typer.fixnum_type, "foo", [typer.fixnum_type]))
|
121
124
|
|
122
|
-
ast.infer(typer)
|
125
|
+
ast.infer(typer, true)
|
123
126
|
|
124
127
|
assert_equal(typer.string_type, ast.inferred_type)
|
125
128
|
|
126
129
|
ast = AST.parse("def bar(a:fixnum, b:string); 1.0; end; def baz; bar(1, 'x'); end")
|
127
130
|
|
128
|
-
ast.infer(typer)
|
131
|
+
ast.infer(typer, true)
|
129
132
|
ast = ast.body
|
130
133
|
|
131
134
|
assert_equal(typer.float_type, typer.method_type(typer.self_type, "bar", [typer.fixnum_type, typer.string_type]))
|
@@ -137,7 +140,7 @@ class TestTyper < Test::Unit::TestCase
|
|
137
140
|
ast = AST.parse("def baz; bar(1, 'x'); end; def bar(a:fixnum, b:string); 1.0; end")
|
138
141
|
typer = Typer::Simple.new("bar")
|
139
142
|
|
140
|
-
ast.infer(typer)
|
143
|
+
ast.infer(typer, true)
|
141
144
|
ast = ast.body
|
142
145
|
|
143
146
|
assert_equal(typer.default_type, typer.method_type(typer.self_type, "baz", []))
|
@@ -157,7 +160,7 @@ class TestTyper < Test::Unit::TestCase
|
|
157
160
|
ast = AST.parse("def baz; bar(1, 1); end; def bar(a:fixnum, b:string); 1.0; end")
|
158
161
|
typer = Typer::Simple.new("bar")
|
159
162
|
|
160
|
-
ast.infer(typer)
|
163
|
+
ast.infer(typer, true)
|
161
164
|
ast = ast.body
|
162
165
|
|
163
166
|
assert_equal(typer.default_type, typer.method_type(typer.self_type, "baz", []))
|
@@ -177,11 +180,12 @@ class TestTyper < Test::Unit::TestCase
|
|
177
180
|
typer = Typer::Simple.new("bar")
|
178
181
|
|
179
182
|
# incompatible body types
|
180
|
-
assert_raise(Typer::InferenceError) {ast.infer(typer)}
|
183
|
+
assert_raise(Typer::InferenceError) {ast.infer(typer, true)}
|
184
|
+
assert_nothing_raised {ast.infer(typer, false)}
|
181
185
|
|
182
186
|
ast = AST.parse("if true; 1.0; else; 2.0; end").body[0]
|
183
187
|
|
184
|
-
assert_nothing_raised {ast.infer(typer); typer.resolve(true)}
|
188
|
+
assert_nothing_raised {ast.infer(typer, true); typer.resolve(true)}
|
185
189
|
|
186
190
|
assert_equal(typer.boolean_type, ast.condition.inferred_type)
|
187
191
|
assert_equal(typer.float_type, ast.body.inferred_type)
|
@@ -189,7 +193,7 @@ class TestTyper < Test::Unit::TestCase
|
|
189
193
|
|
190
194
|
ast = AST.parse("if foo; bar; else; baz; end").body[0]
|
191
195
|
|
192
|
-
assert_nothing_raised {ast.infer(typer)}
|
196
|
+
assert_nothing_raised {ast.infer(typer, true)}
|
193
197
|
|
194
198
|
assert_equal(typer.default_type, ast.condition.inferred_type)
|
195
199
|
assert_equal(typer.default_type, ast.body.inferred_type)
|
@@ -198,10 +202,10 @@ class TestTyper < Test::Unit::TestCase
|
|
198
202
|
# unresolved types for the foo, bar, and baz calls
|
199
203
|
assert_raise(Typer::InferenceError) {typer.resolve(true)}
|
200
204
|
|
201
|
-
ast2 = AST.parse("def foo; 1; end; def bar; 1.0; end")
|
205
|
+
ast2 = AST.parse("def foo; 1; end; def bar; 1.0; end")
|
202
206
|
|
203
|
-
ast2.infer(typer)
|
204
|
-
ast.infer(typer)
|
207
|
+
ast2.infer(typer, true)
|
208
|
+
ast.infer(typer, true)
|
205
209
|
|
206
210
|
# unresolved types for the baz call
|
207
211
|
assert_raise(Typer::InferenceError) {typer.resolve(true)}
|
@@ -214,8 +218,8 @@ class TestTyper < Test::Unit::TestCase
|
|
214
218
|
|
215
219
|
ast2 = AST.parse("def baz; 2.0; end")
|
216
220
|
|
217
|
-
ast2.infer(typer)
|
218
|
-
ast.infer(typer)
|
221
|
+
ast2.infer(typer, true)
|
222
|
+
ast.infer(typer, true)
|
219
223
|
|
220
224
|
assert_nothing_raised {typer.resolve(true)}
|
221
225
|
|
@@ -229,7 +233,7 @@ class TestTyper < Test::Unit::TestCase
|
|
229
233
|
baz = cls.body[1]
|
230
234
|
|
231
235
|
typer = Typer::Simple.new("script")
|
232
|
-
ast.infer(typer)
|
236
|
+
ast.infer(typer, true)
|
233
237
|
|
234
238
|
assert_nothing_raised {typer.resolve(true)}
|
235
239
|
end
|