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
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mirah
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 5
9
- version: 0.0.5
4
+ prerelease:
5
+ version: 0.0.6
10
6
  platform: java
11
7
  authors:
12
8
  - Charles Oliver Nutter
@@ -15,7 +11,7 @@ autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
13
 
18
- date: 2010-12-22 14:22:46.420000 -06:00
14
+ date: 2011-03-20 01:59:06.100000 -05:00
19
15
  default_executable:
20
16
  dependencies:
21
17
  - !ruby/object:Gem::Dependency
@@ -26,11 +22,7 @@ dependencies:
26
22
  requirements:
27
23
  - - ">="
28
24
  - !ruby/object:Gem::Version
29
- segments:
30
- - 0
31
- - 0
32
- - 6
33
- version: 0.0.6
25
+ version: 0.0.8
34
26
  type: :runtime
35
27
  version_requirements: *id001
36
28
  description: |-
@@ -71,7 +63,7 @@ files:
71
63
  - lib/mirah/ast.rb
72
64
  - lib/mirah/compiler.rb
73
65
  - lib/mirah/env.rb
74
- - lib/mirah/nbcompiler.rb
66
+ - lib/mirah/errors.rb
75
67
  - lib/mirah/transform.rb
76
68
  - lib/mirah/transform2.rb
77
69
  - lib/mirah/typer.rb
@@ -117,9 +109,11 @@ files:
117
109
  - test/test_java_typer.rb
118
110
  - test/test_javac_compiler.rb
119
111
  - test/test_jvm_compiler.rb
112
+ - test/test_macros.rb
120
113
  - test/test_typer.rb
121
114
  - examples/bintrees.mirah
122
115
  - examples/construction.mirah
116
+ - examples/Dynamic.class
123
117
  - examples/dynamic.mirah
124
118
  - examples/edb.mirah
125
119
  - examples/fib.mirah
@@ -127,6 +121,7 @@ files:
127
121
  - examples/fractal.mirah
128
122
  - examples/java_thing.mirah
129
123
  - examples/simple_class.mirah
124
+ - examples/SizeThing.class
130
125
  - examples/sort_closure.mirah
131
126
  - examples/swing.mirah
132
127
  - examples/tak.mirah
@@ -138,7 +133,7 @@ files:
138
133
  - examples/appengine/src/org/mirah/MirahApp.mirah
139
134
  - examples/appengine/war/WEB-INF/lib/dubydatastore.jar
140
135
  - examples/plugins/appengine/Rakefile
141
- - examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb
136
+ - examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah
142
137
  - examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby
143
138
  - examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby
144
139
  - examples/wiki/Rakefile
@@ -194,8 +189,8 @@ files:
194
189
  - examples/wiki/war/WEB-INF/lib/dubydatastore.jar
195
190
  - examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar
196
191
  - examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar
197
- - javalib/dynalang-invoke-0.1.jar
198
- - javalib/JRubyParser.jar
192
+ - javalib/dynalink-0.1.jar
193
+ - javalib/jsr292-mock.jar
199
194
  - javalib/mirah-bootstrap.jar
200
195
  - javalib/mirah-parser.jar
201
196
  - History.txt
@@ -216,21 +211,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
211
  requirements:
217
212
  - - ">="
218
213
  - !ruby/object:Gem::Version
219
- segments:
220
- - 0
221
214
  version: "0"
222
215
  required_rubygems_version: !ruby/object:Gem::Requirement
223
216
  none: false
224
217
  requirements:
225
218
  - - ">="
226
219
  - !ruby/object:Gem::Version
227
- segments:
228
- - 0
229
220
  version: "0"
230
221
  requirements: []
231
222
 
232
223
  rubyforge_project: mirah
233
- rubygems_version: 1.3.7
224
+ rubygems_version: 1.5.1
234
225
  signing_key:
235
226
  specification_version: 3
236
227
  summary: Mirah is a customizable programming language featuring static types, local type inference and a heavily Ruby-inspired syntax
