mirah 0.0.5-java → 0.0.6-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 (63) hide show
  1. data/History.txt +33 -0
  2. data/README.txt +2 -3
  3. data/Rakefile +5 -0
  4. data/bin/duby +0 -0
  5. data/bin/dubyc +0 -0
  6. data/bin/dubyp +0 -0
  7. data/bin/jrubyp +0 -0
  8. data/bin/mirah +0 -0
  9. data/bin/mirah.cmd +14 -14
  10. data/bin/mirahc +0 -0
  11. data/bin/mirahc.cmd +14 -14
  12. data/bin/mirahp +0 -0
  13. data/bin/mirahp.cmd +14 -14
  14. data/examples/Dynamic.class +0 -0
  15. data/examples/SizeThing.class +0 -0
  16. data/examples/plugins/appengine/Rakefile +3 -1
  17. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +385 -0
  18. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +58 -15
  19. data/examples/wiki/war/public/javascripts/prettify.js +0 -0
  20. data/examples/wiki/war/public/stylesheets/prettify.css +0 -0
  21. data/javalib/dynalink-0.1.jar +0 -0
  22. data/javalib/jsr292-mock.jar +0 -0
  23. data/javalib/mirah-bootstrap.jar +0 -0
  24. data/javalib/mirah-parser.jar +0 -0
  25. data/lib/mirah.rb +45 -25
  26. data/lib/mirah/ast.rb +81 -27
  27. data/lib/mirah/ast/call.rb +62 -71
  28. data/lib/mirah/ast/class.rb +23 -26
  29. data/lib/mirah/ast/flow.rb +38 -62
  30. data/lib/mirah/ast/intrinsics.rb +59 -37
  31. data/lib/mirah/ast/literal.rb +16 -14
  32. data/lib/mirah/ast/local.rb +8 -8
  33. data/lib/mirah/ast/method.rb +33 -19
  34. data/lib/mirah/ast/structure.rb +54 -13
  35. data/lib/mirah/ast/type.rb +8 -11
  36. data/lib/mirah/compiler.rb +86 -0
  37. data/lib/mirah/errors.rb +60 -0
  38. data/lib/mirah/jvm/base.rb +5 -11
  39. data/lib/mirah/jvm/compiler.rb +12 -1
  40. data/lib/mirah/jvm/source_compiler.rb +10 -2
  41. data/lib/mirah/jvm/source_generator/builder.rb +3 -1
  42. data/lib/mirah/jvm/source_generator/precompile.rb +6 -0
  43. data/lib/mirah/jvm/typer.rb +6 -1
  44. data/lib/mirah/jvm/types.rb +8 -0
  45. data/lib/mirah/jvm/types/factory.rb +34 -10
  46. data/lib/mirah/jvm/types/intrinsics.rb +12 -5
  47. data/lib/mirah/jvm/types/methods.rb +5 -9
  48. data/lib/mirah/plugin/gwt.rb +3 -2
  49. data/lib/mirah/transform.rb +68 -10
  50. data/lib/mirah/transform2.rb +10 -1
  51. data/lib/mirah/typer.rb +5 -10
  52. data/lib/mirah/version.rb +1 -1
  53. data/test/test_compilation.rb +1 -1
  54. data/test/test_java_typer.rb +10 -0
  55. data/test/test_javac_compiler.rb +4 -2
  56. data/test/test_jvm_compiler.rb +132 -9
  57. data/test/test_macros.rb +51 -0
  58. data/test/test_typer.rb +29 -25
  59. metadata +13 -21
  60. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +0 -390
  61. data/javalib/JRubyParser.jar +0 -0
  62. data/javalib/dynalang-invoke-0.1.jar +0 -0
  63. data/lib/mirah/nbcompiler.rb +0 -44
@@ -20,22 +20,14 @@ module Mirah::AST
20
20
  class Unquote < Node
21
21
  child :value
22
22
 
23
- def infer(typer)
24
- raise "Unquote used outside of macro"
23
+ def infer(typer, expression)
24
+ raise Mirah::SyntaxError.new("Unquote used outside of macro", self)
25
25
  end
26
26
 
27
27
  def _dump(depth)
28
28
  vals = Unquote.__extracted
29
29
  index = vals.size
30
- # Make sure the scope is saved
31
- if Scoped === value
32
- value.scope
33
- scoped_value = value
34
- else
35
- scoped_value = ScopedBody.new(value.parent, value.position) {[value]}
36
- scoped_value.static_scope = scoped_value.scope.static_scope
37
- end
38
- vals << self.value
30
+ vals << value
39
31
  Marshal.dump([position, index])
40
32
  end
