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
@@ -16,95 +16,141 @@
16
16
  module Mirah
17
17
  module JVM
18
18
  module MethodLookup
19
- # dummy log; it's expected the inclusion target will have it
20
- def log(msg); end
19
+ java_import 'mirah.lang.ast.ConstructorDefinition'
20
+
21
+ def find_method2(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
22
+ find_method(mapped_type, name, mapped_params, macro_params, meta, scope, &block)
23
+ rescue NameError => ex
24
+ raise ex unless ex.message.include?(name)
25
+ if block_given?
26
+ block.call(ex)
27
+ end
28
+ ex
29
+ end
21
30
 
22
- def find_method(mapped_type, name, mapped_params, meta)
23
- raise ArgumentError if mapped_params.any? {|p| p.nil?}
31
+ def find_method(mapped_type, name, mapped_params, macro_params, meta, scope=nil, &block)
32
+ if mapped_type.error?
33
+ raise "WTF?!?"
34
+ end
24
35
 
25
- if name == 'new'
26
- if meta
27
- name = "<init>"
36
+ if name == 'new' && meta # we're calling SomeClass.new
37
+ name = "<init>"
38
+ constructor = true
39
+ mapped_type = mapped_type.unmeta
40
+ meta = false
41
+ elsif name == 'new' && !meta # we're calling some_instance.new
42
+ constructor = false
43
+ elsif name == '<init>' && !meta # how do we get here?
44
+ constructor = true
45
+ elsif name == 'initialize' && !meta && scope
46
+ context = scope.context
47
+ if context.kind_of?(ConstructorDefinition) || context.findAncesor(ConstructorDefinition.class)
28
48
  constructor = true
29
- else
30
- constructor = false
49
+ name = '<init>'
31
50
  end
32
51
  end
33
52
 
34
- begin
53
+ if block_given?
35
54
  if constructor
36
- method = mapped_type.constructor(*mapped_params)
55
+ mapped_type.add_method_listener('initialize') {block.call(find_method2(mapped_type.meta, 'new', mapped_params, macro_params, true))}
37
56
  else
38
- method = mapped_type.java_method(name, *mapped_params)
57
+ mapped_type.add_method_listener(name) {block.call(find_method2(mapped_type, name, mapped_params, macro_params, meta))}
58
+ end
59
+ block.call(find_method(mapped_type, name, mapped_params, macro_params, meta))
60
+ return
61
+ end
62
+
63
+ begin
64
+ unless mapped_params.any? {|p| p.nil? || p.isError}
65
+ if constructor
66
+ method = mapped_type.constructor(*mapped_params)
67
+ else
68
+ method = mapped_type.java_method(name, *mapped_params)
69
+ end
39
70
  end
40
- rescue NameError
71
+ rescue NameError => ex
72
+ # TODO return nil instead of raising an exception if the method doesn't exist.
73
+ raise ex unless ex.message =~ /#{Regexp.quote(mapped_type.name)}\.#{Regexp.quote(name)}|No constructor #{Regexp.quote(mapped_type.name)}/
74
+ end
75
+
76
+ macro = mapped_type.macro(name, macro_params)
77
+ if method && macro
78
+ method = nil # Need full lookup to determine precedence.
79
+ elsif method.nil? && macro
80
+ method = macro
81
+ elsif method.nil?
41
82
  # exact args failed, do a deeper search
42
- log "No exact match for #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})"
83
+ log "No exact match for #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
43
84
 
44
- method = find_jls(mapped_type, name, mapped_params, meta, constructor)
85
+ method = find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope)
45
86
 
46
87
  unless method
47
- log "Failed to locate method #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})"
88
+ log "Failed to locate method #{mapped_type.name}.#{name}(#{mapped_params.map(&:name).join ', '})" if mapped_params.all?
48
89
  return nil
49
90
  end
50
91
  end
51
92
 
52
- log "Found method #{method.declaring_class.name}.#{name}(#{method.argument_types.map(&:name).join ', '}) from #{mapped_type.name}"
93
+ log "Found method #{method.declaring_class.name}.#{name}(#{method.argument_types.map(&:name).join ', '}) from #{mapped_type.name}" if method
53
94
  return method
54
95
  end
55
96
 
56
- def find_jls(mapped_type, name, mapped_params, meta, constructor)
97
+ def find_jls(mapped_type, name, mapped_params, macro_params, meta, constructor, scope=nil)
57
98
  interfaces = []
58
- if constructor
59
- by_name = mapped_type.unmeta.declared_constructors
99
+ by_name = if constructor
100
+ mapped_type.unmeta.declared_constructors
60
101
  elsif meta
