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.
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