mirah 0.0.4-java → 0.0.5-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 (96) hide show
  1. data/History.txt +23 -0
  2. data/README.txt +13 -5
  3. data/Rakefile +30 -2
  4. data/bin/duby +16 -0
  5. data/bin/dubyc +16 -0
  6. data/bin/dubyp +16 -0
  7. data/bin/jrubyp +16 -0
  8. data/bin/mirah +17 -1
  9. data/bin/mirah.cmd +15 -0
  10. data/bin/mirahc +17 -1
  11. data/bin/mirahc.cmd +16 -1
  12. data/bin/mirahp +17 -1
  13. data/bin/mirahp.cmd +16 -1
  14. data/examples/appengine/Rakefile +17 -2
  15. data/examples/appengine/src/org/mirah/MirahApp.mirah +15 -0
  16. data/examples/bintrees.mirah +15 -0
  17. data/examples/construction.mirah +15 -0
  18. data/examples/dynamic.mirah +15 -0
  19. data/examples/edb.mirah +15 -0
  20. data/examples/fib.mirah +15 -0
  21. data/examples/fields.mirah +15 -0
  22. data/examples/fractal.mirah +15 -0
  23. data/examples/java_thing.mirah +15 -0
  24. data/examples/plugins/appengine/Rakefile +19 -4
  25. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +21 -6
  26. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +15 -0
  27. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +15 -0
  28. data/examples/simple_class.mirah +16 -1
  29. data/examples/sort_closure.mirah +15 -0
  30. data/examples/swing.mirah +17 -2
  31. data/examples/tak.mirah +15 -0
  32. data/examples/wiki/Rakefile +17 -2
  33. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +15 -0
  34. data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +339 -0
  35. data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +42 -0
  36. data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +2 -0
  37. data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +69 -0
  38. data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +7 -0
  39. data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +15 -0
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-parser.jar +0 -0
  42. data/lib/duby.rb +15 -0
  43. data/lib/mirah/appengine_tasks.rb +20 -6
  44. data/lib/mirah/ast/call.rb +19 -4
  45. data/lib/mirah/ast/class.rb +19 -4
  46. data/lib/mirah/ast/flow.rb +16 -1
  47. data/lib/mirah/ast/intrinsics.rb +36 -21
  48. data/lib/mirah/ast/literal.rb +16 -1
  49. data/lib/mirah/ast/local.rb +16 -1
  50. data/lib/mirah/ast/method.rb +18 -3
  51. data/lib/mirah/ast/scope.rb +19 -4
  52. data/lib/mirah/ast/structure.rb +16 -1
  53. data/lib/mirah/ast/type.rb +24 -9
  54. data/lib/mirah/ast.rb +24 -9
  55. data/lib/mirah/compiler.rb +16 -1
  56. data/lib/mirah/env.rb +16 -1
  57. data/lib/mirah/jvm/base.rb +18 -3
  58. data/lib/mirah/jvm/compiler.rb +35 -21
  59. data/lib/mirah/jvm/method_lookup.rb +16 -1
  60. data/lib/mirah/jvm/source_compiler.rb +29 -14
  61. data/lib/mirah/jvm/source_generator/builder.rb +21 -6
  62. data/lib/mirah/jvm/source_generator/loops.rb +16 -1
  63. data/lib/mirah/jvm/source_generator/precompile.rb +17 -2
  64. data/lib/mirah/jvm/source_generator/typer.rb +17 -2
  65. data/lib/mirah/jvm/typer.rb +19 -4
  66. data/lib/mirah/jvm/types/basic_types.rb +16 -1
  67. data/lib/mirah/jvm/types/boolean.rb +17 -2
  68. data/lib/mirah/jvm/types/enumerable.rb +21 -6
  69. data/lib/mirah/jvm/types/extensions.rb +16 -1
  70. data/lib/mirah/jvm/types/factory.rb +18 -3
  71. data/lib/mirah/jvm/types/floats.rb +16 -1
  72. data/lib/mirah/jvm/types/integers.rb +22 -7
  73. data/lib/mirah/jvm/types/intrinsics.rb +29 -14
  74. data/lib/mirah/jvm/types/literals.rb +16 -1
  75. data/lib/mirah/jvm/types/methods.rb +24 -9
  76. data/lib/mirah/jvm/types/number.rb +16 -1
  77. data/lib/mirah/jvm/types.rb +23 -4
  78. data/lib/mirah/nbcompiler.rb +19 -4
  79. data/lib/mirah/plugin/edb.rb +18 -3
  80. data/lib/mirah/plugin/gwt.rb +22 -7
  81. data/lib/mirah/plugin/java.rb +18 -3
  82. data/lib/mirah/transform.rb +35 -20
  83. data/lib/mirah/transform2.rb +20 -5
  84. data/lib/mirah/typer.rb +23 -8
  85. data/lib/mirah/version.rb +18 -0
  86. data/lib/mirah.rb +101 -50
  87. data/lib/mirah_task.rb +27 -12
  88. data/test/test_ast.rb +16 -1
  89. data/test/test_compilation.rb +18 -3
  90. data/test/test_env.rb +26 -11
  91. data/test/test_gwt.rb +18 -3
  92. data/test/test_java_typer.rb +27 -12
  93. data/test/test_javac_compiler.rb +17 -2
  94. data/test/test_jvm_compiler.rb +44 -14
  95. data/test/test_typer.rb +16 -1
  96. metadata +203 -193
