mirah 0.0.12-java → 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
@@ -25,7 +25,7 @@ class EnvTest < Test::Unit::TestCase
25
25
  abc = %w[a b c]
26
26
  assert_equal(abc.join(Mirah::Env.path_separator), Mirah::Env.encode_paths(abc))
27
27
  end
28
-
28
+
29
29
  def test_encode_paths_with_single_element
30
30
  assert_equal('a', Mirah::Env.encode_paths(['a']))
31
31
  end
@@ -38,17 +38,17 @@ class EnvTest < Test::Unit::TestCase
38
38
  paths_to_append = %w[a b c d]
39
39
  encoded_paths = paths_to_append.join Mirah::Env.path_separator
40
40
  path_array = ['1','2']
41
-
41
+
42
42
  assert_equal(['1','2','a','b','c','d'], Mirah::Env.decode_paths(encoded_paths, path_array))
43
43
  assert_equal(['1','2','a','b','c','d'], path_array)
44
44
  end
45
-
45
+
46
46
  def test_decode_paths_with_empty_list
47
47
  assert_equal([], Mirah::Env.decode_paths(''))
48
48
  end
49
-
49
+
50
50
  def test_decode_paths_with_single_element
51
51
  assert_equal(['a'], Mirah::Env.decode_paths('a'))
52
52
  end
53
-
53
+
54
54
  end
@@ -12,15 +12,15 @@
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
- require 'mirah/jvm/typer'
17
- require 'mirah/jvm/source_generator/builder'
18
17
 
19
- module Mirah
20
- module Typer
21
- class JavaSource < JVM
22
- include Mirah::JVM::Types
23
-
24
- end
18
+ class GeneratorTest < Test::Unit::TestCase
19
+ def test_generator_sets_classpath_bootclasspath_on_type_system
20
+
21
+ state = Mirah::Util::CompilationState.new
22
+ state.bootclasspath = "a:b"
23
+ generator = Mirah::Generator.new(state, Mirah::JVM::Compiler::JVMBytecode, false, false)
24
+ assert state.bootclasspath == generator.typer.type_system.bootclasspath
25
25
  end
26
- end
26
+ end
@@ -16,240 +16,278 @@ require 'test_helper'
16
16
 
17
17
  class TyperTest < Test::Unit::TestCase
18
18
  include Mirah
19
+ include Mirah::Util::ProcessErrors
20
+ java_import 'org.mirah.typer.TypeFuture'
21
+ java_import 'org.mirah.typer.simple.SimpleScoper'
22
+ java_import 'org.mirah.typer.simple.SimpleTypes'
23
+ java_import 'mirah.lang.ast.VCall'
24
+ java_import 'mirah.lang.ast.FunctionalCall'
25
+ java_import 'mirah.lang.ast.LocalAccess'
26
+
27
+ module TypeFuture
28
+ def inspect
29
+ toString
30
+ end
31
+ end
19
32
 
20
- def test_fixnum
21
- ast = AST.parse("1")
33
+ def setup
34
+ @scopes = SimpleScoper.new
35
+ new_typer('Bar')
36
+ end
22
37
 
23
- assert_equal(AST::TypeReference.new("fixnum"), ast.infer(Typer::Simple.new(:bar), true))
38
+ def parse(text)
39
+ AST.parse(text, '-', false, @mirah)
24
40
  end
25
41
 
26
- def test_float
27
- ast = AST.parse("1.0")
42
+ def new_typer(n)
43
+ @types = SimpleTypes.new(n.to_s)
44
+ @typer = Mirah::Typer::Typer.new(@types, @scopes, nil)
45
+ @mirah = Transform::Transformer.new(Mirah::Util::CompilationState.new, @typer)
46
+ @typer
47
+ end
28
48
 