41
33
 
@@ -70,21 +62,22 @@ module Mirah::AST
70
62
  end
71
63
 
72
64
  def self.extract_values
73
- values = self.__extracted = []
65
+ values = []
66
+ saved, self.__extracted = self.__extracted, values
74
67
  begin
75
68
  yield
76
69
  return values
77
70
  ensure
78
- self.__extracted = nil
71
+ self.__extracted = saved
79
72
  end
80
73
  end
81
74
 
82
75
  def self.inject_values(values)
83
- self.__injected = values
76
+ saved, self.__injected = self.__injected, values
84
77
  begin
85
78
  yield
86
79
  ensure
87
- self.__injected = nil
80
+ self.__injected = saved
88
81
  end
89
82
  end
90
83
  end
@@ -101,6 +94,8 @@ module Mirah::AST
101
94
  value
102
95
  when Named
103
96
  value.name
97
+ when Node
98
+ value.string_value
104
99
  else
105
100
  raise "Bad unquote value #{value}"
106
101
  end
@@ -128,8 +123,8 @@ module Mirah::AST
128
123
  case value
129
124
  when Arguments, Argument
130
125
  value
131
- when Named
132
- RequiredArgument.new(nil, position, value.name)
126
+ when Node
127
+ RequiredArgument.new(nil, position, value.string_value)
133
128
  when ::String
134
129
  RequiredArgument.new(nil, position, value)
135
130
  else
@@ -142,8 +137,8 @@ module Mirah::AST
142
137
  child :name
143
138
  child :value
144
139
 
145
- def infer(typer)
146
- raise "UnquoteAssign used outside of macro"
140
+ def infer(typer, expression)
141
+ raise Mirah::SyntaxError.new("UnquoteAssign used outside of macro")
147
142
  end
148
143
 
149
144
  def _dump(depth)
@@ -172,6 +167,12 @@ module Mirah::AST
172
167
  end
173
168
 
174
169
  def node
170
+ if ScopedBody === self.name_node
171
+ scope = name_node
172
+ name_node = scope.children[0]
173
+ else
174
+ name_node = self.name_node
175
+ end
175
176
  klass = LocalAssignment
176
177
  if Field === name_node
177
178
  name = name_node.name
@@ -182,7 +183,7 @@ module Mirah::AST
182
183
  elsif String === name_node
183
184
  name = name_node.literal
184
185
  elsif ::String === name_node
185
- name = name
186
+ name = name_node
186
187
  else
187
188
  raise "Bad unquote value"
188
189
  end
@@ -193,7 +194,12 @@ module Mirah::AST
193
194
  n = klass.new(nil, position, name)
194
195
  n << value
195
196
  n.validate_children
196
- return n
197
+ if scope
198
+ scope.children.clear
199
+ scope << n
200
+ else
201
+ return n
202
+ end
197
203
  end
198
204
 
199
205
  def f_arg
@@ -217,10 +223,10 @@ module Mirah::AST
217
223
 
218
224
  def initialize(parent, line_number, name, &block)
219
225
  super(parent, line_number, &block)
220
- @name = name
226
+ self.name = name
221
227
  end
222
228
 
223
- def infer(typer)
229
+ def infer(typer, expression)
224
230
  resolve_if(typer) do
225
231
  self_type = scope.static_scope.self_type
