mirah 0.0.4-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 (141) hide show
  1. data/History.txt +15 -0
  2. data/README.txt +51 -0
  3. data/Rakefile +86 -0
  4. data/bin/duby +10 -0
  5. data/bin/dubyc +10 -0
  6. data/bin/dubyp +10 -0
  7. data/bin/jrubyp +36 -0
  8. data/bin/mirah +9 -0
  9. data/bin/mirah.cmd +1 -0
  10. data/bin/mirahc +9 -0
  11. data/bin/mirahc.cmd +1 -0
  12. data/bin/mirahp +9 -0
  13. data/bin/mirahp.cmd +1 -0
  14. data/examples/ant/example-build.xml +7 -0
  15. data/examples/appengine/Rakefile +19 -0
  16. data/examples/appengine/Readme +29 -0
  17. data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
  18. data/examples/appengine/src/org/mirah/list.dhtml +15 -0
  19. data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
  20. data/examples/bintrees.mirah +66 -0
  21. data/examples/construction.mirah +8 -0
  22. data/examples/dynamic.mirah +17 -0
  23. data/examples/edb.mirah +3 -0
  24. data/examples/fib.mirah +16 -0
  25. data/examples/fields.mirah +22 -0
  26. data/examples/fractal.mirah +55 -0
  27. data/examples/java_thing.mirah +13 -0
  28. data/examples/plugins/appengine/Rakefile +55 -0
  29. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
  30. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
  31. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
  32. data/examples/simple_class.mirah +12 -0
  33. data/examples/sort_closure.mirah +7 -0
  34. data/examples/swing.mirah +20 -0
  35. data/examples/tak.mirah +15 -0
  36. data/examples/test.edb +9 -0
  37. data/examples/wiki/Rakefile +18 -0
  38. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
  39. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
  40. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
  41. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
  42. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
  43. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
  44. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  45. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  46. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  47. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  48. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  49. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  50. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  51. data/examples/wiki/war/app.yaml +21 -0
  52. data/examples/wiki/war/public/favicon.ico +0 -0
  53. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  54. data/examples/wiki/war/public/images/back.gif +0 -0
  55. data/examples/wiki/war/public/images/dir.gif +0 -0
  56. data/examples/wiki/war/public/images/file.gif +0 -0
  57. data/examples/wiki/war/public/javascripts/prettify.js +61 -0
  58. data/examples/wiki/war/public/robots.txt +0 -0
  59. data/examples/wiki/war/public/stylesheets/main.css +156 -0
  60. data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
  61. data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
  62. data/examples/wiki/war/public/stylesheets/source.css +21 -0
  63. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  64. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  65. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  66. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  67. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  68. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  69. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  70. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  71. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  72. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  73. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  74. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  75. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  76. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  77. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  78. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  79. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  80. data/examples/wiki/war/public/wmd/showdown.js +421 -0
  81. data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
  82. data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
  83. data/examples/wiki/war/public/wmd/wmd.js +73 -0
  84. data/javalib/JRubyParser.jar +0 -0
  85. data/javalib/dynalang-invoke-0.1.jar +0 -0
  86. data/javalib/mirah-bootstrap.jar +0 -0
  87. data/javalib/mirah-parser.jar +0 -0
  88. data/lib/duby.rb +2 -0
  89. data/lib/mirah.rb +338 -0
  90. data/lib/mirah/appengine_tasks.rb +146 -0
  91. data/lib/mirah/ast.rb +615 -0
  92. data/lib/mirah/ast/call.rb +307 -0
  93. data/lib/mirah/ast/class.rb +311 -0
  94. data/lib/mirah/ast/flow.rb +364 -0
  95. data/lib/mirah/ast/intrinsics.rb +470 -0
  96. data/lib/mirah/ast/literal.rb +154 -0
  97. data/lib/mirah/ast/local.rb +89 -0
  98. data/lib/mirah/ast/method.rb +360 -0
  99. data/lib/mirah/ast/scope.rb +208 -0
  100. data/lib/mirah/ast/structure.rb +226 -0
  101. data/lib/mirah/ast/type.rb +130 -0
  102. data/lib/mirah/compiler.rb +341 -0
  103. data/lib/mirah/env.rb +33 -0
  104. data/lib/mirah/jvm/base.rb +258 -0
  105. data/lib/mirah/jvm/compiler.rb +885 -0
  106. data/lib/mirah/jvm/method_lookup.rb +203 -0
  107. data/lib/mirah/jvm/source_compiler.rb +737 -0
  108. data/lib/mirah/jvm/source_generator/builder.rb +444 -0
  109. data/lib/mirah/jvm/source_generator/loops.rb +110 -0
  110. data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
  111. data/lib/mirah/jvm/source_generator/typer.rb +11 -0
  112. data/lib/mirah/jvm/typer.rb +151 -0
  113. data/lib/mirah/jvm/types.rb +416 -0
  114. data/lib/mirah/jvm/types/basic_types.rb +33 -0
  115. data/lib/mirah/jvm/types/boolean.rb +17 -0
  116. data/lib/mirah/jvm/types/enumerable.rb +65 -0
  117. data/lib/mirah/jvm/types/extensions.rb +86 -0
  118. data/lib/mirah/jvm/types/factory.rb +186 -0
  119. data/lib/mirah/jvm/types/floats.rb +86 -0
  120. data/lib/mirah/jvm/types/integers.rb +171 -0
  121. data/lib/mirah/jvm/types/intrinsics.rb +376 -0
  122. data/lib/mirah/jvm/types/literals.rb +74 -0
  123. data/lib/mirah/jvm/types/methods.rb +614 -0
  124. data/lib/mirah/jvm/types/number.rb +143 -0
  125. data/lib/mirah/nbcompiler.rb +29 -0
  126. data/lib/mirah/plugin/edb.rb +29 -0
  127. data/lib/mirah/plugin/gwt.rb +173 -0
  128. data/lib/mirah/plugin/java.rb +55 -0
  129. data/lib/mirah/transform.rb +266 -0
  130. data/lib/mirah/transform2.rb +728 -0
  131. data/lib/mirah/typer.rb +407 -0
  132. data/lib/mirah_task.rb +107 -0
  133. data/test/test_ast.rb +359 -0
  134. data/test/test_compilation.rb +112 -0
  135. data/test/test_env.rb +42 -0
  136. data/test/test_gwt.rb +58 -0
  137. data/test/test_java_typer.rb +183 -0
  138. data/test/test_javac_compiler.rb +63 -0
  139. data/test/test_jvm_compiler.rb +2607 -0
  140. data/test/test_typer.rb +221 -0
  141. metadata +235 -0