29
- assert_equal(AST::TypeReference.new("float"), ast.infer(Typer::Simple.new(:bar), true))
49
+ def inferred_type(node)
50
+ type = @typer.infer(node, false).resolve
51
+ if type.name == ':error'
52
+ catch(:exit) do
53
+ process_errors([type])
54
+ end
55
+ end
56
+ type
57
+ end
58
+
59
+ def assert_no_errors(typer, ast)
60
+ process_inference_errors(typer, [ast]) do |errors|
61
+ errors.each {|e| add_failure(e.message)}
62
+ end
63
+ end
64
+
65
+ def assert_errors_including(message, typer, ast)
66
+ actual_errors = []
67
+ process_inference_errors(typer, [ast]) do |errors|
68
+ actual_errors += errors
69
+ end
70
+ fail("no errors") if actual_errors.empty?
71
+ assert actual_errors.any?{|error| error.message.join("\n").include? message },
72
+ "no errors with message \"#{message}\" in [#{actual_errors}"
73
+ end
74
+
75
+ def infer(ast, expression=true)
76
+ new_typer(:bar).infer(ast, expression)
77
+ inferred_type(ast)
78
+ end
79
+
80
+ def test_fixnum
81
+ ast = parse("1")
82
+ assert_equal(@types.getFixnumType(1), infer(ast))
83
+ end
84
+
85
+ def test_float
86
+ ast = parse("1.0")
87
+ new_typer(:bar).infer(ast, true)
88
+ assert_equal(@types.getFloatType(1.0), infer(ast))
30
89
  end
31
90
 
32
91
  def test_string
33
- ast = AST.parse("'foo'")
92
+ ast = parse("'foo'")
34
93
 
35
- assert_equal(AST::TypeReference.new("string"), ast.infer(Typer::Simple.new(:bar), true))
94
+ assert_equal(@types.getStringType, infer(ast))
36
95
  end
37
96
 
38
97
  def test_boolean
39
- ast1 = AST.parse("true")
40
- ast2 = AST.parse("false")
98
+ ast1 = parse("true")
99
+ ast2 = parse("false")
41
100
 
42
- assert_equal(AST::TypeReference.new("boolean"), ast1.infer(Typer::Simple.new(:bar), true))
43
- assert_equal(AST::TypeReference.new("boolean"), ast2.infer(Typer::Simple.new(:bar), true))
101
+ assert_equal(@types.getBooleanType, infer(ast1))
102
+ assert_equal(@types.getBooleanType, infer(ast2))
44
103
  end
45
104
 
46
105
  def test_body
47
- ast1 = AST.parse("'foo'; 1.0; 1")
48
- ast2 = AST.parse("begin; end")
106
+ ast1 = parse("'foo'; 1.0; 1")
107
+ ast2 = parse("begin; end")
49
108
 
50
- assert_equal(AST::TypeReference.new("fixnum"), ast1.infer(Typer::Simple.new(:bar), true))
51
- assert_equal(AST::TypeReference::NullType, ast2.infer(Typer::Simple.new(:bar), true))
109
+ assert_equal(@types.getFixnumType(1), infer(ast1))
110
+ assert_equal(@types.getNullType, infer(ast2))
52
111
  end
53
112
 
54
113
  def test_local
55
- ast1 = AST.parse("a = 1; a")
56
- typer = Typer::Simple.new :bar
114
+ ast1 = parse("a = 1; a")
115
+ infer(ast1)
57
116
 
58
- ast1.infer(typer, true)
117
+ assert_equal(@types.getFixnumType(1), @types.getLocalType(@scopes.getScope(ast1), 'a', nil).resolve)
118
+ assert_equal(@types.getFixnumType(1), inferred_type(ast1.body.get(0)))
119
+ assert_equal(@types.getFixnumType(1), inferred_type(ast1.body.get(1)))
59
120
 
60
- assert_equal(AST::TypeReference.new("fixnum"), typer.local_type(ast1.static_scope, 'a'))
61
- assert_equal(AST::TypeReference.new("fixnum"), ast1.body.children[0].inferred_type)
62
- assert_equal(AST::TypeReference.new("fixnum"), ast1.body.children[1].inferred_type)
121
+ ast2 = parse("b = a = 1")
122
+ infer(ast2)
63
123
 
