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