@@ -242,4 +233,5 @@ test_files:
242
233
  - test/test_java_typer.rb
243
234
  - test/test_javac_compiler.rb
244
235
  - test/test_jvm_compiler.rb
236
+ - test/test_macros.rb
245
237
  - test/test_typer.rb
@@ -1,390 +0,0 @@
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 AppEngine
17
- class DubyDatastorePlugin
18
- @models = {}
19
-
20
- TypeMap = {
21
- 'Category' => 'String',
22
- 'Email' => 'String',
23
- 'Link' => 'String',
24
- 'PhoneNumber' => 'String',
25
- 'PostalAddress' => 'String',
26
- 'Text' => 'String',
27
- 'Blob' => 'byte[]',
28
- 'ShortBlob' => 'byte[]',
29
- 'Rating' => 'int',
30
- 'Long' => 'long',
31
- 'Double' => 'double',
32
- 'Boolean' => 'boolean'
33
- }
34
-
35
- Primitives = ['Long', 'Double', 'Boolean', 'Rating']
36
-
37
- Boxes = {
38
- 'int' => 'Integer',
39
- 'boolean' => 'Boolean',
40
- 'long' => 'Long',
41
- 'double' => 'Double',
42
- }
43
-
44
- Defaults = {
45
- 'Rating' => '0',
46
- 'Long' => 'long(0)',
47
- 'Double' => '0.0',
48
- 'Boolean' => 'false',
49
- 'Blob' => 'byte[].cast(nil)',
50
- 'ShortBlob' => 'byte[].cast(nil)',
51
- }
52
-
53
- Conversions = {
54
- 'Category' => 'getCategory',
55
- 'Email' => 'getEmail',
56
- 'Link' => 'getValue',
57
- 'PhoneNumber' => 'getNumber',
58
- 'PostalAddress' => 'getAddress',
59
- 'Text' => 'getValue',
60
- 'Blob' => 'getBytes',
61
- 'ShortBlob' => 'getBytes',
62
- 'Long' => 'longValue',
63
- 'Double' => 'doubleValue',
64
- 'Boolean' => 'booleanValue',
65
- 'Rating' => 'getRating',
66
- }
67
-
68
- class ModelState
69
- include Mirah::AST
70
- attr_reader :kind, :query, :read, :save, :transformer
71
-
72
- def initialize(transformer, klass, parent, position, ast)
73
- @transformer = transformer
74
- @kind = klass.name.split('.')[-1]
75
- init_query(klass.name, parent, position, ast)
76
- init_static(parent, ast)
77
- init_read(parent, position, ast)
78
- init_save(parent, position, ast)
79
- end
80
-
81
- def init_query(classname, parent, position, ast)
82
- name = "#{classname}$Query"
83
- @query = ClassDefinition.new(parent, position, name) do |classdef|
84
- queryinit = <<-EOF
85
- def initialize; end
86
-
87
- def kind
88
- "#{kind}"
89
- end
90
-
91
- def first
92
- it = _prepare.asIterator
93
- if it.hasNext
94
- e = Entity(it.next)
95
- m = #{kind}.new
96
- m._read_from(e)
97
- m
98
- else
99
- #{kind}(nil)
100
- end
101
- end
102
-
103
- def run
104
- entities = _prepare.asList(_options)
105
- models = #{kind}[entities.size]
106
- it = entities.iterator
107
- i = 0
108
- while (it.hasNext)
109
- e = Entity(it.next)
110
- m = #{kind}.new
111
- m._read_from(e)
112
- models[i] = m
113
- i += 1
114
- end
115
- models
116
- end
117
-
118
- def sort(name:String)
119
- sort(name, false)
120
- end
121
-
122
- def sort(name:String, descending:boolean)
123
- _sort(name, descending)
124
- self
125
- end
126
- EOF
127
- [Mirah::AST.type(nil, 'com.google.appengine.ext.duby.db.DQuery'),
128
- eval(classdef, queryinit)]
129
- end
130
- ast << @query
131
- end
132
-
133
- def init_read(parent, position, ast)
134
- @read = eval(parent, <<-EOF)
135
- def _read_from(e:Entity)
136
- self.entity = e
137
- nil
138
- end
139
- EOF
140
- ast << @read
141
- get_properties = eval(parent, <<-EOF)
142
- def properties
143
- result = super()
144
- nil
145
- result
146
- end
147
- EOF
148
- @get_properties = get_properties.body.children[1] =
149
- Mirah::AST::Body.new(get_properties.body, position)
150
- ast << get_properties
151
- update = eval(parent, <<-EOF)
152
- def update(properties:Map)
153
- nil
154
- self
155
- end
156
- EOF
157
- @update = update.body.children[0] = Body.new(update.body, position) {[]}
158
- ast << update
159
- end
160
-
161
- def init_save(parent, position, ast)
162
- @save = eval(parent, <<-EOF)
163
- def _save_to(e:Entity)
164
- end
165
- EOF
166
- @save.body = Body.new(@save, position) {[]}
167
- ast << @save
168
- end
169
-
170
- def init_static(parent, ast)
171
- # TODO These imports don't work any more. Figure out how to fix that.
172
- scope = ast.static_scope
173
- package = "#{scope.package}." unless scope.package.empty?
174
- scope.import('java.util.Map', 'Map')
175
- scope.import("#{package}#{kind}$Query", "#{kind}__Query__")
176
- %w( Entity Blob Category Email GeoPt IMHandle Key
177
- Link PhoneNumber PostalAddress Rating ShortBlob
178
- Text KeyFactory EntityNotFoundException ).each do |name|
179
- scope.import("com.google.appengine.api.datastore.#{name}", name)
180
- end
181
- ast << eval(parent, <<-EOF)
182
- def initialize
183
- super
184
- end
185
-
186
- def initialize(key_name:String)
187
- super
188
- end
189
-
190
- def initialize(parent:Model)
191
- super
192
- end
193
-
194
- def initialize(parent:Key)
195
- super
196
- end
197
-
198
- def initialize(parent:Model, key_name:String)
199
- super
200
- end
201
-
202
- def initialize(parent:Key, key_name:String)
203
- super
204
- end
205
-
206
- def self.get(key:Key)
207
- begin
208
- m = #{kind}.new
209
- m._read_from(Model._datastore.get(key))
210
- m
211
- rescue EntityNotFoundException
212
- nil
213
- end
214
- end
215
-
216
- def self.get(key_name:String)
217
- get(KeyFactory.createKey("#{kind}", key_name))
218
- end
219
-
220
- def self.get(id:long)
221
- get(KeyFactory.createKey("#{kind}", id))
222
- end
223
-
224
- def self.get(parent:Key, key_name:String)
225
- get(KeyFactory.createKey(parent, "#{kind}", key_name))
226
- end
227
-
228
- def self.get(parent:Key, id:long)
229
- get(KeyFactory.createKey(parent, "#{kind}", id))
230
- end
231
-
232
- def self.get(parent:Model, key_name:String)
233
- get(KeyFactory.createKey(parent.key, "#{kind}", key_name))
234
- end
235
-
236
- def self.get(parent:Model, id:long)
237
- get(KeyFactory.createKey(parent.key, "#{kind}", id))
238
- end
239
-
240
- def self.all
241
- #{kind}__Query__.new
242
- end
243
- EOF
244
- end
245
-
246
- def eval(parent, src)
247
- transformer.eval(src, __FILE__, parent)
248
- end
249
-
250
- def extend_query(code)
251
- query.body << eval(query.body, code)
252
- end
253
-
254
- def extend_update(code)
255
- @update << eval(@update, code)
256
- end
257
-
258
- def extend_get_properties(code)
259
- @get_properties << eval(@get_properties, code)
260
- end
261
-
262
- def extend_read(code)
263
- code = 'e=nil;' + code
264
- eval(read.body, code).children[1..-1].each do |node|
265
- read.body << node
266
- end
267
- end
268
-
269
- def extend_save(code)
270
- code = 'e=nil;' + code
271
- eval(save.body, code).children[1..-1].each do |node|
272
- save.body << node
273
- end
274
- end
275
- end
276
-
277
- def self.find_class(node)
278
- node = node.parent until Mirah::AST::ClassDefinition === node
279
- node
280
- end
281
-
282
- def self.to_datastore(type, value)
283
- if Primitives.include?(type)
284
- "#{type}.new(#{value})"
285
- elsif TypeMap.include?(type)
286
- "(#{value} ? #{type}.new(#{value}) : nil)"
287
- else
288
- value
289
- end
290
- end
291
-
292
- def self.from_datastore(type, value)
293
- duby_type = TypeMap[type]
294
- if duby_type
295
- default = Defaults.fetch(type, "#{duby_type}(nil)")
296
- conversion = Conversions[type]
297
- "(#{value} ? #{type}(#{value}).#{conversion} : #{default})"
298
- else
299
- "#{type}(#{value})"
300
- end
301
- end
302
-
303
-
304
- def self.add_property(name, type, transformer, fcall)
305
- if transformer.state != @state
306
- reset
307
- @state = transformer.state
308
- end
309
- parent = fcall.parent
310
- name = name.literal
311
- type = type.name
312
- type = 'Long' if type == 'Integer'
313
-
314
- result = Mirah::AST::ScopedBody.new(parent, fcall.position) {[]}
315
- result.static_scope = fcall.scope.static_scope
316
- klass = find_class(parent)
317
- unless @models[klass]
318
- @models[klass] = ModelState.new(
319
- transformer, klass, parent, fcall.position, result)
320
- end
321
- model = @models[klass]
322
-
323
- duby_type = TypeMap.fetch(type, type)
324
- coercion = "coerce_" + duby_type.downcase.sub("[]", "s")
325
-
326
- if duby_type == 'List'
327
- model.extend_query(<<-EOF)
328
- def #{name}(value:Object)
329
- returns :void
330
- _query.addFilter("#{name}", _eq_op, value)
331
- end
332
- EOF
333
- else
334
- model.extend_query(<<-EOF)
335
- def #{name}(value:#{duby_type})
336
- returns :void
337
- _query.addFilter("#{name}", _eq_op, #{to_datastore(type, 'value')})
338
- end
339
- EOF
340
- end
341
- temp = transformer.tmp
342
-
343
- model.extend_read(<<-EOF)
344
- #{temp} = e.getProperty("#{name}")
345
- @#{name} = #{from_datastore(type, temp)}
346
- EOF
347
-
348
- model.extend_save(<<-EOF)
349
- e.setProperty("#{name}", #{to_datastore(type, '@' + name)})
350
- EOF
351
-
352
- model.extend_update(<<-EOF)
353
- self.#{name} = properties.get("#{name}") if properties.containsKey("#{name}")
354
- EOF
355
-
356
- model.extend_get_properties(<<-EOF)
357
- result.put("#{name}", #{maybe_box(duby_type, 'self.' + name)})
358
- EOF
359
-
360
- result << model.eval(parent, <<-EOF)
361
- def #{name}
362
- @#{name}
363
- end
364
-
365
- def #{name}=(value:#{duby_type})
366
- @#{name} = value
367
- end
368
-
369
- def #{name}=(value:Object)
370
- self.#{name} = #{coercion}(value)
371
- end
372
- EOF
373
-
374
- result
375
- end
376
-
377
- def self.maybe_box(duby_type, value)
378
- if Boxes.include?(duby_type)
379
- "#{Boxes[duby_type]}.valueOf(#{value})"
380
- else
381
- value
382
- end
383
- end
384
-
385
- def self.reset
386
- @models = {}
387
- end
388
- end
389
- ::Mirah.plugins << DubyDatastorePlugin
390
- end