64
- ast2 = AST.parse("b = a = 1")
65
- ast2.infer(typer, true)
66
-
67
- assert_equal(AST::TypeReference.new("fixnum"), typer.local_type(ast2.static_scope, 'a'))
68
- assert_equal(AST::TypeReference.new("fixnum"), ast2.body.children[0].inferred_type)
124
+ assert_equal(@types.getFixnumType(1), @types.getLocalType(@scopes.getScope(ast2), 'a', nil).resolve)
125
+ assert_equal(@types.getFixnumType(1), inferred_type(ast2.body.get(0)))
69
126
  end
70
127
 
71
128
  def test_signature
72
- ["def foo", "def self.foo"].each do |def_foo|
73
- ast1 = AST.parse("#{def_foo}(a:string); end")
74
- typer = Typer::Simple.new :bar
75
-
76
- ast1.infer(typer, true)
129
+ signature_test(false)
130
+ end
77
131
 
78
- assert_nothing_raised {typer.resolve(true)}
79
- assert_nothing_raised {typer.resolve}
132
+ def test_static_signature
133
+ signature_test(true)
134
+ end
80
135
 
136
+ def signature_test(is_static)
137
+ if is_static
138
+ def_foo = "def self.foo"
139
+ else
140
+ def_foo = "def foo"
141
+ end
142
+ ast1 = parse("#{def_foo}(a:String); end")
143
+ typer = new_typer(:bar)
144
+ typer.infer(ast1, true)
81
145
 
82
- if def_foo =~ /self/
83
- type = typer.self_type.meta
84
- else
85
- type = typer.self_type
86
- end
146
+ assert_no_errors(typer, ast1)
87
147
 
88
- assert_equal(typer.null_type, typer.method_type(type, 'foo', [typer.string_type]))
89
- assert_equal(typer.string_type, typer.local_type(ast1.body[0].static_scope, 'a'))
90
- assert_equal(typer.null_type, ast1.body.inferred_type)
91
- assert_equal(typer.string_type, ast1.body[0].arguments.args[0].inferred_type)
92
148
 
93
- ast1 = AST.parse("#{def_foo}(a:string); a; end")
94
- typer = Typer::Simple.new :bar
149
+ type = @types.getMainType(@scopes.getScope(ast1), ast1)
150
+ type = @types.getMetaType(type) if is_static
95
151
 
96
- ast1.infer(typer, true)
152
+ mdef = ast1.body.get(0)
153
+ inner_scope = @scopes.getScope(mdef.body)
97
154
 
98
- assert_equal(typer.string_type, typer.method_type(type, 'foo', [typer.string_type]))
99
- assert_equal(typer.string_type, typer.local_type(ast1.body[0].static_scope, 'a'))
100
- assert_equal(typer.string_type, ast1.body[0].inferred_type)
101
- assert_equal(typer.string_type, ast1.body[0].arguments.args[0].inferred_type)
155
+ # assert_equal(@types.getNullType, @types.getMethodType(type, 'foo', [@types.getStringType.resolve]).resolve)
156
+ assert_equal(@types.getStringType, @types.getLocalType(inner_scope, 'a', nil).resolve)
157
+ assert_equal(@types.getNullType, inferred_type(mdef).returnType)
158
+ assert_equal(@types.getStringType, inferred_type(mdef.arguments.required.get(0)))
102
159
 
103
- ast1 = AST.parse("#{def_foo}(a) returns :string; end")
104
- typer = Typer::Simple.new :bar
160
+ ast1 = parse("#{def_foo}(a:String); a; end")
161
+ typer = new_typer :bar
162
+ typer.infer(ast1, true)
163
+ mdef = ast1.body.get(0)
164
+ inner_scope = @scopes.getScope(mdef.body)
105
165
 
