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/lib/mirah/plugin/java.rb
DELETED
|
@@ -1,70 +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/typer'
|
|
17
|
-
require 'mirah/jvm/method_lookup'
|
|
18
|
-
require 'mirah/jvm/types'
|
|
19
|
-
require 'java'
|
|
20
|
-
|
|
21
|
-
module Mirah
|
|
22
|
-
module Typer
|
|
23
|
-
class JavaTyper < Base
|
|
24
|
-
include Mirah::JVM::MethodLookup
|
|
25
|
-
include Mirah::JVM::Types
|
|
26
|
-
|
|
27
|
-
def initialize
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def name
|
|
31
|
-
"Java"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def method_type(typer, target_type, name, parameter_types)
|
|
35
|
-
return if target_type.nil? or parameter_types.any? {|t| t.nil?}
|
|
36
|
-
if target_type.respond_to? :get_method
|
|
37
|
-
method = target_type.get_method(name, parameter_types)
|
|
38
|
-
unless method || target_type.basic_type.kind_of?(TypeDefinition)
|
|
39
|
-
raise NoMethodError, "Cannot find %s method %s(%s) on %s" %
|
|
40
|
-
[ target_type.meta? ? "static" : "instance",
|
|
41
|
-
name,
|
|
42
|
-
parameter_types.map{|t| t.full_name}.join(', '),
|
|
43
|
-
target_type.full_name
|
|
44
|
-
]
|
|
45
|
-
end
|
|
46
|
-
if method
|
|
47
|
-
result = method.return_type
|
|
48
|
-
elsif typer.last_chance && target_type.meta? &&
|
|
49
|
-
name == 'new' && parameter_types == []
|
|
50
|
-
unmeta = target_type.unmeta
|
|
51
|
-
if unmeta.respond_to?(:default_constructor)
|
|
52
|
-
result = unmeta.default_constructor
|
|
53
|
-
typer.last_chance = false if result
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
if result
|
|
59
|
-
log "Method type for \"#{name}\" #{parameter_types} on #{target_type} = #{result}"
|
|
60
|
-
else
|
|
61
|
-
log "Method type for \"#{name}\" #{parameter_types} on #{target_type} not found"
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
result
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
typer_plugins << Typer::JavaTyper.new
|
|
70
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Mirah
|
|
2
|
-
module Transform
|
|
3
|
-
class Error < Mirah::MirahError
|
|
4
|
-
attr_reader :position
|
|
5
|
-
def initialize(msg, position, cause=nil)
|
|
6
|
-
position = position.position if position.respond_to? :position
|
|
7
|
-
super(msg, position)
|
|
8
|
-
self.cause = cause
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
TransformError = Transform::Error
|
|
13
|
-
end
|
|
@@ -1,765 +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 Mirah
|
|
17
|
-
module Transform
|
|
18
|
-
class Helper
|
|
19
|
-
java_import 'jmeta.Ast'
|
|
20
|
-
def initialize(transformer)
|
|
21
|
-
@mirah = transformer
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def position(node)
|
|
25
|
-
@mirah.position(node)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def transformer
|
|
29
|
-
@mirah
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def transform(node, parent)
|
|
33
|
-
@mirah.transform(node, parent)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def transform_script(node, parent)
|
|
37
|
-
Mirah::AST::Script.new(parent, position(node)) do |script|
|
|
38
|
-
script.filename = transformer.filename
|
|
39
|
-
[@mirah.transform(node.children[0], script)]
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def transform_fixnum(node, parent)
|
|
44
|
-
Mirah::AST::fixnum(parent, position(node), node[1])
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def transform_float(node, parent)
|
|
48
|
-
Mirah::AST::float(parent, position(node), node[1])
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def transform_true(node, parent)
|
|
52
|
-
Mirah::AST::Boolean.new(parent, position(node), true)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def transform_false(node, parent)
|
|
56
|
-
Mirah::AST::Boolean.new(parent, position(node), false)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def transform_nil(node, parent)
|
|
60
|
-
Mirah::AST::Null.new(parent, position(node))
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def transform_self(node, parent)
|
|
64
|
-
Mirah::AST::Self.new(parent, position(node))
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def transform_string(node, parent)
|
|
68
|
-
Mirah::AST::String.new(parent, position(node), node[1])
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def transform_symbol(node, parent)
|
|
72
|
-
Mirah::AST::String.new(parent, position(node), node[1])
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def transform_body(node, parent)
|
|
76
|
-
Mirah::AST::Body.new(parent, position(node)) do |body|
|
|
77
|
-
node.children.map {|child| @mirah.transform(child, body)}
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def transform_begin(node, parent)
|
|
82
|
-
@mirah.transform(node[1], parent)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def transform_break(node, parent)
|
|
86
|
-
Mirah::AST::Break.new(parent, position(node))
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def transform_arguments(node, parent)
|
|
90
|
-
Mirah::AST::Arguments.new(parent, position(node)) do |args_node|
|
|
91
|
-
node.children.map do |child|
|
|
92
|
-
if child.nil?
|
|
93
|
-
nil
|
|
94
|
-
elsif child.kind_of?(Ast)
|
|
95
|
-
@mirah.transform(child, args_node)
|
|
96
|
-
else
|
|
97
|
-
child.map {|x| @mirah.transform(x, args_node)}
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def transform_required_argument(node, parent)
|
|
104
|
-
name = node[1]
|
|
105
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
106
|
-
type = node[2]
|
|
107
|
-
type_node = transform(type, parent) if type
|
|
108
|
-
if Mirah::AST::Unquote === name && type.nil?
|
|
109
|
-
name
|
|
110
|
-
else
|
|
111
|
-
Mirah::AST::RequiredArgument.new(parent, position(node), name, type_node)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def transform_opt_arg(node, parent)
|
|
116
|
-
name = node[1]
|
|
117
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
118
|
-
type = node[2]
|
|
119
|
-
value = node[3]
|
|
120
|
-
Mirah::AST::OptionalArgument.new(parent, position(node), name) do |optarg|
|
|
121
|
-
[
|
|
122
|
-
type ? transform(type, optarg) : nil,
|
|
123
|
-
transform(value, optarg),
|
|
124
|
-
]
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def transform_rest_arg(node, parent)
|
|
129
|
-
name = node[1]
|
|
130
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
131
|
-
type = node[2]
|
|
132
|
-
Mirah::AST::RestArgument.new(parent, position(node), name) do |restarg|
|
|
133
|
-
[type ? transform(type, restarg) : nil]
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def transform_block_arg(node, parent)
|
|
138
|
-
name = node[1]
|
|
139
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
140
|
-
type = node[2]
|
|
141
|
-
Mirah::AST::BlockArgument.new(parent, position(node), name) do |blkarg|
|
|
142
|
-
[type ? transform(type, blkarg) : nil]
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def transform_opt_block_arg(node, parent)
|
|
147
|
-
block_arg = transform_block_arg(node, parent)
|
|
148
|
-
block_arg.optional = true
|
|
149
|
-
return block_arg
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# TODO UnnamedRestArg
|
|
153
|
-
|
|
154
|
-
def transform_sclass(node, parent)
|
|
155
|
-
Mirah::AST::ClassAppendSelf.new(parent, position(node)) do |class_append_self|
|
|
156
|
-
raise "Singleton class not supported" unless node[1][0] == 'Self'
|
|
157
|
-
|
|
158
|
-
[transformer.transform(node[2], class_append_self)]
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
def transform_zarray(node, parent)
|
|
163
|
-
Mirah::AST::Array.new(parent, position(node))
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def transform_array(node, parent)
|
|
167
|
-
Mirah::AST::Array.new(parent, position(node)) do |array|
|
|
168
|
-
node.children.map {|child| transformer.transform(child, array)}
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def transform_attr_assign(node, parent)
|
|
173
|
-
name = node[1]
|
|
174
|
-
target = node[2]
|
|
175
|
-
args = node[3] + [node[4]]
|
|
176
|
-
position = position(node)
|
|
177
|
-
case name
|
|
178
|
-
when '[]='
|
|
179
|
-
Mirah::AST::Call.new(parent, position, name) do |call|
|
|
180
|
-
[
|
|
181
|
-
transformer.transform(target, call),
|
|
182
|
-
args.map {|arg| transformer.transform(arg, call)},
|
|
183
|
-
nil
|
|
184
|
-
]
|
|
185
|
-
end
|
|
186
|
-
else
|
|
187
|
-
new_name = name[0..-2] + '_set'
|
|
188
|
-
Mirah::AST::Call.new(parent, position, new_name) do |call|
|
|
189
|
-
[
|
|
190
|
-
transformer.transform(target, call),
|
|
191
|
-
args.map {|arg| transformer.transform(arg, call)},
|
|
192
|
-
nil
|
|
193
|
-
]
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
def transform_class(node, parent)
|
|
199
|
-
cpath = node[1]
|
|
200
|
-
body_node = node[2]
|
|
201
|
-
super_node = node[3]
|
|
202
|
-
if cpath[0] == 'Constant'
|
|
203
|
-
name = cpath[1]
|
|
204
|
-
elsif cpath[0] == 'Unquote'
|
|
205
|
-
name = cpath
|
|
206
|
-
else
|
|
207
|
-
raise "Unsupported class name #{cpath[0]}"
|
|
208
|
-
end
|
|
209
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
210
|
-
Mirah::AST::ClassDefinition.new(parent, position(node),
|
|
211
|
-
name,
|
|
212
|
-
transformer.annotations) do |class_def|
|
|
213
|
-
[
|
|
214
|
-
super_node ? transform(super_node, class_def) : nil,
|
|
215
|
-
body_node ? transform(body_node, class_def) : nil
|
|
216
|
-
]
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def transform_def(node, parent)
|
|
221
|
-
name, args_node, type_node, body_node = node[1], node[2], node[3], node[4]
|
|
222
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
223
|
-
position = position(node)
|
|
224
|
-
actual_name = name
|
|
225
|
-
if name =~ /=$/ && name != '[]='
|
|
226
|
-
actual_name = name[0..-2] + '_set'
|
|
227
|
-
end
|
|
228
|
-
if name == 'initialize'
|
|
229
|
-
klass = Mirah::AST::ConstructorDefinition
|
|
230
|
-
else
|
|
231
|
-
klass = Mirah::AST::MethodDefinition
|
|
232
|
-
end
|
|
233
|
-
klass.new(parent,
|
|
234
|
-
position,
|
|
235
|
-
actual_name,
|
|
236
|
-
transformer.annotations) do |defn|
|
|
237
|
-
defn.signature = signature = {:return => nil}
|
|
238
|
-
defn.return_type = transform(type_node, defn) if type_node
|
|
239
|
-
[
|
|
240
|
-
signature,
|
|
241
|
-
args_node ? transformer.transform(args_node, defn) : nil,
|
|
242
|
-
body_node ? transformer.transform(body_node, defn) : nil,
|
|
243
|
-
]
|
|
244
|
-
end
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
def transform_def_static(node, parent)
|
|
248
|
-
name, args_node, type_node, body_node = node[1], node[2], node[3], node[4]
|
|
249
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
250
|
-
position = position(node)
|
|
251
|
-
actual_name = name
|
|
252
|
-
if name =~ /=$/
|
|
253
|
-
actual_name = name[0..-2] + '_set'
|
|
254
|
-
end
|
|
255
|
-
Mirah::AST::StaticMethodDefinition.new(parent,
|
|
256
|
-
position,
|
|
257
|
-
actual_name,
|
|
258
|
-
transformer.annotations) do |defn|
|
|
259
|
-
defn.signature = signature = {:return => nil}
|
|
260
|
-
defn.return_type = transform(type_node, defn) if type_node
|
|
261
|
-
[
|
|
262
|
-
signature,
|
|
263
|
-
args_node ? transformer.transform(args_node, defn) : nil,
|
|
264
|
-
body_node ? transformer.transform(body_node, defn) : nil,
|
|
265
|
-
]
|
|
266
|
-
end
|
|
267
|
-
end
|
|
268
|
-
|
|
269
|
-
def transform_fcall(node, parent)
|
|
270
|
-
if node.respond_to?(:declaration?) && node.declaration?
|
|
271
|
-
return Mirah::AST::Noop.new(parent, position(node))
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
name = node[1]
|
|
275
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
276
|
-
args = node[2]
|
|
277
|
-
iter_node = node[3]
|
|
278
|
-
fcall = Mirah::AST::FunctionalCall.new(parent, position(node), name) do |call|
|
|
279
|
-
[
|
|
280
|
-
args ? args.map {|arg| transformer.transform(arg, call)} : [],
|
|
281
|
-
iter_node ? transformer.transform(iter_node, call) : nil
|
|
282
|
-
]
|
|
283
|
-
end
|
|
284
|
-
macro = Mirah::AST.macro(name)
|
|
285
|
-
if macro
|
|
286
|
-
transformer.expand(fcall, parent, ¯o)
|
|
287
|
-
else
|
|
288
|
-
fcall
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
def transform_call(node, parent)
|
|
293
|
-
name = node[1]
|
|
294
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
295
|
-
target = node[2]
|
|
296
|
-
args = node[3]
|
|
297
|
-
args = [args] if args && args[0].kind_of?(String)
|
|
298
|
-
iter_node = node[4]
|
|
299
|
-
position = position(node)
|
|
300
|
-
|
|
301
|
-
actual_name = name
|
|
302
|
-
case actual_name
|
|
303
|
-
when '[]'
|
|
304
|
-
# could be array instantiation
|
|
305
|
-
case target[0]
|
|
306
|
-
when 'Identifier'
|
|
307
|
-
case target[1]
|
|
308
|
-
when 'boolean', 'byte', 'short', 'char', 'int', 'long', 'float', 'double'
|
|
309
|
-
if args.nil? || args.size == 0
|
|
310
|
-
constant = Mirah::AST::Constant.new(parent, position, target[1])
|
|
311
|
-
constant.array = true
|
|
312
|
-
return constant
|
|
313
|
-
elsif args && args.size == 1
|
|
314
|
-
return Mirah::AST::EmptyArray.new(parent, position) do |array|
|
|
315
|
-
[transform(target, array), transform(args[0], array)]
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
# TODO look for imported, lower case class names
|
|
319
|
-
end
|
|
320
|
-
when 'Constant'
|
|
321
|
-
if args.nil? || args.size == 0
|
|
322
|
-
constant = Mirah::AST::Constant.new(parent, position, target[1])
|
|
323
|
-
constant.array = true
|
|
324
|
-
return constant
|
|
325
|
-
elsif args && args.size == 1
|
|
326
|
-
return Mirah::AST::EmptyArray.new(parent, position) do |array|
|
|
327
|
-
[transform(target, array), transform(args[0], array)]
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
end
|
|
331
|
-
when /=$/
|
|
332
|
-
if name.size > 2 || name =~ /^\w/
|
|
333
|
-
actual_name = name[0..-2] + '_set'
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
Mirah::AST::Call.new(parent, position, actual_name) do |call|
|
|
338
|
-
[
|
|
339
|
-
transformer.transform(target, call),
|
|
340
|
-
args ? args.map {|arg| transformer.transform(arg, call)} : [],
|
|
341
|
-
iter_node ? transformer.transform(iter_node, call) : nil
|
|
342
|
-
]
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
def transform_constant(node, parent)
|
|
347
|
-
Mirah::AST::Constant.new(parent, position(node), node[1])
|
|
348
|
-
end
|
|
349
|
-
|
|
350
|
-
def transform_colon2const(node, parent)
|
|
351
|
-
name = node[2]
|
|
352
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
353
|
-
target = node[1]
|
|
354
|
-
Mirah::AST::Colon2.new(parent, position(node), name) do |colon2|
|
|
355
|
-
[ transform(target, colon2) ]
|
|
356
|
-
end
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
def transform_identifier(node, parent)
|
|
360
|
-
name = node[1]
|
|
361
|
-
position = position(node)
|
|
362
|
-
if name == 'raise'
|
|
363
|
-
Mirah::AST::Raise.new(parent, position) do
|
|
364
|
-
[]
|
|
365
|
-
end
|
|
366
|
-
elsif name == 'null'
|
|
367
|
-
Mirah::AST::Null.new(parent, position)
|
|
368
|
-
elsif ['public', 'private', 'protected'].include?(name)
|
|
369
|
-
Mirah::AST::AccessLevel.new(parent, position, name)
|
|
370
|
-
else
|
|
371
|
-
macro = Mirah::AST.macro(name)
|
|
372
|
-
fcall = Mirah::AST::FunctionalCall.new(parent, position, name) do |call|
|
|
373
|
-
[
|
|
374
|
-
[],
|
|
375
|
-
nil
|
|
376
|
-
]
|
|
377
|
-
end
|
|
378
|
-
if macro
|
|
379
|
-
transformer.expand(fcall, parent, ¯o)
|
|
380
|
-
else
|
|
381
|
-
fcall
|
|
382
|
-
end
|
|
383
|
-
end
|
|
384
|
-
end
|
|
385
|
-
|
|
386
|
-
def transform_local_assign(node, parent)
|
|
387
|
-
name = node[1]
|
|
388
|
-
value_node = node[2]
|
|
389
|
-
position = position(node)
|
|
390
|
-
case value_node[0]
|
|
391
|
-
when 'Symbol', 'Constant'
|
|
392
|
-
Mirah::AST::LocalDeclaration.new(parent, position, name) {|local_decl| [transform(value_node, local_decl)]}
|
|
393
|
-
else
|
|
394
|
-
Mirah::AST::LocalAssignment.new(parent, position, name) {|local| [transform(value_node, local)]}
|
|
395
|
-
end
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
def transform_local(node, parent)
|
|
399
|
-
name = node[1]
|
|
400
|
-
Mirah::AST::Local.new(parent, position(node), name)
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
def transform_iter(node, parent)
|
|
404
|
-
args = node[1]
|
|
405
|
-
body = node[2]
|
|
406
|
-
Mirah::AST::Block.new(parent, position(node)) do |block|
|
|
407
|
-
[
|
|
408
|
-
args ? transformer.transform(args, block) : Mirah::AST::Arguments.new(block, position(node)),
|
|
409
|
-
body ? transformer.transform(body, block) : Mirah::AST::Body.new(block, position(node)),
|
|
410
|
-
]
|
|
411
|
-
end
|
|
412
|
-
end
|
|
413
|
-
|
|
414
|
-
def transform_inst_var(node, parent)
|
|
415
|
-
name = node[1]
|
|
416
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
417
|
-
Mirah::AST::Field.new(parent, position(node), name, transformer.annotations)
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
def transform_inst_var_assign(node, parent)
|
|
421
|
-
name = node[1]
|
|
422
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
423
|
-
value_node = node[2]
|
|
424
|
-
position = position(node)
|
|
425
|
-
case value_node[0]
|
|
426
|
-
when 'Symbol', 'Constant'
|
|
427
|
-
Mirah::AST::FieldDeclaration.new(parent, position,
|
|
428
|
-
name, transformer.annotations) do |field_decl|
|
|
429
|
-
[transform(value_node, field_decl)]
|
|
430
|
-
end
|
|
431
|
-
else
|
|
432
|
-
Mirah::AST::FieldAssignment.new(parent, position, name, transformer.annotations) {|field| [transformer.transform(value_node, field)]}
|
|
433
|
-
end
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
def transform_class_var(node, parent)
|
|
437
|
-
name = node[1]
|
|
438
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
439
|
-
Mirah::AST::Field.new(parent, position(node), name, transformer.annotations, true)
|
|
440
|
-
end
|
|
441
|
-
|
|
442
|
-
def transform_class_var_assign(node, parent)
|
|
443
|
-
name = node[1]
|
|
444
|
-
name = transform(name, nil) unless name.kind_of?(::String)
|
|
445
|
-
value_node = node[2]
|
|
446
|
-
position = position(node)
|
|
447
|
-
case value_node[0]
|
|
448
|
-
when 'Symbol', 'Constant'
|
|
449
|
-
Mirah::AST::FieldDeclaration.new(parent, position,
|
|
450
|
-
name, transformer.annotations, true) do |field_decl|
|
|
451
|
-
[transform(value_node, field_decl)]
|
|
452
|
-
end
|
|
453
|
-
else
|
|
454
|
-
Mirah::AST::FieldAssignment.new(parent, position, name, transformer.annotations, true) {|field| [transformer.transform(value_node, field)]}
|
|
455
|
-
end
|
|
456
|
-
end
|
|
457
|
-
|
|
458
|
-
def transform_if(node, parent)
|
|
459
|
-
condition = node[1]
|
|
460
|
-
then_body = node[2]
|
|
461
|
-
else_body = node[3]
|
|
462
|
-
Mirah::AST::If.new(parent, position(node)) do |iff|
|
|
463
|
-
[
|
|
464
|
-
Mirah::AST::Condition.new(iff, position(condition)) {|cond| [transformer.transform(condition, cond)]},
|
|
465
|
-
then_body ? transformer.transform(then_body, iff) : nil,
|
|
466
|
-
else_body ? transformer.transform(else_body, iff) : nil
|
|
467
|
-
]
|
|
468
|
-
end
|
|
469
|
-
end
|
|
470
|
-
|
|
471
|
-
def transform_zsuper(node, parent)
|
|
472
|
-
Mirah::AST::Super.new(parent, position(node))
|
|
473
|
-
end
|
|
474
|
-
|
|
475
|
-
def transform_super(node, parent)
|
|
476
|
-
args = node[1]
|
|
477
|
-
iter = node[2]
|
|
478
|
-
Mirah::AST::Super.new(parent, position(node)) do |s|
|
|
479
|
-
[args ? args.map {|arg| transformer.transform(arg, s)} : []]
|
|
480
|
-
end
|
|
481
|
-
end
|
|
482
|
-
|
|
483
|
-
def transform_return(node, parent)
|
|
484
|
-
value_node = node[1] if node.size > 1
|
|
485
|
-
Mirah::AST::Return.new(parent, position(node)) do |ret|
|
|
486
|
-
[value_node ? transform(value_node, ret) : nil]
|
|
487
|
-
end
|
|
488
|
-
end
|
|
489
|
-
|
|
490
|
-
def transform_dstring(node, parent)
|
|
491
|
-
Mirah::AST::StringConcat.new(parent, position(node)) do |p|
|
|
492
|
-
node.children.map{|n| transform(n, p)}
|
|
493
|
-
end
|
|
494
|
-
end
|
|
495
|
-
|
|
496
|
-
def transform_ev_string(node, parent)
|
|
497
|
-
Mirah::AST::ToString.new(parent, position(node)) do |p|
|
|
498
|
-
[transform(node[1], p)]
|
|
499
|
-
end
|
|
500
|
-
end
|
|
501
|
-
|
|
502
|
-
def transform_and(node, parent)
|
|
503
|
-
first_node = node[1]
|
|
504
|
-
second_node = node[2]
|
|
505
|
-
Mirah::AST::If.new(parent, position(node)) do |iff|
|
|
506
|
-
[
|
|
507
|
-
Mirah::AST::Condition.new(iff, position(first_node)) {|cond| [transform(first_node, cond)]},
|
|
508
|
-
transform(second_node, iff),
|
|
509
|
-
nil
|
|
510
|
-
]
|
|
511
|
-
end
|
|
512
|
-
end
|
|
513
|
-
|
|
514
|
-
def transform_or(node, parent)
|
|
515
|
-
first_node = node[1]
|
|
516
|
-
second_node = node[2]
|
|
517
|
-
Mirah::AST::Body.new(parent, position(node)) do |block|
|
|
518
|
-
temp = transformer.tmp
|
|
519
|
-
[
|
|
520
|
-
Mirah::AST::LocalAssignment.new(block, position(first_node), temp) do |l|
|
|
521
|
-
[transform(first_node, l)]
|
|
522
|
-
end,
|
|
523
|
-
Mirah::AST::If.new(parent, position(node)) do |iff|
|
|
524
|
-
[
|
|
525
|
-
Mirah::AST::Condition.new(iff, position(first_node)) do |cond|
|
|
526
|
-
[Mirah::AST::Local.new(cond, position(first_node), temp)]
|
|
527
|
-
end,
|
|
528
|
-
Mirah::AST::Local.new(iff, position(first_node), temp),
|
|
529
|
-
transform(second_node, iff)
|
|
530
|
-
]
|
|
531
|
-
end
|
|
532
|
-
]
|
|
533
|
-
end
|
|
534
|
-
end
|
|
535
|
-
|
|
536
|
-
def transform_next(node, parent)
|
|
537
|
-
Mirah::AST::Next.new(parent, position(node))
|
|
538
|
-
end
|
|
539
|
-
|
|
540
|
-
def transform_not(node, parent)
|
|
541
|
-
# TODO it's probably better to keep a not node
|
|
542
|
-
# and actually implement compiling it properly.
|
|
543
|
-
# Bonus points for optimizing branches that use Not's.
|
|
544
|
-
Mirah::AST::If.new(parent, position(node)) do |iff|
|
|
545
|
-
[
|
|
546
|
-
Mirah::AST::Condition.new(iff, position(node)) do |cond|
|
|
547
|
-
[ transform(node[1], cond) ]
|
|
548
|
-
end,
|
|
549
|
-
Mirah::AST::Boolean.new(iff, position(node), false),
|
|
550
|
-
Mirah::AST::Boolean.new(iff, position(node), true)
|
|
551
|
-
]
|
|
552
|
-
end
|
|
553
|
-
end
|
|
554
|
-
|
|
555
|
-
def transform_redo(node, parent)
|
|
556
|
-
Mirah::AST::Redo.new(parent, position(node))
|
|
557
|
-
end
|
|
558
|
-
|
|
559
|
-
def transform_regex(node, parent)
|
|
560
|
-
contents = node[1]
|
|
561
|
-
modifiers = node[2]
|
|
562
|
-
if contents.size == 1 && contents[0][0] == 'String'
|
|
563
|
-
value = contents[0][1]
|
|
564
|
-
Mirah::AST::Regexp.new(parent, position(node), value)
|
|
565
|
-
else
|
|
566
|
-
raise "Unsupported regex #{node}"
|
|
567
|
-
end
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
def transform_ensure(node, parent)
|
|
571
|
-
Mirah::AST::Ensure.new(parent, position(node)) do |n|
|
|
572
|
-
node.children.map {|c| transform(c, n)}
|
|
573
|
-
end
|
|
574
|
-
end
|
|
575
|
-
|
|
576
|
-
def evaluate_at_start?(node)
|
|
577
|
-
if node[0] =~ /Mod$/ && node[2] && node[2][0] == 'Begin'
|
|
578
|
-
false
|
|
579
|
-
else
|
|
580
|
-
true
|
|
581
|
-
end
|
|
582
|
-
end
|
|
583
|
-
|
|
584
|
-
def transform_while(node, parent)
|
|
585
|
-
condition_node = node[1]
|
|
586
|
-
body_node = node[2]
|
|
587
|
-
Mirah::AST::Loop.new(parent, position(node), evaluate_at_start?(node), false) do |loop|
|
|
588
|
-
[
|
|
589
|
-
Mirah::AST::Condition.new(loop, position(condition_node)) {|cond| [transform(condition_node, cond)]},
|
|
590
|
-
transform(body_node, loop)
|
|
591
|
-
]
|
|
592
|
-
end
|
|
593
|
-
end
|
|
594
|
-
def transform_while_mod(node, parent)
|
|
595
|
-
transform_while(node, parent)
|
|
596
|
-
end
|
|
597
|
-
|
|
598
|
-
def transform_until(node, parent)
|
|
599
|
-
condition_node = node[1]
|
|
600
|
-
body_node = node[2]
|
|
601
|
-
Mirah::AST::Loop.new(parent, position(node), evaluate_at_start?(node), true) do |loop|
|
|
602
|
-
[
|
|
603
|
-
Mirah::AST::Condition.new(loop, position(condition_node)) {|cond| [transform(condition_node, cond)]},
|
|
604
|
-
transform(body_node, loop)
|
|
605
|
-
]
|
|
606
|
-
end
|
|
607
|
-
end
|
|
608
|
-
def transform_until_mod(node, parent)
|
|
609
|
-
transform_until(node, parent)
|
|
610
|
-
end
|
|
611
|
-
|
|
612
|
-
def transform_for(node, parent)
|
|
613
|
-
var_node = node[1]
|
|
614
|
-
body_node = node[2]
|
|
615
|
-
iter_node = node[3]
|
|
616
|
-
Mirah::AST::Call.new(parent, position(node), 'each') do |each|
|
|
617
|
-
[
|
|
618
|
-
transformer.transform(iter_node, each),
|
|
619
|
-
[],
|
|
620
|
-
Mirah::AST::Block.new(each, position(body_node)) do |block|
|
|
621
|
-
[
|
|
622
|
-
Mirah::AST::Arguments.new(block, position(var_node)) do |args|
|
|
623
|
-
[
|
|
624
|
-
# TODO support for multiple assignment?
|
|
625
|
-
[Mirah::AST::RequiredArgument.new(args,
|
|
626
|
-
position(var_node),
|
|
627
|
-
var_node[1])
|
|
628
|
-
]
|
|
629
|
-
]
|
|
630
|
-
end,
|
|
631
|
-
transformer.transform(body_node, block)
|
|
632
|
-
]
|
|
633
|
-
end
|
|
634
|
-
]
|
|
635
|
-
end
|
|
636
|
-
end
|
|
637
|
-
|
|
638
|
-
def transform_rescue(node, parent)
|
|
639
|
-
body_node = node[1]
|
|
640
|
-
clauses = node[2]
|
|
641
|
-
else_node = node[3]
|
|
642
|
-
Mirah::AST::Rescue.new(parent, position(node)) do |node|
|
|
643
|
-
[
|
|
644
|
-
transformer.transform(body_node, node),
|
|
645
|
-
clauses.map {|clause| transformer.transform(clause, node)},
|
|
646
|
-
transformer.transform(else_node, node)
|
|
647
|
-
]
|
|
648
|
-
end
|
|
649
|
-
end
|
|
650
|
-
|
|
651
|
-
def transform_rescue_clause(node, parent)
|
|
652
|
-
exceptions = node[1]
|
|
653
|
-
var_name = node[2]
|
|
654
|
-
name = transform(var_name, nil) unless var_name.nil? || var_name.kind_of?(::String)
|
|
655
|
-
body = node[3]
|
|
656
|
-
Mirah::AST::RescueClause.new(parent, position(node)) do |clause|
|
|
657
|
-
clause.name = var_name if var_name
|
|
658
|
-
[
|
|
659
|
-
if exceptions.size == 0
|
|
660
|
-
[Mirah::AST::String.new(clause, position(node), 'java.lang.Exception')]
|
|
661
|
-
else
|
|
662
|
-
exceptions.map {|name| Mirah::AST::Constant.new(clause, position(node), name)}
|
|
663
|
-
end,
|
|
664
|
-
body ? transformer.transform(body, clause) : Mirah::AST::Null.new(clause, position(node))
|
|
665
|
-
]
|
|
666
|
-
end
|
|
667
|
-
end
|
|
668
|
-
|
|
669
|
-
def transform_hash(node, parent)
|
|
670
|
-
Mirah::AST::Call.new(parent, position(node), 'new_hash') do |call|
|
|
671
|
-
[
|
|
672
|
-
Mirah::AST::Builtin.new(call, position(node)),
|
|
673
|
-
[
|
|
674
|
-
Mirah::AST::Array.new(call, position(node)) do |array|
|
|
675
|
-
values = []
|
|
676
|
-
node.children.each do |assoc|
|
|
677
|
-
assoc.children.each do |child|
|
|
678
|
-
values << transform(child, array)
|
|
679
|
-
end
|
|
680
|
-
end
|
|
681
|
-
values
|
|
682
|
-
end
|
|
683
|
-
]
|
|
684
|
-
]
|
|
685
|
-
end
|
|
686
|
-
end
|
|
687
|
-
|
|
688
|
-
def transform_op_assign(node, parent)
|
|
689
|
-
target = node[1]
|
|
690
|
-
attribute = node[2]
|
|
691
|
-
op = node[3]
|
|
692
|
-
value = node[4]
|
|
693
|
-
temp = transformer.tmp
|
|
694
|
-
tempval = transformer.tmp
|
|
695
|
-
position = position(node)
|
|
696
|
-
setter = "#{attribute}="
|
|
697
|
-
getter = attribute
|
|
698
|
-
Mirah::AST::Body.new(parent, position) do |body|
|
|
699
|
-
[
|
|
700
|
-
Mirah::AST::LocalAssignment.new(body, position, temp) {|l| transform(target, l)},
|
|
701
|
-
Mirah::AST::LocalAssignment.new(body, position, tempval) do |l|
|
|
702
|
-
Mirah::AST::Call.new(l, position, op) do |op_call|
|
|
703
|
-
[
|
|
704
|
-
Mirah::AST::Call.new(op_call, position, getter) do |get_call|
|
|
705
|
-
[
|
|
706
|
-
Mirah::AST::Local.new(get_call, position, temp),
|
|
707
|
-
[]
|
|
708
|
-
]
|
|
709
|
-
end,
|
|
710
|
-
[transform(value, op_call)],
|
|
711
|
-
]
|
|
712
|
-
end
|
|
713
|
-
end,
|
|
714
|
-
Mirah::AST::Call.new(body, position, setter) do |set_call|
|
|
715
|
-
[
|
|
716
|
-
Mirah::AST::Local.new(set_call, position, temp),
|
|
717
|
-
[ Mirah::AST::Local.new(set_call, position, tempval) ],
|
|
718
|
-
]
|
|
719
|
-
end,
|
|
720
|
-
Mirah::AST::Local.new(body, position, tempval),
|
|
721
|
-
]
|
|
722
|
-
end
|
|
723
|
-
end
|
|
724
|
-
|
|
725
|
-
def transform_unquote(node, parent)
|
|
726
|
-
Mirah::AST::Unquote.new(parent, position(node)) do |unquote|
|
|
727
|
-
[transform(node[1], unquote)]
|
|
728
|
-
end
|
|
729
|
-
end
|
|
730
|
-
|
|
731
|
-
def transform_unquote_assign(node, parent)
|
|
732
|
-
name, value = node[1], node[2]
|
|
733
|
-
Mirah::AST::UnquoteAssign.new(parent, position(node)) do |unquote|
|
|
734
|
-
[transform(name, unquote), transform(value, unquote)]
|
|
735
|
-
end
|
|
736
|
-
end
|
|
737
|
-
|
|
738
|
-
def transform_block_pass(node, parent)
|
|
739
|
-
Mirah::AST::BlockPass.new(parent, position(node)) do |blockpass|
|
|
740
|
-
[transform(node[1], blockpass)]
|
|
741
|
-
end
|
|
742
|
-
end
|
|
743
|
-
|
|
744
|
-
def transform_annotation(node, parent)
|
|
745
|
-
classname = node[1]
|
|
746
|
-
values = if node[2]
|
|
747
|
-
node[2].children
|
|
748
|
-
else
|
|
749
|
-
[]
|
|
750
|
-
end
|
|
751
|
-
annotation = Mirah::AST::Annotation.new(parent, position(node)) do |anno|
|
|
752
|
-
[Mirah::AST::String.new(anno, position(node), classname)]
|
|
753
|
-
end
|
|
754
|
-
values.each do |assoc|
|
|
755
|
-
key = assoc[1]
|
|
756
|
-
value = assoc[2]
|
|
757
|
-
name = key[1]
|
|
758
|
-
annotation[name] = transform(value, annotation)
|
|
759
|
-
end
|
|
760
|
-
transformer.add_annotation(annotation)
|
|
761
|
-
return Mirah::AST::Noop.new(parent, position(node))
|
|
762
|
-
end
|
|
763
|
-
end
|
|
764
|
-
end
|
|
765
|
-
end
|