61
- by_name = mapped_type.declared_class_methods(name)
102
+ mapped_type.declared_class_methods(name)
62
103
  else
63
- by_name = []
64
- cls = mapped_type
65
- while cls && !cls.error?
66
- by_name += cls.declared_instance_methods(name)
67
- interfaces.concat(cls.interfaces)
68
- cls = cls.superclass
69
- end
70
- if mapped_type.interface? # TODO or abstract
71
- seen = {}
72
- until interfaces.empty?
73
- interface = interfaces.pop
74
- next if seen[interface] || interface.error?
75
- seen[interface] = true
76
- interfaces.concat(interface.interfaces)
77
- by_name += interface.declared_instance_methods(name)
78
- end
79
- end
104
+ mapped_type.find_callable_methods(name)
80
105
  end
81
- # filter by arity
82
- by_name_and_arity = by_name.select {|m| m.argument_types.size == mapped_params.size}
106
+ method = find_jls2(mapped_type, name, mapped_params, meta, by_name, true, scope)
107
+ return method if (constructor || macro_params.nil?)
108
+ macros = mapped_type.find_callable_macros(name)
109
+ if macros.size != 0
110
+ log "Found potential macro match for #{mapped_type.name}.#{name}(#{macro_params.map(&:full_name).join ', '})"
111
+ macro = find_jls2(mapped_type, name, macro_params, meta, macros, false, scope)
112
+ end
113
+ if macro && method
114
+ raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{macro} and #{method}"
115
+ end
116
+ macro || method
117
+ end
118
+
119
+ def find_jls2(mapped_type, name, mapped_params, meta, by_name, include_fields=true, scope=nil)
120
+ return nil if mapped_params.any? {|p| p.nil? || p.isError}
121
+
122
+ # filter by arity, varargs
123
+ by_name_and_arity = by_name.select {|m| m.argument_types.size == mapped_params.size }
83
124
 
84
125
  phase1_methods = phase1(mapped_params, by_name_and_arity)
85
126
 
86
127
  if phase1_methods.size > 1
87
128
  method_list = phase1_methods.map do |m|
88
-
89
- "#{m.name}(#{m.parameter_types.map(&:name).join(', ')})"
129
+ case m.member
130
+ when BiteScript::ASM::MethodMirror
131
+ m.member.inspect
132
+ else
133
+ "#{m.name}(#{m.parameter_types.map(&:name).join(', ')})"
134
+ end
90
135
  end.join("\n")
91
136
  raise "Ambiguous targets invoking #{mapped_type}.#{name}:\n#{method_list}"
92
137
  end
93
138
 
94
139
  phase1_methods[0] ||
95
140
  phase2(mapped_params, by_name) ||
96
- phase3(mapped_params, by_name) ||
97
- field_lookup(mapped_params, mapped_type, meta, name) ||
98
- inner_class(mapped_params, mapped_type, meta, name)
141
+ phase3(mapped_params, by_name)[0] ||
142
+ (include_fields &&
143
+ (field_lookup(mapped_params, mapped_type, meta, name, scope) ||
144
+ inner_class(mapped_params, mapped_type, meta, name)))
99
145
  end
100
146
 
101
147
  def phase1(mapped_params, potentials)
102
- log "Beginning JLS phase 1 search with params (#{mapped_params.map(&:name)})"
148
+ log "Beginning JLS phase 1 search with params (#{mapped_params.map(&:name).join ', '})"
103
149
 
104
150
  # cycle through methods looking for more specific matches; gather matches of equal specificity
105
151
  methods = potentials.inject([]) do |currents, potential|
106
152
  method_params = potential.argument_types
107
- raise "Bad arguments for method #{potential.declaring_class}.#{potential.name}" unless method_params.all?
153
+ next currents unless method_params.all?
108
154
 
109
155
  # exact match always wins; duplicates not possible
110
156
  if each_is_exact(mapped_params, method_params)
@@ -114,7 +160,7 @@ module Mirah
114
160
  # otherwise, check for potential match and compare to current
115
161
  # TODO: missing ambiguity check; picks last method of equal specificity
116
162
  if each_is_exact_or_subtype_or_convertible(mapped_params, method_params)
117
- if currents.size > 0
163
+ if !currents.empty?
118
164
  if is_more_specific?(potential.argument_types, currents[0].argument_types)
119
165
  # potential is better, dump all currents
120
166
  currents = [potential]
@@ -146,14 +192,33 @@ module Mirah
146
192
  end
147
193
 
148
194
  def phase3(mapped_params, potentials)