106
- assert_raise(Typer::InferenceError) do
107
- ast1.infer(typer, true)
108
- typer.resolve(true)
109
- end
110
- end
166
+ # assert_equal(@types.getStringType, @types.getMethodType(type, 'foo', [@types.getStringType.resolve]).resolve)
167
+ assert_equal(@types.getStringType, @types.getLocalType(inner_scope, 'a', nil).resolve)
168
+ assert_equal(@types.getStringType, inferred_type(mdef).returnType)
169
+ assert_equal(@types.getStringType, inferred_type(mdef.arguments.required.get(0)))
111
170
  end
112
171
 
113
172
  def test_call
114
- ast = AST.parse("1.foo(2)").body
115
- typer = Typer::Simple.new "bar"
116
-
117
- typer.learn_method_type(typer.fixnum_type, "foo", [typer.fixnum_type], typer.string_type, [])
118
- assert_equal(typer.string_type, typer.method_type(typer.fixnum_type, "foo", [typer.fixnum_type]))
119
-
120
- ast.infer(typer, true)
173
+ ast = parse("class Int;def foo(a:Int):String; end; end; 1.foo(2)")
121
174
 
122
- assert_equal(typer.string_type, ast.inferred_type)
175
+ assert_equal(@types.getStringType, infer(ast))
123
176
 
124
- ast = AST.parse("def bar(a:fixnum, b:string); 1.0; end; def baz; bar(1, 'x'); end")
177
+ ast = parse("def bar(a:Int, b:String); 1.0; end; def baz; bar(1, 'x'); end")
125
178
 
126
- ast.infer(typer, true)
179
+ infer(ast)
127
180
  ast = ast.body
128
-
129
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "bar", [typer.fixnum_type, typer.string_type]))
130
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "baz", []))
131
- assert_equal(typer.float_type, ast.children[0].inferred_type)
132
- assert_equal(typer.float_type, ast.children[1].inferred_type)
181
+ self_type = @scopes.getScope(ast.get(0)).selfType
182
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(0)).returnType)
183
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(1)).returnType)
133
184
 
134
185
  # Reverse the order, ensure deferred inference succeeds
135
- ast = AST.parse("def baz; bar(1, 'x'); end; def bar(a:fixnum, b:string); 1.0; end")
136
- typer = Typer::Simple.new("bar")
186
+ ast = parse("def baz; bar(1, 'x'); end; def bar(a:Int, b:String); 1.0; end")
187
+ typer = new_typer("bar")
137
188
 
138
- ast.infer(typer, true)
189
+ typer.infer(ast, true)
139
190
  ast = ast.body
140
191
 
141
- assert_equal(typer.default_type, typer.method_type(typer.self_type, "baz", []))
142
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "bar", [typer.fixnum_type, typer.string_type]))
143
- assert_equal(typer.default_type, ast.children[0].inferred_type)
144
- assert_equal(typer.float_type, ast.children[1].inferred_type)
145
-
146
- # allow resolution to run
147
- assert_nothing_raised {typer.resolve}
192
+ assert_no_errors(typer, ast)
148
193
 
149
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "baz", []))
150
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "bar", [typer.fixnum_type, typer.string_type]))
151
- assert_equal(typer.float_type, ast.children[0].inferred_type)
152
- assert_equal(typer.float_type, ast.children[1].inferred_type)
194
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(0)).returnType)
195
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(1)).returnType)
153
196
 
154
197
  # modify bar call to have bogus types, ensure resolution fails
155
- ast = AST.parse("def baz; bar(1, 1); end; def bar(a:fixnum, b:string); 1.0; end")
156
- typer = Typer::Simple.new("bar")
198
+ ast = parse("def baz; bar(1, 1); end; def bar(a:Int, b:String); 1.0; end")
199
+ typer = new_typer("bar")
157
200
 
