mirah 0.0.4-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/History.txt +15 -0
  2. data/README.txt +51 -0
  3. data/Rakefile +86 -0
  4. data/bin/duby +10 -0
  5. data/bin/dubyc +10 -0
  6. data/bin/dubyp +10 -0
  7. data/bin/jrubyp +36 -0
  8. data/bin/mirah +9 -0
  9. data/bin/mirah.cmd +1 -0
  10. data/bin/mirahc +9 -0
  11. data/bin/mirahc.cmd +1 -0
  12. data/bin/mirahp +9 -0
  13. data/bin/mirahp.cmd +1 -0
  14. data/examples/ant/example-build.xml +7 -0
  15. data/examples/appengine/Rakefile +19 -0
  16. data/examples/appengine/Readme +29 -0
  17. data/examples/appengine/src/org/mirah/MirahApp.mirah +57 -0
  18. data/examples/appengine/src/org/mirah/list.dhtml +15 -0
  19. data/examples/appengine/war/WEB-INF/lib/dubydatastore.jar +0 -0
  20. data/examples/bintrees.mirah +66 -0
  21. data/examples/construction.mirah +8 -0
  22. data/examples/dynamic.mirah +17 -0
  23. data/examples/edb.mirah +3 -0
  24. data/examples/fib.mirah +16 -0
  25. data/examples/fields.mirah +22 -0
  26. data/examples/fractal.mirah +55 -0
  27. data/examples/java_thing.mirah +13 -0
  28. data/examples/plugins/appengine/Rakefile +55 -0
  29. data/examples/plugins/appengine/lib/com/google/appengine/ext/duby/db/datastore.rb +375 -0
  30. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +336 -0
  31. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +113 -0
  32. data/examples/simple_class.mirah +12 -0
  33. data/examples/sort_closure.mirah +7 -0
  34. data/examples/swing.mirah +20 -0
  35. data/examples/tak.mirah +15 -0
  36. data/examples/test.edb +9 -0
  37. data/examples/wiki/Rakefile +18 -0
  38. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +324 -0
  39. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +42 -0
  40. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +2 -0
  41. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +69 -0
  42. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +7 -0
  43. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +15 -0
  44. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  45. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  46. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  47. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  48. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  49. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  50. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  51. data/examples/wiki/war/app.yaml +21 -0
  52. data/examples/wiki/war/public/favicon.ico +0 -0
  53. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  54. data/examples/wiki/war/public/images/back.gif +0 -0
  55. data/examples/wiki/war/public/images/dir.gif +0 -0
  56. data/examples/wiki/war/public/images/file.gif +0 -0
  57. data/examples/wiki/war/public/javascripts/prettify.js +61 -0
  58. data/examples/wiki/war/public/robots.txt +0 -0
  59. data/examples/wiki/war/public/stylesheets/main.css +156 -0
  60. data/examples/wiki/war/public/stylesheets/prettify.css +1 -0
  61. data/examples/wiki/war/public/stylesheets/sh_style.css +66 -0
  62. data/examples/wiki/war/public/stylesheets/source.css +21 -0
  63. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  64. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  65. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  66. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  67. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  68. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  69. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  70. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  71. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  72. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  73. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  74. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  75. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  76. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  77. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  78. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  79. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  80. data/examples/wiki/war/public/wmd/showdown.js +421 -0
  81. data/examples/wiki/war/public/wmd/wmd-base.js +1799 -0
  82. data/examples/wiki/war/public/wmd/wmd-plus.js +311 -0
  83. data/examples/wiki/war/public/wmd/wmd.js +73 -0
  84. data/javalib/JRubyParser.jar +0 -0
  85. data/javalib/dynalang-invoke-0.1.jar +0 -0
  86. data/javalib/mirah-bootstrap.jar +0 -0
  87. data/javalib/mirah-parser.jar +0 -0
  88. data/lib/duby.rb +2 -0
  89. data/lib/mirah.rb +338 -0
  90. data/lib/mirah/appengine_tasks.rb +146 -0
  91. data/lib/mirah/ast.rb +615 -0
  92. data/lib/mirah/ast/call.rb +307 -0
  93. data/lib/mirah/ast/class.rb +311 -0
  94. data/lib/mirah/ast/flow.rb +364 -0
  95. data/lib/mirah/ast/intrinsics.rb +470 -0
  96. data/lib/mirah/ast/literal.rb +154 -0
  97. data/lib/mirah/ast/local.rb +89 -0
  98. data/lib/mirah/ast/method.rb +360 -0
  99. data/lib/mirah/ast/scope.rb +208 -0
  100. data/lib/mirah/ast/structure.rb +226 -0
  101. data/lib/mirah/ast/type.rb +130 -0
  102. data/lib/mirah/compiler.rb +341 -0
  103. data/lib/mirah/env.rb +33 -0
  104. data/lib/mirah/jvm/base.rb +258 -0
  105. data/lib/mirah/jvm/compiler.rb +885 -0
  106. data/lib/mirah/jvm/method_lookup.rb +203 -0
  107. data/lib/mirah/jvm/source_compiler.rb +737 -0
  108. data/lib/mirah/jvm/source_generator/builder.rb +444 -0
  109. data/lib/mirah/jvm/source_generator/loops.rb +110 -0
  110. data/lib/mirah/jvm/source_generator/precompile.rb +188 -0
  111. data/lib/mirah/jvm/source_generator/typer.rb +11 -0
  112. data/lib/mirah/jvm/typer.rb +151 -0
  113. data/lib/mirah/jvm/types.rb +416 -0
  114. data/lib/mirah/jvm/types/basic_types.rb +33 -0
  115. data/lib/mirah/jvm/types/boolean.rb +17 -0
  116. data/lib/mirah/jvm/types/enumerable.rb +65 -0
  117. data/lib/mirah/jvm/types/extensions.rb +86 -0
  118. data/lib/mirah/jvm/types/factory.rb +186 -0
  119. data/lib/mirah/jvm/types/floats.rb +86 -0
  120. data/lib/mirah/jvm/types/integers.rb +171 -0
  121. data/lib/mirah/jvm/types/intrinsics.rb +376 -0
  122. data/lib/mirah/jvm/types/literals.rb +74 -0
  123. data/lib/mirah/jvm/types/methods.rb +614 -0
  124. data/lib/mirah/jvm/types/number.rb +143 -0
  125. data/lib/mirah/nbcompiler.rb +29 -0
  126. data/lib/mirah/plugin/edb.rb +29 -0
  127. data/lib/mirah/plugin/gwt.rb +173 -0
  128. data/lib/mirah/plugin/java.rb +55 -0
  129. data/lib/mirah/transform.rb +266 -0
  130. data/lib/mirah/transform2.rb +728 -0
  131. data/lib/mirah/typer.rb +407 -0
  132. data/lib/mirah_task.rb +107 -0
  133. data/test/test_ast.rb +359 -0
  134. data/test/test_compilation.rb +112 -0
  135. data/test/test_env.rb +42 -0
  136. data/test/test_gwt.rb +58 -0
  137. data/test/test_java_typer.rb +183 -0
  138. data/test/test_javac_compiler.rb +63 -0
  139. data/test/test_jvm_compiler.rb +2607 -0
  140. data/test/test_typer.rb +221 -0
  141. metadata +235 -0
