mirah 0.0.7-java → 0.0.8-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 (182) hide show
  1. data/History.txt +181 -0
  2. data/README.txt +6 -10
  3. data/Rakefile +86 -9
  4. data/bin/mirah +2 -0
  5. data/bin/mirahc +2 -0
  6. data/bin/mirahp +2 -0
  7. data/{bin/dubyp → examples/interfaces.mirah} +16 -9
  8. data/examples/macros/square.mirah +12 -0
  9. data/examples/macros/square_int.mirah +12 -0
  10. data/examples/macros/string-each-char.mirah +14 -0
  11. data/examples/maven/README.txt +2 -0
  12. data/examples/maven/pom.xml +23 -0
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
  14. data/examples/rosettacode/100-doors.mirah +44 -0
  15. data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
  16. data/examples/rosettacode/README.txt +9 -0
  17. data/examples/rosettacode/boolean-values.mirah +29 -0
  18. data/examples/rosettacode/comments.mirah +2 -0
  19. data/examples/rosettacode/copy-a-string.mirah +10 -0
  20. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
  21. data/examples/rosettacode/create-a-file.mirah +6 -0
  22. data/examples/rosettacode/empty-string.mirah +9 -0
  23. data/examples/rosettacode/factorial.mirah +10 -0
  24. data/examples/rosettacode/fibonacci.mirah +21 -0
  25. data/examples/rosettacode/file-size.mirah +5 -0
  26. data/examples/rosettacode/fizz-buzz.mirah +21 -0
  27. data/examples/rosettacode/flatten-a-list.mirah +24 -0
  28. data/examples/rosettacode/guess-the-number.mirah +21 -0
  29. data/examples/rosettacode/is-string-numeric.mirah +127 -0
  30. data/examples/rosettacode/palindrome.mirah +14 -0
  31. data/examples/rosettacode/repeat-a-string.mirah +9 -0
  32. data/examples/rosettacode/reverse-a-string.mirah +6 -0
  33. data/examples/rosettacode/rot-13.mirah +20 -0
  34. data/examples/rosettacode/user-input.mirah +4 -0
  35. data/examples/sort_closure.mirah +1 -1
  36. data/javalib/dynalink-0.2.jar +0 -0
  37. data/javalib/mirah-bootstrap.jar +0 -0
  38. data/lib/mirah.rb +7 -16
  39. data/lib/mirah/ast.rb +22 -92
  40. data/lib/mirah/ast/call.rb +41 -9
  41. data/lib/mirah/ast/class.rb +34 -6
  42. data/lib/mirah/ast/flow.rb +17 -5
  43. data/lib/mirah/ast/intrinsics.rb +50 -8
  44. data/lib/mirah/ast/literal.rb +7 -0
  45. data/lib/mirah/ast/local.rb +9 -1
  46. data/lib/mirah/ast/method.rb +21 -8
  47. data/lib/mirah/ast/scope.rb +1 -1
  48. data/lib/mirah/ast/structure.rb +81 -15
  49. data/lib/mirah/ast/type.rb +4 -0
  50. data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
  51. data/lib/mirah/commands/base.rb +54 -0
  52. data/lib/mirah/commands/compile.rb +39 -0
  53. data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
  54. data/lib/mirah/commands/run.rb +73 -0
  55. data/lib/mirah/compiler.rb +37 -417
  56. data/lib/mirah/compiler/call.rb +45 -0
  57. data/lib/mirah/compiler/class.rb +81 -0
  58. data/lib/mirah/compiler/flow.rb +109 -0
  59. data/lib/mirah/compiler/literal.rb +130 -0
  60. data/lib/mirah/compiler/local.rb +59 -0
  61. data/lib/mirah/compiler/method.rb +44 -0
  62. data/lib/mirah/compiler/structure.rb +65 -0
  63. data/lib/mirah/compiler/type.rb +27 -0
  64. data/lib/mirah/env.rb +4 -6
  65. data/lib/mirah/generator.rb +61 -0
  66. data/lib/mirah/jvm/compiler.rb +8 -867
  67. data/lib/mirah/jvm/compiler/base.rb +270 -0
  68. data/lib/mirah/jvm/compiler/java_source.rb +779 -0
  69. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
  70. data/lib/mirah/jvm/method_lookup.rb +21 -2
  71. data/lib/mirah/jvm/source_generator/builder.rb +10 -13
  72. data/lib/mirah/jvm/source_generator/loops.rb +99 -93
  73. data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
  74. data/lib/mirah/jvm/typer.rb +3 -3
  75. data/lib/mirah/jvm/types.rb +10 -426
  76. data/lib/mirah/jvm/types/array_type.rb +62 -0
  77. data/lib/mirah/jvm/types/basic_types.rb +1 -0
  78. data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
  79. data/lib/mirah/jvm/types/factory.rb +23 -5
  80. data/lib/mirah/jvm/types/interface_definition.rb +20 -0
  81. data/lib/mirah/jvm/types/intrinsics.rb +15 -3
  82. data/lib/mirah/jvm/types/meta_type.rb +45 -0
  83. data/lib/mirah/jvm/types/methods.rb +12 -5
  84. data/lib/mirah/jvm/types/null_type.rb +27 -0
  85. data/lib/mirah/jvm/types/primitive_type.rb +38 -0
  86. data/lib/mirah/jvm/types/source_mirror.rb +266 -0
  87. data/lib/mirah/jvm/types/type.rb +173 -0
  88. data/lib/mirah/jvm/types/type_definition.rb +55 -0
  89. data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
  90. data/lib/mirah/jvm/types/void_type.rb +19 -0
  91. data/lib/mirah/parser.rb +90 -0
  92. data/lib/mirah/plugin/gwt.rb +5 -5
  93. data/lib/mirah/plugin/java.rb +1 -1
  94. data/lib/mirah/transform.rb +4 -321
  95. data/lib/mirah/transform/ast_ext.rb +63 -0
  96. data/lib/mirah/transform/error.rb +13 -0
  97. data/lib/mirah/transform/helper.rb +761 -0
  98. data/lib/mirah/transform/transformer.rb +255 -0
  99. data/lib/mirah/typer.rb +2 -383
  100. data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
  101. data/lib/mirah/typer/simple.rb +377 -0
  102. data/lib/mirah/util/argument_processor.rb +114 -0
  103. data/lib/mirah/util/class_loader.rb +37 -0
  104. data/lib/mirah/util/compilation_state.rb +51 -0
  105. data/lib/mirah/util/process_errors.rb +33 -0
  106. data/lib/mirah/version.rb +1 -1
  107. data/lib/mirah_task.rb +3 -2
  108. data/test/{test_ast.rb → core/test_ast.rb} +6 -0
  109. data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
  110. data/test/{test_env.rb → core/test_env.rb} +24 -25
  111. data/test/{test_macros.rb → core/test_macros.rb} +2 -4
  112. data/test/{test_typer.rb → core/test_typer.rb} +0 -3
  113. data/test/jvm/bytecode_test_helper.rb +181 -0
  114. data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
  115. data/test/jvm/test_enumerable.rb +304 -0
  116. data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
  117. data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
  118. data/test/jvm/test_macros.rb +147 -0
  119. data/test/jvm/test_main_method.rb +15 -0
  120. data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
  121. metadata +103 -91
  122. data/bin/jrubyp +0 -52
  123. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
  124. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
  125. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
  126. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
  127. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
  128. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
  129. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  130. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  131. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  132. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  133. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  134. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  135. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  136. data/examples/wiki/war/app.yaml +0 -21
  137. data/examples/wiki/war/public/favicon.ico +0 -0
  138. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  139. data/examples/wiki/war/public/images/back.gif +0 -0
  140. data/examples/wiki/war/public/images/dir.gif +0 -0
  141. data/examples/wiki/war/public/images/file.gif +0 -0
  142. data/examples/wiki/war/public/javascripts/prettify.js +0 -61
  143. data/examples/wiki/war/public/robots.txt +0 -0
  144. data/examples/wiki/war/public/stylesheets/main.css +0 -156
  145. data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
  146. data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
  147. data/examples/wiki/war/public/stylesheets/source.css +0 -21
  148. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  149. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  150. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  151. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  152. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  153. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  154. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  155. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  156. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  157. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  158. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  159. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  160. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  161. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  162. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  163. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  164. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  165. data/examples/wiki/war/public/wmd/showdown.js +0 -421
  166. data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
  167. data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
  168. data/examples/wiki/war/public/wmd/wmd.js +0 -73
  169. data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
  170. data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
  171. data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
  172. data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
  173. data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
  174. data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
  175. data/javalib/dynalink-0.1.jar +0 -0
  176. data/javalib/jsr292-mock.jar +0 -0
  177. data/lib/mirah/class_loader.rb +0 -35
  178. data/lib/mirah/compilation_state.rb +0 -28
  179. data/lib/mirah/impl.rb +0 -273
  180. data/lib/mirah/jvm/base.rb +0 -267
  181. data/lib/mirah/jvm/source_compiler.rb +0 -760
  182. data/lib/mirah/transform2.rb +0 -752