158
- ast.infer(typer, true)
201
+ typer.infer(ast, true)
159
202
  ast = ast.body
160
203
 
161
- assert_equal(typer.default_type, typer.method_type(typer.self_type, "baz", []))
162
- assert_equal(typer.float_type, typer.method_type(typer.self_type, "bar", [typer.fixnum_type, typer.string_type]))
163
- assert_equal(typer.default_type, ast.children[0].inferred_type)
164
- assert_equal(typer.float_type, ast.children[1].inferred_type)
165
-
166
- # allow resolution to run and produce error
167
- assert_raise(Typer::InferenceError) {typer.resolve(true)}
168
- error_nodes = typer.errors.map {|e| e.node}
169
- inspected = "[FunctionalCall(bar)\n Fixnum(1)\n Fixnum(1)]"
170
- assert_equal(inspected, error_nodes.inspect)
204
+ assert_equal(":error", inferred_type(ast.get(0)).name)
205
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.get(1)).returnType)
171
206
  end
172
207
 
173
208
  def test_if
174
- ast = AST.parse("if true; 1.0; else; ''; end").body[0]
175
- typer = Typer::Simple.new("bar")
209
+ ast = parse("if true; 1.0; else; ''; end").body
176
210
 
177
211
  # incompatible body types
178
- assert_raise(Typer::InferenceError) {ast.infer(typer, true)}
179
- assert_nothing_raised {ast.infer(typer, false)}
212
+ assert_equal(':error', infer(ast).name)
180
213
 
181
- ast = AST.parse("if true; 1.0; else; 2.0; end").body[0]
214
+ ast = parse("if true; 1.0; else; 2.0; end").body.get(0)
182
215
 
183
- assert_nothing_raised {ast.infer(typer, true); typer.resolve(true)}
216
+ assert_not_equal(':error', infer(ast).name)
184
217
 
185
- assert_equal(typer.boolean_type, ast.condition.inferred_type)
186
- assert_equal(typer.float_type, ast.body.inferred_type)
187
- assert_equal(typer.float_type, ast.else.inferred_type)
218
+ assert_equal(@types.getBooleanType, inferred_type(ast.condition))
219
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.body))
220
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.elseBody))
188
221
 
189
- ast = AST.parse("if foo; bar; else; baz; end").body[0]
222
+ typer = new_typer(:Bar)
190
223
 
191
- assert_nothing_raised {ast.infer(typer, true)}
224
+ ast = parse("if foo; bar; else; baz; end").body.get(0)
225
+ typer.infer(ast.parent.parent, true)
226
+ assert_equal(':error', inferred_type(ast).name)
192
227
 
193
- assert_equal(typer.default_type, ast.condition.inferred_type)
194
- assert_equal(typer.default_type, ast.body.inferred_type)
195
- assert_equal(typer.default_type, ast.else.inferred_type)
228
+ ast2 = parse("def foo; 1; end; def bar; 1.0; end")
196
229
 
197
- # unresolved types for the foo, bar, and baz calls
198
- assert_raise(Typer::InferenceError) {typer.resolve(true)}
230
+ typer.infer(ast2, true)
199
231
 
200
- ast2 = AST.parse("def foo; 1; end; def bar; 1.0; end")
232
+ # unresolved types for the baz call
233
+ assert_equal(':error', inferred_type(ast.elseBody).name)
201
234
 
202
- ast2.infer(typer, true)
203
- ast.infer(typer, true)
235
+ assert_equal(@types.getFixnumType(1), inferred_type(ast.condition))
236
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.body))
204
237
 
