mirah 0.1.4-java → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/History.txt +531 -0
- data/README.md +23 -10
- data/Rakefile +239 -156
- data/TODO.md +71 -10
- data/bin/mirah +1 -1
- data/bin/mirahc +1 -1
- data/dist/mirahc.jar +0 -0
- data/examples/bintrees.mirah +2 -2
- data/examples/construction.mirah +2 -2
- data/examples/fields.mirah +1 -1
- data/examples/fractal.mirah +1 -1
- data/examples/fractal.rb +70 -0
- data/examples/interfaces.mirah +1 -1
- data/examples/java_thing.mirah +1 -1
- data/examples/macros/square.mirah +3 -3
- data/examples/macros/square_int.mirah +3 -3
- data/examples/macros/string_each_char.mirah +6 -6
- data/examples/rosettacode/100-doors.mirah +0 -2
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +3 -3
- data/examples/rosettacode/empty-string.mirah +1 -1
- data/examples/rosettacode/fizz-buzz.mirah +4 -4
- data/examples/rosettacode/is-string-numeric.mirah +7 -7
- data/examples/rosettacode/palindrome.mirah +2 -2
- data/examples/rosettacode/reverse-a-string.mirah +1 -1
- data/examples/rosettacode/rot-13.mirah +1 -1
- data/examples/{edb.mirah → rosettacode/simple_character_math.mirah} +13 -4
- data/examples/rosettacode/string-case.mirah +2 -2
- data/examples/rosettacode/string-length.mirah +1 -1
- data/examples/swing.mirah +9 -14
- data/extensions_and_macros.md +117 -0
- data/lib/mirah.rb +1 -1
- data/lib/mirah/errors.rb +3 -1
- data/lib/mirah/transform/ast_ext.rb +3 -2
- data/lib/mirah/util/process_errors.rb +1 -2
- data/lib/mirah/version.rb +1 -1
- data/test/A.class +0 -0
- data/test/core/util/jvm_version_test.rb +10 -0
- data/test/core/util/mirah_arguments_test.rb +51 -4
- data/test/fixtures/cp1251_test.mirah +7 -0
- data/test/fixtures/org/foo/AbstractExecutorJava8.java +30 -0
- data/test/fixtures/org/foo/ClassWithSelfReferencingTypeParameter.java +24 -0
- data/test/fixtures/org/foo/InnerInterfaceClass.java +12 -0
- data/test/fixtures/org/foo/IntAnno.class +0 -0
- data/test/fixtures/org/foo/TypeFixtureJava8.java +10 -0
- data/test/fixtures/utf8_test.mirah +7 -0
- data/test/jvm/access_levels_test.rb +31 -0
- data/test/jvm/annotations_test.rb +3 -6
- data/test/jvm/blocks_test.rb +303 -120
- data/test/jvm/cast_test.rb +123 -50
- data/test/jvm/closure_test.rb +242 -0
- data/test/jvm/constructors_test.rb +1 -3
- data/test/jvm/example_test.rb +6 -2
- data/test/jvm/extensions/array_extensions_test.rb +181 -0
- data/test/jvm/extensions/collection_extensions_test.rb +195 -0
- data/test/jvm/{enumerable_test.rb → extensions/enumerable_test.rb} +81 -13
- data/test/jvm/extensions/hash_extensions_test.rb +56 -0
- data/test/jvm/extensions/list_extensions_test.rb +143 -0
- data/test/jvm/extensions/lock_extensions_test.rb +43 -0
- data/test/jvm/{numeric_extensions_test.rb → extensions/numeric_extensions_test.rb} +0 -0
- data/test/jvm/extensions/numeric_operators_test.rb +86 -0
- data/test/jvm/extensions/object_extensions_test.rb +122 -0
- data/test/jvm/{string_builder_extensions_test.rb → extensions/string_builder_extensions_test.rb} +0 -0
- data/test/jvm/{string_extensions_test.rb → extensions/string_extensions_test.rb} +57 -4
- data/test/jvm/generics_test.rb +14 -6
- data/test/jvm/import_test.rb +38 -1
- data/test/jvm/interface_test.rb +17 -0
- data/test/jvm/jvm_commands_test.rb +9 -0
- data/test/jvm/jvm_compiler_test.rb +568 -43
- data/test/jvm/macros_test.rb +343 -19
- data/test/jvm/main_method_test.rb +1 -3
- data/test/jvm/new_backend_test_helper.rb +54 -7
- data/test/jvm/rescue_test.rb +20 -5
- data/test/jvm/static_fields_test.rb +52 -10
- data/test/jvm/{mirror_compilation_test_helper.rb → string_test.rb} +10 -9
- data/test/jvm/varargs_test.rb +6 -16
- data/test/mirrors/base_type_test.rb +20 -7
- data/test/mirrors/bytecode_mirror_test.rb +8 -3
- data/test/mirrors/generics_test.rb +89 -10
- data/test/mirrors/member_test.rb +1 -1
- data/test/mirrors/method_lookup_test.rb +10 -3
- data/test/mirrors/mirrors_test.rb +20 -20
- data/test/mirrors/simple_async_mirror_loader_test.rb +1 -1
- data/test/mirrors/simple_mirror_loader_test.rb +1 -1
- data/test/newMirahClass$Closure2.class +0 -0
- data/test/newMirahClass.class +0 -0
- data/test/test_helper.rb +8 -1
- metadata +31 -16
- data/bin/bundler +0 -16
- data/bin/rake +0 -16
- data/examples/ant/example-build.xml~ +0 -7
- data/examples/test.edb +0 -9
- data/lib/mirah/compiler.rb +0 -67
- data/lib/mirah/parser.rb +0 -224
- data/lib/mirah/util/delegate.rb +0 -65
- data/test/jvm/list_extensions_test.rb +0 -23
data/lib/mirah/parser.rb
DELETED
@@ -1,224 +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
|
-
require 'mirah/util/process_errors'
|
17
|
-
require 'mirah/util/logging'
|
18
|
-
require 'mirah/transform'
|
19
|
-
require 'java'
|
20
|
-
|
21
|
-
module Mirah
|
22
|
-
class Parser
|
23
|
-
include Mirah::Util::ProcessErrors
|
24
|
-
include Mirah::Logging::Logged
|
25
|
-
|
26
|
-
def initialize(state, typer, logging)
|
27
|
-
@transformer = Mirah::Transform::Transformer.new(state, typer)
|
28
|
-
@logging = logging
|
29
|
-
end
|
30
|
-
|
31
|
-
attr_accessor :transformer, :logging
|
32
|
-
|
33
|
-
def parse_from_args(files_or_scripts)
|
34
|
-
nodes = []
|
35
|
-
inline = false
|
36
|
-
puts "Parsing..." if logging
|
37
|
-
expand_files(files_or_scripts).each do |script|
|
38
|
-
if script == '-e'
|
39
|
-
inline = true
|
40
|
-
next
|
41
|
-
elsif inline
|
42
|
-
nodes << parse_inline(script)
|
43
|
-
break
|
44
|
-
else
|
45
|
-
nodes << parse_file(script)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
raise 'nothing to parse? ' + files_or_scripts.inspect unless nodes.length > 0
|
49
|
-
nodes = nodes.compact
|
50
|
-
if self.logging
|
51
|
-
nodes.each {|node| log "Parsed:\n #{format_ast(node)}"}
|
52
|
-
end
|
53
|
-
nodes
|
54
|
-
end
|
55
|
-
|
56
|
-
def parse_inline(source)
|
57
|
-
puts " <inline script>" if logging
|
58
|
-
parse_and_transform('DashE', source)
|
59
|
-
end
|
60
|
-
|
61
|
-
def parse_file(filename)
|
62
|
-
puts " #{filename}" if logging
|
63
|
-
parse_and_transform(filename, File.read(filename))
|
64
|
-
end
|
65
|
-
|
66
|
-
def parse_and_transform(filename, src)
|
67
|
-
Mirah::AST.parse_ruby(transformer, src, filename)
|
68
|
-
end
|
69
|
-
|
70
|
-
def format_ast(ast)
|
71
|
-
AstPrinter.new.scan(ast, ast)
|
72
|
-
end
|
73
|
-
|
74
|
-
def expand_files(files_or_scripts)
|
75
|
-
expanded = []
|
76
|
-
files_or_scripts.each do |filename|
|
77
|
-
if File.directory?(filename)
|
78
|
-
Dir[File.join(filename, '*')].each do |child|
|
79
|
-
if File.directory?(child)
|
80
|
-
files_or_scripts << child
|
81
|
-
elsif child =~ /\.(duby|mirah)$/
|
82
|
-
expanded << child
|
83
|
-
end
|
84
|
-
end
|
85
|
-
else
|
86
|
-
expanded << filename
|
87
|
-
end
|
88
|
-
end
|
89
|
-
expanded
|
90
|
-
end
|
91
|
-
|
92
|
-
class AstPrinter < NodeScanner
|
93
|
-
java_import "mirah.lang.ast.Node"
|
94
|
-
def initialize
|
95
|
-
@out = ""
|
96
|
-
@indent = 0
|
97
|
-
@newline = true
|
98
|
-
end
|
99
|
-
def puts(*args)
|
100
|
-
print(*args)
|
101
|
-
@newline = true
|
102
|
-
@out << "\n"
|
103
|
-
end
|
104
|
-
def print(*args)
|
105
|
-
@out << (" " * @indent) if @newline
|
106
|
-
args.each {|arg| @out << arg}
|
107
|
-
@newline = false
|
108
|
-
@out
|
109
|
-
end
|
110
|
-
def indent
|
111
|
-
@indent += 2
|
112
|
-
end
|
113
|
-
def dedent
|
114
|
-
@indent -= 2
|
115
|
-
end
|
116
|
-
def enterNullChild(obj)
|
117
|
-
puts("nil")
|
118
|
-
end
|
119
|
-
|
120
|
-
def startNode(node)
|
121
|
-
print("[#{node.java_class.simple_name}")
|
122
|
-
indent
|
123
|
-
end
|
124
|
-
|
125
|
-
def enterDefault(node, arg)
|
126
|
-
startNode(node)
|
127
|
-
puts
|
128
|
-
true
|
129
|
-
end
|
130
|
-
|
131
|
-
def exitDefault(node, arg)
|
132
|
-
dedent
|
133
|
-
if @out[-2,2] =~ /^[\[\]"]\n/
|
134
|
-
@out[-1,0] = "]"
|
135
|
-
@out
|
136
|
-
else
|
137
|
-
no_children = @out.rindex(/[\]\n]/, -2) < @out.rindex("[")
|
138
|
-
if no_children
|
139
|
-
@out[-1,0] = "]"
|
140
|
-
else
|
141
|
-
puts("]")
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
%w(Boolean Fixnum Float CharLiteral).each do |name|
|
147
|
-
eval(<<-EOF)
|
148
|
-
def enter#{name}(node, arg)
|
149
|
-
startNode(node)
|
150
|
-
print(" ", node.value.to_s)
|
151
|
-
true
|
152
|
-
end
|
153
|
-
EOF
|
154
|
-
end
|
155
|
-
|
156
|
-
def enterSimpleString(node, arg)
|
157
|
-
first_child = @out.rindex(/[\]\n]/, -2) < @out.rindex("[")
|
158
|
-
if first_child
|
159
|
-
@newline = false
|
160
|
-
@out[-1,1] = " "
|
161
|
-
end
|
162
|
-
print '"', node.value
|
163
|
-
true
|
164
|
-
end
|
165
|
-
|
166
|
-
def exitSimpleString(node, arg)
|
167
|
-
puts '"'
|
168
|
-
end
|
169
|
-
|
170
|
-
def enterTypeRefImpl(node, arg)
|
171
|
-
startNode(node)
|
172
|
-
print " #{node.name}"
|
173
|
-
print " array" if node.isArray
|
174
|
-
print " static" if node.isStatic
|
175
|
-
true
|
176
|
-
end
|
177
|
-
|
178
|
-
def enterNodeList(node, arg)
|
179
|
-
puts "["
|
180
|
-
indent
|
181
|
-
true
|
182
|
-
end
|
183
|
-
|
184
|
-
def enterBlockArgument(node, arg)
|
185
|
-
enterDefault(node, arg)
|
186
|
-
puts "optional" if node.optional
|
187
|
-
true
|
188
|
-
end
|
189
|
-
|
190
|
-
def enterLoop(node, arg)
|
191
|
-
enterDefault(node, arg)
|
192
|
-
puts "skipFirstCheck" if node.skipFirstCheck
|
193
|
-
puts "negative" if node.negative
|
194
|
-
true
|
195
|
-
end
|
196
|
-
|
197
|
-
def exitFieldAccess(node, arg)
|
198
|
-
puts "static" if node.isStatic
|
199
|
-
exitDefault(node, arg)
|
200
|
-
end
|
201
|
-
alias exitFieldAssign exitFieldAccess
|
202
|
-
|
203
|
-
def enterUnquote(node, arg)
|
204
|
-
enterDefault(node, arg)
|
205
|
-
object = node.object
|
206
|
-
if object
|
207
|
-
if object.kind_of?(Node)
|
208
|
-
scan(object, arg)
|
209
|
-
elsif object.kind_of?(java.util.List) && object.all? {|i| i.kind_of?(Node)}
|
210
|
-
object.each {|o| scan(o, arg)}
|
211
|
-
else
|
212
|
-
str = if node.object.respond_to?(:toString)
|
213
|
-
node.object.toString
|
214
|
-
else
|
215
|
-
node.object.inspect
|
216
|
-
end
|
217
|
-
puts "<", str, ">"
|
218
|
-
end
|
219
|
-
end
|
220
|
-
object.nil?
|
221
|
-
end
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
data/lib/mirah/util/delegate.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# Ripped from 1.8 stdlib
|
2
|
-
|
3
|
-
module Mirah
|
4
|
-
module Util
|
5
|
-
class Delegator
|
6
|
-
IgnoreBacktracePat = %r"\A#{Regexp.quote(__FILE__)}:\d+:in `"
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.DelegateClass(superclass)
|
10
|
-
klass = Class.new
|
11
|
-
methods = superclass.public_instance_methods(true).map(&:to_s)
|
12
|
-
methods -= ::Kernel.public_instance_methods(false).map(&:to_s)
|
13
|
-
methods -= ["__id__", "__send__"] if RUBY_VERSION > '1.9' # avoid warnings
|
14
|
-
methods |= ["to_s","to_a","inspect","==","=~","==="]
|
15
|
-
klass.module_eval {
|
16
|
-
def initialize(obj) # :nodoc:
|
17
|
-
@_dc_obj = obj
|
18
|
-
end
|
19
|
-
def method_missing(m, *args) # :nodoc:
|
20
|
-
unless @_dc_obj.respond_to?(m)
|
21
|
-
super(m, *args)
|
22
|
-
end
|
23
|
-
@_dc_obj.__send__(m, *args)
|
24
|
-
end
|
25
|
-
def respond_to?(m, include_private = false) # :nodoc:
|
26
|
-
return true if super
|
27
|
-
return @_dc_obj.respond_to?(m, include_private)
|
28
|
-
end
|
29
|
-
def __getobj__ # :nodoc:
|
30
|
-
@_dc_obj
|
31
|
-
end
|
32
|
-
def __setobj__(obj) # :nodoc:
|
33
|
-
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
34
|
-
@_dc_obj = obj
|
35
|
-
end
|
36
|
-
def clone # :nodoc:
|
37
|
-
new = super
|
38
|
-
new.__setobj__(__getobj__.clone)
|
39
|
-
new
|
40
|
-
end
|
41
|
-
def dup # :nodoc:
|
42
|
-
new = super
|
43
|
-
new.__setobj__(__getobj__.clone)
|
44
|
-
new
|
45
|
-
end
|
46
|
-
}
|
47
|
-
for method in methods
|
48
|
-
begin
|
49
|
-
klass.module_eval <<-EOS, __FILE__, __LINE__+1
|
50
|
-
def #{method}(*args, &block)
|
51
|
-
begin
|
52
|
-
@_dc_obj.__send__(:#{method}, *args, &block)
|
53
|
-
ensure
|
54
|
-
$@.delete_if{|s| ::Mirah::Util::Delegator::IgnoreBacktracePat =~ s} if $@
|
55
|
-
end
|
56
|
-
end
|
57
|
-
EOS
|
58
|
-
rescue SyntaxError
|
59
|
-
raise NameError, "invalid identifier %s" % method, caller(3)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
return klass
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
class ListExtensionsTest < Test::Unit::TestCase
|
2
|
-
def test_bracket_getter
|
3
|
-
cls, = compile(<<-EOF)
|
4
|
-
x = [1,2]
|
5
|
-
puts x[0]
|
6
|
-
EOF
|
7
|
-
assert_output("1\n") do
|
8
|
-
cls.main(nil)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_bracket_assignment
|
13
|
-
cls, = compile(<<-EOF)
|
14
|
-
import java.util.ArrayList
|
15
|
-
x = ArrayList.new
|
16
|
-
x[0]= "2"
|
17
|
-
puts x
|
18
|
-
EOF
|
19
|
-
assert_output("[2]\n") do
|
20
|
-
cls.main(nil)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|