149
- nil
195
+ potential_varargs = potentials.select{|m| m.varargs? }
196
+ methods = potential_varargs.inject([]) do |currents, potential|
197
+ method_params = potential.argument_types
198
+ # match n-1 params of potential
199
+ non_varargs_params, possible_varargs_params = mapped_params.partition.with_index{|param,i| i < method_params.size-1}
200
+
201
+ vararg_types = possible_varargs_params.size.times.map{ method_params.last.component_type }
202
+
203
+ if each_is_exact(non_varargs_params, method_params[0..-2]) &&
204
+ each_is_exact(possible_varargs_params, vararg_types)
205
+ return [potential]
206
+ end
207
+
208
+ if each_is_exact_or_subtype_or_convertible(non_varargs_params, method_params[0..-2]) &&
209
+ each_is_exact_or_subtype_or_convertible(possible_varargs_params, vararg_types)
210
+ currents << potential
211
+ end
212
+
213
+ currents
214
+ end
150
215
  end
151
216
 
152
- def field_lookup(mapped_params, mapped_type, meta, name)
217
+ def field_lookup(mapped_params, mapped_type, meta, name, scope)
153
218
  log("Attempting #{meta ? 'static' : 'instance'} field lookup for '#{name}' on class #{mapped_type}")
154
219
  # if we get to this point, the potentials do not match, so we ignore them
155
-
156
-
220
+
221
+
157
222
  # search for a field of the given name
158
223
  if name =~ /_set$/
159
224
  # setter
@@ -173,42 +238,46 @@ module Mirah
173
238
 
174
239
  if (meta && !field.static?) ||
175
240
  (!meta && field.static?)
176
- field == nil
241
+ return nil
177
242
  end
178
243
 
179
244
  # check accessibility
180
245
  # TODO: protected field access check appropriate to current type
181
246
  if setter
182
- raise "cannot set final field '#{name}' on class #{mapped_type}" if field.final?
247
+ if field.final?
248
+ log "cannot set final field '#{name}' on class #{mapped_type}"
249
+ return nil
250
+ end
251
+ end
252
+ unless field.public?
253
+ from = " from #{scope.selfType.resolve.name}" if scope
254
+ log "cannot access field '#{name}' on class #{mapped_type}#{from}"
255
+ return nil
183
256
  end
184
- raise "cannot access field '#{name}' on class #{mapped_type}" unless field.public?
185
257
 
186
258
  field
187
259
  end
188
260
 
189
261
  def inner_class(params, type, meta, name)
190
- return unless params.size == 0 && meta
262
+ return unless params.empty? && meta
191
263
  log("Attempting inner class lookup for '#{name}' on #{type}")
192
264
  type.inner_class_getter(name)
193
265
  end
194
266
 
195
267
  def each_is_exact(incoming, target)
196
- incoming.each_with_index do |in_type, i|
197
- target_type = target[i]
198
-
199
- # exact match
200
- return false unless target_type == in_type
201
- end
202
- return true
268
+ incoming.zip(target).all? { |in_type, target_type| target_type == in_type }
203
269
  end
204
270
 
205
271
  def each_is_exact_or_subtype_or_convertible(incoming, target)
206
- incoming.each_with_index do |in_type, i|
207
- target_type = target[i]
272
+ incoming.zip(target).each do |in_type, target_type|
208
273
 
209
274
  # exact match
210
275
  next if target_type == in_type
211
276
 
277
+ unless target_type.respond_to?(:primitive?) && in_type.respond_to?(:primitive?)
278
+ puts "Huh?"
279
+ end
280
+
212
281
  # primitive is safely convertible
213
282
  if target_type.primitive?
214
283
  if in_type.primitive?
@@ -13,7 +13,6 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- require 'mirah/typer'
17
16
  require 'mirah/jvm/types'
18
17
  require 'mirah/jvm/types/factory'
19
18
 
@@ -33,6 +32,13 @@ module Mirah
33
32
  @known_types = @factory.known_types
34
33
  @known_types['dynamic'] = DynamicType.new
35
34
  @errors = []
35
+ self.scopes = transformer.scopes
36
+ end
37
+
38
+ def define_type(node, name, superclass, interfaces)
39
+ scope = get_scope(node)
40
+ @factory.define_type(scope, node)
41
+ super(scope, name, superclass, interfaces)
36
42
  end
37
43
 
38
44
  def set_filename(scope, filename)
@@ -55,9 +61,9 @@ module Mirah
55
61
  end
56
62
 
57
63
  def type_definition(scope, name, superclass, interfaces)
58
- imports = scope.static_scope.imports
64
+ imports = scope.imports
59
65
  name = imports[name] while imports.include?(name)
