mirah 0.1.0.pre-java → 0.1.1-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 (92) hide show
  1. data/History.txt +736 -0
  2. data/README.md +71 -0
  3. data/Rakefile +227 -73
  4. data/examples/Fib.class +0 -0
  5. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +2 -3
  6. data/examples/simple_class.mirah +3 -3
  7. data/examples/{dynamic.mirah → simple_class.mirah~} +7 -12
  8. data/javalib/mirah-bootstrap.jar +0 -0
  9. data/javalib/mirah-builtins.jar +0 -0
  10. data/javalib/mirah-compiler.jar +0 -0
  11. data/javalib/mirah-parser.jar +0 -0
  12. data/javalib/mirah-util.jar +0 -0
  13. data/lib/mirah.rb +8 -1
  14. data/lib/mirah/ast.rb +1 -1
  15. data/lib/mirah/ast/scope.rb +16 -0
  16. data/lib/mirah/commands/base.rb +1 -3
  17. data/lib/mirah/compiler.rb +17 -3
  18. data/lib/mirah/errors.rb +10 -10
  19. data/lib/mirah/generator.rb +21 -9
  20. data/lib/mirah/jvm/compiler.rb +17 -0
  21. data/lib/mirah/jvm/compiler/base.rb +24 -5
  22. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +83 -20
  23. data/lib/mirah/jvm/method_lookup.rb +43 -22
  24. data/lib/mirah/jvm/types.rb +1 -2
  25. data/lib/mirah/jvm/types/array_type.rb +1 -6
  26. data/lib/mirah/jvm/types/ast_ext.rb +31 -0
  27. data/lib/mirah/jvm/types/basic_types.rb +1 -2
  28. data/lib/mirah/jvm/types/boolean.rb +11 -10
  29. data/lib/mirah/jvm/types/extensions.rb +14 -5
  30. data/lib/mirah/jvm/types/factory.rb +128 -43
  31. data/lib/mirah/jvm/types/floats.rb +8 -10
  32. data/lib/mirah/jvm/types/integers.rb +16 -9
  33. data/lib/mirah/jvm/types/intrinsics.rb +17 -69
  34. data/lib/mirah/jvm/types/meta_type.rb +5 -0
  35. data/lib/mirah/jvm/types/methods.rb +317 -151
  36. data/lib/mirah/jvm/types/methods.rb~ +973 -0
  37. data/lib/mirah/jvm/types/number.rb +29 -6
  38. data/lib/mirah/jvm/types/primitive_type.rb +35 -7
  39. data/lib/mirah/jvm/types/source_mirror.rb +11 -6
  40. data/lib/mirah/jvm/types/type.rb +52 -0
  41. data/lib/mirah/jvm/types/type_definition.rb +8 -2
  42. data/lib/mirah/transform/ast_ext.rb +9 -31
  43. data/lib/mirah/transform/transformer.rb +1 -1
  44. data/lib/mirah/typer.rb +2 -1
  45. data/lib/mirah/util/argument_processor.rb +10 -14
  46. data/lib/mirah/util/argument_processor.rb~ +146 -0
  47. data/lib/mirah/util/compilation_state.rb +15 -9
  48. data/lib/mirah/util/process_errors.rb +8 -2
  49. data/lib/mirah/version.rb +2 -2
  50. data/lib/mirah_task.rb +0 -7
  51. data/test/core/typer_test.rb +21 -13
  52. data/test/core/util/argument_processor_test.rb +19 -19
  53. data/test/core/util/class_loader_test.rb +19 -4
  54. data/test/core/util/compilation_state_test.rb +38 -0
  55. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  56. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  57. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  58. data/test/jvm/blocks_test.rb +50 -29
  59. data/test/jvm/bytecode_test_helper.rb +71 -57
  60. data/test/jvm/cast_test.rb +162 -0
  61. data/test/jvm/constructors_test.rb +48 -0
  62. data/test/jvm/enumerable_test.rb +136 -7
  63. data/test/jvm/example_test.rb +39 -0
  64. data/test/jvm/factory_test.rb +6 -0
  65. data/test/jvm/generics_test.rb +0 -5
  66. data/test/jvm/import_test.rb +81 -0
  67. data/test/jvm/interface_test.rb +113 -0
  68. data/test/jvm/java_typer_test.rb +57 -11
  69. data/test/jvm/jvm_commands_test.rb +24 -0
  70. data/test/jvm/jvm_compiler_test.rb +186 -370
  71. data/test/jvm/macros_test.rb +67 -6
  72. data/test/jvm/main_method_test.rb +1 -1
  73. data/test/jvm/mirror_compilation_test_helper.rb +24 -0
  74. data/test/jvm/new_backend_test_helper.rb +25 -0
  75. data/test/jvm/rescue_test.rb +153 -18
  76. data/test/jvm/string_test.rb +41 -0
  77. data/test/jvm/varargs_test.rb +65 -0
  78. data/test/mirrors/base_type_test.rb +96 -0
  79. data/test/mirrors/bytecode_mirror_test.rb +86 -0
  80. data/test/mirrors/generics_test.rb +776 -0
  81. data/test/mirrors/member_test.rb +69 -0
  82. data/test/mirrors/method_lookup_test.rb +574 -0
  83. data/test/mirrors/mirrors_test.rb +562 -0
  84. data/test/mirrors/simple_async_mirror_loader_test.rb +110 -0
  85. data/test/mirrors/simple_mirror_loader_test.rb +104 -0
  86. data/test/test_helper.rb +2 -1
  87. metadata +244 -217
  88. data/README.txt +0 -59
  89. data/javalib/dynalink-0.2.jar +0 -0
  90. data/lib/mirah/jvm/typer.rb +0 -177
  91. data/lib/mirah/jvm/types/dynamic_type.rb +0 -45
  92. data/lib/mirah/jvm/types/unreachable_type.rb +0 -27
