mirah 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +225 -0
  3. data/Rakefile +108 -315
  4. data/TODO.md +100 -0
  5. data/bin/bundler +16 -0
  6. data/bin/rake +16 -0
  7. data/dist/mirahc.jar +0 -0
  8. data/examples/appengine/Readme +0 -1
  9. data/examples/literals.mirah +17 -0
  10. data/examples/macros/string_each_char.mirah +1 -1
  11. data/lib/mirah.rb +11 -21
  12. data/lib/mirah/transform/transformer.rb +1 -2
  13. data/lib/mirah/util/class_loader.rb +1 -1
  14. data/lib/mirah/util/logging.rb +0 -63
  15. data/lib/mirah/util/process_errors.rb +1 -0
  16. data/lib/mirah/version.rb +1 -1
  17. data/{examples/simple_class.mirah~ → test/artifacts/jar_test.rb} +7 -11
  18. data/{lib/mirah/commands.rb → test/artifacts/jruby_test.rb} +8 -5
  19. data/test/core/typer_test.rb +29 -11
  20. data/test/core/util/argument_processor_test.rb +24 -23
  21. data/test/core/util/class_loader_test.rb +7 -4
  22. data/test/core/util/{compilation_state_test.rb → jvm_version_test.rb} +20 -16
  23. data/test/fixtures/org/foo/ImplicitClassRetAnno.java +4 -0
  24. data/test/fixtures/org/foo/IntAnno.java +9 -0
  25. data/test/jvm/annotations_test.rb +11 -11
  26. data/test/jvm/blocks_test.rb +16 -12
  27. data/test/jvm/constructors_test.rb +8 -8
  28. data/test/jvm/enumerable_test.rb +48 -24
  29. data/test/jvm/generics_test.rb +3 -7
  30. data/test/jvm/import_test.rb +14 -0
  31. data/test/jvm/interface_test.rb +9 -24
  32. data/test/jvm/jvm_commands_test.rb +22 -4
  33. data/test/jvm/jvm_compiler_test.rb +124 -79
  34. data/test/jvm/list_extensions_test.rb +1 -1
  35. data/test/jvm/macros_test.rb +67 -14
  36. data/test/jvm/main_method_test.rb +1 -1
  37. data/test/jvm/new_backend_test_helper.rb +100 -3
  38. data/{lib/mirah/jvm/types/bitescript_ext.rb → test/jvm/static_fields_test.rb} +22 -21
  39. data/test/mirrors/base_type_test.rb +4 -3
  40. data/test/mirrors/bytecode_mirror_test.rb +35 -15
  41. data/test/mirrors/generics_test.rb +14 -5
  42. data/test/mirrors/member_test.rb +2 -1
  43. data/test/mirrors/method_lookup_test.rb +18 -6
  44. data/test/mirrors/mirrors_test.rb +87 -20
  45. data/test/mirrors/simple_async_mirror_loader_test.rb +7 -3
  46. data/test/mirrors/simple_mirror_loader_test.rb +5 -5
  47. data/test/test_helper.rb +25 -1
  48. metadata +18 -78
  49. data/bin/mirahp +0 -27
  50. data/bin/mirahp.cmd +0 -16
  51. data/examples/Fib.class +0 -0
  52. data/javalib/mirah-bootstrap.jar +0 -0
  53. data/javalib/mirah-builtins.jar +0 -0
  54. data/javalib/mirah-compiler.jar +0 -0
  55. data/javalib/mirah-mirrors.jar +0 -0
  56. data/javalib/mirah-newast-transitional.jar +0 -0
  57. data/javalib/mirah-parser.jar +0 -0
  58. data/javalib/mirah-util.jar +0 -0
  59. data/lib/mirah/ast.rb +0 -43
  60. data/lib/mirah/ast/scope.rb +0 -262
  61. data/lib/mirah/commands/base.rb +0 -59
  62. data/lib/mirah/commands/compile.rb +0 -39
  63. data/lib/mirah/commands/parse.rb +0 -36
  64. data/lib/mirah/commands/run.rb +0 -78
  65. data/lib/mirah/generator.rb +0 -150
  66. data/lib/mirah/jvm/compiler.rb +0 -50
  67. data/lib/mirah/jvm/compiler/base.rb +0 -421
  68. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +0 -1194
  69. data/lib/mirah/jvm/method_lookup.rb +0 -307
  70. data/lib/mirah/jvm/types.rb +0 -45
  71. data/lib/mirah/jvm/types/array_type.rb +0 -60
  72. data/lib/mirah/jvm/types/ast_ext.rb +0 -31
  73. data/lib/mirah/jvm/types/basic_types.rb +0 -41
  74. data/lib/mirah/jvm/types/block_type.rb +0 -15
  75. data/lib/mirah/jvm/types/boolean.rb +0 -70
  76. data/lib/mirah/jvm/types/enumerable.rb +0 -80
  77. data/lib/mirah/jvm/types/extensions.rb +0 -110
  78. data/lib/mirah/jvm/types/factory.rb +0 -830
  79. data/lib/mirah/jvm/types/floats.rb +0 -99
  80. data/lib/mirah/jvm/types/generic_type.rb +0 -72
  81. data/lib/mirah/jvm/types/implicit_nil_type.rb +0 -29
  82. data/lib/mirah/jvm/types/integers.rb +0 -131
  83. data/lib/mirah/jvm/types/interface_definition.rb +0 -20
  84. data/lib/mirah/jvm/types/intrinsics.rb +0 -385
  85. data/lib/mirah/jvm/types/literals.rb +0 -89
  86. data/lib/mirah/jvm/types/meta_type.rb +0 -54
  87. data/lib/mirah/jvm/types/methods.rb +0 -946
  88. data/lib/mirah/jvm/types/null_type.rb +0 -39
  89. data/lib/mirah/jvm/types/number.rb +0 -184
  90. data/lib/mirah/jvm/types/primitive_type.rb +0 -76
  91. data/lib/mirah/jvm/types/source_mirror.rb +0 -274
  92. data/lib/mirah/jvm/types/type.rb +0 -311
  93. data/lib/mirah/jvm/types/type_definition.rb +0 -72
  94. data/lib/mirah/jvm/types/void_type.rb +0 -19
  95. data/lib/mirah/util/compilation_state.rb +0 -60
  96. data/test/core/commands_test.rb +0 -89
  97. data/test/core/generator_test.rb +0 -26
  98. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  99. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  100. data/test/jvm/bytecode_test_helper.rb +0 -193
  101. data/test/jvm/factory_test.rb +0 -28
  102. data/test/jvm/java_typer_test.rb +0 -283