@@ -1,10 +1,25 @@
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
+
1
16
  require 'mirah/jvm/source_generator/builder'
2
17
 
3
- module Duby::JavaSource
18
+ module Mirah::JavaSource
4
19
  class ClassBuilder
5
20
  def build_jsni_method(name, visibility, static, exceptions, type, *args)
6
21
  finish_declaration
7
- type ||= Duby::AST.type(nil, :void)
22
+ type ||= Mirah::AST.type(nil, :void)
8
23
  @methods << JsniMethodBuilder.new(self,
9
24
  :name => name,
10
25
  :visibility => visibility,
@@ -50,11 +65,11 @@ module Duby::JavaSource
50
65
  end
51
66
  end
52
67
 
53
- module Duby::Compiler
68
+ module Mirah::Compiler
54
69
  class JVMCompilerBase
55
70
  # arg_types must be an Array
56
71
  def create_method_builder(name, node, static, exceptions, return_type, arg_types)
57
- unless node.class == Duby::AST::JsniMethodDefinition
72
+ unless node.class == Mirah::AST::JsniMethodDefinition
58
73
  @class.build_method(name.to_s, node.visibility, static,
59
74
  exceptions, return_type, *arg_types)
60
75
  else
@@ -81,7 +96,7 @@ module Duby::Compiler
81
96
  end
82
97
  end
83
98
 
84
- module Duby::AST
99
+ module Mirah::AST
85
100
  class JsniMethodDefinition < MethodDefinition
86
101
  def initialize(static, parent, line_number, name, annotations=[], &block)
87
102
  super(parent, line_number, name, annotations, &block)
@@ -138,7 +153,7 @@ module Duby::AST
138
153
  call_node.name,
139
154
  transformer.annotations) do |defn|
140
155
 
141
- signature = {:return => Duby::AST.type(nil, args[0].name)}
156
+ signature = {:return => Mirah::AST.type(nil, args[0].name)}
142
157
  method = call_node.parameters[0]
143
158
 
144
159
  unless method.nil?
@@ -149,7 +164,7 @@ module Duby::AST
149
164
  hash_node.child_nodes.each_slice(2) do |name, type|
150
165
  position = name.position + type.position
151
166
  name = name.literal
152
- type = Duby::AST.type(nil, type.name)
167
+ type = Mirah::AST.type(nil, type.name)
153
168
  signature[name.intern] = type
154
169
  arg_list.push(RequiredArgument.new(args_new, position, name))
155
170
  end
@@ -1,13 +1,28 @@
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
+
1
16
  require 'mirah/typer'
2
17
  require 'mirah/jvm/method_lookup'
3
18
  require 'mirah/jvm/types'
4
19
  require 'java'
5
20
 
6
- module Duby
21
+ module Mirah
7
22
  module Typer
8
23
  class JavaTyper < BaseTyper
9
- include Duby::JVM::MethodLookup
10
- include Duby::JVM::Types
24
+ include Mirah::JVM::MethodLookup
25
+ include Mirah::JVM::Types
11
26
 