@@ -0,0 +1,562 @@
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 BaseMirrorsTest < Test::Unit::TestCase
20
+ java_import 'org.mirah.jvm.mirrors.MirrorTypeSystem'
21
+ java_import 'org.mirah.jvm.mirrors.JVMScope'
22
+ java_import 'org.mirah.jvm.types.JVMType'
23
+ java_import 'org.mirah.jvm.types.JVMTypeUtils'
24
+ java_import 'org.mirah.typer.BaseTypeFuture'
25
+ java_import 'org.mirah.typer.CallFuture'
26
+ java_import 'org.mirah.typer.TypeFuture'
27
+ java_import 'mirah.lang.ast.ClassDefinition'
28
+ java_import 'mirah.lang.ast.ConstructorDefinition'
29
+ java_import 'mirah.lang.ast.PositionImpl'
30
+ java_import 'mirah.lang.ast.Script'
31
+ java_import 'mirah.lang.ast.StringCodeSource'
32
+ java_import 'mirah.lang.ast.TypeRefImpl'
33
+ java_import 'org.jruby.org.objectweb.asm.Opcodes'
34
+ java_import 'org.jruby.org.objectweb.asm.Type'
35
+
36
+ def setup
37
+ @types = MirrorTypeSystem.new
38
+ @scope = JVMScope.new
39
+ set_filename('foo-bar.mirah')
40
+ end
41
+
42
+ def set_filename(filename)
43
+ @script = Script.new(PositionImpl.new(StringCodeSource.new(filename, ""),
44
+ 0, 0, 0, 0, 0, 0))
45
+ end
46
+
47
+ def assert_descriptor(descriptor, type)
48
+ assert(type.isResolved)
49
+ assert_resolved_to(descriptor, type.resolve)
50
+ assert_not_error(type)
51
+ end
52
+
53
+ def assert_resolved_to(descriptor, resolved)
54
+ assert_kind_of(JVMType, resolved)
55
+ assert_equal(descriptor, resolved.getAsmType.descriptor)
56
+ end
57
+
58
+ def assert_error(type)
59
+ assert_block("Excpected #{type.resolve} to be an error") {
60
+ type.resolve.isError
61
+ }
62
+ end
63
+
64
+ def assert_not_error(type)
65
+ assert(!type.resolve.isError)
66
+ end
67
+
68
+ def assert_subtype_of(supertype, subtype)
69
+ converted_supertype = convert_to_type(supertype)
70
+ assert_block("Invalid supertype #{supertype}") {
71
+ !converted_supertype.isError
72
+ }
73
+ assert_block("Expected #{supertype} > #{subtype}") {
74
+ converted_supertype.assignableFrom(convert_to_type(subtype))
75
+ }
76
+ end
77
+
78
+ def convert_to_type(x)
79
+ if x.kind_of?(JVMType)
80
+ x
81
+ elsif x.respond_to?(:resolve)
82
+ x.resolve
83
+ elsif x.kind_of?(TypeRefImpl)
84
+ @types.get(@scope, x).resolve
85
+ else
86
+ @types.get(@scope, typeref(x)).resolve
87
+ end
88
+ end
89
+
90
+ def main_type
91
+ @types.getMainType(@scope, @script)
92
+ end
93
+
94
+ def typeref(name, array=false)
95
+ TypeRefImpl.new(name, array, false, nil)
96
+ end
97
+
98
+ def define_type(name, superclass=nil, interfaces=[])
99
+ @types.defineType(
100
+ @scope, ClassDefinition.new, name, superclass, interfaces)
101
+ end
102
+ end
103
+
104
+ class MirrorsTest < BaseMirrorsTest
105
+
106
+ def test_add_default_imports
107
+ @types.addDefaultImports(@scope)
108
+ type = @types.get(@scope, typeref("StackTraceElement"))
109
+ assert_descriptor("Ljava/lang/StackTraceElement;", type)
110
+ end
111
+
112
+ def test_fixnum
113
+ type = @types.getFixnumType(0)
114
+ assert_descriptor("I", type)
115
+ assert_descriptor("J", @types.getFixnumType(1 << 33))
116
+ end
117
+
118
+ def test_fixnum_narrowing
119
+ type = @types.getFixnumType(0)
120
+ assert_descriptor("I", type)
121
+ type.narrow
122
+ assert_descriptor("B", type)
123
+
124
+ type = @types.getFixnumType(1 << 8)
125
+ assert_descriptor("I", type)
126
+ type.narrow
127
+ assert_descriptor("S", type)
128
+ end
129
+
130
+ def test_string
131
+ assert_descriptor("Ljava/lang/String;", @types.getStringType)
132
+ end
133
+
134
+ def test_void
135
+ type = @types.getVoidType
136
+ assert_descriptor("V", type)
137
+ end
138
+
139
+ def test_nil
140
+ type = @types.getImplicitNilType
141
+ assert_not_nil(type)
142
+ assert(type.resolve.matchesAnything)
143
+ assert_descriptor("V", type)
144
+ end
145
+
146
+ def test_null
147
+ type = @types.getNullType.resolve
148
+ assert_equal("null", type.name)
149
+ assert_resolved_to("Ljava/lang/Object;", type)
150
+ end
151
+
152
+ def test_main_type
153
+ assert_descriptor("LFooBar;", main_type)
154
+ end
155
+
156
+ def test_main_type2
157
+ set_filename("some_class.mirah")
158
+ assert_descriptor("LSomeClass;", main_type)
159
+ end
160
+
161
+ def test_main_type_is_meta
162
+ assert(main_type.resolve.isMeta)
163
+ end
164
+
165
+ def test_main_type_with_package
166
+ @scope.package_set("foo.bar")
167
+ assert_descriptor("Lfoo/bar/FooBar;", main_type)
168
+ end
169
+
170
+ def test_regex
171
+ assert_descriptor("Ljava/util/regex/Pattern;", @types.getRegexType)
172
+ end
173
+
174
+ def test_hash
175
+ assert_descriptor("Ljava/util/Map;", @types.getHashLiteralType(@types.getStringType, @types.getRegexType, nil))
176
+ end
177
+
178
+ def test_float
179
+ assert_descriptor("D", @types.getFloatType(0))
180
+ end
181
+
182
+ def test_float_narrowing
183
+ type = @types.getFloatType(0.0)
184
+ assert_descriptor("D", type)
185
+ type.narrow
186
+ assert_descriptor("F", type)
187
+ end
188
+
189
+ def test_exception
190
+ assert_descriptor("Ljava/lang/Exception;", @types.getDefaultExceptionType)
191
+ end
192
+
193
+ def test_throwable
194
+ assert_descriptor("Ljava/lang/Throwable;", @types.getBaseExceptionType)
195
+ end
196
+
197
+ def test_boolean
198
+ assert_descriptor("Z", @types.getBooleanType)
199
+ end
200
+
201
+ def test_list
202
+ assert_descriptor("Ljava/util/List;", @types.getArrayLiteralType(@types.getStringType, nil))
203
+ end
204
+
205
+ def test_superclass
206
+ assert_descriptor("Ljava/lang/Object;", @types.getSuperClass(main_type))
207
+ end
208
+
209
+ def test_method_def
210
+ type = @types.getMethodDefType(main_type, 'foobar', [], nil, nil)
211
+ assert_error(type.returnType)
212
+ type = @types.getMethodDefType(
213
+ main_type, 'foobar', [], @types.getVoidType, nil)
214
+ assert_descriptor('V', type.returnType)
215
+ end
216
+
217
+ def test_meta_resolved
218
+ type = @types.getStringType.resolve
219
+ assert_false(type.isMeta)
220
+ assert(@types.getMetaType(type).isMeta)
221
+ end
222
+
223
+ def test_meta_future
224
+ type = @types.getStringType
225
+ assert_false(type.resolve.isMeta)
226
+ assert(@types.getMetaType(type).resolve.isMeta)
227
+ end
228
+
229
+ def test_local
230
+ type1 = @types.getLocalType(@scope, "ARGV", nil)
231
+ type2 = @types.getLocalType(@scope, "ARGV", nil)
232
+ type2.assign(@types.getFixnumType(0), nil)
233
+ assert_descriptor("I", type1)
234
+ assert_descriptor("I", type2)
235
+ end
236
+
237
+ def test_multiple_locals
238
+ type1 = @types.getLocalType(@scope, "a", nil)
239
+ type2 = @types.getLocalType(@scope, "b", nil)
240
+ assert_error(type1)
241
+ assert_error(type2)
242
+ type1.assign(@types.getFixnumType(0), nil)
243
+ assert_descriptor("I", type1)
244
+ assert_error(type2)
245
+ type2.assign(@types.getStringType, nil)
246
+ assert_descriptor("I", type1)
247
+ assert_descriptor("Ljava/lang/String;", type2)
248
+ end
249
+
250
+ def test_multiple_scopes
251
+ type1 = @types.getLocalType(@scope, "a", nil)
252
+ type2 = @types.getLocalType(JVMScope.new, "a", nil)
253
+ assert_error(type1)
254
+ assert_error(type2)
255
+ type1.assign(@types.getFixnumType(0), nil)
256
+ assert_descriptor("I", type1)
257
+ assert_error(type2)
258
+ type2.assign(@types.getStringType, nil)
259
+ assert_descriptor("I", type1)
260
+ assert_descriptor("Ljava/lang/String;", type2)
261
+ end
262
+
263
+ def test_define_type
264
+ type = define_type("Subclass", main_type)
265
+ assert_descriptor("LSubclass;", type)
266
+ assert_descriptor("LFooBar;", @types.getSuperClass(type))
267
+ end
268
+
269
+ def test_redefine_main_type
270
+ existing = main_type.resolve.unmeta
271
+ type = @types.defineType(@scope, ClassDefinition.new, "FooBar", nil, [])
272
+ assert_descriptor("LFooBar;", type)
273
+ assert_same(existing, type.resolve)
274
+ end
275
+
276
+ def test_default_constructor
277
+ object = @types.getSuperClass(main_type).resolve
278
+ constructor = object.getMethod('<init>', [])
279
+ assert_not_nil(constructor)
280
+ assert_equal('CONSTRUCTOR', constructor.kind.name)
281
+ assert_not_equal(0, constructor.flags & Opcodes.ACC_PUBLIC)
282
+ end
283
+
284
+ def test_get
285
+ type = @types.get(@scope, typeref('void'))
286
+ assert_descriptor('V', type)
287
+ end
288
+
289
+ def test_package
290
+ @scope.package_set('foo')
291
+ type = define_type('Bar')
292
+ assert_descriptor("Lfoo/Bar;", type)
293
+
294
+ @scope.package_set('foo.bar')
295
+ assert_descriptor("Lfoo/bar/Baz;", define_type('Baz'))
296
+ end
297
+
298
+ def test_search_packages
299
+ define_type("A")
300
+ define_type("B")
301
+ @scope.package_set('foo')
302
+ define_type("A")
303
+ @scope.package_set('bar')
304
+ define_type("A")
305
+
306
+ @scope.import("bar", "*")
307
+ @scope.package_set(nil)
308
+ ref = typeref('A')
309
+ assert_descriptor("LA;", @types.get(@scope, ref))
310
+
311
+ @scope.package_set("foo")
312
+ assert_descriptor("Lfoo/A;", @types.get(@scope, ref))
313
+
314
+ @scope.package_set("baz")
315
+ assert_descriptor("Lbar/A;", @types.get(@scope, ref))
316
+
317
+ # This isn't quite right. Primitive types should be visible,
318
+ # but other classes in the default package shouldn't be accessible
319
+ # to other packages.
320
+ assert_descriptor("LB;", @types.get(@scope, typeref('B')))
321
+ end
322
+
323
+ def test_import
324
+ @scope.import('java.util.Map', 'JavaMap')
325
+ assert_descriptor("Ljava/util/Map;", @types.get(@scope, typeref('JavaMap')))
326
+ end
327
+
328
+ def test_classname_from_filename
329
+ assert_equal("SomeClass",
330
+ MirrorTypeSystem.classnameFromFilename("SomeClass.mirah"))
331
+ assert_equal("FooBar",
332
+ MirrorTypeSystem.classnameFromFilename("FooBar.mirah"))
333
+ assert_equal("SomeClass",
334
+ MirrorTypeSystem.classnameFromFilename("some_class.mirah"))
335
+ assert_equal("FooBar",
336
+ MirrorTypeSystem.classnameFromFilename("foo-bar.mirah"))
337
+ assert_equal(
338
+ "SomeClass",
339
+ MirrorTypeSystem.classnameFromFilename("foo/bar/some_class.mirah"))
340
+ end
341
+
342
+ def test_primitive_array
343
+ array_type = @types.get(@scope, typeref('int', true)).resolve
344
+ assert_resolved_to('[I', array_type)
345
+ assert(JVMTypeUtils.isArray(array_type))
346
+ assert_subtype_of('java.lang.Object', array_type)
347
+ assert_subtype_of('java.lang.Cloneable', array_type)
348
+ assert_subtype_of('java.io.Serializable', array_type)
349
+ assert_resolved_to('I', array_type.component_type)
350
+ assert_descriptor(
351
+ '[S', @types.getArrayType(@types.get(@scope, typeref('short'))))
352
+ end
353
+
354
+ def test_field
355
+ # TODO use instance field from static method
356
+ a = @types.getFieldType(main_type, 'a', nil)
357
+ b = @types.getFieldType(main_type, 'b', nil)
358
+ assert_not_same(a, b)
359
+ assert_same(a, @types.getFieldType(main_type, 'a', nil))
360
+
361
+ field = main_type.resolve.getDeclaredField('a')
362
+ assert_not_nil(field)
363
+ assert_same(a, field.async_return_type)
364
+ assert_equal("STATIC_FIELD_ACCESS", field.kind.name)
365
+
366
+ assert_same(field, main_type.resolve.unmeta.getDeclaredField('a'))
367
+ end
368
+ end
369
+
370
+ class MTS_MethodLookupTest < BaseMirrorsTest
371
+ def setup
372
+ super
373
+ @scope.selfType_set(main_type)
374
+ end
375
+
376
+
377
+ def test_simple_method_def
378
+ @types.getMethodDefType(main_type, 'foobar', [], @types.getVoidType, nil)
379
+ type = @types.getMethodType(
380
+ CallFuture.new(@types, @scope, main_type, true, 'foobar', [], [], nil))
381
+ assert_resolved_to('LFooBar;', type.resolve.returnType)
382
+ end
383
+
384
+ def test_multiple_method_defs
385
+ @types.getMethodDefType(main_type, 'foobar', [], @types.getVoidType, nil)
386
+ @types.getMethodDefType(main_type, 'foo', [], @types.getFixnumType(1), nil)
387
+ type = @types.getMethodType(
388
+ CallFuture.new(@types, @scope, main_type, true, 'foobar', [], [], nil))
389
+ assert_not_error(type)
390
+ assert_resolved_to('LFooBar;', type.resolve.returnType)
391
+ type = @types.getMethodType(
392
+ CallFuture.new(@types, @scope, main_type, true, 'foo', [], [], nil))
393
+ assert_not_error(type)
394
+ assert_resolved_to('I', type.resolve.returnType)
395
+ end
396
+
397
+ def test_async_return_type
398
+ future = BaseTypeFuture.new
399
+ @types.getMethodDefType(main_type, 'foo', [], future, nil)
400
+ type = @types.getMethodType(
401
+ CallFuture.new(@types, @scope, main_type, true, 'foo', [], [], nil))
402
+ assert_error(type)
403
+ future.resolved(@types.getFixnumType(1).resolve)
404
+ assert_not_error(type)
405
+ assert_resolved_to('I', type.resolve.returnType)
406
+ end
407
+
408
+ def test_infer_return_type_from_body
409
+ future = @types.getMethodDefType(main_type, 'foo', [], nil, nil)
410
+ type = @types.getMethodType(
411
+ CallFuture.new(@types, @scope, main_type, true, 'foo', [], [], nil))
412
+ assert_error(type)
413
+ future.returnType.assign(@types.getFixnumType(1), nil)
414
+ assert_not_error(type)
415
+ assert_resolved_to('I', type.resolve.returnType)
416
+ end
417
+
418
+ def test_async_arguments
419
+ type = @types.wrap(Type.getType("LFooBar;"))
420
+ @scope.selfType_set(type)
421
+ int = @types.wrap(Type.getType("I"))
422
+ short = @types.wrap(Type.getType("S"))
423
+ @types.getMethodDefType(type, 'foo', [int], int, nil)
424
+ argument_future = BaseTypeFuture.new
425
+ @types.getMethodDefType(type, 'foo', [argument_future], short, nil)
426
+
427
+ call_future = CallFuture.new(@types, @scope, type, true, 'foo', [short], [], nil)
428
+ assert_not_error(call_future)
429
+ assert_resolved_to('I', call_future.resolve)
430
+
431
+ # Now make the other one more specific
432
+ argument_future.resolved(short.resolve)
433
+ assert_resolved_to('S', call_future.resolve)
434
+ end
435
+
436
+ def test_async_arguments_meta
437
+ int = @types.wrap(Type.getType("I"))
438
+ short = @types.wrap(Type.getType("S"))
439
+ @types.getMethodDefType(main_type, 'foo', [int], int, nil)
440
+ argument_future = BaseTypeFuture.new
441
+ @types.getMethodDefType(main_type, 'foo', [argument_future], short, nil)
442
+
443
+ call_future = CallFuture.new(@types, @scope, main_type, true, 'foo', [short], [], nil)
444
+ assert_not_error(call_future)
445
+ assert_resolved_to('I', call_future.resolve)
446
+
447
+ # Now make the other one more specific
448
+ argument_future.resolved(short.resolve)
449
+ assert_resolved_to('S', call_future.resolve)
450
+ end
451
+
452
+ def test_async_param_superclass
453
+ assert_not_error(main_type)
454
+ super_future = BaseTypeFuture.new
455
+ b = @types.defineType(@scope, ClassDefinition.new, "B", super_future, [])
456
+ a = @types.defineType(@scope, ClassDefinition.new, "A", b, [])
457
+ c = @types.defineType(@scope, ClassDefinition.new, "C", nil, [])
458
+
459
+ @types.getMethodDefType(main_type, 'foobar', [c],
460
+ @types.getFixnumType(0), nil)
461
+ type1 = CallFuture.new(@types, @scope, main_type, true, 'foobar', [b], [], nil)
462
+ assert_error(type1)
463
+ type2 = CallFuture.new(@types, @scope, main_type, true, 'foobar', [b], [], nil)
464
+ assert_error(type2)
465
+ super_future.resolved(c.resolve)
466
+ assert_descriptor("I", type1)
467
+ assert_descriptor("I", type2)
468
+ end
469
+
470
+ def test_super_in_constructor
471
+ @scope.selfType_set(main_type)
472
+ @scope.context_set(ConstructorDefinition.new)
473
+ future = CallFuture.new(
474
+ @types, @scope,
475
+ @types.getSuperClass(main_type), true, 'initialize', [], [], nil)
476
+ assert_descriptor("Ljava/lang/Object;", future)
477
+ end
478
+
479
+ def test_array_methods
480
+ index_type = @types.get(@scope, typeref('int'))
481
+ component_type = @types.get(@scope, typeref('short'))
482
+ array_type = @types.get(@scope, typeref('short', true))
483
+
484
+ method = @types.getMethodType(CallFuture.new(
485
+ @types, @scope, array_type, true, 'length', [], [], nil))
486
+ assert_resolved_to('I', method.resolve.returnType)
487
+ method = @types.getMethodType(CallFuture.new(
488
+ @types, @scope, array_type, true, '[]', [index_type], [], nil))
489
+ assert_resolved_to('S', method.resolve.returnType)
490
+ method = @types.getMethodType(CallFuture.new(
491
+ @types, @scope, array_type, true,
492
+ '[]=', [index_type, component_type], [], nil))
493
+ assert_resolved_to('S', method.resolve.returnType)
494
+ end
495
+
496
+ def test_field_access_via_call
497
+ system = @types.get(@scope, typeref('java.lang.System'))
498
+ method = @types.getMethodType(CallFuture.new(
499
+ @types, @scope, system, true, 'out', [], [], nil))
500
+ assert_not_error(method)
501
+ assert_resolved_to("Ljava/io/PrintStream;", method.resolve.returnType)
502
+ member = method.resolve.returnType.member
503
+ assert_equal('STATIC_FIELD_ACCESS', member.kind.name)
504
+ end
505
+
506
+ def test_constructor
507
+ object = @types.get(@scope, typeref('java.lang.Object'))
508
+ object_meta = @types.getMetaType(object)
509
+ method = CallFuture.new(
510
+ @types, @scope, object_meta, true, 'new', [], [], nil)
511
+ assert_descriptor('Ljava/lang/Object;', method)
512
+ end
513
+
514
+ def test_implicit_nil_widen
515
+ a = @types.getStringType.resolve
516
+ b = @types.getImplicitNilType.resolve
517
+ c = a.widen(b)
518
+ assert_resolved_to('Ljava/lang/String;', c)
519
+ end
520
+
521
+ def test_object_widen
522
+ a = @types.getStringType.resolve
523
+ b = @types.getRegexType.resolve
524
+ c = a.widen(b)
525
+ assert_resolved_to('Ljava/io/Serializable;', c)
526
+ end
527
+
528
+ def test_boxed_assignment
529
+ a = @types.wrap(Type.getType("Ljava/lang/Boolean;")).resolve
530
+ b = @types.getBooleanType.resolve
531
+ assert(a.assignableFrom(b))
532
+ assert(b.assignableFrom(a))
533
+ end
534
+
535
+ def test_same_type
536
+ a = @types.getStringType.resolve
537
+ assert(a.isSameType(a))
538
+ end
539
+
540
+ def test_class_literal
541
+ object = @types.get(@scope, typeref('java.lang.Object'))
542
+ object_meta = @types.getMetaType(object)
543
+ method = CallFuture.new(
544
+ @types, @scope, object_meta, true, 'class', [], [], nil)
545
+ assert_equal('java.lang.Class<java.lang.Object>', method.resolve.toString)
546
+
547
+ method = CallFuture.new(
548
+ @types, @scope, main_type, true, 'class', [], [], nil)
549
+ assert_equal('java.lang.Class<FooBar>', method.resolve.toString)
550
+ end
551
+
552
+ def test_generic_method
553
+ klass = CallFuture.new(
554
+ @types, @scope, main_type, true, 'class', [], [], nil)
555
+ collections = @types.getMetaType(
556
+ @types.get(@scope, typeref('java.util.Collections')))
557
+ set = @types.get(@scope, typeref('java.util.Set'))
558
+ checked = CallFuture.new(
559
+ @types, @scope, collections, true, 'checkedSet', [set, klass], [], nil)
560
+ assert_equal('java.util.Set<FooBar>', checked.resolve.toString)
561
+ end
562
+ end