@@ -0,0 +1,188 @@
1
+ require 'mirah/ast'
2
+
3
+ module Duby::AST
4
+ class TempValue
5
+ def initialize(node, compiler=nil, value=nil)
6
+ if compiler.nil?
7
+ @tempname = node
8
+ else
9
+ @tempname = compiler.temp(node, value)
10
+ @tempvalue = value || node
11
+ end
12
+ end
13
+
14
+ def compile(compiler, expression)
15
+ if expression
16
+ compiler.method.print @tempname
17
+ end
18
+ end
19
+
20
+ def reload(compiler)
21
+ compiler.assign(@tempname, @tempvalue)
22
+ end
23
+ end
24
+
25
+ class Node
26
+ def expr?(compiler)
27
+ true
28
+ end
29
+
30
+ def precompile(compiler)
31
+ if expr?(compiler)
32
+ self
33
+ else
34
+ temp(compiler)
35
+ end
36
+ end
37
+
38
+ def temp(compiler, value=nil)
39
+ TempValue.new(self, compiler, value)
40
+ end
41
+ end
42
+
43
+ class Body
44
+ def expr?(compiler)
45
+ false
46
+ end
47
+ end
48
+
49
+ class If
50
+ def expr?(compiler)
51
+ return false unless condition.predicate.expr?(compiler)
52
+ return false unless body.nil? || body.expr?(compiler)
53
+ return false unless self.else.nil? || self.else.expr?(compiler)
54
+ true
55
+ end
56
+ end
57
+
58
+ class Loop
59
+ def expr?(compiler)
60
+ false
61
+ end
62
+
63
+ def precompile(compiler)
64
+ compile(compiler, false)
65
+ temp(compiler, 'null')
66
+ end
67
+ end
68
+
69
+ class Call
70
+ def method(compiler=nil)
71
+ @method ||= begin
72
+ arg_types = parameters.map {|p| p.inferred_type}
73
+ target.inferred_type.get_method(name, arg_types)
74
+ end
75
+ end
76
+
77
+ def expr?(compiler)
78
+ target.expr?(compiler) &&
79
+ parameters.all? {|p| p.expr?(compiler)} &&
80
+ !method.return_type.kind_of?(Duby::AST::InlineCode) &&
81
+ !method.return_type.void?
82
+ end
83
+
84
+ def precompile_target(compiler)
85
+ if method.return_type.void? && target.expr?(compiler)
86
+ TempValue.new(target, compiler)
87
+ else
88
+ target.precompile(compiler)
89
+ end
90
+ end
91
+ end
92
+
93
+ class FunctionalCall
94
+ def method(compiler)
95
+ @method ||= begin
96
+ arg_types = parameters.map {|p| p.inferred_type}
97
+ @self_type.get_method(name, arg_types)
98
+ end
99
+ end
100
+
101
+ def expr?(compiler)
102
+ parameters.all? {|p| p.expr?(compiler)} &&
103
+ (cast? || !method(compiler).return_type.void?)
104
+ end
105
+ end
106
+
107
+ # TODO merge with FunctionalCall logic (almost identical)
108
+ class Super
109
+ def method(compiler)
110
+ @method ||= begin
111
+ arg_types = parameters.map {|p| p.inferred_type}
112
+ compiler.self_type.superclass.get_method(name, arg_types)
113
+ end
114
+ end
115
+
116
+ def expr?(compiler)
117
+ parameters.all? {|p| p.expr?(compiler)} &&
118
+ !method(compiler).return_type.void?
119
+ end
120
+ end
121
+
122
+ class EmtpyArray
123
+ def expr?(compiler)
124
+ size.expr?(compiler)
125
+ end
126
+ end
127
+
128
+ class LocalAssignment
129
+ def expr?(compiler)
130
+ compiler.method.local?(name) && value.expr?(compiler)
131
+ end
132
+
133
+ def precompile(compiler)
134
+ if expr?(compiler)
135
+ self
136
+ else
137
+ compile(compiler, false)
138
+ TempValue.new(name)
139
+ end
140
+ end
141
+ end
142
+
143
+ class ToString
144
+ def expr?(compiler)
145
+ body.expr?(compiler)
146
+ end
147
+
148
+ def temp(compiler, value=nil)
149
+ TempValue.new(body, compiler, value)
150
+ end
151
+ end
152
+
153
+ class StringConcat
154
+ def expr?(compiler)
155
+ children.all? {|x| x.expr?(compiler)}
156
+ end
157
+ end
158
+
159
+ class Return
160
+ def expr?(compiler)
161
+ false
162
+ end
163
+ end
164
+
165
+ class Raise
166
+ def expr?(compiler)
167
+ false
168
+ end
169
+ end
170
+
171
+ class Rescue
172
+ def expr?(compiler)
173
+ false
174
+ end
175
+ end
176
+
177
+ class Ensure
178
+ def expr?(compiler)
179
+ false
180
+ end
181
+ end
182
+
183
+ class FieldAssignment
184
+ def expr?(compiler)
185
+ false
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,11 @@
1
+ require 'mirah/jvm/typer'
2
+ require 'mirah/jvm/source_generator/builder'
3
+
4
+ module Duby
5
+ module Typer
6
+ class JavaSource < JVM
7
+ include Duby::JVM::Types
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,151 @@
1
+ require 'mirah/typer'
2
+ require 'mirah/jvm/types'
3
+ require 'mirah/jvm/types/factory'
4
+
5
+ module Duby
6
+ module Typer
7
+ class JVM < Simple
8
+ include Duby::JVM::Types
9
+
10
+ attr_reader :transformer
11
+
12
+ def initialize(transformer)
13
+ @factory = AST.type_factory
14
+ @transformer = transformer
15
+ unless @factory.kind_of? TypeFactory
16
+ raise "TypeFactory not installed"
17
+ end
18
+ @known_types = @factory.known_types
19
+ @known_types['dynamic'] = DynamicType.new
20
+ @errors = []
21
+ end
22
+
23
+ def set_filename(scope, filename)
24
+ classname = Duby::Compiler::JVM.classname_from_filename(filename)
25
+ main_class = @factory.declare_type(scope, classname)
26
+ @known_types['self'] = main_class.meta
27
+ end
28
+
29
+ def type_reference(scope, name, array=false, meta=false)
30
+ @factory.type(scope, name, array, meta)
31
+ end
32
+
33
+ def name
34
+ "JVM"
35
+ end
36
+
37
+ def type_definition(scope, name, superclass, interfaces)
38
+ imports = scope.static_scope.imports
39
+ name = imports[name] while imports.include?(name)
40
+ package = scope.static_scope.package
41
+ unless name =~ /\./ || package.empty?
42
+ name = "#{package}.#{name}"
43
+ end
44
+
45
+ @known_types[name]
46
+ end
47
+
48
+ def null_type
49
+ Null
50
+ end
51
+
52
+ def no_type
53
+ Void
54
+ end
55
+
56
+ def array_type
57
+ # TODO: allow other types for pre-1.2 profiles
58
+ type_reference(nil, "java.util.List")
59
+ end
60
+
61
+ def hash_type
62
+ # TODO: allow other types for pre-1.2 profiles
63
+ type_reference(nil, "java.util.Map")
64
+ end
65
+
66
+ def regexp_type
67
+ type_reference(nil, "java.util.regex.Pattern")
68
+ end
69
+
70
+ def known_type(scope, name)
71
+ @factory.known_type(scope, name)
72
+ end
73
+
74
+ def fixnum_type(value)
75
+ FixnumLiteral.new(value)
76
+ end
77
+
78
+ def float_type(value)
79
+ FloatLiteral.new(value)
80
+ end
81
+
82
+ def learn_method_type(target_type, name, parameter_types, type, exceptions)
83
+ static = target_type.meta?
84
+ if static
85
+ target_type.unmeta.declare_static_method(name, parameter_types, type, exceptions)
86
+ else
87
+ target_type.declare_method(name, parameter_types, type, exceptions)
88
+ end
89
+ super
90
+ end
91
+
92
+ def infer_signature(method_def)
93
+ signature = method_def.signature
94
+ sig_args = signature.dup
95
+ return_type = sig_args.delete(:return)
96
+ exceptions = sig_args.delete(:throws)
97
+ args = method_def.arguments.args || []
98
+ static = method_def.kind_of? Duby::AST::StaticMethodDefinition
99
+ if sig_args.size != args.size
100
+ # If the superclass declares one method with the same name and
101
+ # same number of arguments, assume we're overriding it.
102
+ found = nil
103
+ ambiguous = false
104
+ classes = [self_type.superclass] + self_type.interfaces
105
+ while classes.size > 0
106
+ cls = classes.pop
107
+ if static
108
+ methods = cls.declared_class_methods
109
+ else
110
+ methods = cls.declared_instance_methods
111
+ end
112
+ methods.each do |method|
113
+ if method.name == method_def.name &&
114
+ method.argument_types.size == args.size
115
+ if found && found.argument_types != method.argument_types
116
+ ambiguous = true
117
+ else
118
+ found ||= method
119
+ end
120
+ end
121
+ end
122
+ classes << cls.superclass if cls.superclass
123
+ end
124
+ if found && !ambiguous
125
+ signature[:return] = found.return_type
126
+ signature[:throws] = found.exceptions
127
+ args.zip(found.argument_types) do |arg, type|
128
+ signature[arg.name.intern] = type
129
+ end
130
+ end
131
+ elsif signature[:return].nil? && !static
132
+ arg_types = args.map do |arg|
133
+ signature[arg.name.intern]
134
+ end
135
+ method = self_type.find_method(
136
+ self_type, method_def.name, arg_types, false)
137
+ interfaces = self_type.interfaces.dup
138
+ until method || interfaces.empty?
139
+ interface = interfaces.pop
140
+ method = interface.find_method(
141
+ interface, method_def.name, arg_types, false)
142
+ end
143
+ if method
144
+ signature[:return] = method.return_type
145
+ signature[:throws] = method.exceptions
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,416 @@
1
+ require 'bitescript'
2
+ require 'mirah/ast'
3
+ require 'mirah/jvm/method_lookup'
4
+ require 'mirah/jvm/compiler'
5
+ require 'set'
6
+
7
+ module Duby
8
+ module JVM
9
+ module Types
10
+ class Type < AST::TypeReference
11
+ include Java::DubyLangCompiler::Class
12
+ include Duby::JVM::MethodLookup
13
+
14
+ attr_writer :inner_class
15
+
16
+ def log(message)
17
+ puts "* [JVM::Types] #{message}" if Duby::Compiler::JVM.verbose
18
+ end
19
+
20
+ def initialize(mirror_or_name)
21
+ if mirror_or_name.kind_of?(BiteScript::ASM::ClassMirror)
22
+ @type = mirror_or_name
23
+ name = mirror_or_name.type.class_name
24
+ else
25
+ name = mirror_or_name.to_s
26
+ end
27
+ super(name, false, false)
28
+ raise ArgumentError, "Bad type #{mirror_or_name}" if name =~ /Java::/
29
+ end
30
+
31
+ def full_name
32
+ desc = BiteScript::Signature.class_id(self)
33
+ BiteScript::ASM::Type.get_type(desc).class_name
34
+ end
35
+
36
+ def jvm_type
37
+ @type
38
+ end
39
+
40
+ def void?
41
+ false
42
+ end
43
+
44
+ def meta?
45
+ false
46
+ end
47
+
48
+ def array?
49
+ false
50
+ end
51
+
52
+ def primitive?
53
+ false
54
+ end
55
+
56
+ def interface?
57
+ @type.interface?
58
+ end
59
+
60
+ def dynamic?
61
+ false
62
+ end
63
+
64
+ def inner_class?
65
+ @inner_class
66
+ end
67
+
68
+ def is_parent(other)
69
+ assignable_from?(other)
70
+ end
71
+
72
+ def compatible?(other)
73
+ assignable_from?(other)
74
+ end
75
+
76
+ def assignable_from?(other)
77
+ return false if other.nil?
78
+ return true if !primitive? && other == Null
79
+ return true if other == self
80
+ return true if other.error? || other.unreachable?
81
+
82
+ # TODO should we allow more here?
83
+ return interface? if other.block?
84
+
85
+ return true if jvm_type && (jvm_type == other.jvm_type)
86
+
87
+ assignable_from?(other.superclass) ||
88
+ other.interfaces.any? {|i| assignable_from?(i)}
89
+ end
90
+
91
+ def iterable?
92
+ ['java.lang.Iterable',
93
+ 'java.util.Iterator',
94
+ 'java.util.Enumeration'].any? {|n| AST.type(nil, n).assignable_from(self)}
95
+ end
96
+
97
+ def component_type
98
+ AST.type(nil, 'java.lang.Object') if iterable?
99
+ end
100
+
101
+ def meta
102
+ @meta ||= MetaType.new(self)
103
+ end
104
+
105
+ def unmeta
106
+ self
107
+ end
108
+
109
+ def basic_type
110
+ self
111
+ end
112
+
113
+ def array_type
114
+ @array_type ||= Duby::JVM::Types::ArrayType.new(self)
115
+ end
116
+
117
+ def prefix
118
+ 'a'
119
+ end
120
+
121
+ # is this a 64 bit type?
122
+ def wide?
123
+ false
124
+ end
125
+
126
+ def inspect(indent=0)
127
+ "#{' ' * indent}#<#{self.class.name} #{name}>"
128
+ end
129
+
130
+ def newarray(method)
131
+ method.anewarray(self)
132
+ end
133
+
134
+ def superclass
135
+ raise "Incomplete type #{self}" unless jvm_type
136
+ AST.type(nil, jvm_type.superclass) if jvm_type.superclass
137
+ end
138
+
139
+ def interfaces
140
+ raise "Incomplete type #{self} (#{self.class})" unless jvm_type
141
+ @interfaces ||= begin
142
+ interfaces = jvm_type.interfaces.map {|i| AST.type(nil, i)}.to_set
143
+ if superclass
144
+ interfaces |= superclass.interfaces
145
+ end
146
+ interfaces.to_a
147
+ end
148
+ @interfaces
149
+ end
150
+
151
+ def astore(builder)
152
+ if primitive?
153
+ builder.send "#{name[0,1]}astore"
154
+ else
155
+ builder.aastore
156
+ end
157
+ end
158
+
159
+ def aload(builder)
160
+ if primitive?
161
+ builder.send "#{name[0,1]}aload"
162
+ else
163
+ builder.aaload
164
+ end
165
+ end
166
+ end
167
+
168
+ class PrimitiveType < Type
169
+ def initialize(type, wrapper)
170
+ @wrapper = wrapper
171
+ super(type)
172
+ end
173
+
174
+ def primitive?
175
+ true
176
+ end
177
+
178
+ def primitive_type
179
+ @wrapper::TYPE
180
+ end
181
+
182
+ def newarray(method)
183
+ method.send "new#{name}array"
184
+ end
185
+
186
+ def interfaces
187
+ []
188
+ end
189
+
190
+ def convertible_to?(type)
191
+ return true if type == self
192
+ widening_conversions = WIDENING_CONVERSIONS[self]
193
+ widening_conversions && widening_conversions.include?(type)
194
+ end
195
+
196
+ def superclass
197
+ nil
198
+ end
199
+ end
200
+
201
+ class MetaType < Type
202
+ attr_reader :unmeta
203
+
204
+ def initialize(unmeta)
205
+ @name = unmeta.name
206
+ @unmeta = unmeta
207
+ end
208
+
209
+ def basic_type
210
+ @unmeta.basic_type
211
+ end
212
+
213
+ def meta?
214
+ true
215
+ end
216
+
217
+ def meta
218
+ self
219
+ end
220
+
221
+ def superclass
222
+ @unmeta.superclass.meta if @unmeta.superclass
223
+ end
224
+
225
+ def interfaces
226
+ []
227
+ end
228
+
229
+ def jvm_type
230
+ unmeta.jvm_type
231
+ end
232
+
233
+ def inner_class?
234
+ basic_type.inner_class?
235
+ end
236
+ end
237
+
238
+ class NullType < Type
239
+ def initialize
240
+ super('java.lang.Object')
241
+ end
242
+
243
+ def to_s
244
+ "Type(null)"
245
+ end
246
+
247
+ def compatible?(other)
248
+ !other.primitive?
249
+ end
250
+ end
251
+
252
+ class VoidType < PrimitiveType
253
+ def initialize
254
+ super('void', Java::JavaLang::Void)
255
+ end
256
+
257
+ def void?
258
+ true
259
+ end
260
+
261
+ def return(builder)
262
+ builder.returnvoid
263
+ end
264
+ end
265
+
266
+ class ArrayType < Type
267
+ attr_reader :component_type
268
+
269
+ def initialize(component_type)
270
+ @component_type = component_type
271
+ if @component_type.jvm_type
272
+ #@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
273
+ else
274
+ # FIXME: THIS IS WRONG, but I don't know how to fix it
275
+ #@type = @component_type
276
+ end
277
+ @name = component_type.name
278
+ end
279
+
280
+ def array?
281
+ true
282
+ end
283
+
284
+ def iterable?
285
+ true
286
+ end
287
+
288
+ def inner_class?
289
+ basic_type.inner_class?
290
+ end
291
+
292
+ def basic_type
293
+ component_type.basic_type
294
+ end
295
+
296
+ def superclass
297
+ Object
298
+ end
299
+
300
+ def interfaces
301
+ []
302
+ end
303
+
304
+ def meta
305
+ @meta ||= ArrayMetaType.new(self)
306
+ end
307
+ end
308
+
309
+ class ArrayMetaType < MetaType; end
310
+
311
+ class DynamicType < Type
312
+ ObjectType = Type.new('java.lang.Object')
313
+
314
+ def initialize
315
+ # For naming, bytecode purposes, we are an Object
316
+ @name = "java.lang.Object"
317
+ end
318
+
319
+ def basic_type
320
+ self
321
+ end
322
+
323
+ def is_parent(other)
324
+ ObjectType.assignable_from?(other)
325
+ end
326
+
327
+ def assignable_from?(other)
328
+ ObjectType.assignable_from?(other)
329
+ end
330
+
331
+ def jvm_type
332
+ java.lang.Object
333
+ end
334
+
335
+ def dynamic?
336
+ true
337
+ end
338
+ end
339
+
340
+ class TypeDefinition < Type
341
+ attr_accessor :node
342
+
343
+ def initialize(name, node)
344
+ raise ArgumentError, "Bad name #{name}" if name[0,1] == '.'
345
+ raise ArgumentError, "Bad name #{name}" if name.include? ?/
346
+ @name = name
347
+ @node = node
348
+ raise ArgumentError, "Bad type #{name}" if self.name =~ /Java::/
349
+ end
350
+
351
+ def name
352
+ if @type
353
+ @type.name.tr('/', '.')
354
+ else
355
+ @name
356
+ end
357
+ end
358
+
359
+ def superclass
360
+ (node && node.superclass) || Object
361
+ end
362
+
363
+ def interfaces
364
+ if node
365
+ node.interfaces
366
+ else
367
+ []
368
+ end
369
+ end
370
+
371
+ def define(builder)
372
+ class_name = @name.tr('.', '/')
373
+ abstract = node && node.abstract
374
+ @type ||= builder.define_class(
375
+ class_name,
376
+ :visibility => :public,
377
+ :abstract => abstract,
378
+ :superclass => superclass,
379
+ :interfaces => interfaces)
380
+ end
381
+
382
+ def meta
383
+ @meta ||= TypeDefMeta.new(self)
384
+ end
385
+ end
386
+
387
+ class InterfaceDefinition < TypeDefinition
388
+ def initialize(name, node)
389
+ super(name, node)
390
+ end
391
+
392
+ def define(builder)
393
+ class_name = @name.tr('.', '/')
394
+ @type ||= builder.public_interface(class_name, *interfaces)
395
+ end
396
+
397
+ def interface?
398
+ true
399
+ end
400
+ end
401
+
402
+ class TypeDefMeta < MetaType
403
+ end
404
+ end
405
+ end
406
+ end
407
+
408
+ require 'mirah/jvm/types/intrinsics'
409
+ require 'mirah/jvm/types/methods'
410
+ require 'mirah/jvm/types/number'
411
+ require 'mirah/jvm/types/integers'
412
+ require 'mirah/jvm/types/boolean'
413
+ require 'mirah/jvm/types/floats'
414
+ require 'mirah/jvm/types/basic_types'
415
+ require 'mirah/jvm/types/literals'
416
+ require 'mirah/jvm/types/extensions'