205
- # unresolved types for the baz call
206
- assert_raise(Typer::InferenceError) {typer.resolve(true)}
207
-
208
- # the condition isn't a boolean
209
- assert_equal(AST.error_type, ast.condition.inferred_type)
210
-
211
- # TODO this portion of the test no longer works
212
- #
213
- ## the body types are errors because the types don't match
214
- #assert_equal(AST.error_type, ast.body.inferred_type)
215
- #assert_equal(AST.error_type, ast.else.inferred_type)
216
-
217
- #typer.errors.clear
218
- ## replacing baz w/ one that has a compatible type
219
- #ast2 = AST.parse("def baz; 2.0; end")
220
- #
221
- #ast2.infer(typer, true)
222
- #ast.infer(typer, true)
223
- #
224
- #assert_nothing_raised {typer.resolve(true)}
225
- #
226
- #assert_equal(typer.float_type, ast2.body[0].inferred_type)
227
- end
228
-
229
- def test_rescue_w_different_type_raises_inference_error_when_expression
230
- ast = AST.parse("begin true; 1.0; rescue; ''; end").body[0]
231
- typer = Typer::Simple.new("bar")
238
+ ast2 = parse("def baz; 2.0; end")
239
+ typer.infer(ast2, true)
232
240
 
233
- assert_raise(Mirah::InferenceError) {ast.infer(typer, true)}
241
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast2.body).returnType)
242
+
243
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast))
244
+ assert_equal(@types.getFloatType(1.0), inferred_type(ast.elseBody))
234
245
  end
235
246
 
236
- def test_rescue_w_different_type_doesnt_raise_inference_error_when_statement
237
- ast = AST.parse("begin true; 1.0; rescue; ''; end").body[0]
238
- typer = Typer::Simple.new("bar")
247
+ def test_class
248
+ ast = parse("class Foo; def foo; 1; end; def baz; foo; end; end")
249
+ cls = ast.body.get(0)
250
+ foo = cls.body.get(0)
251
+ baz = cls.body.get(1)
252
+
253
+ typer = new_typer("script")
254
+ typer.infer(ast, true)
255
+
256
+ assert_no_errors(typer, ast)
257
+ end
239
258
 
240
- assert_nothing_raised {ast.infer(typer, false)}
259
+ def test_rescue_w_different_type_raises_inference_error_when_expression
260
+ ast = parse("1 + begin true; 1.0; rescue; ''; end")
261
+ infer(ast, true)
262
+ assert_errors_including "Incompatible types", @typer, ast
241
263
  end
242
264
 
265
+ def test_rescue_w_different_type_doesnt_raise_inference_error_when_statement
266
+ ast = parse("begin true; 1.0; rescue; ''; end")
267
+ infer(ast, false)
268
+ assert_no_errors @typer, ast
269
+ end
243
270
 
244
- def test_class
245
- ast = AST.parse("class Foo; def foo; 1; end; def baz; foo; end; end")
246
- cls = ast.body[0]
247
- foo = cls.body[0]
248
- baz = cls.body[1]
271
+ def test_colon2
272
+ ast = parse("java::lang::System.out")
273
+ infer(ast)
274
+ target_type = inferred_type(ast.body(0).target)
275
+ assert_equal('java.lang.System', target_type.name)
276
+ end
249
277
 
250
- typer = Typer::Simple.new("script")
251
- ast.infer(typer, true)
278
+ def test_static_method
279
+ ast = parse("class Foo; def self.bar;1; end; end; Foo.bar")
280
+ assert_equal(@types.getFixnumType(1), infer(ast))
281
+ end
252
282
 
253
- assert_nothing_raised {typer.resolve(true)}
283
+ def test_vcall
284
+ ast = parse("foo = 1; def squeak; nil; end; foo; squeak")
285
+ assert_kind_of(VCall, ast.body(2))
286
+ assert_kind_of(VCall, ast.body(3))
287
+ infer(ast)
288
+ assert_equal(@types.getFixnumType(1), inferred_type(ast.body(2)))
289
+ assert_equal(@types.getNullType, inferred_type(ast.body(3)))
290
+ assert_kind_of(LocalAccess, ast.body(2))
291
+ assert_kind_of(FunctionalCall, ast.body(3))
254
292
  end
255
293
  end