mirah 0.0.12-java → 0.1.0-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.
- data/History.txt +372 -0
- data/README.txt +4 -5
- data/Rakefile +178 -55
- data/examples/appengine/Readme +3 -3
- data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
- data/examples/appengine/src/org/mirah/list.dhtml +1 -1
- data/examples/bintrees.mirah +1 -1
- data/examples/edb.mirah +1 -1
- data/examples/fib.mirah +1 -1
- data/examples/interfaces.mirah +1 -1
- data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
- data/examples/maven/README.txt +1 -1
- data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
- data/examples/plugins/appengine/Rakefile +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
- data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
- data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
- data/examples/rosettacode/100-doors.mirah +6 -6
- data/examples/rosettacode/README.txt +3 -3
- data/examples/rosettacode/boolean-values.mirah +1 -1
- data/examples/rosettacode/comments.mirah +1 -1
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
- data/examples/rosettacode/factorial.mirah +1 -1
- data/examples/rosettacode/fibonacci.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +2 -2
- data/examples/rosettacode/flatten-a-list.mirah +4 -4
- data/examples/rosettacode/guess-the-number.mirah +2 -2
- data/examples/rosettacode/hamming-numbers.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +22 -22
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/random-numbers.mirah +1 -1
- data/examples/rosettacode/repeat-a-string.mirah +1 -1
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +5 -5
- data/examples/rosettacode/secure-temporary-file.mirah +2 -2
- data/examples/rosettacode/sleep.mirah +1 -1
- data/examples/rosettacode/string-length.mirah +5 -5
- data/examples/swing.mirah +1 -1
- data/examples/test.edb +1 -1
- data/javalib/mirah-bootstrap.jar +0 -0
- data/javalib/mirah-builtins.jar +0 -0
- data/javalib/mirah-parser.jar +0 -0
- data/javalib/mirah-util.jar +0 -0
- data/lib/duby.rb +1 -1
- data/lib/mirah.rb +50 -28
- data/lib/mirah/ast.rb +15 -605
- data/lib/mirah/ast/scope.rb +98 -69
- data/lib/mirah/commands.rb +1 -1
- data/lib/mirah/commands/base.rb +7 -7
- data/lib/mirah/commands/compile.rb +3 -3
- data/lib/mirah/commands/parse.rb +7 -5
- data/lib/mirah/commands/run.rb +12 -19
- data/lib/mirah/compiler.rb +15 -23
- data/lib/mirah/errors.rb +16 -1
- data/lib/mirah/generator.rb +79 -39
- data/lib/mirah/jvm/compiler.rb +1 -19
- data/lib/mirah/jvm/compiler/base.rb +233 -90
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
- data/lib/mirah/jvm/method_lookup.rb +134 -65
- data/lib/mirah/jvm/typer.rb +10 -5
- data/lib/mirah/jvm/types.rb +10 -2
- data/lib/mirah/jvm/types/array_type.rb +10 -12
- data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
- data/lib/mirah/jvm/types/basic_types.rb +26 -33
- data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
- data/lib/mirah/jvm/types/block_type.rb +15 -0
- data/lib/mirah/jvm/types/boolean.rb +8 -4
- data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
- data/lib/mirah/jvm/types/enumerable.rb +7 -7
- data/lib/mirah/jvm/types/extensions.rb +11 -6
- data/lib/mirah/jvm/types/factory.rb +624 -94
- data/lib/mirah/jvm/types/floats.rb +21 -15
- data/lib/mirah/jvm/types/generic_type.rb +72 -0
- data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
- data/lib/mirah/jvm/types/integers.rb +26 -71
- data/lib/mirah/jvm/types/interface_definition.rb +3 -3
- data/lib/mirah/jvm/types/intrinsics.rb +203 -168
- data/lib/mirah/jvm/types/literals.rb +6 -6
- data/lib/mirah/jvm/types/meta_type.rb +13 -4
- data/lib/mirah/jvm/types/methods.rb +281 -93
- data/lib/mirah/jvm/types/null_type.rb +17 -5
- data/lib/mirah/jvm/types/number.rb +10 -7
- data/lib/mirah/jvm/types/primitive_type.rb +17 -6
- data/lib/mirah/jvm/types/source_mirror.rb +12 -7
- data/lib/mirah/jvm/types/type.rb +107 -23
- data/lib/mirah/jvm/types/type_definition.rb +25 -10
- data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
- data/lib/mirah/jvm/types/void_type.rb +3 -3
- data/lib/mirah/parser.rb +154 -16
- data/lib/mirah/plugin/edb.rb +1 -1
- data/lib/mirah/transform.rb +1 -2
- data/lib/mirah/transform/ast_ext.rb +24 -43
- data/lib/mirah/transform/transformer.rb +29 -224
- data/lib/mirah/typer.rb +2 -16
- data/lib/mirah/util/argument_processor.rb +25 -10
- data/lib/mirah/util/class_loader.rb +1 -1
- data/lib/mirah/util/compilation_state.rb +16 -17
- data/lib/mirah/util/delegate.rb +2 -2
- data/lib/mirah/util/logging.rb +110 -0
- data/lib/mirah/util/process_errors.rb +69 -11
- data/lib/mirah/version.rb +1 -1
- data/test/core/commands_test.rb +6 -24
- data/test/core/env_test.rb +5 -5
- data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
- data/test/core/typer_test.rb +196 -158
- data/test/core/util/argument_processor_test.rb +10 -10
- data/test/core/util/class_loader_test.rb +6 -5
- data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
- data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
- data/test/jvm/annotations_test.rb +5 -5
- data/test/jvm/blocks_test.rb +140 -88
- data/test/jvm/bytecode_test_helper.rb +112 -94
- data/test/jvm/cast_test.rb +162 -0
- data/test/jvm/constructors_test.rb +18 -8
- data/test/jvm/enumerable_test.rb +77 -44
- data/test/jvm/example_test.rb +53 -0
- data/test/jvm/factory_test.rb +7 -1
- data/test/jvm/generics_test.rb +57 -0
- data/test/jvm/hash_test.rb +106 -0
- data/test/jvm/import_test.rb +81 -0
- data/test/jvm/interface_test.rb +73 -0
- data/test/jvm/java_typer_test.rb +92 -66
- data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
- data/test/jvm/jvm_compiler_test.rb +170 -604
- data/test/jvm/list_extensions_test.rb +23 -0
- data/test/jvm/macros_test.rb +197 -32
- data/test/jvm/main_method_test.rb +4 -4
- data/test/jvm/numeric_extensions_test.rb +13 -0
- data/test/jvm/rescue_test.rb +73 -16
- data/test/jvm/varargs_test.rb +65 -0
- data/test/test_helper.rb +1 -2
- metadata +234 -251
- data/examples/SortClosure$__xform_tmp_1.class +0 -0
- data/examples/SortClosure$__xform_tmp_2.class +0 -0
- data/examples/SortClosure.class +0 -0
- data/examples/macros/StringEachChar$Extension1.class +0 -0
- data/lib/mirah/ast/call.rb +0 -345
- data/lib/mirah/ast/class.rb +0 -359
- data/lib/mirah/ast/flow.rb +0 -381
- data/lib/mirah/ast/intrinsics.rb +0 -563
- data/lib/mirah/ast/literal.rb +0 -178
- data/lib/mirah/ast/local.rb +0 -112
- data/lib/mirah/ast/method.rb +0 -408
- data/lib/mirah/ast/structure.rb +0 -387
- data/lib/mirah/ast/type.rb +0 -146
- data/lib/mirah/commands/base.rb~ +0 -57
- data/lib/mirah/compiler/call.rb +0 -45
- data/lib/mirah/compiler/class.rb +0 -81
- data/lib/mirah/compiler/flow.rb +0 -109
- data/lib/mirah/compiler/literal.rb +0 -130
- data/lib/mirah/compiler/local.rb +0 -59
- data/lib/mirah/compiler/method.rb +0 -44
- data/lib/mirah/compiler/structure.rb +0 -65
- data/lib/mirah/jvm/compiler/java_source.rb +0 -787
- data/lib/mirah/jvm/method_lookup.rb~ +0 -247
- data/lib/mirah/jvm/source_generator/builder.rb +0 -468
- data/lib/mirah/jvm/source_generator/loops.rb +0 -131
- data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
- data/lib/mirah/plugin/gwt.rb +0 -189
- data/lib/mirah/plugin/java.rb +0 -70
- data/lib/mirah/transform/error.rb +0 -13
- data/lib/mirah/transform/helper.rb +0 -765
- data/lib/mirah/typer/simple.rb +0 -384
- data/lib/mirah/version.rb~ +0 -18
- data/test/core/ast_test.rb +0 -382
- data/test/core/compilation_test.rb +0 -130
- data/test/core/macros_test.rb +0 -61
- data/test/jvm/javac_test_helper.rb +0 -89
- data/test/jvm/jvm_compiler_test.rb~ +0 -2181
- data/test/plugins/gwt_test.rb +0 -69
data/examples/appengine/Readme
CHANGED
|
@@ -12,10 +12,10 @@ Datastore API:
|
|
|
12
12
|
Model.all -> Query
|
|
13
13
|
property foo, String # or any supported datastore type
|
|
14
14
|
# For numbers use Long or Double
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
instance.save
|
|
17
17
|
instance.key
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
instance.foo
|
|
20
20
|
instance.foo=
|
|
21
21
|
|
|
@@ -26,4 +26,4 @@ Datastore API:
|
|
|
26
26
|
Query.sort(property_name, true) # descending
|
|
27
27
|
Query.foo('foo').bar(3) # Only return instances where foo = 'foo' and bar = 3
|
|
28
28
|
Query.offset(10)
|
|
29
|
-
Query.limit(5)
|
|
29
|
+
Query.limit(5)
|
data/examples/bintrees.mirah
CHANGED
data/examples/edb.mirah
CHANGED
data/examples/fib.mirah
CHANGED
data/examples/interfaces.mirah
CHANGED
|
@@ -14,12 +14,11 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
macro def eachChar(value,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
`value`.toCharArray.each do | my_char |
|
|
17
|
+
macro def eachChar(value, block:Block)
|
|
18
|
+
quote {
|
|
19
|
+
`value`.toCharArray.each do |`block.arguments` |
|
|
21
20
|
`block.body`
|
|
22
|
-
end
|
|
21
|
+
end
|
|
23
22
|
}
|
|
24
23
|
end
|
|
25
24
|
|
data/examples/maven/README.txt
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
This is a sample project that uses the Mirah plugin for Maven to
|
|
2
|
-
build and compile source.
|
|
2
|
+
build and compile source.
|
|
@@ -22,13 +22,13 @@ class Door
|
|
|
22
22
|
def initialize
|
|
23
23
|
@state=false
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
def closed?; !@state; end
|
|
27
27
|
def open?; @state; end
|
|
28
28
|
|
|
29
29
|
def close; @state=false; end
|
|
30
30
|
def open; @state=true; end
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
def toggle
|
|
33
33
|
if closed?
|
|
34
34
|
open
|
|
@@ -36,14 +36,14 @@ class Door
|
|
|
36
36
|
close
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
def toString; Boolean.toString(@state); end
|
|
41
41
|
end
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
doors=ArrayList.new
|
|
44
44
|
1.upto(100) do
|
|
45
45
|
doors.add(Door.new)
|
|
46
|
-
end
|
|
46
|
+
end
|
|
47
47
|
|
|
48
48
|
1.upto(100) do |multiplier|
|
|
49
49
|
index = 0
|
|
@@ -54,7 +54,7 @@ end
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
i = 0
|
|
57
|
-
doors.each do |door|
|
|
57
|
+
doors.each do |door|
|
|
58
58
|
puts "Door #{i+1} is #{door}."
|
|
59
59
|
i+=1
|
|
60
60
|
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
2
|
This example set is all the code for Mirah from the Rosetta Code wiki
|
|
3
|
-
(http://rosettacode.org/.
|
|
3
|
+
(http://rosettacode.org/.
|
|
4
4
|
|
|
5
|
-
This code is the canonical source for the wiki. Please add as many more
|
|
5
|
+
This code is the canonical source for the wiki. Please add as many more
|
|
6
6
|
samples as you'd like. Either add the sample here and send a pull request
|
|
7
7
|
to the project owners, or add a sample to the Rosetta Code wiki and send
|
|
8
8
|
a message to the project owners. Either way, we'd like to try and keep
|
|
9
|
-
the wiki page and this repository synchronized.
|
|
9
|
+
the wiki page and this repository synchronized.
|
|
@@ -21,7 +21,7 @@ import java.util.regex.Matcher
|
|
|
21
21
|
def count_substring(pattern:string, source:string)
|
|
22
22
|
(source.length() - source.replace(pattern, "").length()) / pattern.length()
|
|
23
23
|
end
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
puts count_substring("th", "the three truths") # ==> 3
|
|
26
26
|
puts count_substring("abab", "ababababab") # ==> 2
|
|
27
27
|
puts count_substring("a*b", "abaabba*bbaba*bbab") # ==> 2
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
1.upto(100) do |n|
|
|
18
18
|
print "Fizz" if a = ((n % 3) == 0)
|
|
19
|
-
print "Buzz" if b = ((n % 5) == 0)
|
|
19
|
+
print "Buzz" if b = ((n % 5) == 0)
|
|
20
20
|
print n unless (a || b)
|
|
21
21
|
print "\n"
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
# a little more straight forward
|
|
24
|
+
# a little more straight forward
|
|
25
25
|
1.upto(100) do |n|
|
|
26
26
|
if (n % 15) == 0
|
|
27
27
|
puts "FizzBuzz"
|
|
@@ -17,18 +17,18 @@ import java.util.ArrayList
|
|
|
17
17
|
import java.util.List
|
|
18
18
|
import java.util.Collection
|
|
19
19
|
|
|
20
|
-
def flatten(list: Collection)
|
|
20
|
+
def flatten(list: Collection)
|
|
21
21
|
flatten(list, ArrayList.new)
|
|
22
22
|
end
|
|
23
23
|
def flatten(source: Collection, result: List)
|
|
24
24
|
|
|
25
25
|
source.each do |x|
|
|
26
|
-
if (Collection.class.isAssignableFrom(x.getClass()))
|
|
27
|
-
flatten(Collection(x), result)
|
|
26
|
+
if (Collection.class.isAssignableFrom(x.getClass()))
|
|
27
|
+
flatten(Collection(x), result)
|
|
28
28
|
else
|
|
29
29
|
result.add(x)
|
|
30
30
|
result # if branches must return same type
|
|
31
|
-
end
|
|
31
|
+
end
|
|
32
32
|
end
|
|
33
33
|
result
|
|
34
34
|
end
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
|
|
16
16
|
import java.math.BigInteger
|
|
17
17
|
import java.util.PriorityQueue
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
def updateFrontier(x:BigInteger, queue:PriorityQueue):void
|
|
20
20
|
queue.offer(x.shiftLeft(1))
|
|
21
21
|
queue.offer(x.multiply(BigInteger.valueOf(3)))
|
|
22
22
|
queue.offer(x.multiply(BigInteger.valueOf(5)))
|
|
23
23
|
end
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
def hamming(n:int):BigInteger
|
|
26
26
|
raise "Invalid parameter" if (n <= 0)
|
|
27
27
|
|
|
@@ -42,8 +42,8 @@ end
|
|
|
42
42
|
nums = ""
|
|
43
43
|
1.upto(20) do | i |
|
|
44
44
|
nums = nums + " #{hamming(i)}"
|
|
45
|
-
end
|
|
45
|
+
end
|
|
46
46
|
puts "Hamming(1 .. 20) =#{nums}"
|
|
47
47
|
puts "\nHamming(1691) = #{hamming(1691)}"
|
|
48
|
-
puts "Hamming(1000000) = #{hamming(1000000)}"
|
|
48
|
+
puts "Hamming(1000000) = #{hamming(1000000)}"
|
|
49
49
|
|
|
@@ -17,7 +17,7 @@ import java.text.NumberFormat
|
|
|
17
17
|
import java.text.ParsePosition
|
|
18
18
|
import java.util.Scanner
|
|
19
19
|
|
|
20
|
-
# this first example relies on catching an exception,
|
|
20
|
+
# this first example relies on catching an exception,
|
|
21
21
|
# which is bad style and poorly performing in Java
|
|
22
22
|
def is_numeric?(s:string)
|
|
23
23
|
begin
|
|
@@ -40,28 +40,28 @@ puts '1.2.3 is not numeric' unless is_numeric?('1.2.3')
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
# check every element of the string
|
|
43
|
-
def is_numeric2?(s: string)
|
|
44
|
-
if (s == nil || s.isEmpty())
|
|
45
|
-
return false
|
|
46
|
-
end
|
|
47
|
-
if (!s.startsWith('-'))
|
|
43
|
+
def is_numeric2?(s: string)
|
|
44
|
+
if (s == nil || s.isEmpty())
|
|
45
|
+
return false
|
|
46
|
+
end
|
|
47
|
+
if (!s.startsWith('-'))
|
|
48
48
|
if s.contains('-')
|
|
49
|
-
return false
|
|
49
|
+
return false
|
|
50
50
|
end
|
|
51
|
-
end
|
|
52
|
-
|
|
51
|
+
end
|
|
52
|
+
|
|
53
53
|
0.upto(s.length()-1) do |x|
|
|
54
54
|
c = s.charAt(x)
|
|
55
55
|
if ((x == 0) && (c == '-'.charAt(0)))
|
|
56
56
|
# negative number
|
|
57
57
|
elsif (c == '.'.charAt(0))
|
|
58
|
-
if (s.indexOf('.', x) > -1)
|
|
58
|
+
if (s.indexOf('.', x) > -1)
|
|
59
59
|
return false # more than one period
|
|
60
|
-
end
|
|
60
|
+
end
|
|
61
61
|
elsif (!Character.isDigit(c))
|
|
62
62
|
return false
|
|
63
63
|
end
|
|
64
|
-
end
|
|
64
|
+
end
|
|
65
65
|
true
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -78,7 +78,7 @@ puts '1.2.3 is not numeric' unless is_numeric2?('1.2.3')
|
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
|
|
81
|
-
# use a regular expression
|
|
81
|
+
# use a regular expression
|
|
82
82
|
def is_numeric3?(s:string)
|
|
83
83
|
s == nil || s.matches("[-+]?\\d+(\\.\\d+)?")
|
|
84
84
|
end
|
|
@@ -94,12 +94,12 @@ puts '123- is not numeric' unless is_numeric3?('123-')
|
|
|
94
94
|
puts '1.2.3 is not numeric' unless is_numeric3?('1.2.3')
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
# use the positional parser in the java.text.NumberFormat object
|
|
98
|
-
# (a more robust solution). If, after parsing, the parse position is at
|
|
99
|
-
# the end of the string, we can deduce that the entire string was a
|
|
97
|
+
# use the positional parser in the java.text.NumberFormat object
|
|
98
|
+
# (a more robust solution). If, after parsing, the parse position is at
|
|
99
|
+
# the end of the string, we can deduce that the entire string was a
|
|
100
100
|
# valid number.
|
|
101
|
-
def is_numeric4?(s:string)
|
|
102
|
-
return false if s == nil
|
|
101
|
+
def is_numeric4?(s:string)
|
|
102
|
+
return false if s == nil
|
|
103
103
|
formatter = NumberFormat.getInstance()
|
|
104
104
|
pos = ParsePosition.new(0)
|
|
105
105
|
formatter.parse(s, pos)
|
|
@@ -118,10 +118,10 @@ puts '123- is not numeric' unless is_numeric4?('123-')
|
|
|
118
118
|
puts '1.2.3 is not numeric' unless is_numeric4?('1.2.3')
|
|
119
119
|
|
|
120
120
|
|
|
121
|
-
# use the java.util.Scanner object. Very useful if you have to
|
|
122
|
-
# scan multiple entries. Scanner also has similar methods for longs,
|
|
123
|
-
# shorts, bytes, doubles, floats, BigIntegers, and BigDecimals as well
|
|
124
|
-
# as methods for integral types where you may input a base/radix other than
|
|
121
|
+
# use the java.util.Scanner object. Very useful if you have to
|
|
122
|
+
# scan multiple entries. Scanner also has similar methods for longs,
|
|
123
|
+
# shorts, bytes, doubles, floats, BigIntegers, and BigDecimals as well
|
|
124
|
+
# as methods for integral types where you may input a base/radix other than
|
|
125
125
|
# 10 (10 is the default, which can be changed using the useRadix method).
|
|
126
126
|
def is_numeric5?(s:string)
|
|
127
127
|
return false if s == nil
|