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.
- data/History.txt +372 -0
- data/README.txt +4 -5
- data/Rakefile +178 -55
- data/examples/appengine/Readme +3 -3
- data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
- data/examples/appengine/src/org/mirah/list.dhtml +1 -1
- data/examples/bintrees.mirah +1 -1
- data/examples/edb.mirah +1 -1
- data/examples/fib.mirah +1 -1
- data/examples/interfaces.mirah +1 -1
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
- data/examples/maven/README.txt +1 -1
- data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
- data/examples/plugins/appengine/Rakefile +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
- data/examples/rosettacode/100-doors.mirah +6 -6
- data/examples/rosettacode/README.txt +3 -3
- data/examples/rosettacode/boolean-values.mirah +1 -1
- data/examples/rosettacode/comments.mirah +1 -1
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
- data/examples/rosettacode/factorial.mirah +1 -1
- data/examples/rosettacode/fibonacci.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +2 -2
- data/examples/rosettacode/flatten-a-list.mirah +4 -4
- data/examples/rosettacode/guess-the-number.mirah +2 -2
- data/examples/rosettacode/hamming-numbers.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +22 -22
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/random-numbers.mirah +1 -1
- data/examples/rosettacode/repeat-a-string.mirah +1 -1
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +5 -5
- data/examples/rosettacode/secure-temporary-file.mirah +2 -2
- data/examples/rosettacode/sleep.mirah +1 -1
- data/examples/rosettacode/string-length.mirah +5 -5
- data/examples/swing.mirah +1 -1
- data/examples/test.edb +1 -1
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/duby.rb +1 -1
- data/lib/mirah.rb +50 -28
- data/lib/mirah/ast.rb +15 -605
- data/lib/mirah/ast/scope.rb +98 -69
- data/lib/mirah/commands.rb +1 -1
- data/lib/mirah/commands/base.rb +7 -7
- data/lib/mirah/commands/compile.rb +3 -3
- data/lib/mirah/commands/parse.rb +7 -5
- data/lib/mirah/commands/run.rb +12 -19
- data/lib/mirah/compiler.rb +15 -23
- data/lib/mirah/errors.rb +16 -1
- data/lib/mirah/generator.rb +79 -39
- data/lib/mirah/jvm/compiler.rb +1 -19
- data/lib/mirah/jvm/compiler/base.rb +233 -90
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
- data/lib/mirah/jvm/method_lookup.rb +134 -65
- data/lib/mirah/jvm/typer.rb +10 -5
- data/lib/mirah/jvm/types.rb +10 -2
- data/lib/mirah/jvm/types/array_type.rb +10 -12
- data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
- data/lib/mirah/jvm/types/basic_types.rb +26 -33
- data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
- data/lib/mirah/jvm/types/block_type.rb +15 -0
- data/lib/mirah/jvm/types/boolean.rb +8 -4
- data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
- data/lib/mirah/jvm/types/enumerable.rb +7 -7
- data/lib/mirah/jvm/types/extensions.rb +11 -6
- data/lib/mirah/jvm/types/factory.rb +624 -94
- data/lib/mirah/jvm/types/floats.rb +21 -15
- data/lib/mirah/jvm/types/generic_type.rb +72 -0
- data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
- data/lib/mirah/jvm/types/integers.rb +26 -71
- data/lib/mirah/jvm/types/interface_definition.rb +3 -3
- data/lib/mirah/jvm/types/intrinsics.rb +203 -168
- data/lib/mirah/jvm/types/literals.rb +6 -6
- data/lib/mirah/jvm/types/meta_type.rb +13 -4
- data/lib/mirah/jvm/types/methods.rb +281 -93
- data/lib/mirah/jvm/types/null_type.rb +17 -5
- data/lib/mirah/jvm/types/number.rb +10 -7
- data/lib/mirah/jvm/types/primitive_type.rb +17 -6
- data/lib/mirah/jvm/types/source_mirror.rb +12 -7
- data/lib/mirah/jvm/types/type.rb +107 -23
- data/lib/mirah/jvm/types/type_definition.rb +25 -10
- data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
- data/lib/mirah/jvm/types/void_type.rb +3 -3
- data/lib/mirah/parser.rb +154 -16
- data/lib/mirah/plugin/edb.rb +1 -1
- data/lib/mirah/transform.rb +1 -2
- data/lib/mirah/transform/ast_ext.rb +24 -43
- data/lib/mirah/transform/transformer.rb +29 -224
- data/lib/mirah/typer.rb +2 -16
- data/lib/mirah/util/argument_processor.rb +25 -10
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/compilation_state.rb +16 -17
- data/lib/mirah/util/delegate.rb +2 -2
- data/lib/mirah/util/logging.rb +110 -0
- data/lib/mirah/util/process_errors.rb +69 -11
- data/lib/mirah/version.rb +1 -1
- data/test/core/commands_test.rb +6 -24
- data/test/core/env_test.rb +5 -5
- data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
- data/test/core/typer_test.rb +196 -158
- data/test/core/util/argument_processor_test.rb +10 -10
- data/test/core/util/class_loader_test.rb +6 -5
- 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/annotations_test.rb +5 -5
- data/test/jvm/blocks_test.rb +140 -88
- data/test/jvm/bytecode_test_helper.rb +112 -94
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +18 -8
- data/test/jvm/enumerable_test.rb +77 -44
- data/test/jvm/example_test.rb +53 -0
- data/test/jvm/factory_test.rb +7 -1
- data/test/jvm/generics_test.rb +57 -0
- data/test/jvm/hash_test.rb +106 -0
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +73 -0
- data/test/jvm/java_typer_test.rb +92 -66
- data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
- data/test/jvm/jvm_compiler_test.rb +170 -604
- data/test/jvm/list_extensions_test.rb +23 -0
- data/test/jvm/macros_test.rb +197 -32
- data/test/jvm/main_method_test.rb +4 -4
- data/test/jvm/numeric_extensions_test.rb +13 -0
- data/test/jvm/rescue_test.rb +73 -16
- data/test/jvm/varargs_test.rb +65 -0
- data/test/test_helper.rb +1 -2
- metadata +234 -251
- data/examples/SortClosure$__xform_tmp_1.class +0 -0
- data/examples/SortClosure$__xform_tmp_2.class +0 -0
- data/examples/SortClosure.class +0 -0
- data/examples/macros/StringEachChar$Extension1.class +0 -0
- data/lib/mirah/ast/call.rb +0 -345
- data/lib/mirah/ast/class.rb +0 -359
- data/lib/mirah/ast/flow.rb +0 -381
- data/lib/mirah/ast/intrinsics.rb +0 -563
- data/lib/mirah/ast/literal.rb +0 -178
- data/lib/mirah/ast/local.rb +0 -112
- data/lib/mirah/ast/method.rb +0 -408
- data/lib/mirah/ast/structure.rb +0 -387
- data/lib/mirah/ast/type.rb +0 -146
- data/lib/mirah/commands/base.rb~ +0 -57
- data/lib/mirah/compiler/call.rb +0 -45
- data/lib/mirah/compiler/class.rb +0 -81
- data/lib/mirah/compiler/flow.rb +0 -109
- data/lib/mirah/compiler/literal.rb +0 -130
- data/lib/mirah/compiler/local.rb +0 -59
- data/lib/mirah/compiler/method.rb +0 -44
- data/lib/mirah/compiler/structure.rb +0 -65
- data/lib/mirah/jvm/compiler/java_source.rb +0 -787
- data/lib/mirah/jvm/method_lookup.rb~ +0 -247
- data/lib/mirah/jvm/source_generator/builder.rb +0 -468
- data/lib/mirah/jvm/source_generator/loops.rb +0 -131
- data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
- data/lib/mirah/plugin/gwt.rb +0 -189
- data/lib/mirah/plugin/java.rb +0 -70
- data/lib/mirah/transform/error.rb +0 -13
- data/lib/mirah/transform/helper.rb +0 -765
- data/lib/mirah/typer/simple.rb +0 -384
- data/lib/mirah/version.rb~ +0 -18
- data/test/core/ast_test.rb +0 -382
- data/test/core/compilation_test.rb +0 -130
- data/test/core/macros_test.rb +0 -61
- data/test/jvm/javac_test_helper.rb +0 -89
- data/test/jvm/jvm_compiler_test.rb~ +0 -2181
- data/test/plugins/gwt_test.rb +0 -69
|
@@ -2,8 +2,8 @@ module Mirah
|
|
|
2
2
|
module JVM
|
|
3
3
|
module Types
|
|
4
4
|
class NullType < Type
|
|
5
|
-
def initialize
|
|
6
|
-
super(
|
|
5
|
+
def initialize(types)
|
|
6
|
+
super(types, types.get_mirror('java.lang.Object'))
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def to_s
|
|
@@ -15,13 +15,25 @@ module Mirah
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def compatible?(other)
|
|
18
|
-
|
|
18
|
+
assignable_from(other)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def assignable_from?(other)
|
|
22
|
-
|
|
22
|
+
if other.respond_to?(:primitive?)
|
|
23
|
+
!other.primitive?
|
|
24
|
+
else
|
|
25
|
+
other.matchesAnything
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def widen(other)
|
|
30
|
+
if other.matchesAnything
|
|
31
|
+
self
|
|
32
|
+
else
|
|
33
|
+
other
|
|
34
|
+
end
|
|
23
35
|
end
|
|
24
36
|
end
|
|
25
37
|
end
|
|
26
38
|
end
|
|
27
|
-
end
|
|
39
|
+
end
|
|
@@ -17,7 +17,7 @@ module Mirah::JVM::Types
|
|
|
17
17
|
class ComparisonIntrinsic < Intrinsic
|
|
18
18
|
attr_reader :name, :op
|
|
19
19
|
def initialize(type, name, op, args)
|
|
20
|
-
super(type, name, args,
|
|
20
|
+
super(type, name, args, type.type_system.type(nil, 'boolean')) do; end
|
|
21
21
|
@type = type
|
|
22
22
|
@op = op
|
|
23
23
|
end
|
|
@@ -38,15 +38,17 @@ module Mirah::JVM::Types
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
class Number < PrimitiveType
|
|
41
|
+
TYPE_ORDERING = ['byte', 'short', 'int', 'long', 'float', 'double']
|
|
42
|
+
|
|
41
43
|
# The type returned by arithmetic operations with this type.
|
|
42
44
|
def math_type
|
|
43
45
|
self
|
|
44
46
|
end
|
|
45
|
-
|
|
47
|
+
|
|
46
48
|
def suffix
|
|
47
49
|
''
|
|
48
50
|
end
|
|
49
|
-
|
|
51
|
+
|
|
50
52
|
# Adds an intrinsic that delegates to an intrinsic in another primitive
|
|
51
53
|
# type. That type must support promoting the "this" argument.
|
|
52
54
|
def delegate_intrinsic(name, type, return_type)
|
|
@@ -62,11 +64,12 @@ module Mirah::JVM::Types
|
|
|
62
64
|
end
|
|
63
65
|
end
|
|
64
66
|
end
|
|
65
|
-
|
|
67
|
+
|
|
66
68
|
def add_delegates(name, return_type = nil)
|
|
67
|
-
index = TYPE_ORDERING.index(math_type)
|
|
69
|
+
index = TYPE_ORDERING.index(math_type.name)
|
|
68
70
|
larger_types = TYPE_ORDERING[index + 1, TYPE_ORDERING.size]
|
|
69
71
|
larger_types.each do |type|
|
|
72
|
+
type = @type_system.type(nil, type)
|
|
70
73
|
delegate_intrinsic(name, type, return_type || type)
|
|
71
74
|
end
|
|
72
75
|
end
|
|
@@ -80,7 +83,7 @@ module Mirah::JVM::Types
|
|
|
80
83
|
def boolean_operator(name, op)
|
|
81
84
|
args = [math_type]
|
|
82
85
|
add_method(name, args, ComparisonIntrinsic.new(self, name, op, args))
|
|
83
|
-
add_delegates(name,
|
|
86
|
+
add_delegates(name, @type_system.type(nil, 'boolean'))
|
|
84
87
|
end
|
|
85
88
|
|
|
86
89
|
def invert_op(op)
|
|
@@ -155,4 +158,4 @@ module Mirah::JVM::Types
|
|
|
155
158
|
builder.invokestatic box_type, "valueOf", [box_type, math_type]
|
|
156
159
|
end
|
|
157
160
|
end
|
|
158
|
-
end
|
|
161
|
+
end
|
|
@@ -2,9 +2,19 @@ module Mirah
|
|
|
2
2
|
module JVM
|
|
3
3
|
module Types
|
|
4
4
|
class PrimitiveType < Type
|
|
5
|
-
|
|
5
|
+
WIDENING_CONVERSIONS = {
|
|
6
|
+
'byte' => ['byte', 'short', 'int', 'long', 'float', 'double', 'java.lang.Byte', 'java.lang.Object'],
|
|
7
|
+
'short' => ['short', 'int', 'long', 'float', 'double', 'java.lang.Short', 'java.lang.Object'],
|
|
8
|
+
'char' => ['char', 'int', 'long', 'float', 'double', 'java.lang.Character', 'java.lang.Object'],
|
|
9
|
+
'int' => ['int', 'long', 'float', 'double','java.lang.Integer', 'java.lang.Object'],
|
|
10
|
+
'long' => ['long', 'float', 'double', 'java.lang.Long', 'java.lang.Object'],
|
|
11
|
+
'float' => ['float', 'double', 'java.lang.Float', 'java.lang.Object'],
|
|
12
|
+
'double' => ['double', 'java.lang.Double', 'java.lang.Object']
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
def initialize(types, type, wrapper)
|
|
6
16
|
@wrapper = wrapper
|
|
7
|
-
super(type)
|
|
17
|
+
super(types, type)
|
|
8
18
|
end
|
|
9
19
|
|
|
10
20
|
def primitive?
|
|
@@ -19,14 +29,15 @@ module Mirah
|
|
|
19
29
|
method.send "new#{name}array"
|
|
20
30
|
end
|
|
21
31
|
|
|
22
|
-
def interfaces
|
|
32
|
+
def interfaces(include_parent=true)
|
|
23
33
|
[]
|
|
24
34
|
end
|
|
25
35
|
|
|
26
36
|
def convertible_to?(type)
|
|
27
37
|
return true if type == self
|
|
28
|
-
|
|
29
|
-
widening_conversions
|
|
38
|
+
return false if type.array?
|
|
39
|
+
widening_conversions = WIDENING_CONVERSIONS[self.name]
|
|
40
|
+
widening_conversions && widening_conversions.include?(type.name)
|
|
30
41
|
end
|
|
31
42
|
|
|
32
43
|
def superclass
|
|
@@ -35,4 +46,4 @@ module Mirah
|
|
|
35
46
|
end
|
|
36
47
|
end
|
|
37
48
|
end
|
|
38
|
-
end
|
|
49
|
+
end
|
|
@@ -27,10 +27,11 @@ module Mirah::JVM::Types
|
|
|
27
27
|
java_import 'javax.lang.model.element.Element'
|
|
28
28
|
java_import 'javax.lang.model.type.TypeKind'
|
|
29
29
|
java_import 'javax.lang.model.type.TypeMirror'
|
|
30
|
-
java_import 'com.sun.tools.javac.model.JavacElements'
|
|
31
30
|
java_import 'javax.lang.model.util.ElementScanner6'
|
|
32
31
|
java_import 'javax.lang.model.element.AnnotationValueVisitor'
|
|
32
|
+
java_import 'com.sun.tools.javac.model.JavacElements'
|
|
33
33
|
rescue
|
|
34
|
+
# must be after Java 7-15
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
if defined?(JavacElements)
|
|
@@ -81,10 +82,10 @@ module Mirah::JVM::Types
|
|
|
81
82
|
|
|
82
83
|
def classpath
|
|
83
84
|
options = [
|
|
84
|
-
'-classpath',
|
|
85
|
+
'-classpath', @type_factory.classpath
|
|
85
86
|
]
|
|
86
|
-
if
|
|
87
|
-
options << '-bootclasspath' <<
|
|
87
|
+
if @type_factory.bootclasspath
|
|
88
|
+
options << '-bootclasspath' << @type_factory.bootclasspath
|
|
88
89
|
end
|
|
89
90
|
options
|
|
90
91
|
end
|
|
@@ -262,8 +263,12 @@ module Mirah::JVM::Types
|
|
|
262
263
|
end
|
|
263
264
|
|
|
264
265
|
def self.load(file, factory)
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
if defined? JavacElements
|
|
267
|
+
parser = JavaSourceParser.new(file, factory)
|
|
268
|
+
parser.parse
|
|
269
|
+
end
|
|
270
|
+
rescue TypeError
|
|
271
|
+
# 1.6.8 on Java 7, don't use source mirror
|
|
267
272
|
end
|
|
268
273
|
end
|
|
269
|
-
end
|
|
274
|
+
end
|
data/lib/mirah/jvm/types/type.rb
CHANGED
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
module Mirah
|
|
2
2
|
module JVM
|
|
3
3
|
module Types
|
|
4
|
-
class Type
|
|
5
|
-
|
|
4
|
+
class Type
|
|
5
|
+
java_import 'org.mirah.typer.ErrorType'
|
|
6
|
+
java_import 'org.mirah.typer.SpecialType'
|
|
7
|
+
java_import 'org.mirah.typer.ResolvedType'
|
|
8
|
+
|
|
9
|
+
class SpecialType
|
|
10
|
+
def full_name
|
|
11
|
+
name
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
6
15
|
include Mirah::JVM::MethodLookup
|
|
16
|
+
include Mirah::Logging::Logged
|
|
7
17
|
|
|
8
|
-
|
|
18
|
+
include ResolvedType
|
|
9
19
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
end
|
|
20
|
+
attr_reader :name, :type_system
|
|
21
|
+
attr_writer :inner_class
|
|
13
22
|
|
|
14
|
-
def initialize(mirror_or_name)
|
|
23
|
+
def initialize(type_system, mirror_or_name)
|
|
24
|
+
@type_system = type_system
|
|
25
|
+
raise ArgumentError if type_system.nil?
|
|
15
26
|
if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
|
|
16
27
|
@type = mirror_or_name
|
|
17
|
-
name = mirror_or_name.type.class_name
|
|
28
|
+
@name = mirror_or_name.type.class_name
|
|
18
29
|
else
|
|
19
|
-
name = mirror_or_name.to_s
|
|
30
|
+
@name = mirror_or_name.to_s
|
|
20
31
|
end
|
|
21
|
-
super(name, false, false)
|
|
22
32
|
raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
|
|
23
33
|
end
|
|
24
34
|
|
|
@@ -38,10 +48,28 @@ module Mirah
|
|
|
38
48
|
def meta?
|
|
39
49
|
false
|
|
40
50
|
end
|
|
51
|
+
def isMeta
|
|
52
|
+
self.meta?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def generic?
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
def isGeneric
|
|
60
|
+
self.generic?
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def isBlock
|
|
64
|
+
false
|
|
65
|
+
end
|
|
41
66
|
|
|
42
67
|
def array?
|
|
43
68
|
false
|
|
44
69
|
end
|
|
70
|
+
def isArray
|
|
71
|
+
self.array?
|
|
72
|
+
end
|
|
45
73
|
|
|
46
74
|
def primitive?
|
|
47
75
|
false
|
|
@@ -52,7 +80,7 @@ module Mirah
|
|
|
52
80
|
# mirrors for all incoming types without blowing up on e.g. 'boolean' or 'int'
|
|
53
81
|
(@type || BiteScript::ASM::ClassMirror.for_name(@name)).interface? rescue nil
|
|
54
82
|
end
|
|
55
|
-
|
|
83
|
+
|
|
56
84
|
def abstract?
|
|
57
85
|
(@type || BiteScript::ASM::ClassMirror.for_name(@name)).abstract? rescue nil
|
|
58
86
|
end
|
|
@@ -73,29 +101,50 @@ module Mirah
|
|
|
73
101
|
assignable_from?(other)
|
|
74
102
|
end
|
|
75
103
|
|
|
104
|
+
def error?
|
|
105
|
+
false
|
|
106
|
+
end
|
|
107
|
+
def isError
|
|
108
|
+
false
|
|
109
|
+
end
|
|
110
|
+
|
|
76
111
|
def assignable_from?(other)
|
|
77
|
-
return false
|
|
78
|
-
return true if !primitive? && other
|
|
112
|
+
return false unless other
|
|
113
|
+
return true if !primitive? && other.kind_of?(NullType)
|
|
79
114
|
return true if other == self
|
|
80
|
-
return true if other.
|
|
115
|
+
return true if other.matchesAnything
|
|
81
116
|
|
|
82
|
-
|
|
83
|
-
return interface? || abstract? if other.block?
|
|
117
|
+
return interface? || abstract? if other.isBlock
|
|
84
118
|
|
|
85
119
|
return true if jvm_type && (jvm_type == other.jvm_type)
|
|
86
120
|
|
|
121
|
+
return assignable_from?(other.ungeneric) if other.generic?
|
|
122
|
+
|
|
123
|
+
return other.convertible_to?(self) if other.primitive?
|
|
124
|
+
|
|
87
125
|
assignable_from?(other.superclass) ||
|
|
88
126
|
other.interfaces.any? {|i| assignable_from?(i)}
|
|
89
127
|
end
|
|
128
|
+
def assignableFrom(other)
|
|
129
|
+
assignable_from?(other)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def widen(other)
|
|
133
|
+
return self if assignable_from?(other)
|
|
134
|
+
common_parent = (ancestors_and_interfaces & ([other] + other.ancestors_and_interfaces))[0]
|
|
135
|
+
common_parent || ErrorType.new([["Incompatible types #{self} and #{other}."]])
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def matchesAnything; false; end
|
|
90
139
|
|
|
91
140
|
def iterable?
|
|
92
141
|
['java.lang.Iterable',
|
|
93
142
|
'java.util.Iterator',
|
|
94
|
-
'java.util.Enumeration'].any? {|n|
|
|
143
|
+
'java.util.Enumeration'].any? {|n| @type_system.type(nil, n).assignable_from(self)}
|
|
95
144
|
end
|
|
96
145
|
|
|
97
146
|
def component_type
|
|
98
|
-
|
|
147
|
+
@type_system.type(nil, 'java.lang.Object') if iterable?
|
|
99
148
|
end
|
|
100
149
|
|
|
101
150
|
def meta
|
|
@@ -106,6 +155,19 @@ module Mirah
|
|
|
106
155
|
self
|
|
107
156
|
end
|
|
108
157
|
|
|
158
|
+
def generic
|
|
159
|
+
@generic ||= GenericType.new(self)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def ungeneric
|
|
163
|
+
self
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def type_parameters
|
|
167
|
+
return nil unless jvm_type
|
|
168
|
+
jvm_type.type_parameters
|
|
169
|
+
end
|
|
170
|
+
|
|
109
171
|
def basic_type
|
|
110
172
|
self
|
|
111
173
|
end
|
|
@@ -124,7 +186,11 @@ module Mirah
|
|
|
124
186
|
end
|
|
125
187
|
|
|
126
188
|
def inspect(indent=0)
|
|
127
|
-
"#{' ' * indent}#<#{self.class.name} #{name}>"
|
|
189
|
+
"#{' ' * indent}#<#{self.class.name.split(/::/)[-1]} #{name}>"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def to_s
|
|
193
|
+
inspect
|
|
128
194
|
end
|
|
129
195
|
|
|
130
196
|
def newarray(method)
|
|
@@ -141,14 +207,14 @@ module Mirah
|
|
|
141
207
|
|
|
142
208
|
def superclass
|
|
143
209
|
raise "Incomplete type #{self}" unless jvm_type
|
|
144
|
-
|
|
210
|
+
@type_system.type(nil, jvm_type.superclass) if jvm_type.superclass
|
|
145
211
|
end
|
|
146
212
|
|
|
147
|
-
def interfaces
|
|
213
|
+
def interfaces(include_parent=true)
|
|
148
214
|
raise "Incomplete type #{self} (#{self.class})" unless jvm_type
|
|
149
215
|
@interfaces ||= begin
|
|
150
|
-
interfaces = jvm_type.interfaces.map {|i|
|
|
151
|
-
if superclass
|
|
216
|
+
interfaces = jvm_type.interfaces.map {|i| @type_system.type(nil, i)}.to_set
|
|
217
|
+
if superclass && include_parent
|
|
152
218
|
interfaces |= superclass.interfaces
|
|
153
219
|
end
|
|
154
220
|
interfaces.to_a
|
|
@@ -156,6 +222,24 @@ module Mirah
|
|
|
156
222
|
@interfaces
|
|
157
223
|
end
|
|
158
224
|
|
|
225
|
+
def ancestors_and_interfaces
|
|
226
|
+
if self.primitive?
|
|
227
|
+
[]
|
|
228
|
+
else
|
|
229
|
+
ancestors = []
|
|
230
|
+
get_ancestors = lambda {|c| [c.superclass] + c.interfaces(false)}
|
|
231
|
+
new_ancestors = get_ancestors.call(self)
|
|
232
|
+
until new_ancestors.empty?
|
|
233
|
+
klass = new_ancestors.shift
|
|
234
|
+
next if klass.nil? || klass.name == 'java.lang.Object' || klass.isError
|
|
235
|
+
ancestors << klass
|
|
236
|
+
new_ancestors.concat(get_ancestors.call(klass))
|
|
237
|
+
end
|
|
238
|
+
ancestors << @type_system.type(nil, 'java.lang.Object')
|
|
239
|
+
ancestors
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
159
243
|
def astore(builder)
|
|
160
244
|
if primitive?
|
|
161
245
|
builder.send "#{name[0,1]}astore"
|
|
@@ -2,11 +2,14 @@ module Mirah
|
|
|
2
2
|
module JVM
|
|
3
3
|
module Types
|
|
4
4
|
class TypeDefinition < Type
|
|
5
|
-
|
|
5
|
+
java_import 'mirah.lang.ast.InterfaceDeclaration'
|
|
6
|
+
attr_accessor :node, :scope
|
|
6
7
|
|
|
7
|
-
def initialize(name, node)
|
|
8
|
+
def initialize(types, scope, name, node)
|
|
8
9
|
raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
|
|
9
10
|
raise ArgumentError, "Bad name #{name}" if name.include? ?/
|
|
11
|
+
@type_system = types
|
|
12
|
+
@scope = scope
|
|
10
13
|
@name = name
|
|
11
14
|
@node = node
|
|
12
15
|
raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
|
|
@@ -16,29 +19,41 @@ module Mirah
|
|
|
16
19
|
if @type
|
|
17
20
|
@type.name.tr('/', '.')
|
|
18
21
|
else
|
|
19
|
-
|
|
22
|
+
if !@name.include?(?.) && scope.package
|
|
23
|
+
"#{scope.package}.#{@name}"
|
|
24
|
+
else
|
|
25
|
+
@name
|
|
26
|
+
end
|
|
20
27
|
end
|
|
21
28
|
end
|
|
22
29
|
|
|
23
30
|
def superclass
|
|
24
|
-
|
|
31
|
+
if node && node.superclass
|
|
32
|
+
@type_system.get(scope, node.superclass.typeref).resolve
|
|
33
|
+
else
|
|
34
|
+
@type_system.type(nil, 'java.lang.Object')
|
|
35
|
+
end
|
|
25
36
|
end
|
|
26
37
|
|
|
27
|
-
def interfaces
|
|
38
|
+
def interfaces(include_parent=true)
|
|
28
39
|
if node
|
|
29
|
-
node.interfaces
|
|
40
|
+
node.interfaces.map {|n| @type_system.get(scope, n.typeref).resolve}
|
|
30
41
|
else
|
|
31
42
|
[]
|
|
32
43
|
end
|
|
33
44
|
end
|
|
34
45
|
|
|
46
|
+
def abstract?
|
|
47
|
+
node && (node.kind_of?(InterfaceDeclaration) || node.annotated_abstract?)
|
|
48
|
+
end
|
|
49
|
+
|
|
35
50
|
def define(builder)
|
|
36
|
-
class_name =
|
|
37
|
-
abstract = node && node.abstract
|
|
51
|
+
class_name = name.tr('.', '/')
|
|
52
|
+
abstract = node && node.kind_of?(InterfaceDeclaration) #node.abstract
|
|
38
53
|
@type ||= builder.define_class(
|
|
39
54
|
class_name,
|
|
40
55
|
:visibility => :public,
|
|
41
|
-
:abstract => abstract
|
|
56
|
+
:abstract => abstract?,
|
|
42
57
|
:superclass => superclass,
|
|
43
58
|
:interfaces => interfaces)
|
|
44
59
|
end
|
|
@@ -52,4 +67,4 @@ module Mirah
|
|
|
52
67
|
end
|
|
53
68
|
end
|
|
54
69
|
end
|
|
55
|
-
end
|
|
70
|
+
end
|