12
27
  def initialize
13
28
  end
@@ -1,7 +1,22 @@
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
+
1
16
  require 'base64'
2
17
  require 'jruby'
3
18
 
4
- module Duby
19
+ module Mirah
5
20
  module Transform
6
21
  class Error < StandardError
7
22
  attr_reader :position, :cause
@@ -30,7 +45,7 @@ module Duby
30
45
  @scopes = []
31
46
  @extra_body = nil
32
47
  @state = state
33
- @helper = Duby::AST::TransformHelper.new(self)
48
+ @helper = Mirah::AST::TransformHelper.new(self)
34
49
  end
35
50
 
36
51
  def destination
@@ -48,7 +63,7 @@ module Duby
48
63
 
49
64
  def add_annotation(annotation)
50
65
  @annotations << annotation
51
- Duby::AST::Noop.new(annotation.parent, annotation.position)
66
+ Mirah::AST::Noop.new(annotation.parent, annotation.position)
52
67
  end
53
68
 
54
69
  def tmp(format="__xform_tmp_%d")
@@ -88,13 +103,13 @@ module Duby
88
103
  begin
89
104
  top = @extra_body.nil?
90
105
  if top
91
- @extra_body = Duby::AST::Body.new(nil, position(node))
106
+ @extra_body = Mirah::AST::Body.new(nil, position(node))
92
107
  end
93
108
  method = "transform_#{camelize(node[0])}"
94
109
  result = @helper.send method, node, parent
95
110
  if top
96
111
  body = result.body
97
- if body.kind_of?(Duby::AST::Body) && @extra_body.empty?
112
+ if body.kind_of?(Mirah::AST::Body) && @extra_body.empty?
98
113
  @extra_body = body
99
114
  else
100
115
  result.body = @extra_body
@@ -105,11 +120,11 @@ module Duby
105
120
  return result
106
121
  rescue Error => ex
107
122
  @errors << ex
108
- Duby::AST::ErrorNode.new(parent, ex)
123
+ Mirah::AST::ErrorNode.new(parent, ex)
109
124
  rescue Exception => ex
110
125
  error = Error.new(ex.message, position(node), ex)
111
126
  @errors << error
112
- Duby::AST::ErrorNode.new(parent, error)
127
+ Mirah::AST::ErrorNode.new(parent, error)
113
128
  end
114
129
  end
115
130
 
@@ -124,7 +139,7 @@ module Duby
124
139
  end
125
140
 
126
141
  def eval(src, filename='-', parent=nil, *vars)
127
- node = Duby::AST.parse_ruby(src, filename)
142
+ node = Mirah::AST.parse_ruby(src, filename)
128
143
  duby_node = transform(node, nil).body
129
144
  duby_node.parent = parent
130
145
  duby_node
@@ -132,11 +147,11 @@ module Duby
132
147
 
133
148
  def dump_ast(node)
134
149
  encoded = nil
135
- values = Duby::AST::Unquote.extract_values do
150
+ values = Mirah::AST::Unquote.extract_values do
136
151
  encoded = Base64.encode64(Marshal.dump(node))
137
152
  end
138
- result = Duby::AST::Array.new(nil, node.position)
139
- result << Duby::AST::String.new(result, node.position, encoded)
153
+ result = Mirah::AST::Array.new(nil, node.position)
154
+ result << Mirah::AST::String.new(result, node.position, encoded)
140
155
  values.each {|value| result << value}
141
156
  return result
142
157
  end
@@ -144,9 +159,9 @@ module Duby
144
159
  def load_ast(args)
145
160
  nodes = args.to_a
146
161
  encoded = nodes.shift
147
- Duby::AST::Unquote.inject_values(nodes) do
162
+ Mirah::AST::Unquote.inject_values(nodes) do
148
163
  result = Marshal.load(Base64.decode64(encoded))
149
- if Duby::AST::UnquotedValue === result
164
+ if Mirah::AST::UnquotedValue === result
150
165
  result.node
151
166
  else
152
167
  result
@@ -155,7 +170,7 @@ module Duby
155
170
  end
156
171
 
157
172
  def __ruby_eval(code, arg)
158
- Kernel.eval(code)
173
+ self.instance_eval(code)
159
174
  end
160
175
 
