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
|
@@ -2,8 +2,8 @@ module Mirah
|
|
|
2
2
|
module JVM
|
|
3
3
|
module Types
|
|
4
4
|
class VoidType < PrimitiveType
|
|
5
|
-
def initialize
|
|
6
|
-
super('void', Java::JavaLang::Void)
|
|
5
|
+
def initialize(types)
|
|
6
|
+
super(types, 'void', Java::JavaLang::Void)
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def void?
|
|
@@ -16,4 +16,4 @@ module Mirah
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
|
-
end
|
|
19
|
+
end
|
data/lib/mirah/parser.rb
CHANGED
|
@@ -14,22 +14,22 @@
|
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
16
|
require 'mirah/util/process_errors'
|
|
17
|
+
require 'mirah/util/logging'
|
|
17
18
|
require 'mirah/transform'
|
|
18
19
|
require 'java'
|
|
19
20
|
|
|
20
21
|
module Mirah
|
|
21
22
|
class Parser
|
|
22
23
|
include Mirah::Util::ProcessErrors
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
include Mirah::Logging::Logged
|
|
25
|
+
|
|
26
|
+
def initialize(state, typer, logging)
|
|
27
|
+
@transformer = Mirah::Transform::Transformer.new(state, typer)
|
|
27
28
|
@logging = logging
|
|
28
|
-
@verbose = state.verbose
|
|
29
29
|
end
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
attr_accessor :transformer, :logging
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
def parse_from_args(files_or_scripts)
|
|
34
34
|
nodes = []
|
|
35
35
|
inline = false
|
|
@@ -46,25 +46,31 @@ module Mirah
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
raise 'nothing to parse? ' + files_or_scripts.inspect unless nodes.length > 0
|
|
49
|
-
nodes.compact
|
|
49
|
+
nodes = nodes.compact
|
|
50
|
+
if self.logging
|
|
51
|
+
nodes.each {|node| log "Parsed:\n #{format_ast(node)}"}
|
|
52
|
+
end
|
|
53
|
+
nodes
|
|
50
54
|
end
|
|
51
|
-
|
|
55
|
+
|
|
52
56
|
def parse_inline(source)
|
|
53
57
|
puts " <inline script>" if logging
|
|
54
58
|
parse_and_transform('DashE', source)
|
|
55
59
|
end
|
|
56
|
-
|
|
60
|
+
|
|
57
61
|
def parse_file(filename)
|
|
58
62
|
puts " #{filename}" if logging
|
|
59
63
|
parse_and_transform(filename, File.read(filename))
|
|
60
64
|
end
|
|
61
|
-
|
|
65
|
+
|
|
62
66
|
def parse_and_transform(filename, src)
|
|
63
|
-
|
|
64
|
-
process_errors(transformer.errors)
|
|
65
|
-
mirah_ast
|
|
67
|
+
Mirah::AST.parse_ruby(transformer, src, filename)
|
|
66
68
|
end
|
|
67
|
-
|
|
69
|
+
|
|
70
|
+
def format_ast(ast)
|
|
71
|
+
AstPrinter.new.scan(ast, ast)
|
|
72
|
+
end
|
|
73
|
+
|
|
68
74
|
def expand_files(files_or_scripts)
|
|
69
75
|
expanded = []
|
|
70
76
|
files_or_scripts.each do |filename|
|
|
@@ -82,5 +88,137 @@ module Mirah
|
|
|
82
88
|
end
|
|
83
89
|
expanded
|
|
84
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
|
|
85
223
|
end
|
|
86
|
-
end
|
|
224
|
+
end
|
data/lib/mirah/plugin/edb.rb
CHANGED
|
@@ -24,7 +24,7 @@ Mirah::AST.defmacro('def_edb') do |transformer, fcall, parent|
|
|
|
24
24
|
compiler.pre_cmd = ["def #{name}", "_edbout = StringBuilder.new"]
|
|
25
25
|
compiler.post_cmd = ["_edbout.toString", "end"]
|
|
26
26
|
src = compiler.compile(IO.read(path))
|
|
27
|
-
ast = Mirah::AST.parse_ruby(src, path)
|
|
27
|
+
ast = Mirah::AST.parse_ruby(transformer, src, path)
|
|
28
28
|
transformer.filename = path
|
|
29
29
|
script = transformer.transform(ast, parent)
|
|
30
30
|
script.body.parent = parent
|
data/lib/mirah/transform.rb
CHANGED
|
@@ -1,57 +1,38 @@
|
|
|
1
1
|
module Mirah
|
|
2
2
|
module AST
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
java_import 'mirah.impl.MirahParser'
|
|
8
|
-
end
|
|
9
|
-
java_import 'jmeta.ErrorHandler'
|
|
10
|
-
|
|
11
|
-
class MirahErrorHandler
|
|
12
|
-
include ErrorHandler
|
|
13
|
-
def warning(messages, positions)
|
|
14
|
-
print "Warning: "
|
|
15
|
-
messages.each_with_index do |message, i|
|
|
16
|
-
jpos = positions[i]
|
|
17
|
-
if jpos
|
|
18
|
-
dpos = Mirah::Transform::Transformer::JMetaPosition.new(jpos, jpos)
|
|
19
|
-
print "#{message} at "
|
|
20
|
-
Mirah.print_error("", dpos)
|
|
21
|
-
else
|
|
22
|
-
print message
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
3
|
+
java_import 'mirah.impl.MirahParser'
|
|
4
|
+
java_import 'mirah.lang.ast.StringCodeSource'
|
|
5
|
+
java_import 'org.mirah.macros.Macro'
|
|
6
|
+
java_import 'org.mirah.util.SimpleDiagnostics'
|
|
27
7
|
|
|
28
8
|
def parse(src, filename='dash_e', raise_errors=false, transformer=nil)
|
|
29
|
-
|
|
30
|
-
transformer
|
|
31
|
-
transformer.filename = filename
|
|
32
|
-
ast = transformer.transform(ast, nil)
|
|
33
|
-
if raise_errors
|
|
34
|
-
transformer.errors.each do |e|
|
|
35
|
-
raise e.cause || e
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
ast
|
|
9
|
+
raise ArgumentError unless transformer
|
|
10
|
+
parse_ruby(transformer, src, filename)
|
|
39
11
|
end
|
|
40
12
|
module_function :parse
|
|
41
13
|
|
|
42
|
-
def parse_ruby(src, filename='-')
|
|
14
|
+
def parse_ruby(transformer, src, filename='-')
|
|
43
15
|
raise ArgumentError if src.nil?
|
|
16
|
+
#filename = transformer.tag_filename(src, filename)
|
|
44
17
|
parser = MirahParser.new
|
|
45
|
-
|
|
46
|
-
parser.
|
|
18
|
+
source = StringCodeSource.new(filename, src)
|
|
19
|
+
parser.diagnostics = SimpleDiagnostics.new(true)
|
|
47
20
|
begin
|
|
48
|
-
parser.parse(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
21
|
+
ast = parser.parse(source)
|
|
22
|
+
if parser.diagnostics.error_count > 0
|
|
23
|
+
puts "#{parser.diagnostics.error_count} errors, exiting"
|
|
24
|
+
throw :exit, 1
|
|
52
25
|
end
|
|
26
|
+
return ast
|
|
27
|
+
rescue NativeException => ex
|
|
28
|
+
ex.cause.printStackTrace
|
|
29
|
+
raise ex
|
|
30
|
+
rescue => ex
|
|
31
|
+
# if ex.cause.kind_of? Java::OrgMirahMmeta::SyntaxError
|
|
32
|
+
# ex = SyntaxError.wrap ex.cause, nil
|
|
33
|
+
# end
|
|
53
34
|
|
|
54
|
-
if ex.
|
|
35
|
+
if ex.respond_to? :position
|
|
55
36
|
position = ex.cause.position
|
|
56
37
|
Mirah.print_error(ex.cause.message, position)
|
|
57
38
|
end
|
|
@@ -60,4 +41,4 @@ module Mirah
|
|
|
60
41
|
end
|
|
61
42
|
module_function :parse_ruby
|
|
62
43
|
end
|
|
63
|
-
end
|
|
44
|
+
end
|
|
@@ -1,41 +1,39 @@
|
|
|
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
|
+
|
|
1
16
|
module Mirah
|
|
2
17
|
module Transform
|
|
3
18
|
class Transformer
|
|
4
19
|
begin
|
|
5
|
-
|
|
20
|
+
java_import 'org.mirah.macros.Compiler'
|
|
6
21
|
rescue NameError
|
|
7
|
-
|
|
8
|
-
include Java::DubyLangCompiler.Compiler
|
|
22
|
+
# builtins not compiled yet
|
|
9
23
|
end
|
|
10
24
|
|
|
11
25
|
attr_reader :errors, :state
|
|
12
26
|
attr_accessor :filename
|
|
13
|
-
|
|
27
|
+
|
|
28
|
+
def initialize(state, typer)
|
|
14
29
|
@errors = []
|
|
15
30
|
@tmp_count = 0
|
|
16
31
|
@annotations = []
|
|
17
|
-
@scopes = []
|
|
18
32
|
@extra_body = nil
|
|
19
33
|
@state = state
|
|
20
|
-
@
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def destination
|
|
24
|
-
@state.destination
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def verbose?
|
|
28
|
-
@state.verbose
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def annotations
|
|
32
|
-
result, @annotations = @annotations, []
|
|
33
|
-
return result
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def add_annotation(annotation)
|
|
37
|
-
@annotations << annotation
|
|
38
|
-
Mirah::AST::Noop.new(annotation.parent, annotation.position)
|
|
34
|
+
@typer = typer
|
|
35
|
+
@types = typer.type_system if typer
|
|
36
|
+
@files = {""=>{:filename => "", :line => 0, :code => ""}}
|
|
39
37
|
end
|
|
40
38
|
|
|
41
39
|
def tmp(format="__xform_tmp_%d")
|
|
@@ -44,214 +42,21 @@ module Mirah
|
|
|
44
42
|
|
|
45
43
|
class JMetaPosition
|
|
46
44
|
attr_accessor :start_line, :end_line, :start_offset, :end_offset, :file
|
|
47
|
-
attr_accessor :startpos, :endpos, :
|
|
45
|
+
attr_accessor :startpos, :endpos, :start_column, :end_column, :source
|
|
48
46
|
|
|
49
|
-
def initialize(startpos, endpos)
|
|
47
|
+
def initialize(transformer, startpos, endpos, source)
|
|
50
48
|
@startpos = startpos
|
|
51
49
|
@endpos = endpos
|
|
52
|
-
@
|
|
50
|
+
@transformer = transformer
|
|
53
51
|
@start_line = startpos.line
|
|
54
52
|
@start_offset = startpos.pos
|
|
55
|
-
@
|
|
53
|
+
@start_column = startpos.col
|
|
56
54
|
@end_line = endpos.line
|
|
57
55
|
@end_offset = endpos.pos
|
|
58
|
-
@
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def +(other)
|
|
62
|
-
JMetaPosition.new(@startpos, other.endpos)
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def position(node)
|
|
67
|
-
JMetaPosition.new(node.start_position, node.end_position)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def camelize(name)
|
|
71
|
-
name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def transform(node, parent)
|
|
75
|
-
return nil if node.nil?
|
|
76
|
-
begin
|
|
77
|
-
top = @extra_body.nil?
|
|
78
|
-
if top
|
|
79
|
-
return nil if !node.children.empty? && node.children.all?(&:nil?)
|
|
80
|
-
|
|
81
|
-
@extra_body = Mirah::AST::Body.new(nil, position(node))
|
|
82
|
-
end
|
|
83
|
-
method = "transform_#{camelize(node[0])}"
|
|
84
|
-
result = @helper.send method, node, parent
|
|
85
|
-
if top
|
|
86
|
-
body = result.body
|
|
87
|
-
if body.kind_of?(Mirah::AST::Body) && @extra_body.empty?
|
|
88
|
-
@extra_body = body
|
|
89
|
-
else
|
|
90
|
-
result.body = @extra_body
|
|
91
|
-
body.parent = @extra_body
|
|
92
|
-
@extra_body.children.insert(0, body)
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
return result
|
|
96
|
-
rescue Error => ex
|
|
97
|
-
@errors << ex
|
|
98
|
-
Mirah::AST::ErrorNode.new(parent, ex)
|
|
99
|
-
# rescue Exception => ex
|
|
100
|
-
# error = Error.new(ex.message, position(node), ex)
|
|
101
|
-
# @errors << error
|
|
102
|
-
# Mirah::AST::ErrorNode.new(parent, error)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def captured?(node)
|
|
107
|
-
depth = node.depth
|
|
108
|
-
scope = @scopes[-1]
|
|
109
|
-
while depth > 0
|
|
110
|
-
depth -= 1
|
|
111
|
-
scope = scope.enclosing_scope
|
|
112
|
-
end
|
|
113
|
-
scope.isCaptured(node.index)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def eval(src, filename='-', parent=nil, *vars)
|
|
117
|
-
node = Mirah::AST.parse_ruby(src, filename)
|
|
118
|
-
mirah_node = transform(node, nil).body
|
|
119
|
-
mirah_node.parent = parent
|
|
120
|
-
mirah_node
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
def dump_ast(node, call=nil)
|
|
124
|
-
encoded = nil
|
|
125
|
-
values = Mirah::AST::Unquote.extract_values do
|
|
126
|
-
encoded = Base64.encode64(Marshal.dump(node))
|
|
127
|
-
end
|
|
128
|
-
scope = call.scope.static_scope if call
|
|
129
|
-
result = Mirah::AST::Array.new(nil, node.position)
|
|
130
|
-
if encoded.size < 65535
|
|
131
|
-
result << Mirah::AST::String.new(result, node.position, encoded)
|
|
132
|
-
else
|
|
133
|
-
strings = Mirah::AST::StringConcat.new(result, node.position)
|
|
134
|
-
result << strings
|
|
135
|
-
while encoded.size >= 65535
|
|
136
|
-
chunk = encoded[0, 65535]
|
|
137
|
-
encoded[0, 65535] = ""
|
|
138
|
-
strings << Mirah::AST::String.new(strings, node.position, chunk)
|
|
139
|
-
end
|
|
140
|
-
strings << Mirah::AST::String.new(strings, node.position, encoded)
|
|
141
|
-
end
|
|
142
|
-
values.each do |value|
|
|
143
|
-
if call
|
|
144
|
-
scoped_value = Mirah::AST::ScopedBody.new(result, value.position)
|
|
145
|
-
scoped_value << value
|
|
146
|
-
scoped_value.static_scope = scope
|
|
147
|
-
else
|
|
148
|
-
scoped_value = value
|
|
149
|
-
end
|
|
150
|
-
result << scoped_value
|
|
151
|
-
end
|
|
152
|
-
return result
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def load_ast(args)
|
|
156
|
-
nodes = args.to_a
|
|
157
|
-
encoded = nodes.shift
|
|
158
|
-
Mirah::AST::Unquote.inject_values(nodes) do
|
|
159
|
-
result = Marshal.load(Base64.decode64(encoded))
|
|
160
|
-
if Mirah::AST::UnquotedValue === result
|
|
161
|
-
result.node
|
|
162
|
-
else
|
|
163
|
-
result
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def __ruby_eval(code, arg)
|
|
169
|
-
self.instance_eval(code)
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def fixnum(value)
|
|
173
|
-
node = eval("1")
|
|
174
|
-
node.literal = value
|
|
175
|
-
node
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
def constant(name, array=false)
|
|
179
|
-
node = eval("Foo")
|
|
180
|
-
node.name = name
|
|
181
|
-
node.array = array
|
|
182
|
-
node
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
def cast(type, value)
|
|
186
|
-
if value.kind_of?(String)
|
|
187
|
-
value = Mirah::AST::Local.new(@extra_body, @extra_body.position, value)
|
|
188
|
-
end
|
|
189
|
-
fcall = eval("Foo()")
|
|
190
|
-
fcall.name = type
|
|
191
|
-
fcall.parameters = [value]
|
|
192
|
-
fcall
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
def string(value)
|
|
196
|
-
node = eval('"Foo"')
|
|
197
|
-
node.literal = value
|
|
198
|
-
node
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
def empty_array(type_node, size_node)
|
|
202
|
-
node = eval('int[0]')
|
|
203
|
-
node.type_node = type_node
|
|
204
|
-
node.size = size_node
|
|
205
|
-
node
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def find_class(name)
|
|
209
|
-
AST.type(nil, name, false, false)
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def expand(fvcall, parent)
|
|
213
|
-
result = yield self, fvcall, parent
|
|
214
|
-
unless AST::Node === result
|
|
215
|
-
raise Error.new('Invalid macro result', fvcall.position)
|
|
216
|
-
end
|
|
217
|
-
result
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
def append_node(node)
|
|
221
|
-
@extra_body << node
|
|
222
|
-
node
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
def define_class(position, name, &block)
|
|
226
|
-
append_node Mirah::AST::ClassDefinition.new(@extra_body, position, name, &block)
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def defineClass(name, superclass=nil, interfaces=nil)
|
|
230
|
-
define_class(@extra_body.position, name) do |class_def|
|
|
231
|
-
superclass = Mirah::AST::Constant.new(class_def, class_def.position, superclass)
|
|
232
|
-
superclass.parent = class_def
|
|
233
|
-
if interfaces
|
|
234
|
-
class_def.implements(*interfaces.map {|i| Mirah::AST::Constant.new(class_def, class_def.position, i)})
|
|
235
|
-
end
|
|
236
|
-
[superclass, body(class_def)]
|
|
237
|
-
end
|
|
238
|
-
end
|
|
239
|
-
|
|
240
|
-
def body(parent=nil)
|
|
241
|
-
parent ||= @extra_body
|
|
242
|
-
Mirah::AST::Body.new(parent, parent.position)
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
def define_closure(position, name, enclosing_type)
|
|
246
|
-
target = self
|
|
247
|
-
parent = @extra_body
|
|
248
|
-
enclosing_type = enclosing_type.unmeta
|
|
249
|
-
if enclosing_type.respond_to?(:node) && enclosing_type.node
|
|
250
|
-
parent = target = enclosing_type.node
|
|
56
|
+
@end_column = endpos.col
|
|
57
|
+
@source = source
|
|
251
58
|
end
|
|
252
|
-
target.append_node(Mirah::AST::ClosureDefinition.new(
|
|
253
|
-
parent, position, name, enclosing_type))
|
|
254
59
|
end
|
|
255
60
|
end
|
|
256
61
|
end
|
|
257
|
-
end
|
|
62
|
+
end
|