226
232
  extension_name = "%s$%s" % [self_type.name,
@@ -239,7 +245,7 @@ module Mirah::AST
239
245
  self_type.add_method(name, arg_types, macro)
240
246
  end
241
247
  proxy.__inline__(Noop.new(parent, position))
242
- proxy.infer(typer)
248
+ proxy.infer(typer, expression)
243
249
  end
244
250
  end
245
251
 
@@ -270,12 +276,13 @@ module Mirah::AST
270
276
  new_factory = orig_factory.dup
271
277
  Mirah::AST.type_factory = new_factory
272
278
  ast = build_ast(name, parent, transformer)
273
- puts ast.inspect if state.verbose
274
279
  classes = compile_ast(name, ast, transformer)
275
280
  loader = MirahClassLoader.new(
276
281
  JRuby.runtime.jruby_class_loader, classes)
277
282
  klass = loader.loadClass(name, true)
278
- annotate(parent, name)
283
+ if state.save_extensions
284
+ annotate(parent, name)
285
+ end
279
286
  Mirah::AST.type_factory = orig_factory
280
287
  klass
281
288
  end
@@ -304,20 +311,29 @@ module Mirah::AST
304
311
  end
305
312
 
306
313
  def compile_ast(name, ast, transformer)
307
- typer = Mirah::Typer::JVM.new(transformer)
308
- typer.infer(ast)
309
- typer.resolve(true)
314
+ begin
315
+ typer = Mirah::Typer::JVM.new(transformer)
316
+ typer.infer(ast, false)
317
+ typer.resolve(true)
318
+ typer.errors.each do |e|
319
+ raise e
320
+ end
321
+ ensure
322
+ puts ast.inspect if transformer.state.verbose
323
+ end
310
324
  compiler = Mirah::Compiler::JVM.new
311
325
  ast.compile(compiler, false)
312
326
  class_map = {}
313
327
  compiler.generate do |outfile, builder|
314
- outfile = "#{transformer.destination}#{outfile}"
315
- FileUtils.mkdir_p(File.dirname(outfile))
316
- File.open(outfile, 'wb') do |f|
317
- bytes = builder.generate
318
- name = builder.class_name.gsub(/\//, '.')
319
- class_map[name] = bytes
320
- f.write(bytes)
328
+ bytes = builder.generate
329
+ name = builder.class_name.gsub(/\//, '.')
330
+ class_map[name] = bytes
331
+ if transformer.state.save_extensions
332
+ outfile = "#{transformer.destination}#{outfile}"
333
+ FileUtils.mkdir_p(File.dirname(outfile))
334
+ File.open(outfile, 'wb') do |f|
335
+ f.write(bytes)
336
+ end
321
337
  end
322
338
  end
323
339
  class_map
@@ -325,7 +341,7 @@ module Mirah::AST
325
341
 
326
342
  def build_ast(name, parent, transformer)
327
343
  # TODO should use a new type factory too.
328
-
344
+
329
345
  ast = Mirah::AST.parse_ruby("begin;end")
330
346
  ast = transformer.transform(ast, nil)
331
347
 
@@ -372,6 +388,12 @@ module Mirah::AST
372
388
  [arg.name, type, arg.position]
373
389
  end
374
390
  m = extension.define_method(position, '_expand', node_type, *actual_args)
391
+ scope.static_scope.imports.each do |short, long|
392
+ m.static_scope.import(long, short)
393
+ end
394
+ scope.static_scope.search_packages.each do |package|
395
+ m.static_scope.import(package, '*')
396
+ end
375
397
  m.body = self.body
376
398
  ast.body = extension
377
399
  ast
@@ -19,11 +19,13 @@ module Mirah::AST
19
19
  super(parent, line_number, &block)
20
20
  end
21
21
 
22
- def infer(typer)
23
- children.each do |kid|
24
- kid.infer(typer)
22
+ def infer(typer, expression)
23
+ resolve_if(typer) do
24
+ children.each do |kid|
25
+ kid.infer(typer, true)
26
+ end
27
+ @inferred_type = typer.array_type
25
28
  end
26
- @inferred_type = typer.array_type
27
29
  end
28
30
  end
29
31
 
@@ -35,7 +37,7 @@ module Mirah::AST
35
37
  @literal = literal
36
38
  end
37
39
 
38
- def infer(typer)
40
+ def infer(typer, expression)
39
41
  resolve_if(typer) {@inferred_type = typer.fixnum_type(@literal)}
40
42
  end
41
43
 
@@ -56,7 +58,7 @@ module Mirah::AST
56
58
  @literal = literal
57
59
  end
58
60
 
59
- def infer(typer)
61
+ def infer(typer, expression)
60
62
  resolve_if(typer) {@inferred_type = typer.float_type(@literal)}
61
63
  end
62
64
  end
@@ -71,7 +73,7 @@ module Mirah::AST
71
73
  @literal = literal
72
74
  end
73
75
 
74
- def infer(typer)
76
+ def infer(typer, expression)
75
77
  return @inferred_type if resolved?
76
78
  resolved!
77
79
  @inferred_type ||= typer.regexp_type
@@ -88,7 +90,7 @@ module Mirah::AST
88
90
  @literal = literal
89
91
  end
90
92
 
91
- def infer(typer)
93
+ def infer(typer, expression)
92
94
  return @inferred_type if resolved?
93
95
  resolved!
94
96
  @inferred_type ||= typer.string_type
@@ -108,10 +110,10 @@ module Mirah::AST
108
110
  super(parent, position, &block)
109
111
  end
110
112
 
111
- def infer(typer)
113
+ def infer(typer, expression)
112
114
  unless resolved?
113
115
  resolved = true
114
- children.each {|node| node.infer(typer); resolved &&= node.resolved?}
116
+ children.each {|node| node.infer(typer, true); resolved &&= node.resolved?}
115
117
  resolved! if resolved
116
118
  @inferred_type ||= typer.string_type
117
119
  end
@@ -126,9 +128,9 @@ module Mirah::AST
126
128
  super(parent, position)
127
129
  end
128
130
 
129
- def infer(typer)
131
+ def infer(typer, expression)
130
132
  unless resolved?
131
- body.infer(typer)
133
+ body.infer(typer, true)
132
134
  resolved! if body.resolved?
133
135
  @inferred_type ||= typer.string_type
134
136
  end
@@ -146,7 +148,7 @@ module Mirah::AST
146
148
  @literal = literal
147
149
  end
148
150
 
149
- def infer(typer)
151
+ def infer(typer, expression)
150
152
  return @inferred_type if resolved?
151
153
  resolved!
152
154
  @inferred_type ||= typer.boolean_type
@@ -160,7 +162,7 @@ module Mirah::AST
160
162
  super(parent, line_number)
161
163
  end
162
164
 
163
- def infer(typer)
165
+ def infer(typer, expression)
164
166
  return @inferred_type if resolved?
165
167
  resolved!
166
168
  @inferred_type ||= typer.null_type
@@ -24,14 +24,14 @@ module Mirah::AST
24
24
 
25
25
  def initialize(parent, line_number, name, &block)
26
26
  super(parent, line_number, &block)
27
- @name = name
27
+ self.name = name
28
28
  end
29
29
 
30
30
  def captured?
31
31
  scope.static_scope.captured?(name)
32
32
  end
33
33
 
34
- def infer(typer)
34
+ def infer(typer, expression)
35
35
  resolve_if(typer) do
36
36
  scope.static_scope << name
37
37
  @type = type_node.type_reference(typer)
@@ -53,7 +53,7 @@ module Mirah::AST
53
53
 
54
54
  def initialize(parent, line_number, name, &block)
55
55
  super(parent, line_number, &block)
56
- @name = name
56
+ self.name = name
57
57
  end
58
58
 
59
59
  def captured?
@@ -64,10 +64,10 @@ module Mirah::AST
64
64
  "LocalAssignment(name = #{name}, scope = #{scope}, captured = #{captured? == true})"
65
65
  end
66
66
 
67
- def infer(typer)
67
+ def infer(typer, expression)
68
68
  resolve_if(typer) do
69
69
  scope.static_scope << name
70
- typer.infer(value)
70
+ typer.infer(value, true)
71
71
  end
72
72
  end
73
73
 
@@ -83,18 +83,18 @@ module Mirah::AST
83
83
 
84
84
  def initialize(parent, line_number, name)
85
85
  super(parent, line_number, [])
86
- @name = name
86
+ self.name = name
87
87
  end
88
88
 
89
89
  def captured?
90
- scope.static_scope.captured?(name)
90
+ scope && scope.static_scope.captured?(name)
91
91
  end
92
92
 
93
93
  def to_s
94
94
  "Local(name = #{name}, scope = #{scope}, captured = #{captured? == true})"
95
95
  end
96
96
 
97
- def infer(typer)
97
+ def infer(typer, expression)
98
98
  resolve_if(typer) do
99
99
  scope.static_scope << name
100
100
  typer.local_type(containing_scope, name)
@@ -25,9 +25,9 @@ module Mirah::AST
25
25
  super(parent, line_number, &block)
26
26
  end
27
27
 
28
- def infer(typer)
28
+ def infer(typer, expression)
29
29
  unless resolved?
30
- @inferred_type = args ? args.map {|arg| typer.infer(arg)} : []
30
+ @inferred_type = args ? args.map {|arg| typer.infer(arg, true)} : []
31
31
  if @inferred_type.all?
32
32
  resolved!
33
33
  else
@@ -115,10 +115,10 @@ module Mirah::AST
115
115
  def initialize(parent, line_number, name, type=nil)
116
116
  super(parent, line_number, [type])
117
117
 
118
- @name = name
118
+ self.name = name
119
119
  end
120
120
 
121
- def infer(typer)
121
+ def infer(typer, expression)
122
122
  resolve_if(typer) do
123
123
  scope.static_scope << name
124
124
  # if not already typed, check parent of parent (MethodDefinition)
@@ -144,17 +144,17 @@ module Mirah::AST
144
144
 
145
145
  def initialize(parent, line_number, name, &block)
146
146
  super(parent, line_number, &block)
147
- @name = name
147
+ self.name = name
148
148
  end
149
149
 
150
- def infer(typer)
150
+ def infer(typer, expression)
151
151
  resolve_if(typer) do
152
152
  scope.static_scope << name
153
153
  # if not already typed, check parent of parent (MethodDefinition)
154
154
  # for signature info
155
155
  method_def = parent.parent
156
156
  signature = method_def.signature
157
- value_type = value.infer(typer)
157
+ value_type = value.infer(typer, true)
158
158
  declared_type = type_node.type_reference(typer) if type_node
159
159
  signature[name.intern] = declared_type || value_type
160
160
  end
@@ -168,10 +168,10 @@ module Mirah::AST
168
168
  def initialize(parent, line_number, name)
169
169
  super(parent, line_number)
170
170
 
171
- @name = name
171
+ self.name = name
172
172
  end
173
173
 
174
- def infer(typer)
174
+ def infer(typer, expression)
175
175
  scope.static_scope << name
176
176
  super
177
177
  end
@@ -186,10 +186,10 @@ module Mirah::AST
186
186
  def initialize(parent, line_number, name)
187
187
  super(parent, line_number)
188
188
 
189
- @name = name
189
+ self.name = name
190
190
  end
191
191
 
192
- def infer(typer)
192
+ def infer(typer, expression)
193
193
  scope.static_scope << name
194
194
  super
195
195
  end
@@ -202,6 +202,7 @@ module Mirah::AST
202
202
  include Scoped
203
203
  include ClassScoped
204
204
  include Binding
205
+ include Java::DubyLangCompiler.MethodDefinition
205
206
 
206
207
  child :signature
207
208
  child :arguments
@@ -216,7 +217,7 @@ module Mirah::AST
216
217
  def initialize(parent, line_number, name, annotations=[], &block)
217
218
  @annotations = annotations
218
219
  super(parent, line_number, &block)
219
- @name = name
220
+ self.name = name
220
221
  @visibility = (class_scope && class_scope.current_access_level) || :public
221
222
  end
222
223
 
@@ -224,24 +225,30 @@ module Mirah::AST
224
225
  super
225
226
  end
226
227
 
227
- def infer(typer)
228
+ def infer(typer, expression)
228
229
  resolve_if(typer) do
229
230
  @defining_class ||= begin
231
+ static_scope.self_node = :self
230
232
  static_scope.self_type = if static?
231
233
  scope.static_scope.self_type.meta
232
234
  else
233
235
  scope.static_scope.self_type
234
236
  end
235
237
  end
236
- @annotations.each {|a| a.infer(typer)} if @annotations
237
- typer.infer(arguments)
238
+ @annotations.each {|a| a.infer(typer, true)} if @annotations
239
+ typer.infer(arguments, true)
240
+ if @return_type.kind_of?(UnquotedValue)
241
+ @return_type = @return_type.node
242
+ @return_type.parent = self
243
+ end
238
244
  signature[:return] = @return_type.type_reference(typer) if @return_type
239
245
  if @exceptions
240
246
  signature[:throws] = @exceptions.map {|e| e.type_reference(typer)}
241
247
  end
242
248
  typer.infer_signature(self)
243
249
  forced_type = signature[:return]
244
- inferred_type = body ? typer.infer(body) : typer.no_type
250
+ body_is_expression = (forced_type != typer.no_type)
251
+ inferred_type = body ? typer.infer(body, body_is_expression) : typer.no_type
245
252
 
246
253
  if inferred_type && arguments.inferred_type.all?
247
254
  actual_type = if forced_type.nil?
@@ -283,7 +290,7 @@ module Mirah::AST
283
290
  arguments.args.each do |arg|
284
291
  if OptionalArgument === arg
285
292
  arg_types_for_opt = args_for_opt.map do |arg_for_opt|
286
- arg_for_opt.infer(typer)
293
+ arg_for_opt.infer(typer, true)
287
294
  end
288
295
  typer.learn_method_type(defining_class, name, arg_types_for_opt, type, signature[:throws])
289
296
  end
@@ -318,6 +325,13 @@ module Mirah::AST
318
325
  extract_delegate_constructor
319
326
  end
320
327
 
328
+ def validate_children
329
+ super
330
+ if @delegate_args
331
+ @delegate_args.each {|arg| arg.parent = self}
332
+ end
333
+ end
334
+
321
335
  def first_node
322
336
  if body.kind_of? Body
323
337
  body.children[0]
@@ -354,9 +368,9 @@ module Mirah::AST
354
368
  self.first_node = Noop.new(self, position) if @delegate_args
355
369
  end
356
370
 
357
- def infer(typer)
371
+ def infer(typer, expression)
358
372
  unless @inferred_type
359
- delegate_args.each {|a| typer.infer(a)} if delegate_args
373
+ delegate_args.each {|a| typer.infer(a, true)} if delegate_args
360
374
  end
361
375
  super
362
376
  end