@@ -40,7 +40,12 @@ module Mirah::AST
40
40
  else
41
41
  position, index = Marshal.load(str)
42
42
  holder = UnquotedValue.new(nil, position)
43
- holder << Unquote.__injected[index].dup
43
+ value = Unquote.__injected[index]
44
+ begin
45
+ holder << value.dup
46
+ rescue TypeError
47
+ holder << value
48
+ end
44
49
  holder
45
50
  end
46
51
  end
@@ -97,10 +102,14 @@ module Mirah::AST
97
102
  when Node
98
103
  value.string_value
99
104
  else
100
- raise "Bad unquote value #{value}"
105
+ raise "Bad unquote value for name #{value} (#{value.class})"
101
106
  end
102
107
  end
103
108
 
109
+ def type
110
+ Constant.new(nil, position, name)
111
+ end
112
+
104
113
  def node
105
114
  case value
106
115
  when Node
@@ -114,12 +123,24 @@ module Mirah::AST
114
123
  else
115
124
  return Local.new(nil, position, value)
116
125
  end
126
+ when ::Fixnum
127
+ return Fixnum.new(nil, position, value)
117
128
  else
118
- raise "Bad unquote value"
129
+ raise "Bad unquote value for node #{value} (#{value.class})"
119
130
  end
120
131
  end
