mirah 0.0.12-java → 0.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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
|