@@ -0,0 +1,336 @@
1
+ import java.util.ConcurrentModificationException
2
+
3
+ import com.google.appengine.api.datastore.DatastoreServiceFactory
4
+ import com.google.appengine.api.datastore.Entity
5
+ import com.google.appengine.api.datastore.EntityNotFoundException
6
+ import com.google.appengine.api.datastore.Key
7
+ import com.google.appengine.api.datastore.KeyFactory
8
+ import com.google.appengine.api.datastore.Query
9
+ import 'Builder', 'com.google.appengine.api.datastore.FetchOptions$Builder'
10
+ import 'FilterOperator', 'com.google.appengine.api.datastore.Query$FilterOperator'
11
+ import 'SortDirection', 'com.google.appengine.api.datastore.Query$SortDirection'
12
+ import com.google.appengine.api.datastore.GeoPt
13
+ import com.google.appengine.api.datastore.IMHandle
14
+ import com.google.appengine.api.users.User
15
+
16
+ import java.util.Arrays
17
+ import java.util.Date
18
+ import java.util.HashMap
19
+ import java.util.List
20
+ import java.util.Map
21
+
22
+ class DQuery
23
+ def initialize
24
+ @query = Query.new(kind)
25
+ end
26
+
27
+ def kind
28
+ "foo"
29
+ end
30
+
31
+ def limit(l:int)
32
+ returns void
33
+ if @options
34
+ @options.limit(l)
35
+ else
36
+ @options = Builder.withLimit(l)
37
+ end
38
+ end
39
+
40
+ def offset(o:int)
41
+ returns void
42
+ if @options
43
+ @options.offset(o)
44
+ else
45
+ @options = Builder.withOffset(o)
46
+ end
47
+ end
48
+
49
+ def sort(name:String, descending=false):void
50
+ if descending
51
+ @query.addSort(name, _desc)
52
+ else
53
+ @query.addSort(name)
54
+ end
55
+ end
56
+
57
+ def count
58
+ _prepare.countEntities
59
+ end
60
+
61
+ def _query
62
+ @query
63
+ end
64
+
65
+ def _options
66
+ if @options.nil?
67
+ @options = Builder.withOffset(0)
68
+ end
69
+ @options
70
+ end
71
+
72
+ def _prepare
73
+ Model._datastore.prepare(@query)
74
+ end
75
+
76
+ def _eq_op
77
+ FilterOperator.valueOf("EQUAL")
78
+ end
79
+
80
+ def _desc
81
+ SortDirection.valueOf("DESCENDING")
82
+ end
83
+ end
84
+
85
+ class Model
86
+ defmacro property(name, type) do
87
+ # This is a hack to make packaging possible.
88
+ # Everything's still written in ruby, but we load it out of
89
+ # the datastore plugin's JAR. So as long as Model is in your CLASSPATH
90
+ # you don't need any extra arguments to dubyc.
91
+ code = <<RUBY
92
+ require 'com/google/appengine/ext/duby/db/datastore.rb'
93
+ AppEngine::DubyDatastorePlugin.add_property(*arg.to_a)
94
+ RUBY
95
+ @mirah.__ruby_eval(code, [name, type, @mirah, @call])
96
+ end
97
+
98
+ def initialize; end
99
+
100
+ def initialize(key_name:String)
101
+ @key_name = key_name
102
+ end
103
+
104
+ def initialize(parent:Model)
105
+ @parent = parent.key
106
+ end
107
+
108
+ def initialize(parent:Key)
109
+ @parent = parent
110
+ end
111
+
112
+ def initialize(parent:Model, key_name:String)
113
+ @parent = parent.key
114
+ @key_name = key_name
115
+ end
116
+
117
+ def initialize(parent:Key, key_name:String)
118
+ @parent = parent
119
+ @key_name = key_name
120
+ end
121
+
122
+ def self._datastore
123
+ unless @service
124
+ @service = DatastoreServiceFactory.getDatastoreService
125
+ end
126
+ @service
127
+ end
128
+
129
+ def self.delete(key:Key)
130
+ returns void
131
+ keys = Key[1]
132
+ keys[0] = key
133
+ Model._datastore.delete(keys)
134
+ end
135
+
136
+ def kind
137
+ getClass.getSimpleName
138
+ end
139
+
140
+ def key
141
+ if @entity
142
+ @entity.getKey
143
+ elsif @key_name
144
+ if @parent
145
+ KeyFactory.createKey(@parent, kind, @key_name)
146
+ else
147
+ KeyFactory.createKey(kind, @key_name)
148
+ end
149
+ else
150
+ Key(nil)
151
+ end
152
+ end
153
+
154
+ def save
155
+ Model._datastore.put(to_entity)
156
+ end
157
+
158
+ def delete
159
+ returns void
160
+ Model.delete(key)
161
+ end
162
+
163
+ def to_entity
164
+ before_save
165
+ @entity ||= begin
166
+ if @key_name
167
+ Entity.new(key)
168
+ elsif @parent
169
+ Entity.new(kind, @parent)
170
+ else
171
+ Entity.new(kind)
172
+ end
173
+ end
174
+ _save_to(@entity)
175
+ @entity
176
+ end
177
+
178
+ def properties
179
+ Map(HashMap.new)
180
+ end
181
+
182
+ def entity=(entity:Entity)
183
+ @entity = entity
184
+ end
185
+
186
+ def parent
187
+ @parent
188
+ end
189
+
190
+ def coerce_list(object:Object)
191
+ if object.kind_of?(List)
192
+ List(object)
193
+ elsif object.kind_of?(Object[])
194
+ Arrays.asList(Object[].cast(object))
195
+ else
196
+ raise IllegalArgumentException.new(
197
+ "Expected List, got #{object} (#{object.getClass.getName})")
198
+ end
199
+ end
200
+
201
+ def coerce_long(object:Object)
202
+ if object.kind_of?(Number)
203
+ Number(object).longValue
204
+ elsif object.kind_of?(String)
205
+ Long.parseLong(String(object))
206
+ else
207
+ raise IllegalArgumentException.new(
208
+ "Expected Long, got #{object} (#{object.getClass.getName})")
209
+ end
210
+ end
211
+
212
+ def coerce_int(object:Object)
213
+ if object.kind_of?(Number)
214
+ Number(object).intValue
215
+ elsif object.kind_of?(String)
216
+ Integer.parseInt(String(object))
217
+ else
218
+ raise IllegalArgumentException.new(
219
+ "Expected Integer, got #{object} (#{object.getClass.getName})")
220
+ end
221
+ end
222
+
223
+ def coerce_double(object:Object)
224
+ if object.kind_of?(Number)
225
+ Number(object).doubleValue
226
+ elsif object.kind_of?(String)
227
+ Double.parseDouble(String(object))
228
+ else
229
+ raise IllegalArgumentException.new(
230
+ "Expected Double, got #{object} (#{object.getClass.getName})")
231
+ end
232
+ end
233
+
234
+ def coerce_boolean(object:Object)
235
+ if object.kind_of?(Boolean)
236
+ Boolean(object).booleanValue
237
+ elsif object.kind_of?(String)
238
+ Boolean.parseBoolean(String(object))
239
+ else
240
+ raise IllegalArgumentException.new(
241
+ "Expected Boolean, got #{object} (#{object.getClass.getName})")
242
+ end
243
+ end
244
+
245
+ def coerce_date(object:Object)
246
+ unless object.kind_of?(Date) || object.nil?
247
+ raise IllegalArgumentException.new(
248
+ "Expected Date, got #{object} (#{object.getClass.getName})")
249
+ end
250
+ Date(object)
251
+ end
252
+
253
+ def coerce_geopt(object:Object)
254
+ unless object.kind_of?(GeoPt) || object.nil?
255
+ raise IllegalArgumentException.new(
256
+ "Expected GeoPt, got #{object} (#{object.getClass.getName})")
257
+ end
258
+ GeoPt(object)
259
+ end
260
+
261
+ def coerce_user(object:Object)
262
+ unless object.kind_of?(User) || object.nil?
263
+ raise IllegalArgumentException.new(
264
+ "Expected User, got #{object} (#{object.getClass.getName})")
265
+ end
266
+ User(object)
267
+ end
268
+
269
+ def coerce_imhandle(object:Object)
270
+ unless object.kind_of?(IMHandle) || object.nil?
271
+ raise IllegalArgumentException.new(
272
+ "Expected IMHandle, got #{object} (#{object.getClass.getName})")
273
+ end
274
+ IMHandle(object)
275
+ end
276
+
277
+ def coerce_string(object:Object)
278
+ if object.nil?
279
+ String(nil)
280
+ else
281
+ object.toString
282
+ end
283
+ end
284
+
285
+ def coerce_key(object:Object)
286
+ if object.kind_of?(Key) || object.nil?
287
+ Key(object)
288
+ elsif object.kind_of?(String)
289
+ KeyFactory.stringToKey(String(object))
290
+ else
291
+ raise IllegalArgumentException.new(
292
+ "Expected Key, got #{object} (#{object.getClass.getName})")
293
+ end
294
+ end
295
+
296
+ def coerce_bytes(object:Object)
297
+ if object.kind_of?(byte[]) || object.nil?
298
+ byte[].cast(object)
299
+ else
300
+ raise IllegalArgumentException.new(
301
+ "Expected byte[], got #{object} (#{object.getClass.getName})")
302
+ end
303
+ end
304
+
305
+ # TODO coerce arrays to lists?
306
+
307
+ def before_save; end
308
+
309
+ def self.transaction(block:Runnable):void
310
+ tries = 3
311
+ while tries > 0
312
+ begin
313
+ tries -= 1
314
+ tx = Model._datastore.beginTransaction
315
+ begin
316
+ block.run
317
+ tx.commit
318
+ return
319
+ ensure
320
+ tx.rollback if tx.isActive
321
+ end
322
+ rescue ConcurrentModificationException => ex
323
+ unless tries > 0
324
+ raise ex
325
+ end
326
+ end
327
+ end
328
+ end
329
+
330
+ # protected
331
+ def _save_to(e:Entity):void
332
+ end
333
+
334
+ def _read_from(e:Entity):void
335
+ end
336
+ end
@@ -0,0 +1,113 @@
1
+ import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig
2
+ import com.google.appengine.tools.development.testing.LocalServiceTestConfig
3
+ import com.google.appengine.tools.development.testing.LocalServiceTestHelper
4
+
5
+ import org.junit.After
6
+ import org.junit.Before
7
+ import org.junit.Test
8
+ import org.junit.Assert
9
+
10
+ import com.google.appengine.api.datastore.Blob
11
+ import com.google.appengine.api.datastore.Category
12
+ import com.google.appengine.api.datastore.Email
13
+ import com.google.appengine.api.datastore.GeoPt
14
+ import com.google.appengine.api.datastore.IMHandle
15
+ import com.google.appengine.api.datastore.Key
16
+ import com.google.appengine.api.datastore.Link
17
+ import com.google.appengine.api.datastore.PhoneNumber
18
+ import com.google.appengine.api.datastore.PostalAddress
19
+ import com.google.appengine.api.datastore.Rating
20
+ import com.google.appengine.api.datastore.ShortBlob
21
+ import com.google.appengine.api.datastore.Text
22
+ import java.util.Date
23
+ import java.util.HashMap
24
+ import java.util.List
25
+ import java.util.ArrayList
26
+ import com.google.appengine.api.users.User
27
+
28
+ class TestModel < Model
29
+ property 'date', Date
30
+ property 'akey', Key
31
+ property 'blob', Blob
32
+ property 'shortblob', ShortBlob
33
+ property 'category', Category
34
+ property 'email', Email
35
+ property 'geopt', GeoPt
36
+ property 'imhandle', IMHandle
37
+ property 'link', Link
38
+ property 'phonenumber', PhoneNumber
39
+ property 'address', PostalAddress
40
+ property 'rating', Rating
41
+ property 'text', Text
42
+ property 'string', String
43
+ property 'integer', Long
44
+ property 'afloat', Double
45
+ property 'user', User
46
+ property 'list', List
47
+ end
48
+
49
+ class ModelTest
50
+ include Assert
51
+
52
+ def helper
53
+ @helper ||= begin
54
+ configs = LocalServiceTestConfig[1]
55
+ configs[0] = LocalDatastoreServiceTestConfig.new
56
+ LocalServiceTestHelper.new(configs)
57
+ end
58
+ end
59
+
60
+ $Before
61
+ def setup
62
+ returns void
63
+ helper.setUp
64
+ end
65
+
66
+ $After
67
+ def teardown
68
+ returns void
69
+ helper.tearDown
70
+ end
71
+
72
+ $Test
73
+ def test_get_and_put
74
+ returns void
75
+ e = TestModel.new
76
+ e.string = "Hello"
77
+ e.save
78
+ e2 = TestModel.get(e.key)
79
+ assertEquals("Hello", e2.string)
80
+ assertEquals(e.key, e2.key)
81
+ end
82
+
83
+ $Test
84
+ def test_sort
85
+ returns void
86
+ # just make sure it compiles
87
+ TestModel.all.sort('link').run
88
+ end
89
+
90
+ $Test
91
+ def test_properties
92
+ returns void
93
+ e = TestModel.new
94
+ e.string = "Hi"
95
+ e.rating = 10
96
+ properties = e.properties
97
+ assertEquals("Hi", properties.get("string"))
98
+ assertEquals(Integer.valueOf(10), properties.get("rating"))
99
+ assertTrue(properties.containsKey("blob"))
100
+ assertEquals(nil, properties.get("blob"))
101
+ end
102
+
103
+ $Test
104
+ def test_query_list
105
+ returns void
106
+ e = TestModel.new
107
+ e.list = ["a", "b", "c"]
108
+ e.save
109
+ e2 = TestModel.all.list("b").first
110
+ assertEquals(e.key, e2.key)
111
+ end
112
+ # TODO more tests.
113
+ end
@@ -0,0 +1,12 @@
1
+ class Foo
2
+ def initialize
3
+ puts 'constructor'
4
+ @hello = 'Hello, '
5
+ end
6
+
7
+ def hello(a:string)
8
+ puts @hello; puts a
9
+ end
10
+ end
11
+
12
+ Foo.new.hello('Duby')