121
132
 
122
- def f_arg
133
+ def nodes
134
+ case value
135
+ when ::Array, Java::JavaUtil::List
136
+ # TODO convert items to nodes.
137
+ value.to_a
138
+ else
139
+ [node]
140
+ end
141
+ end
142
+
143
+ def f_arg_item(value)
123
144
  case value
124
145
  when Arguments, Argument
125
146
  value
@@ -127,8 +148,26 @@ module Mirah::AST
127
148
  RequiredArgument.new(nil, position, value.string_value)
128
149
  when ::String
129
150
  RequiredArgument.new(nil, position, value)
151
+ when ::Array, java.util.List
152
+ name, type = value.map do |item|
153
+ if item.kind_of?(Node)
154
+ item.string_value
155
+ else
156
+ item.to_s
157
+ end
158
+ end
159
+ RequiredArgument.new(nil, position, name, type)
130
160
  else
131
- raise "Bad unquote value"
161
+ raise "Bad unquote value for arg #{value} (#{value.class})"
162
+ end
163
+ end
164
+
165
+ def f_arg
166
+ case value
167
+ when ::Array, java.util.List
168
+ value.map {|item| f_arg_item(item)}
169
+ else
170
+ f_arg_item(value)
132
171
  end
133
172
  end
134
173
  end
@@ -277,7 +316,7 @@ module Mirah::AST
277
316
  Mirah::AST.type_factory = new_factory
278
317
  ast = build_ast(name, parent, transformer)
279
318
  classes = compile_ast(name, ast, transformer)
