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.
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