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.
- data/History.txt +736 -0
- data/README.md +71 -0
- data/Rakefile +227 -73
- data/examples/Fib.class +0 -0
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +2 -3
- data/examples/simple_class.mirah +3 -3
- data/examples/{dynamic.mirah → simple_class.mirah~} +7 -12
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-compiler.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/mirah.rb +8 -1
- data/lib/mirah/ast.rb +1 -1
- data/lib/mirah/ast/scope.rb +16 -0
- data/lib/mirah/commands/base.rb +1 -3
- data/lib/mirah/compiler.rb +17 -3
- data/lib/mirah/errors.rb +10 -10
- data/lib/mirah/generator.rb +21 -9
- data/lib/mirah/jvm/compiler.rb +17 -0
- data/lib/mirah/jvm/compiler/base.rb +24 -5
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +83 -20
- data/lib/mirah/jvm/method_lookup.rb +43 -22
- data/lib/mirah/jvm/types.rb +1 -2
- data/lib/mirah/jvm/types/array_type.rb +1 -6
- data/lib/mirah/jvm/types/ast_ext.rb +31 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -2
- data/lib/mirah/jvm/types/boolean.rb +11 -10
- data/lib/mirah/jvm/types/extensions.rb +14 -5
- data/lib/mirah/jvm/types/factory.rb +128 -43
- data/lib/mirah/jvm/types/floats.rb +8 -10
- data/lib/mirah/jvm/types/integers.rb +16 -9
- data/lib/mirah/jvm/types/intrinsics.rb +17 -69
- data/lib/mirah/jvm/types/meta_type.rb +5 -0
- data/lib/mirah/jvm/types/methods.rb +317 -151
- data/lib/mirah/jvm/types/methods.rb~ +973 -0
- data/lib/mirah/jvm/types/number.rb +29 -6
- data/lib/mirah/jvm/types/primitive_type.rb +35 -7
- data/lib/mirah/jvm/types/source_mirror.rb +11 -6
- data/lib/mirah/jvm/types/type.rb +52 -0
- data/lib/mirah/jvm/types/type_definition.rb +8 -2
- data/lib/mirah/transform/ast_ext.rb +9 -31
- data/lib/mirah/transform/transformer.rb +1 -1
- data/lib/mirah/typer.rb +2 -1
- data/lib/mirah/util/argument_processor.rb +10 -14
- data/lib/mirah/util/argument_processor.rb~ +146 -0
- data/lib/mirah/util/compilation_state.rb +15 -9
- data/lib/mirah/util/process_errors.rb +8 -2
- data/lib/mirah/version.rb +2 -2
- data/lib/mirah_task.rb +0 -7
- data/test/core/typer_test.rb +21 -13
- data/test/core/util/argument_processor_test.rb +19 -19
- data/test/core/util/class_loader_test.rb +19 -4
- data/test/core/util/compilation_state_test.rb +38 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/blocks_test.rb +50 -29
- data/test/jvm/bytecode_test_helper.rb +71 -57
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +48 -0
- data/test/jvm/enumerable_test.rb +136 -7
- data/test/jvm/example_test.rb +39 -0
- data/test/jvm/factory_test.rb +6 -0
- data/test/jvm/generics_test.rb +0 -5
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +113 -0
- data/test/jvm/java_typer_test.rb +57 -11
- data/test/jvm/jvm_commands_test.rb +24 -0
- data/test/jvm/jvm_compiler_test.rb +186 -370
- data/test/jvm/macros_test.rb +67 -6
- data/test/jvm/main_method_test.rb +1 -1
- data/test/jvm/mirror_compilation_test_helper.rb +24 -0
- data/test/jvm/new_backend_test_helper.rb +25 -0
- data/test/jvm/rescue_test.rb +153 -18
- data/test/jvm/string_test.rb +41 -0
- data/test/jvm/varargs_test.rb +65 -0
- data/test/mirrors/base_type_test.rb +96 -0
- data/test/mirrors/bytecode_mirror_test.rb +86 -0
- data/test/mirrors/generics_test.rb +776 -0
- data/test/mirrors/member_test.rb +69 -0
- data/test/mirrors/method_lookup_test.rb +574 -0
- data/test/mirrors/mirrors_test.rb +562 -0
- data/test/mirrors/simple_async_mirror_loader_test.rb +110 -0
- data/test/mirrors/simple_mirror_loader_test.rb +104 -0
- data/test/test_helper.rb +2 -1
- metadata +244 -217
- data/README.txt +0 -59
- data/javalib/dynalink-0.2.jar +0 -0
- data/lib/mirah/jvm/typer.rb +0 -177
- data/lib/mirah/jvm/types/dynamic_type.rb +0 -45
- 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
|