mirah 0.0.9-java → 0.0.10-java
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +40 -0
- data/Rakefile +3 -2
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah/ast.rb +22 -12
- data/lib/mirah/ast/flow.rb +28 -14
- data/lib/mirah/ast/intrinsics.rb +20 -17
- data/lib/mirah/ast/method.rb +9 -3
- data/lib/mirah/ast/scope.rb +3 -3
- data/lib/mirah/ast/structure.rb +16 -13
- data/lib/mirah/commands/base.rb +6 -2
- data/lib/mirah/jvm/compiler/java_source.rb +4 -4
- data/lib/mirah/jvm/source_generator/builder.rb +6 -0
- data/lib/mirah/jvm/types/intrinsics.rb +8 -3
- data/lib/mirah/transform/helper.rb +1 -1
- data/lib/mirah/typer/simple.rb +1 -1
- data/lib/mirah/util/argument_processor.rb +2 -2
- data/lib/mirah/util/process_errors.rb +2 -1
- data/lib/mirah/version.rb +1 -1
- data/test/core/test_ast.rb +4 -6
- data/test/core/test_commands.rb +80 -0
- data/test/core/test_compilation.rb +2 -6
- data/test/core/test_env.rb +1 -3
- data/test/core/test_macros.rb +15 -3
- data/test/core/test_typer.rb +17 -4
- data/test/jvm/bytecode_test_helper.rb +6 -7
- data/test/jvm/javac_test_helper.rb +0 -7
- data/test/jvm/test_annotations.rb +58 -0
- data/test/jvm/test_blocks.rb +62 -0
- data/test/jvm/test_jvm_compiler.rb +40 -188
- data/test/jvm/test_macros.rb +13 -0
- data/test/jvm/test_rescue.rb +152 -0
- data/test/plugins/test_gwt.rb +1 -3
- data/test/test_helper.rb +19 -0
- metadata +13 -5
@@ -73,7 +73,7 @@ module Mirah::JVM::Types
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def add_compiled_macro(klass, name, arg_types)
|
76
|
-
add_macro(name, *arg_types) do |
|
76
|
+
add_macro(name, *arg_types) do |mirah, call|
|
77
77
|
# Ick. We need to preserve the scope of the arguments to the macro.
|
78
78
|
# However the only way to do that is to wrap them in a ScopedBody.
|
79
79
|
# It'd be better if we didn't have to expose this wrapper node to
|
@@ -87,15 +87,20 @@ module Mirah::JVM::Types
|
|
87
87
|
wrap_with_scoped_body call, arg
|
88
88
|
end
|
89
89
|
|
90
|
-
expander = klass.constructors[0].newInstance(
|
90
|
+
expander = klass.constructors[0].newInstance(mirah, call)
|
91
91
|
ast = expander.expand
|
92
92
|
if ast
|
93
93
|
body = Mirah::AST::ScopedBody.new(call.parent, call.position)
|
94
94
|
body << ast
|
95
|
-
|
95
|
+
|
96
|
+
# if the macro was called on something, and that something
|
97
|
+
# was not a class only containing macros, reassign self for
|
98
|
+
# the body.
|
99
|
+
if call.target && !call.target.is_a?(Mirah::AST::Builtin)
|
96
100
|
body.static_scope.self_type = call.target.inferred_type!
|
97
101
|
body.static_scope.self_node = call.target
|
98
102
|
end
|
103
|
+
|
99
104
|
body
|
100
105
|
else
|
101
106
|
Mirah::AST::Noop.new(call.parent, call.position)
|
@@ -406,7 +406,7 @@ module Mirah
|
|
406
406
|
Mirah::AST::Block.new(parent, position(node)) do |block|
|
407
407
|
[
|
408
408
|
args ? transformer.transform(args, block) : Mirah::AST::Arguments.new(block, position(node)),
|
409
|
-
body ? transformer.transform(body, block) :
|
409
|
+
body ? transformer.transform(body, block) : Mirah::AST::Body.new(block, position(node)),
|
410
410
|
]
|
411
411
|
end
|
412
412
|
end
|
data/lib/mirah/typer/simple.rb
CHANGED
@@ -52,7 +52,7 @@ module Mirah
|
|
52
52
|
else
|
53
53
|
puts "-j/--java flag only applies to \"compile\" mode."
|
54
54
|
print_help
|
55
|
-
throw :exit
|
55
|
+
throw :exit, 1
|
56
56
|
end
|
57
57
|
when '--jvm'
|
58
58
|
args.shift
|
@@ -79,7 +79,7 @@ module Mirah
|
|
79
79
|
else
|
80
80
|
puts "unrecognized flag: " + args[0]
|
81
81
|
print_help
|
82
|
-
throw :exit
|
82
|
+
throw :exit, 1
|
83
83
|
end
|
84
84
|
end
|
85
85
|
state.destination ||= File.join(File.expand_path('.'), '')
|
@@ -16,6 +16,7 @@
|
|
16
16
|
module Mirah
|
17
17
|
module Util
|
18
18
|
module ProcessErrors
|
19
|
+
# errors - array of NodeErrors
|
19
20
|
def process_errors(errors)
|
20
21
|
errors.each do |ex|
|
21
22
|
puts ex
|
@@ -26,7 +27,7 @@ module Mirah
|
|
26
27
|
end
|
27
28
|
puts ex.backtrace if @verbose
|
28
29
|
end
|
29
|
-
throw :exit unless errors.empty?
|
30
|
+
throw :exit, 1 unless errors.empty?
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
data/lib/mirah/version.rb
CHANGED
data/test/core/test_ast.rb
CHANGED
@@ -12,10 +12,7 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
|
16
|
-
require 'mirah'
|
17
|
-
require 'test/unit'
|
18
|
-
require 'jruby'
|
15
|
+
require 'test_helper'
|
19
16
|
|
20
17
|
class TestAst < Test::Unit::TestCase
|
21
18
|
include Mirah
|
@@ -360,7 +357,8 @@ class TestAst < Test::Unit::TestCase
|
|
360
357
|
assert_not_nil(new_ast)
|
361
358
|
assert(AST::EmptyArray === new_ast)
|
362
359
|
assert_equal(5, new_ast.size.literal)
|
363
|
-
|
360
|
+
|
361
|
+
assert_equal("int", new_ast.type_node.name)
|
364
362
|
end
|
365
363
|
|
366
364
|
def test_block_comment
|
@@ -377,4 +375,4 @@ class TestAst < Test::Unit::TestCase
|
|
377
375
|
AST.parse("puts( 'aoue'")
|
378
376
|
end
|
379
377
|
end
|
380
|
-
end
|
378
|
+
end
|
@@ -0,0 +1,80 @@
|
|
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
|
+
require 'test_helper'
|
16
|
+
|
17
|
+
|
18
|
+
class TestCommands < Test::Unit::TestCase
|
19
|
+
def teardown
|
20
|
+
Mirah::AST.type_factory = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
class RaisesMirahErrorCommand < Mirah::Commands::Base
|
24
|
+
def execute
|
25
|
+
execute_base { raise Mirah::MirahError, "just an error" }
|
26
|
+
end
|
27
|
+
def command_name; :foo; end
|
28
|
+
end
|
29
|
+
|
30
|
+
class MirahProcessesErrorCommand < Mirah::Commands::Base
|
31
|
+
include Mirah::Util::ProcessErrors
|
32
|
+
def execute
|
33
|
+
execute_base { process_errors [Mirah::NodeError.new("just an error")] }
|
34
|
+
end
|
35
|
+
def command_name; :foo; end
|
36
|
+
end
|
37
|
+
|
38
|
+
class SuccessfulCommand < Mirah::Commands::Base
|
39
|
+
def execute
|
40
|
+
execute_base { "something" }
|
41
|
+
end
|
42
|
+
def command_name; :foo; end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_on_Mirah_error_has_non_zero_exit_code
|
46
|
+
assert_non_zero_exit do
|
47
|
+
RaisesMirahErrorCommand.new([]).execute
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_on_bad_argument_has_non_zero_exit_code
|
52
|
+
assert_non_zero_exit do
|
53
|
+
RaisesMirahErrorCommand.new(['-bad-argument']).execute
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_on_j_option_when_command_is_not_compile_has_non_zero_exit_code
|
58
|
+
assert_non_zero_exit do
|
59
|
+
RaisesMirahErrorCommand.new(['-j']).execute
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_success_is_truthy
|
64
|
+
assert SuccessfulCommand.new([]).execute, "expected it to be truthy"
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_process_errors_causes_a_non_zero_exit
|
68
|
+
assert_non_zero_exit do
|
69
|
+
MirahProcessesErrorCommand.new([]).execute
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def assert_non_zero_exit
|
74
|
+
ex = assert_raise SystemExit do
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
assert_not_equal 0, ex.status
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -12,13 +12,9 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
+
require 'test_helper'
|
15
16
|
|
16
|
-
|
17
|
-
require 'mirah/compiler'
|
18
|
-
require 'test/unit'
|
19
|
-
require 'jruby'
|
20
|
-
|
21
|
-
class TestAst < Test::Unit::TestCase
|
17
|
+
class TestCompilation < Test::Unit::TestCase
|
22
18
|
include Mirah
|
23
19
|
|
24
20
|
class MockCompiler
|
data/test/core/test_env.rb
CHANGED
@@ -12,9 +12,7 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
|
16
|
-
require 'test/unit'
|
17
|
-
require 'mirah'
|
15
|
+
require 'test_helper'
|
18
16
|
|
19
17
|
class TestEnv < Test::Unit::TestCase
|
20
18
|
include Mirah
|
data/test/core/test_macros.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
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.
|
1
15
|
# TODO refactor this and test_jvm_compiler to use mirah.rb
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'mirah'
|
16
|
+
require 'test_helper'
|
5
17
|
|
6
18
|
class TestMacros < Test::Unit::TestCase
|
7
19
|
java_import 'java.lang.System'
|
data/test/core/test_typer.rb
CHANGED
@@ -12,9 +12,7 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
|
16
|
-
require 'test/unit'
|
17
|
-
require 'mirah'
|
15
|
+
require 'test_helper'
|
18
16
|
|
19
17
|
class TestTyper < Test::Unit::TestCase
|
20
18
|
include Mirah
|
@@ -222,6 +220,21 @@ class TestTyper < Test::Unit::TestCase
|
|
222
220
|
|
223
221
|
assert_equal(typer.float_type, ast2.body[0].inferred_type)
|
224
222
|
end
|
223
|
+
|
224
|
+
def test_rescue_w_different_type_raises_inference_error_when_expression
|
225
|
+
ast = AST.parse("begin true; 1.0; rescue; ''; end").body[0]
|
226
|
+
typer = Typer::Simple.new("bar")
|
227
|
+
|
228
|
+
assert_raise(Mirah::InferenceError) {ast.infer(typer, true)}
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_rescue_w_different_type_doesnt_raise_inference_error_when_statement
|
232
|
+
ast = AST.parse("begin true; 1.0; rescue; ''; end").body[0]
|
233
|
+
typer = Typer::Simple.new("bar")
|
234
|
+
|
235
|
+
assert_nothing_raised {ast.infer(typer, false)}
|
236
|
+
end
|
237
|
+
|
225
238
|
|
226
239
|
def test_class
|
227
240
|
ast = AST.parse("class Foo; def foo; 1; end; def baz; foo; end; end")
|
@@ -234,4 +247,4 @@ class TestTyper < Test::Unit::TestCase
|
|
234
247
|
|
235
248
|
assert_nothing_raised {typer.resolve(true)}
|
236
249
|
end
|
237
|
-
end
|
250
|
+
end
|
@@ -12,15 +12,10 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
require '
|
16
|
-
require 'test/unit'
|
17
|
-
require 'mirah'
|
18
|
-
require 'jruby'
|
15
|
+
require 'test_helper'
|
19
16
|
require 'stringio'
|
20
17
|
require 'fileutils'
|
21
18
|
|
22
|
-
#$CLASSPATH << File.expand_path("#{File.dirname(__FILE__)}/../..")
|
23
|
-
|
24
19
|
unless Mirah::AST.macro "__gloop__"
|
25
20
|
Mirah::AST.defmacro "__gloop__" do |transformer, fcall, parent|
|
26
21
|
Mirah::AST::Loop.new(parent, parent.position, true, false) do |loop|
|
@@ -125,7 +120,7 @@ module JVMCompiler
|
|
125
120
|
compiler
|
126
121
|
end
|
127
122
|
|
128
|
-
def compile(code, name =
|
123
|
+
def compile(code, name = tmp_script_name)
|
129
124
|
clear_tmp_files
|
130
125
|
reset_type_factory
|
131
126
|
|
@@ -135,6 +130,10 @@ module JVMCompiler
|
|
135
130
|
|
136
131
|
generate_classes compiler
|
137
132
|
end
|
133
|
+
|
134
|
+
def tmp_script_name
|
135
|
+
"script" + System.nano_time.to_s
|
136
|
+
end
|
138
137
|
end
|
139
138
|
|
140
139
|
|
@@ -12,14 +12,7 @@
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
|
-
|
16
|
-
require 'bundler/setup'
|
17
|
-
require 'test/unit'
|
18
|
-
require 'mirah'
|
19
|
-
|
20
15
|
require 'bytecode_test_helper'
|
21
|
-
|
22
|
-
|
23
16
|
require 'mirah/jvm/compiler/java_source'
|
24
17
|
|
25
18
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class TestAnnotations < Test::Unit::TestCase
|
2
|
+
def deprecated
|
3
|
+
@deprecated ||= java.lang.Deprecated.java_class
|
4
|
+
end
|
5
|
+
|
6
|
+
def test_annotation_on_a_method
|
7
|
+
cls, = compile(<<-EOF)
|
8
|
+
$Deprecated
|
9
|
+
def foo
|
10
|
+
'foo'
|
11
|
+
end
|
12
|
+
EOF
|
13
|
+
|
14
|
+
assert_not_nil cls.java_class.java_method('foo').annotation(deprecated)
|
15
|
+
assert_nil cls.java_class.annotation(deprecated)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_annotation_on_a_class
|
19
|
+
script, cls = compile(<<-EOF)
|
20
|
+
$Deprecated
|
21
|
+
class Annotated
|
22
|
+
end
|
23
|
+
EOF
|
24
|
+
assert_not_nil cls.java_class.annotation(deprecated)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_annotation_on_a_field
|
28
|
+
cls, = compile(<<-EOF)
|
29
|
+
class AnnotatedField
|
30
|
+
def initialize
|
31
|
+
$Deprecated
|
32
|
+
@foo = 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
EOF
|
36
|
+
|
37
|
+
assert_not_nil cls.java_class.declared_fields[0].annotation(deprecated)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_annotation_with_an_integer
|
41
|
+
jruby_method = Java::OrgJrubyAnno::JRubyMethod.java_class
|
42
|
+
|
43
|
+
cls, = compile(<<-EOF)
|
44
|
+
import org.jruby.*
|
45
|
+
import org.jruby.anno.*
|
46
|
+
import org.jruby.runtime.*
|
47
|
+
import org.jruby.runtime.builtin.*
|
48
|
+
|
49
|
+
$JRubyMethod["name" => "bar", "optional" => 1]
|
50
|
+
def bar(baz:int)
|
51
|
+
end
|
52
|
+
EOF
|
53
|
+
method_annotation = cls.java_class.java_method('bar', :int).annotation(jruby_method)
|
54
|
+
|
55
|
+
assert_equal 1, method_annotation.optional
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,62 @@
|
|
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
|
+
class TestBlocks < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def setup
|
19
|
+
super
|
20
|
+
clear_tmp_files
|
21
|
+
reset_type_factory
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse_and_type code, name=tmp_script_name
|
25
|
+
parse_and_resolve_types name, code
|
26
|
+
end
|
27
|
+
|
28
|
+
#this should probably be a core test
|
29
|
+
def test_empty_block_parses_and_types_without_error
|
30
|
+
assert_nothing_raised do
|
31
|
+
parse_and_type(<<-CODE)
|
32
|
+
interface Bar do;def run:void;end;end
|
33
|
+
|
34
|
+
class Foo
|
35
|
+
def foo(a:Bar)
|
36
|
+
1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
Foo.new.foo do
|
40
|
+
end
|
41
|
+
CODE
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_non_empty_block_parses_and_types_without_error
|
46
|
+
assert_nothing_raised do
|
47
|
+
parse_and_type(<<-CODE)
|
48
|
+
interface Bar do;def run:void;end;end
|
49
|
+
|
50
|
+
class Foo
|
51
|
+
def foo(a:Bar)
|
52
|
+
1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
Foo.new.foo do
|
56
|
+
1
|
57
|
+
end
|
58
|
+
CODE
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|