@@ -1,89 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- require 'test_helper'
16
-
17
-
18
- class CommandsTest < Test::Unit::TestCase
19
- class RaisesMirahErrorCommand < Mirah::Commands::Base
20
- def execute
21
- execute_base { raise Mirah::MirahError, "just an error" }
22
- end
23
- def command_name; :foo; end
24
- end
25
-
26
- class MirahProcessesErrorCommand < Mirah::Commands::Base
27
- include Mirah::Util::ProcessErrors
28
- def execute
29
- execute_base { process_errors [Mirah::NodeError.new("just an error")] }
30
- end
31
- def command_name; :foo; end
32
- end
33
-
34
- class SuccessfulCommand < Mirah::Commands::Base
35
- def execute
36
- execute_base { "something" }
37
- end
38
- def command_name; :foo; end
39
- end
40
-
41
- def test_on_Mirah_error_has_non_zero_exit_code
42
- assert_non_zero_exit do
43
- RaisesMirahErrorCommand.new([]).execute
44
- end
45
- end
46
-
47
- def test_on_bad_argument_has_non_zero_exit_code
48
- assert_non_zero_exit do
49
- RaisesMirahErrorCommand.new(['-bad-argument']).execute
50
- end
51
- end
52
-
53
- def test_on_v_with_no_args_exits_without_running_command
54
- assert_zero_exit do
55
- RaisesMirahErrorCommand.new(['-v']).execute
56
- end
57
- end
58
-
59
- def test_on_j_option_when_command_is_not_compile_has_non_zero_exit_code
60
- assert_non_zero_exit do
61
- RaisesMirahErrorCommand.new(['-j']).execute
62
- end
63
- end
64
-
65
- def test_success_is_truthy
66
- assert SuccessfulCommand.new([]).execute, "expected it to be truthy"
67
- end
68
-
69
- def test_process_errors_causes_a_non_zero_exit
70
- assert_non_zero_exit do
71
- MirahProcessesErrorCommand.new([]).execute
72
- end
73
- end
74
-
75
- def assert_non_zero_exit
76
- ex = assert_raise SystemExit do
77
- yield
78
- end
79
- assert_not_equal 0, ex.status
80
- end
81
-
82
- def assert_zero_exit
83
- ex = assert_raise SystemExit do
84
- yield
85
- end
86
- assert_equal 0, ex.status
87
- end
88
-
89
- end
@@ -1,26 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- require 'test_helper'
16
-
17
-
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
- end
26
- end
@@ -1,193 +0,0 @@
1
- # Copyright (c) 2010-2013 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- require 'test_helper'
16
- require 'set'
17
-
18
- module JVMCompiler
19
- $CLASSPATH << TEST_DEST
20
-
21
- java_import 'java.lang.System'
22
- java_import 'java.io.PrintStream'
23
- java_import 'java.net.URLClassLoader'
24
- java_import 'org.jruby.javasupport.JavaClass'
25
-
26
- include Mirah
27
-
28
- def new_state
29
- state = Mirah::Util::CompilationState.new
30
- state.save_extensions = true
31
- state.destination = TEST_DEST
32
- state.classpath = Env.encode_paths [TEST_DEST, FIXTURE_TEST_DEST]
33
- state.type_system = type_system if type_system
34
- state
35
- end
36
-
37
- def type_system
38
- nil
39
- end
40
-
41
- def clean_tmp_files
42
- return unless @tmp_classes
43
- File.unlink(*@tmp_classes)
44
- end
45
-
46
- def compiler_type
47
- JVM::Compiler::JVMBytecode
48
- end
49
-
50
- def compiler_name
51
- "original"
52
- end
53
-
54
- def parse name, code, transformer
55
- AST.parse(code, name, true, transformer)
56
- end
57
-
58
- def infer_and_resolve_types ast, generator
59
- scoper, typer = generator.infer_asts(ast, true)
60
- ast
61
- end
62
-
63
- def parse_and_resolve_types name, code
64
- state = new_state
65
-
66
- generator = Mirah::Generator.new(state, compiler_type, false, false)
67
- transformer = Mirah::Transform::Transformer.new(state, generator.typer)
68
-
69
- ast = [AST.parse(code, name, true, transformer)]
70
-
71
- infer_and_resolve_types ast, generator
72
-
73
- ast
74
- end
75
-
76
- def generate_classes compiler_results, state
77
- classes = {}
78
-
79
- compiler_results.each do |result|
80
- bytes = result.bytes
81
- filename = "#{TEST_DEST}#{result.filename}"
82
- FileUtils.mkdir_p(File.dirname(filename))
83
- File.open(filename, 'wb') { |f| f.write(bytes) }
84
- @tmp_classes << filename
85
- classes[result.filename[0..-7]] = Mirah::Util::ClassLoader.binary_string bytes
86
- end
87
-
88
- loader = Mirah::Util::ClassLoader.new(
89
- URLClassLoader.new(
90
- Mirah::Env.make_urls(state.classpath),
91
- JRuby.runtime.jruby_class_loader),
92
- classes)
93
-
94
- classes.keys.map do |name|
95
- cls = loader.load_class(name.tr('/', '.'))
96
- JavaUtilities.get_proxy_class(JavaClass.get(JRuby.runtime, cls))
97
- end
98
- end
99
-
100
- def compile(code, options = {})
101
- name = options.delete :name
102
- name ||= tmp_script_name
103
-
104
- state = new_state
105
- java_version = options.delete :java_version
106
- if java_version
107
- state.set_jvm_version java_version
108
- end
109
-
110
- generator = Mirah::Generator.new(state, compiler_type, false, false)
111
- transformer = Mirah::Transform::Transformer.new(state, generator.typer)
112
-
113
- ast = [AST.parse_ruby(nil, code, name)]
114
-
115
- scoper, typer = generator.infer_asts(ast, true)
116
- generator.do_transforms ast
117
- compiler_results = generator.compiler.compile_asts(ast, scoper, typer)
118
-
119
- generate_classes compiler_results, state
120
- end
121
-
122
- def tmp_script_name
123
- "script#{name.gsub(/\)|\(/,'_').capitalize}#{System.nano_time}"
124
- end
125
- end
126
-
127
-
128
- module CommonAssertions
129
- java_import 'java.lang.System'
130
- java_import 'java.io.PrintStream'
131
-
132
- def assert_include(value, array, message=nil)
133
- message = build_message message, '<?> does not include <?>', array, value
134
- assert_block message do
135
- array.include? value
136
- end
137
- end
138
-
139
- def capture_output
140
- saved_output = System.out
141
- output = StringIO.new
142
- System.setOut(PrintStream.new(output.to_outputstream))
143
- begin
144
- yield
145
- output.rewind
146
- output.read
147
- ensure
148
- System.setOut(saved_output)
149
- end
150
- end
151
-
152
- def assert_output(expected, &block)
153
- assert_equal(expected, capture_output(&block))
154
- end
155
-
156
- def assert_raise_java(type, message=nil)
157
- begin
158
- yield
159
- rescue Exception => e
160
- ex = e
161
- end
162
- ex = ex.cause if ex.is_a? NativeException
163
- assert_equal type, ex.class
164
- if message
165
- assert_equal message,
166
- ex.message.to_s,
167
- "expected error message to be '#{message}' but was '#{ex.message}'"
168
- end
169
- ex
170
- end
171
- end
172
-
173
- module DebuggingHelp
174
- def with_finest_logging
175
- Mirah::Logging::MirahLogger.level = Mirah::Logging::Level::FINEST
176
- yield
177
- ensure
178
- Mirah::Logging::MirahLogger.level = Mirah::Logging::Level::INFO
179
- end
180
- end
181
-
182
- class Test::Unit::TestCase
183
- include JVMCompiler
184
- include DebuggingHelp
185
-
186
- def setup
187
- @tmp_classes = Set.new
188
- end
189
-
190
- def cleanup
191
- clean_tmp_files
192
- end
193
- end
@@ -1,28 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- class FactoryTest < Test::Unit::TestCase
17
- def test_bootclass_loader_can_find_things_on_bootclasspath
18
- factory = Mirah::JVM::Types::TypeFactory.new
19
- factory.bootclasspath = File.expand_path("#{__FILE__}/../../fixtures/") +"/"
20
- assert factory.bootstrap_loader.get_resource 'org/foo/A.class'
21
- end
22
-
23
- def test_nil_classpath_is_ok
24
- factory = Mirah::JVM::Types::TypeFactory.new
25
- factory.classpath = nil
26
- end
27
-
28
- end
@@ -1,283 +0,0 @@
1
- # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
- # All contributing project authors may be found in the NOTICE file.
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
-
16
- require 'test/unit'
17
- require 'mirah'
18
-
19
- class JavaTyperTest < Test::Unit::TestCase
20
- include Mirah
21
- include Mirah::Util::ProcessErrors
22
-
23
- java_import 'org.mirah.typer.simple.SimpleScoper'
24
- java_import 'org.mirah.typer.BaseTypeFuture'
25
- java_import 'org.mirah.typer.CallFuture'
26
- java_import 'org.mirah.typer.TypeFuture'
27
-
28
- def setup
29
- @types = Mirah::JVM::Types::TypeFactory.new
30
- @scopes = SimpleScoper.new {|scoper, node| Mirah::AST::StaticScope.new(node, scoper)}
31
- @typer = Mirah::Typer::Typer.new(@types, @scopes, nil, nil)
32
- @mirah = Mirah::Transform::Transformer.new(Mirah::Util::CompilationState.new, @typer)
33
- end
34
-
35
- def inferred_type(node, expression=false)
36
- if node.kind_of? Java::MirahLangAst::Script
37
- node = node.body
38
- end
39
- type = @typer.infer(node, expression).resolve
40
- if type.name == ':error'
41
- catch(:exit) do
42
- process_errors([type])
43
- end
44
- end
45
- type
46
- end
47
-
48
- def assert_errors_including(message, ast)
49
- @typer.infer(ast, false)
50
- actual_errors = []
51
- process_inference_errors(@typer, [ast]) do |errors|
52
- actual_errors += errors.map {|e| e.message.map{|m| m[0]}.join("\n")}
53
- end
54
- fail("no errors") if actual_errors.empty?
55
- assert actual_errors.any?{|error| error =~ message },
56
- "no errors with message \"#{message}\" in #{actual_errors}"
57
- end
58
-
59
- def method_type(target, name, args)
60
- target = @types.cache_and_wrap(target)
61
- args = args.map {|arg| @types.cache_and_wrap(arg) }
62
- call = CallFuture.new(@types, nil, target, true, name, args, nil, nil)
63
- @types.getMethodType(call).return_type
64
- end
65
-
66
- def parse(text)
67
- AST.parse(text, '-', false, @mirah)
68
- end
69
-
70
- def test_simple_overtyped_meta_method
71
- string_meta = @types.type(nil, 'java.lang.String', false, true)
72
- string = @types.type(nil, 'java.lang.String')
73
-
74
- # integral types
75
- ['boolean', 'char', 'double', 'float', 'int', 'long'].each do |type_name|
76
- type = @types.type(nil, type_name)
77
- return_type = method_type(string_meta, 'valueOf', [type])
78
- assert_equal(string, return_type.resolve, "valueOf(#{type}) should return #{string}")
79
- end
80
-
81
- # char[]
82
- type = @types.type(nil, 'char', true)
83
- return_type = method_type(string_meta, 'valueOf', [type])
84
- assert_equal(string, return_type.resolve)
85
-
86
- # Object
87
- type = @types.type(nil, 'java.lang.Object')
88
- return_type = method_type(string_meta, 'valueOf', [type])
89
- assert_equal(string, return_type.resolve)
90
- end
91
-
92
- def test_non_overtyped_method
93
- string = @types.type(nil, 'java.lang.String')
94
-
95
- int = @types.type(nil, 'int')
96
- return_type = method_type(string, 'length', [])
97
- assert_equal(int, return_type.resolve)
98
-
99
- byte_array = @types.type(nil, 'byte', true)
100
- return_type = method_type(string, 'getBytes', [])
101
- assert_equal(byte_array, return_type.resolve)
102
- end
103
-
104
- def test_simple_overtyped_method
105
- string_meta = @types.type(nil, 'java.lang.String', false, true)
106
- string = @types.type(nil, 'java.lang.String')
107
-
108
- return_type = method_type(string_meta, 'valueOf', [string])
109
- assert_equal(string, return_type.resolve)
110
- end
111
-
112
- def test_primitive_conversion_method
113
- string = @types.type(nil, 'java.lang.String')
114
- byte = @types.type(nil, 'byte')
115
- char = @types.type(nil, 'char')
116
- long = @types.type(nil, 'long')
117
-
118
- return_type = method_type(string, 'charAt', [byte])
119
- assert_kind_of(TypeFuture, return_type)
120
- assert_equal(char, return_type.resolve)
121
-
122
- return_type = method_type(string, 'charAt', [long]).resolve
123
- assert(return_type.isError)
124
- end
125
-
126
- include Mirah::JVM::MethodLookup
127
-
128
- def test_is_more_specific
129
- object = @types.type(nil, 'java.lang.Object')
130
- charseq = @types.type(nil, 'java.lang.CharSequence')
131
- string = @types.type(nil, 'java.lang.String')
132
-
133
- assert object.is_more_specific?([string], [object])
134
- assert object.is_more_specific?([charseq], [object])
135
- assert object.is_more_specific?([string], [charseq])
136
- end
137
-
138
- def test_primitive_convertible
139
- boolean = @types.type(nil, 'boolean')
140
- byte = @types.type(nil, 'byte')
141
- short = @types.type(nil, 'short')
142
- char = @types.type(nil, 'char')
143
- int = @types.type(nil, 'int')
144
- long = @types.type(nil, 'long')
145
- float = @types.type(nil, 'float')
146
- double = @types.type(nil, 'double')
147
-
148
- assert !primitive_convertible?(boolean, byte)
149
- assert !primitive_convertible?(boolean, short)
150
- assert !primitive_convertible?(boolean, char)
151
- assert !primitive_convertible?(boolean, int)
152
- assert !primitive_convertible?(boolean, long)
153
- assert !primitive_convertible?(boolean, float)
154
- assert !primitive_convertible?(boolean, double)
155
- assert primitive_convertible?(boolean, boolean)
156
-
157
- assert !primitive_convertible?(byte, boolean)
158
- assert primitive_convertible?(byte, byte)
159
- assert primitive_convertible?(byte, short)
160
- assert !primitive_convertible?(byte, char)
161
- assert primitive_convertible?(byte, int)
162
- assert primitive_convertible?(byte, long)
163
- assert primitive_convertible?(byte, float)
164
- assert primitive_convertible?(byte, double)
165
-
166
- assert !primitive_convertible?(short, boolean)
167
- assert !primitive_convertible?(short, byte)
168
- assert !primitive_convertible?(short, char)
169
- assert primitive_convertible?(short, short)
170
- assert primitive_convertible?(short, int)
171
- assert primitive_convertible?(short, long)
172
- assert primitive_convertible?(short, float)
173
- assert primitive_convertible?(short, double)
174
-
175
- assert !primitive_convertible?(char, boolean)
176
- assert !primitive_convertible?(char, byte)
177
- assert !primitive_convertible?(char, short)
178
- assert primitive_convertible?(char, char)
179
- assert primitive_convertible?(char, int)
180
- assert primitive_convertible?(char, long)
181
- assert primitive_convertible?(char, float)
182
- assert primitive_convertible?(char, double)
183
-
184
- assert !primitive_convertible?(int, boolean)
185
- assert !primitive_convertible?(int, byte)
186
- assert !primitive_convertible?(int, short)
187
- assert !primitive_convertible?(int, char)
188
- assert primitive_convertible?(int, int)
189
- assert primitive_convertible?(int, long)
190
- assert primitive_convertible?(int, float)
191
- assert primitive_convertible?(int, double)
192
-
193
- assert !primitive_convertible?(long, boolean)
194
- assert !primitive_convertible?(long, byte)
195
- assert !primitive_convertible?(long, short)
196
- assert !primitive_convertible?(long, char)
197
- assert !primitive_convertible?(long, int)
198
- assert primitive_convertible?(long, long)
199
- assert primitive_convertible?(long, float)
200
- assert primitive_convertible?(long, double)
201
-
202
- assert !primitive_convertible?(float, boolean)
203
- assert !primitive_convertible?(float, byte)
204
- assert !primitive_convertible?(float, short)
205
- assert !primitive_convertible?(float, char)
206
- assert !primitive_convertible?(float, int)
207
- assert !primitive_convertible?(float, long)
208
- assert primitive_convertible?(float, float)
209
- assert primitive_convertible?(float, double)
210
-
211
- assert !primitive_convertible?(double, boolean)
212
- assert !primitive_convertible?(double, byte)
213
- assert !primitive_convertible?(double, short)
214
- assert !primitive_convertible?(double, char)
215
- assert !primitive_convertible?(double, int)
216
- assert !primitive_convertible?(double, long)
217
- assert !primitive_convertible?(double, float)
218
- assert primitive_convertible?(double, double)
219
- end
220
-
221
- def test_primitive_array
222
- ary = @types.type(nil, 'byte', true)
223
- int = @types.type(nil, 'int')
224
-
225
- # TODO fix intrinsics
226
- assert_equal(@types.type(nil, 'byte'), method_type(ary, "[]", [int]).resolve)
227
- end
228
-
229
-
230
- def test_primitive_not_convertible_to_array_with_same_component_type
231
- ary = @types.type(nil, 'byte', true)
232
- byte = @types.type(nil, 'byte')
233
-
234
- assert !primitive_convertible?(byte, ary)
235
- end
236
-
237
- def test_int
238
- ast = parse("#{1 << 16}")
239
- assert_equal(@types.type(nil, 'int'), inferred_type(ast))
240
- end
241
-
242
- def test_long
243
- ast = parse("#{1 << 33}")
244
- assert_equal(@types.type(nil, 'long'), inferred_type(ast))
245
- end
246
-
247
- def test_char
248
- ast = parse("?a")
249
- assert_equal(@types.type(nil, 'char'), inferred_type(ast))
250
- end
251
-
252
- def test_static_method
253
- ast = parse("class Foo;def self.bar; 1; end; end; Foo.bar")
254
- assert_equal(@types.type(nil, 'int'), inferred_type(ast))
255
- end
256
-
257
- def test_if_with_raise_has_non_raise_type
258
- ast = parse("if true; 1; else; raise 'error'; end")
259
- assert_equal(@types.type(nil, 'int'), inferred_type(ast))
260
- end
261
-
262
- def test_rescue_with_raise_in_rescue_has_body_type
263
- ast = parse("1 + begin; 1; rescue; raise 'error'; end")
264
- assert_equal(@types.type(nil, 'int'), inferred_type(ast))
265
- end
266
-
267
- def test_rescue_with_else_and_raise_in_rescue_has_else_type
268
- ast = parse("1 + begin; ''; rescue; raise 'error'; else 1 end")
269
- assert_equal(@types.type(nil, 'int'), inferred_type(ast))
270
- end
271
-
272
- def test_type_cycle
273
- ast = parse(<<-EOF)
274
- def foo(a:String):Object
275
- nil
276
- end
277
-
278
- a = "x"
279
- a = foo(a)
280
- EOF
281
- assert_errors_including(/Cannot assign .*Object.* to .*String/, ast)
282
- end
283
- end