161
176
  def fixnum(value)
@@ -188,7 +203,7 @@ module Duby
188
203
  end
189
204
 
190
205
  def define_class(position, name, &block)
191
- append_node Duby::AST::ClassDefinition.new(@extra_body, position, name, &block)
206
+ append_node Mirah::AST::ClassDefinition.new(@extra_body, position, name, &block)
192
207
  end
193
208
 
194
209
  def define_closure(position, name, enclosing_type)
@@ -198,7 +213,7 @@ module Duby
198
213
  if enclosing_type.respond_to?(:node) && enclosing_type.node
199
214
  parent = target = enclosing_type.node
200
215
  end
201
- target.append_node(Duby::AST::ClosureDefinition.new(
216
+ target.append_node(Mirah::AST::ClosureDefinition.new(
202
217
  parent, position, name, enclosing_type))
203
218
  end
204
219
  end
@@ -221,9 +236,9 @@ module Duby
221
236
  messages.each_with_index do |message, i|
222
237
  jpos = positions[i]
223
238
  if jpos
224
- dpos = Duby::Transform::Transformer::JMetaPosition.new(jpos, jpos)
239
+ dpos = Mirah::Transform::Transformer::JMetaPosition.new(jpos, jpos)
225
240
  print "#{message} at "
226
- Duby.print_error("", dpos)
241
+ Mirah.print_error("", dpos)
227
242
  else
228
243
  print message
229
244
  end
@@ -233,7 +248,7 @@ module Duby
233
248
 
234
249
  def parse(src, filename='dash_e', raise_errors=false, transformer=nil)
235
250
  ast = parse_ruby(src, filename)
236
- transformer ||= Transform::Transformer.new(Duby::CompilationState.new)
251
+ transformer ||= Transform::Transformer.new(Mirah::CompilationState.new)
237
252
  transformer.filename = filename
238
253
  ast = transformer.transform(ast, nil)
239
254
  if raise_errors
@@ -255,7 +270,7 @@ module Duby
255
270
  rescue => ex
256
271
  if ex.cause.respond_to? :position
257
272
  position = ex.cause.position
258
- Duby.print_error(ex.cause.message, position)
273
+ Mirah.print_error(ex.cause.message, position)
259
274
  end
260
275
  raise ex
261
276
  end
@@ -1,4 +1,19 @@
1
- module Duby::AST
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
+ module Mirah::AST
2
17
  class TransformHelper
3
18
  java_import 'jmeta.Ast'
4
19
  def initialize(transformer)
@@ -25,11 +40,11 @@ module Duby::AST
25
40
  end
26
41
 
27
42
  def transform_fixnum(node, parent)
28
- Duby::AST::fixnum(parent, position(node), node[1])
43
+ Mirah::AST::fixnum(parent, position(node), node[1])
29
44
  end
30
45
 
31
46
  def transform_float(node, parent)
32
- Duby::AST::float(parent, position(node), node[1])
47
+ Mirah::AST::float(parent, position(node), node[1])
33
48
  end
34
49
 
35
50
  def transform_true(node, parent)
@@ -257,7 +272,7 @@ module Duby::AST
257
272
  iter_node ? transformer.transform(iter_node, call) : nil
258
273
  ]
259
274
  end
260
- macro = Duby::AST.macro(name)
275
+ macro = Mirah::AST.macro(name)
261
276
  if macro
262
277
  transformer.expand(fcall, parent, &macro)
263
278
  else
@@ -334,7 +349,7 @@ module Duby::AST
334
349
  elsif ['public', 'private', 'protected'].include?(name)
335
350
  AccessLevel.new(parent, position, name)
336
351
  else
337
- macro = Duby::AST.macro(name)
352
+ macro = Mirah::AST.macro(name)
338
353
  fcall = FunctionalCall.new(parent, position, name) do |call|
339
354
  [
340
355
  [],
data/lib/mirah/typer.rb CHANGED
@@ -1,7 +1,22 @@
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
+
1
16
  require 'mirah/ast'
2
17
  require 'mirah/transform'
3
18
 
4
- module Duby
19
+ module Mirah
5
20
  module Typer
6
21
  class << self
7
22
  attr_accessor :verbose
@@ -20,7 +35,7 @@ module Duby
20
35
  end
21
36
 
22
37
  class BaseTyper
23
- include Duby
38
+ include Mirah
24
39
 
25
40
  def log(message); Typer.log(message); end
26
41
 
@@ -219,7 +234,7 @@ module Duby
219
234
 
220
235
  def plugins
221
236
  if cycling?
222
- Duby.typer_plugins.each do |plugin|
237
+ Mirah.typer_plugins.each do |plugin|
223
238
  log "Invoking plugin: #{plugin}"
224
239
 
225
240
  result = yield plugin
@@ -391,14 +406,14 @@ module Duby
391
406
  end
392
407
 
393
408
  if __FILE__ == $0
394
- Duby::AST.verbose = true
395
- Duby::Typer.verbose = true
396
- ast = Duby::AST.parse(File.read(ARGV[0]))
397
- typer = Duby::Typer::Simple.new("script")
409
+ Mirah::AST.verbose = true
410
+ Mirah::Typer.verbose = true
411
+ ast = Mirah::AST.parse(File.read(ARGV[0]))
412
+ typer = Mirah::Typer::Simple.new("script")
398
413
  typer.infer(ast)
399
414
  begin
400
415
  typer.resolve(true)
401
- rescue Duby::Typer::InferenceError => e
416
+ rescue Mirah::Typer::InferenceError => e
402
417
  puts e.message
403
418
  end
404
419
 
@@ -0,0 +1,18 @@
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
+ module Mirah
17
+ VERSION = "0.0.5"
18
+ end
data/lib/mirah.rb CHANGED
@@ -1,5 +1,21 @@
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
+
1
16
  require 'fileutils'
2
17
  require 'rbconfig'
18
+ require 'mirah/version'
3
19
  require 'mirah/transform'
4
20
  require 'mirah/ast'
5
21
  require 'mirah/typer'
@@ -16,17 +32,17 @@ require 'mirah/jvm/typer'
16
32
  Dir[File.dirname(__FILE__) + "/mirah/plugin/*"].each {|file| require "#{file}" if file =~ /\.rb$/}
17
33
  require 'jruby'
18
34
 
19
- module Duby
35
+ module Mirah
20
36
  def self.run(*args)
21
- DubyImpl.new.run(*args)
37
+ MirahImpl.new.run(*args)
22
38
  end
23
39
 
24
40
  def self.compile(*args)
25
- DubyImpl.new.compile(*args)
41
+ MirahImpl.new.compile(*args)
26
42
  end
27
43
 
28
44
  def self.parse(*args)
29
- DubyImpl.new.parse(*args)
45
+ MirahImpl.new.parse(*args)
30
46
  end
31
47
 
32
48
  def self.plugins
@@ -66,14 +82,34 @@ module Duby
66
82
  end
67
83
 
68
84
  class CompilationState
85
+ def initialize
86
+ BiteScript.bytecode_version = BiteScript::JAVA1_5
87
+ end
88
+
69
89
  attr_accessor :verbose, :destination
90
+ attr_accessor :version_printed
91
+
92
+ def set_jvm_version(ver_str)
93
+ case ver_str
94
+ when '1.4'
95
+ BiteScript.bytecode_version = BiteScript::JAVA1_4
96
+ when '1.5'
97
+ BiteScript.bytecode_version = BiteScript::JAVA1_5
98
+ when '1.6'
99
+ BiteScript.bytecode_version = BiteScript::JAVA1_6
100
+ when '1.7'
101
+ BiteScript.bytecode_version = BiteScript::JAVA1_7
102
+ else
103
+ $stderr.puts "invalid bytecode version specified: #{ver_str}"
104
+ end
105
+ end
70
106
  end
71
107
  end
72
108
 
73
109
  # This is a custom classloader impl to allow loading classes with
74
110
  # interdependencies by having findClass retrieve classes as needed from the
75
111
  # collection of all classes generated by the target script.
76
- class DubyClassLoader < java::security::SecureClassLoader
112
+ class MirahClassLoader < java::security::SecureClassLoader
77
113
  def initialize(parent, class_map)
78
114
  super(parent)
79
115
  @class_map = class_map
@@ -104,9 +140,9 @@ class DubyClassLoader < java::security::SecureClassLoader
104
140
  end
105
141
  end
106
142
 
107
- class DubyImpl
143
+ class MirahImpl
108
144
  def initialize
109
- Duby::AST.type_factory = Duby::JVM::Types::TypeFactory.new
145
+ Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
110
146
  end
111
147
 
112
148
  def run(*args)
@@ -121,7 +157,7 @@ class DubyImpl
121
157
  end
122
158
 
123
159
  # load all classes
124
- dcl = DubyClassLoader.new(java.lang.ClassLoader.system_class_loader, class_map)
160
+ dcl = MirahClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
125
161
  class_map.each do |name,|
126
162
  cls = dcl.load_class(name)
127
163
  # TODO: using first main; find correct one
@@ -137,7 +173,7 @@ class DubyImpl
137
173
  raise e
138
174
  end
139
175
  else
140
- puts "No main found"
176
+ puts "No main found" unless @state.version_printed
141
177
  end
142
178
  end
143
179
 
@@ -193,17 +229,17 @@ class DubyImpl
193
229
  exit(1)
194
230
  end
195
231
  begin
196
- ast = Duby::AST.parse_ruby(src, @filename)
232
+ ast = Mirah::AST.parse_ruby(src, @filename)
197
233
  # rescue org.jrubyparser.lexer.SyntaxException => ex
198
- # Duby.print_error(ex.message, ex.position)
234
+ # Mirah.print_error(ex.message, ex.position)
199
235
  # raise ex if @state.verbose
200
236
  end
201
- @transformer = Duby::Transform::Transformer.new(@state)
237
+ @transformer = Mirah::Transform::Transformer.new(@state)
202
238
  Java::MirahImpl::Builtin.initialize_builtins(@transformer)
203
239
  @transformer.filename = @filename
204
240
  ast = @transformer.transform(ast, nil)
205
241
  @transformer.errors.each do |ex|
206
- Duby.print_error(ex.message, ex.position)
242
+ Mirah.print_error(ex.message, ex.position)
207
243
  raise ex.cause || ex if @state.verbose
208
244
  end
209
245
  @error = @transformer.errors.size > 0
@@ -212,7 +248,7 @@ class DubyImpl
212
248
  end
213
249
 
214
250
  def infer_asts(asts)
215
- typer = Duby::Typer::JVM.new(@transformer)
251
+ typer = Mirah::Typer::JVM.new(@transformer)
216
252
  asts.each {|ast| typer.infer(ast) }
217
253
  begin
218
254
  typer.resolve(false)
@@ -224,7 +260,7 @@ class DubyImpl
224
260
  puts "Inference Error:"
225
261
  typer.errors.each do |ex|
226
262
  if ex.node
227
- Duby.print_error(ex.message, ex.node.position)
263
+ Mirah.print_error(ex.message, ex.node.position)
228
264
  else
229
265
  puts ex.message
230
266
  end
@@ -242,7 +278,7 @@ class DubyImpl
242
278
  compiler.generate(&block)
243
279
  rescue Exception => ex
244
280
  if ex.respond_to? :node
245
- Duby.print_error(ex.message, ex.node.position)
281
+ Mirah.print_error(ex.message, ex.node.position)
246
282
  puts ex.backtrace if @state.verbose
247
283
  exit 1
248
284
  else
@@ -253,43 +289,49 @@ class DubyImpl
253
289
  end
254
290
 
255
291
  def process_flags!(args)
256
- @state ||= Duby::CompilationState.new
292
+ @state ||= Mirah::CompilationState.new
257
293
  while args.length > 0 && args[0] =~ /^-/
258
294
  case args[0]
259
- when '--verbose', '-V'
260
- Duby::Typer.verbose = true
261
- Duby::AST.verbose = true
262
- Duby::Compiler::JVM.verbose = true
263
- @state.verbose = true
295
+ when '--classpath', '-c'
264
296
  args.shift
265
- when '--java', '-j'
266
- require 'mirah/jvm/source_compiler'
267
- @compiler_class = Duby::Compiler::JavaSource
297
+ Mirah::Env.decode_paths(args.shift, $CLASSPATH)
298
+ when '--cd'
268
299
  args.shift
300
+ Dir.chdir(args.shift)
269
301
  when '--dest', '-d'
270
302
  args.shift
271
303
  @state.destination = File.join(File.expand_path(args.shift), '')
272
- when '--cd'
304
+ when '-e'
305
+ break
306
+ when '--explicit-packages'
273
307
  args.shift
274
- Dir.chdir(args.shift)
275
- when '--plugin', '-p'
308
+ Mirah::AST::Script.explicit_packages = true
309
+ when '--help', '-h'
310
+ print_help
311
+ exit(0)
312
+ when '--java', '-j'
313
+ require 'mirah/jvm/source_compiler'
314
+ @compiler_class = Mirah::Compiler::JavaSource
276
315
  args.shift
277
- plugin = args.shift
278
- require "mirah/plugin/#{plugin}"
316
+ when '--jvm'
317
+ args.shift
318
+ @state.set_jvm_version(args.shift)
279
319
  when '-I'
280
320
  args.shift
281
321
  $: << args.shift
282
- when '--classpath', '-c'
322
+ when '--plugin', '-p'
283
323
  args.shift
284
- Duby::Env.decode_paths(args.shift, $CLASSPATH)
285
- when '--explicit-packages'
324
+ plugin = args.shift
325
+ require "mirah/plugin/#{plugin}"
326
+ when '--verbose', '-V'
327
+ Mirah::Typer.verbose = true
328
+ Mirah::AST.verbose = true
329
+ Mirah::Compiler::JVM.verbose = true
330
+ @state.verbose = true
286
331
  args.shift
287
- Duby::AST::Script.explicit_packages = true
288
- when '--help', '-h'
289
- print_help
290
- exit(0)
291
- when '-e'
292
- break
332
+ when '--version', '-v'
333
+ args.shift
334
+ print_version
293
335
  else
294
336
  puts "unrecognized flag: " + args[0]
295
337
  print_help
@@ -297,19 +339,30 @@ class DubyImpl
297
339
  end
298
340
  end
299
341
  @state.destination ||= File.join(File.expand_path('.'), '')
300
- @compiler_class ||= Duby::Compiler::JVM
342
+ @compiler_class ||= Mirah::Compiler::JVM
301
343
  end
302
344
 
303
345
  def print_help
304
- $stdout.puts "#{$0} [flags] <files or \"-e SCRIPT\">
305
- -V, --verbose\t\tVerbose logging
306
- -j, --java\t\tOutput .java source (jrubyc only)
307
- -d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
308
- -p, --plugin PLUGIN\tLoad and use plugin during compilation
346
+ puts "#{$0} [flags] <files or \"-e SCRIPT\">
309
347
  -c, --classpath PATH\tAdd PATH to the Java classpath for compilation
310
- --explicit-packages\tDisable guessing the package from the filename
348
+ --cd DIR\t\tSwitch to the specified DIR befor compilation
349
+ -d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
350
+ -e CODE\t\tCompile or run the inline script following -e
351
+ \t\t\t (the class will be named \"DashE\")
352
+ --explicit-packages\tRequire explicit 'package' lines in source
311
353
  -h, --help\t\tPrint this help message
312
- -e\t\t\tCompile or run the script following -e (naming it \"DashE\")"
354
+ -I DIR\t\tAdd DIR to the Ruby load path before running
355
+ -j, --java\t\tOutput .java source (jrubyc only)
356
+ --jvm VERSION\t\tEmit JVM bytecode targeting specified JVM
357
+ \t\t\t version (1.4, 1.5, 1.6, 1.7)
358
+ -p, --plugin PLUGIN\trequire 'mirah/plugin/PLUGIN' before running
359
+ -v, --version\t\tPrint the version of Mirah to the console
360
+ -V, --verbose\t\tVerbose logging"
361
+ end
362
+
363
+ def print_version
364
+ puts "Mirah v#{Mirah::VERSION}"
365
+ @state.version_printed = true
313
366
  end
314
367
 
315
368
  def expand_files(files)
@@ -331,8 +384,6 @@ class DubyImpl
331
384
  end
332
385
  end
333
386
 
334
- Mirah = Duby
335
-
336
387
  if __FILE__ == $0
337
- Duby.run(ARGV[0], *ARGV[1..-1])
388
+ Mirah.run(ARGV[0], *ARGV[1..-1])
338
389
  end