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.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. 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(BiteScript::ASM::ClassMirror.load('java.lang.Object'))
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
- !other.primitive?
18
+ assignable_from(other)
19
19
  end
20
20
 
21
21
  def assignable_from?(other)
22
- !other.primitive?
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, Boolean) do; end
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, Boolean)
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
- def initialize(type, wrapper)
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
- widening_conversions = WIDENING_CONVERSIONS[self]
29
- widening_conversions && widening_conversions.include?(type)
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', Mirah::AST.type_factory.classpath
85
+ '-classpath', @type_factory.classpath
85
86
  ]
86
- if Mirah::AST.type_factory.bootclasspath
87
- options << '-bootclasspath' << Mirah::AST.type_factory.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
- parser = JavaSourceParser.new(file, factory)
266
- parser.parse
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
@@ -1,24 +1,34 @@
1
1
  module Mirah
2
2
  module JVM
3
3
  module Types
4
- class Type < AST::TypeReference
5
- include Java::DubyLangCompiler::Class
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
- attr_writer :inner_class
18
+ include ResolvedType
9
19
 
10
- def log(message)
11
- puts "* [JVM::Types] #{message}" if Mirah::JVM::Compiler::JVMBytecode.verbose
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 if other.nil?
78
- return true if !primitive? && other == Null
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.error? || other.unreachable?
115
+ return true if other.matchesAnything
81
116
 
82
- # TODO should we allow more here?
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| AST.type(nil, n).assignable_from(self)}
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
- AST.type(nil, 'java.lang.Object') if iterable?
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
- AST.type(nil, jvm_type.superclass) if jvm_type.superclass
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| AST.type(nil, i)}.to_set
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
- attr_accessor :node
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
- @name
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
- (node && node.superclass) || Object
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 = @name.tr('.', '/')
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