280
- loader = Mirah::ClassLoader.new(
319
+ loader = Mirah::Util::ClassLoader.new(
281
320
  JRuby.runtime.jruby_class_loader, classes)
282
321
  klass = loader.loadClass(name, true)
283
322
  if state.save_extensions
@@ -312,7 +351,8 @@ module Mirah::AST
312
351
 
313
352
  def compile_ast(name, ast, transformer)
314
353
  begin
315
- typer = Mirah::Typer::JVM.new(transformer)
354
+ # FIXME: This is JVM specific, and should move out of platform-independent code
355
+ typer = Mirah::JVM::Typer.new(transformer)
316
356
  typer.infer(ast, false)
317
357
  typer.resolve(true)
318
358
  typer.errors.each do |e|
@@ -321,7 +361,8 @@ module Mirah::AST
321
361
  ensure
322
362
  puts ast.inspect if transformer.state.verbose
323
363
  end
324
- compiler = Mirah::Compiler::JVM.new
364
+ # FIXME: This is JVM specific, and should move out of platform-independent code
365
+ compiler = Mirah::JVM::Compiler::JVMBytecode.new
325
366
  ast.compile(compiler, false)
326
367
  class_map = {}
327
368
  compiler.generate do |outfile, builder|
@@ -351,6 +392,7 @@ module Mirah::AST
351
392
  extension.implements(Mirah::AST.type(nil, 'duby.lang.compiler.Macro'))
352
393
 
353
394
  extension.static_scope.import('duby.lang.compiler.Node', 'Node')
395
+ extension.static_scope.package = scope.static_scope.package
354
396
 
355
397
  # The constructor just saves the state
356
398
  extension.define_constructor(
@@ -168,4 +168,11 @@ module Mirah::AST
168
168
  @inferred_type ||= typer.null_type
169
169
  end
170
170
  end
171
+
172
+ class Self < Node
173
+ include Scoped
174
+ def infer(typer, expression)
175
+ @inferred_type ||= scope.static_scope.self_type
176
+ end
177
+ end
171
178
  end
@@ -67,7 +67,11 @@ module Mirah::AST
67
67
  def infer(typer, expression)
68
68
  resolve_if(typer) do
69
69
  scope.static_scope << name
70
- typer.infer(value, true)
70
+ type = typer.infer(value, true)
71
+ if type && type.null?
72
+ type = typer.local_type(containing_scope, name) unless typer.last_chance
73
+ end
74
+ type
71
75
  end
72
76
  end
73
77
 
@@ -94,6 +98,10 @@ module Mirah::AST
94
98
  "Local(name = #{name}, scope = #{scope}, captured = #{captured? == true})"
95
99
  end
96
100
 
101
+ def type_reference(typer)
102
+ typer.type_reference(scope, @name)
103
+ end
104
+
97
105
  def infer(typer, expression)
98
106
  resolve_if(typer) do
99
107
  scope.static_scope << name
@@ -46,7 +46,7 @@ module Mirah::AST
46
46
  end
47
47
 
48
48
  def validate_child(args, child_index)
49
- if args.kind_of?(Array)
49
+ if args.kind_of?(::Array)
50
50
  args.each_with_index do |arg, arg_index|
51
51
  if UnquotedValue === arg
52
52
  actual_arg = arg.f_arg
@@ -70,7 +70,7 @@ module Mirah::AST
70
70
  case args
71
71
  when Arguments
72
72
  args.children.each_with_index {|child, i| merge_args(child, i)}
73
- when Array
73
+ when ::Array
74
74
  args.each {|arg| merge_args(arg, child_index)}
75
75
  when RequiredArgument
76
76
  if child_index > 2
@@ -127,13 +127,23 @@ module Mirah::AST
127
127
  signature = method_def.signature
128
128
 
129
129
  if type_node
130
- signature[name.intern] = type_node.type_reference(typer)
130
+ if ::String === type_node # How does this happen?
131
+ signature[name.intern] = typer.type_reference(scope, type_node)
132
+ else
133
+ signature[name.intern] = type_node.type_reference(typer)
134
+ end
131
135
  end
132
136
 
133
137
  # if signature, search for this argument
134
138
  signature[name.intern] || typer.local_type(containing_scope, name)
135
139
  end
136
140
  end
141
+
142
+ def validate_type_node
143
+ if UnquotedValue === type_node
144
+ self.type_node = type_node.type
145
+ end
146
+ end
137
147
  end
138
148
 
139
149
  class OptionalArgument < Argument
@@ -191,7 +201,6 @@ module Mirah::AST
191
201
 
192
202
  def infer(typer, expression)
193
203
  scope.static_scope << name
194
- super
195
204
  end
196
205
  end
197
206
 
@@ -237,11 +246,15 @@ module Mirah::AST
237
246
  end
238
247
  @annotations.each {|a| a.infer(typer, true)} if @annotations
239
248
  typer.infer(arguments, true)
240
- if @return_type.kind_of?(UnquotedValue)
241
- @return_type = @return_type.node
242
- @return_type.parent = self
249
+ if @return_type
250
+ if @return_type.kind_of?(UnquotedValue)
251
+ @return_type = @return_type.node
252
+ @return_type.parent = self
253
+ else
254
+ @return_type.parent = self
255
+ end
256
+ signature[:return] = @return_type.type_reference(typer)
243
257
  end
244
- signature[:return] = @return_type.type_reference(typer) if @return_type
245
258
  if @exceptions
246
259
  signature[:throws] = @exceptions.map {|e| e.type_reference(typer)}
247
260
  end
@@ -93,7 +93,7 @@ module Mirah
93
93
  return unless type
94
94
  existing_type = local_type(name)
95
95
  if existing_type
96
- unless existing_type.assignable_from?(type)
96
+ unless existing_type.compatible?(type)
97
97
  raise Mirah::Typer::InferenceError.new(
98
98
  "Can't assign #{type.full_name} to " \
99
99
  "variable of type #{existing_type.full_name}")
@@ -95,8 +95,8 @@ module Mirah::AST
95
95
  super
96
96
  end
97
97
 
98
- def binding_type(duby=nil)
99
- static_scope.binding_type(defining_class, duby)
98
+ def binding_type(mirah=nil)
99
+ static_scope.binding_type(defining_class, mirah)
100
100
  end
101
101
 
102
102
  def binding_type=(type)
@@ -142,16 +142,19 @@ module Mirah::AST
142
142
  end
143
143
 
144
144
  def prepare(typer, method)
145
- duby = typer.transformer
145
+ mirah = typer.transformer
146
146
  interface = method.argument_types[-1]
147
147
  outer_class = scope.defining_class
148
- binding = scope.binding_type(duby)
149
- name = "#{outer_class.name}$#{duby.tmp}"
150
- klass = duby.define_closure(position, name, outer_class)
148
+
149
+ binding = scope.binding_type(mirah)
150
+
151
+ name = "#{outer_class.name}$#{mirah.tmp}"
152
+
153
+ klass = mirah.define_closure(position, name, outer_class)
151
154
  klass.interfaces = [interface]
152
155
  klass.define_constructor(position,
153
156
  ['binding', binding]) do |c|
154
- duby.eval("@binding = binding", '-', c, 'binding')
157
+ mirah.eval("@binding = binding", '-', c, 'binding')
155
158
  end
156
159
 
157
160
  # TODO We need a special scope here that allows access to the
@@ -200,16 +203,17 @@ module Mirah::AST
200
203
  next false
201
204
  end
202
205
 
203
- raise "Multiple abstract methods found; cannot use block" if impl_methods.size > 1
206
+ raise "Multiple abstract methods found within given interface [#{impl_methods.map(&:name).join(', ')}]; cannot use block" if impl_methods.size > 1
204
207
  impl_methods.each do |method|
205
208
  mdef = klass.define_method(position,
206
- method.name,
207
- method.return_type,
208
- args.dup)
209
- mdef.static_scope = static_scope
210
- mdef.body = body.dup
211
- mdef.binding_type = binding
212
- typer.infer(mdef.body, true)
209
+ method.name,
210
+ method.return_type,
211
+ args.dup) do |mdef|
212
+ mdef.static_scope = static_scope
213
+ mdef.binding_type = binding
214
+ mdef.body = body.dup
215
+ end
216
+ typer.infer(mdef.body, method.return_type != typer.no_type)
213
217
  end
214
218
  end
215
219
 
@@ -282,4 +286,66 @@ module Mirah::AST
282
286
  attr_accessor :explicit_packages
283
287
  end
284
288
  end
289
+
290
+ class Annotation < Node
291
+ attr_reader :values
292
+ attr_accessor :runtime
293
+ alias runtime? runtime
294
+
295
+ child :name_node
296
+
297
+ def initialize(parent, position, name=nil, &block)
298
+ super(parent, position, &block)
299
+ if name
300
+ @name = if name.respond_to?(:class_name)
301
+ name.class_name
302
+ else
303
+ name.name
304
+ end
305
+ end
306
+ @values = {}
307
+ end
308
+
309
+ def name
310
+ @name
311
+ end
312
+
313
+ def type
314
+ BiteScript::ASM::Type.getObjectType(@name.tr('.', '/'))
315
+ end
316
+
317
+ def []=(name, value)
318
+ @values[name] = value
319
+ end
320
+
321
+ def [](name)
322
+ @values[name]
323
+ end
324
+
325
+ def infer(typer, expression)
326
+ @inferred ||= begin
327
+ @name = name_node.type_reference(typer).name if name_node
328
+ @values.each do |name, value|
329
+ if Node === value
330
+ @values[name] = annotation_value(value, typer)
331
+ end
332
+ end
333
+ true
334
+ end
335
+ end
336
+
337
+ def annotation_value(node, typer)
338
+ case node
339
+ when String
340
+ java.lang.String.new(node.literal)
341
+ when Array
342
+ node.children.map {|node| annotation_value(node, typer)}
343
+ else
344
+ # TODO Support other types
345
+ ref = value.type_refence(typer)
346
+ desc = BiteScript::Signature.class_id(ref)
347
+ BiteScript::ASM::Type.getType(desc)
348
+ end
349
+ end
350
+ end
285
351
  end
@@ -35,6 +35,10 @@ module Mirah::AST
35
35
  typer.no_type
36
36
  end
37
37
  end
38
+
39
+ def top_level?
40
+ true
41
+ end
38
42
  end
39
43
 
40
44
  defmacro('import') do |transformer, fcall, parent|
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env jruby
2
-
3
1
  # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
4
2
  # All contributing project authors may be found in the NOTICE file.
5
3
  #
@@ -15,12 +13,7 @@
15
13
  # See the License for the specific language governing permissions and
16
14
  # limitations under the License.
17
15
 
18
- begin
19
- require 'mirah'
20
- rescue LoadError
21
- $: << File.dirname(File.dirname(__FILE__)) + '/lib'
22
- require 'mirah'
23
- end
24
-
25
- puts 'WARNING: Duby is now Mirah. Please use the `mirahc` command.'
26
- Duby.compile(*ARGV)
16
+ require 'mirah/commands/base'
17
+ require 'mirah/commands/run'
18
+ require 'mirah/commands/compile'
19
+ require 'mirah/commands/parse'
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2010 The Mirah project authors. All Rights Reserved.
2
+ # All contributing project authors may be found in the NOTICE file.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require 'mirah/jvm/types'
17
+ require 'mirah/util/compilation_state'
18
+ require 'mirah/util/argument_processor'
19
+ require 'mirah/errors'
20
+
21
+ module Mirah
22
+ module Commands
23
+ class Base
24
+ def initialize(args)
25
+ Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
26
+ @state = Mirah::Util::CompilationState.new
27
+ @state.command = command_name
28
+ @args = args
29
+ @argument_processor = Mirah::Util::ArgumentProcessor.new(@state, @args)
30
+ end
31
+
32
+ attr_accessor :state, :args, :argument_processor
33
+
34
+ def execute_base
35
+ # because MirahCommand is a JRuby Java class, SystemExit bubbles through and makes noise
36
+ # so we use a catch/throw to early exit instead
37
+ # see process_errors.rb
38
+ catch(:exit) do
39
+ begin
40
+ argument_processor.process
41
+ yield
42
+ rescue Mirah::InternalCompilerError => ice
43
+ Mirah.print_error(ice.message, ice.position) if ice.node
44
+ raise ice.cause if (ice.cause && state.verbose)
45
+ raise ice
46
+ rescue Mirah::MirahError => ex
47
+ Mirah.print_error(ex.message, ex.position)
48
+ puts ex.backtrace if state.verbose
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end