60
- package = scope.static_scope.package
66
+ package = scope.package
61
67
  unless name =~ /\./ || package.empty?
62
68
  name = "#{package}.#{name}"
63
69
  end
@@ -157,7 +163,6 @@ module Mirah
157
163
  interfaces = self_type.interfaces.dup
158
164
  until method || interfaces.empty?
159
165
  interface = interfaces.pop
160
- next if interface.error?
161
166
  method = interface.find_method(
162
167
  interface, method_def.name, arg_types, false)
163
168
  end
@@ -169,4 +174,4 @@ module Mirah
169
174
  end
170
175
  end
171
176
  end
172
- end
177
+ end
@@ -16,14 +16,22 @@
16
16
  require 'bitescript'
17
17
  require 'mirah/ast'
18
18
  require 'mirah/jvm/method_lookup'
19
- require 'mirah/jvm/compiler'
19
+ require 'mirah/util/logging'
20
+ #require 'mirah/jvm/compiler'
20
21
  require 'set'
22
+ module Mirah::JVM
23
+ module Types
24
+ end
25
+ end
21
26
  require 'mirah/jvm/types/type'
22
27
  require 'mirah/jvm/types/primitive_type'
23
28
  require 'mirah/jvm/types/meta_type'
29
+ require 'mirah/jvm/types/generic_type'
24
30
  require 'mirah/jvm/types/null_type'
31
+ require 'mirah/jvm/types/implicit_nil_type'
25
32
  require 'mirah/jvm/types/unreachable_type'
26
33
  require 'mirah/jvm/types/void_type'
34
+ require 'mirah/jvm/types/block_type'
27
35
  require 'mirah/jvm/types/array_type'
28
36
  require 'mirah/jvm/types/dynamic_type'
29
37
  require 'mirah/jvm/types/type_definition'
@@ -34,6 +42,6 @@ require 'mirah/jvm/types/number'
34
42
  require 'mirah/jvm/types/integers'
35
43
  require 'mirah/jvm/types/boolean'
36
44
  require 'mirah/jvm/types/floats'
37
- require 'mirah/jvm/types/basic_types'
38
45
  require 'mirah/jvm/types/literals'
46
+ require 'mirah/jvm/types/factory'
39
47
  require 'mirah/jvm/types/extensions'
@@ -6,13 +6,10 @@ module Mirah
6
6
 
7
7
  def initialize(component_type)
8
8
  @component_type = component_type
9
- if @component_type.jvm_type
10
- #@type = java.lang.reflect.Array.newInstance(@component_type.jvm_type, 0).class
11
- else
12
- # FIXME: THIS IS WRONG, but I don't know how to fix it
13
- #@type = @component_type
14
- end
9
+
15
10
  @name = component_type.name
11
+ @type_system = component_type.type_system
12
+ self.intrinsics
16
13
  end
17
14
 
18
15
  def array?
@@ -32,22 +29,23 @@ module Mirah
32
29
  end
33
30
 
34
31
  def superclass
32
+ object_type = @type_system.type(nil, 'java.lang.Object')
35
33
  if component_type.primitive?
36
- Object
34
+ object_type
37
35
  elsif component_type.array?
38
36
  # fix covariance here for arrays of arrays
39
37
  # see #55
40
- Object
38
+ object_type
41
39
  else
42
- if component_type == Object
43
- Object
40
+ if component_type == object_type
41
+ object_type
44
42
  else
45
43
  component_type.superclass.array_type
46
44
  end
47
45
  end
48
46
  end
49
47
 
50
- def interfaces
48
+ def interfaces(include_parent=true)
51
49
  []
52
50
  end
53
51
 
@@ -59,4 +57,4 @@ module Mirah
59
57
  class ArrayMetaType < MetaType; end
60
58
  end
61
59
  end
62
- end
60
+ end
@@ -13,15 +13,19 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- module Mirah
17
- module AST
18
- class Import
19
- def compile(compiler, expression)
20
- # TODO: what does it mean for import to be an expression?
21
- compiler.import(short, long)
22
- rescue Exception => ex
23
- raise Mirah::InternalCompilerError.wrap(ex, self)
16
+ class Java::MirahLangAst::NodeImpl
17
+ def annotated_abstract?
18
+ annotations.each do |anno|
19
+ if anno.type.typeref.name == 'org.mirah.jvm.types.Modifiers'
20
+ anno.values.each do |entry|
21
+ if entry.key.identifier == 'flags'
22
+ entry.value.values.each do |value|
23
+ return true if value.identifier == 'ABSTRACT'
24
+ end
25
+ end
26
+ end
24
27
  end
25
28
  end
29
+ false
26
30
  end
27
31
  end