mirah 0.0.7-java → 0.0.8-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 +181 -0
- data/README.txt +6 -10
- data/Rakefile +86 -9
- data/bin/mirah +2 -0
- data/bin/mirahc +2 -0
- data/bin/mirahp +2 -0
- data/{bin/dubyp → examples/interfaces.mirah} +16 -9
- data/examples/macros/square.mirah +12 -0
- data/examples/macros/square_int.mirah +12 -0
- data/examples/macros/string-each-char.mirah +14 -0
- data/examples/maven/README.txt +2 -0
- data/examples/maven/pom.xml +23 -0
- data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
- data/examples/rosettacode/100-doors.mirah +44 -0
- data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
- data/examples/rosettacode/README.txt +9 -0
- data/examples/rosettacode/boolean-values.mirah +29 -0
- data/examples/rosettacode/comments.mirah +2 -0
- data/examples/rosettacode/copy-a-string.mirah +10 -0
- data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
- data/examples/rosettacode/create-a-file.mirah +6 -0
- data/examples/rosettacode/empty-string.mirah +9 -0
- data/examples/rosettacode/factorial.mirah +10 -0
- data/examples/rosettacode/fibonacci.mirah +21 -0
- data/examples/rosettacode/file-size.mirah +5 -0
- data/examples/rosettacode/fizz-buzz.mirah +21 -0
- data/examples/rosettacode/flatten-a-list.mirah +24 -0
- data/examples/rosettacode/guess-the-number.mirah +21 -0
- data/examples/rosettacode/is-string-numeric.mirah +127 -0
- data/examples/rosettacode/palindrome.mirah +14 -0
- data/examples/rosettacode/repeat-a-string.mirah +9 -0
- data/examples/rosettacode/reverse-a-string.mirah +6 -0
- data/examples/rosettacode/rot-13.mirah +20 -0
- data/examples/rosettacode/user-input.mirah +4 -0
- data/examples/sort_closure.mirah +1 -1
- data/javalib/dynalink-0.2.jar +0 -0
- data/javalib/mirah-bootstrap.jar +0 -0
- data/lib/mirah.rb +7 -16
- data/lib/mirah/ast.rb +22 -92
- data/lib/mirah/ast/call.rb +41 -9
- data/lib/mirah/ast/class.rb +34 -6
- data/lib/mirah/ast/flow.rb +17 -5
- data/lib/mirah/ast/intrinsics.rb +50 -8
- data/lib/mirah/ast/literal.rb +7 -0
- data/lib/mirah/ast/local.rb +9 -1
- data/lib/mirah/ast/method.rb +21 -8
- data/lib/mirah/ast/scope.rb +1 -1
- data/lib/mirah/ast/structure.rb +81 -15
- data/lib/mirah/ast/type.rb +4 -0
- data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
- data/lib/mirah/commands/base.rb +54 -0
- data/lib/mirah/commands/compile.rb +39 -0
- data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
- data/lib/mirah/commands/run.rb +73 -0
- data/lib/mirah/compiler.rb +37 -417
- data/lib/mirah/compiler/call.rb +45 -0
- data/lib/mirah/compiler/class.rb +81 -0
- data/lib/mirah/compiler/flow.rb +109 -0
- data/lib/mirah/compiler/literal.rb +130 -0
- data/lib/mirah/compiler/local.rb +59 -0
- data/lib/mirah/compiler/method.rb +44 -0
- data/lib/mirah/compiler/structure.rb +65 -0
- data/lib/mirah/compiler/type.rb +27 -0
- data/lib/mirah/env.rb +4 -6
- data/lib/mirah/generator.rb +61 -0
- data/lib/mirah/jvm/compiler.rb +8 -867
- data/lib/mirah/jvm/compiler/base.rb +270 -0
- data/lib/mirah/jvm/compiler/java_source.rb +779 -0
- data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
- data/lib/mirah/jvm/method_lookup.rb +21 -2
- data/lib/mirah/jvm/source_generator/builder.rb +10 -13
- data/lib/mirah/jvm/source_generator/loops.rb +99 -93
- data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
- data/lib/mirah/jvm/typer.rb +3 -3
- data/lib/mirah/jvm/types.rb +10 -426
- data/lib/mirah/jvm/types/array_type.rb +62 -0
- data/lib/mirah/jvm/types/basic_types.rb +1 -0
- data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
- data/lib/mirah/jvm/types/factory.rb +23 -5
- data/lib/mirah/jvm/types/interface_definition.rb +20 -0
- data/lib/mirah/jvm/types/intrinsics.rb +15 -3
- data/lib/mirah/jvm/types/meta_type.rb +45 -0
- data/lib/mirah/jvm/types/methods.rb +12 -5
- data/lib/mirah/jvm/types/null_type.rb +27 -0
- data/lib/mirah/jvm/types/primitive_type.rb +38 -0
- data/lib/mirah/jvm/types/source_mirror.rb +266 -0
- data/lib/mirah/jvm/types/type.rb +173 -0
- data/lib/mirah/jvm/types/type_definition.rb +55 -0
- data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
- data/lib/mirah/jvm/types/void_type.rb +19 -0
- data/lib/mirah/parser.rb +90 -0
- data/lib/mirah/plugin/gwt.rb +5 -5
- data/lib/mirah/plugin/java.rb +1 -1
- data/lib/mirah/transform.rb +4 -321
- data/lib/mirah/transform/ast_ext.rb +63 -0
- data/lib/mirah/transform/error.rb +13 -0
- data/lib/mirah/transform/helper.rb +761 -0
- data/lib/mirah/transform/transformer.rb +255 -0
- data/lib/mirah/typer.rb +2 -383
- data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
- data/lib/mirah/typer/simple.rb +377 -0
- data/lib/mirah/util/argument_processor.rb +114 -0
- data/lib/mirah/util/class_loader.rb +37 -0
- data/lib/mirah/util/compilation_state.rb +51 -0
- data/lib/mirah/util/process_errors.rb +33 -0
- data/lib/mirah/version.rb +1 -1
- data/lib/mirah_task.rb +3 -2
- data/test/{test_ast.rb → core/test_ast.rb} +6 -0
- data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
- data/test/{test_env.rb → core/test_env.rb} +24 -25
- data/test/{test_macros.rb → core/test_macros.rb} +2 -4
- data/test/{test_typer.rb → core/test_typer.rb} +0 -3
- data/test/jvm/bytecode_test_helper.rb +181 -0
- data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
- data/test/jvm/test_enumerable.rb +304 -0
- data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
- data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
- data/test/jvm/test_macros.rb +147 -0
- data/test/jvm/test_main_method.rb +15 -0
- data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
- metadata +103 -91
- data/bin/jrubyp +0 -52
- data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
- data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
- data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
- data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
- data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
- data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
- data/examples/wiki/war/app.yaml +0 -21
- data/examples/wiki/war/public/favicon.ico +0 -0
- data/examples/wiki/war/public/images/appengine_duby.png +0 -0
- data/examples/wiki/war/public/images/back.gif +0 -0
- data/examples/wiki/war/public/images/dir.gif +0 -0
- data/examples/wiki/war/public/images/file.gif +0 -0
- data/examples/wiki/war/public/javascripts/prettify.js +0 -61
- data/examples/wiki/war/public/robots.txt +0 -0
- data/examples/wiki/war/public/stylesheets/main.css +0 -156
- data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
- data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
- data/examples/wiki/war/public/stylesheets/source.css +0 -21
- data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
- data/examples/wiki/war/public/wmd/images/bg.png +0 -0
- data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
- data/examples/wiki/war/public/wmd/images/bold.png +0 -0
- data/examples/wiki/war/public/wmd/images/code.png +0 -0
- data/examples/wiki/war/public/wmd/images/h1.png +0 -0
- data/examples/wiki/war/public/wmd/images/hr.png +0 -0
- data/examples/wiki/war/public/wmd/images/img.png +0 -0
- data/examples/wiki/war/public/wmd/images/italic.png +0 -0
- data/examples/wiki/war/public/wmd/images/link.png +0 -0
- data/examples/wiki/war/public/wmd/images/ol.png +0 -0
- data/examples/wiki/war/public/wmd/images/redo.png +0 -0
- data/examples/wiki/war/public/wmd/images/separator.png +0 -0
- data/examples/wiki/war/public/wmd/images/ul.png +0 -0
- data/examples/wiki/war/public/wmd/images/undo.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
- data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
- data/examples/wiki/war/public/wmd/showdown.js +0 -421
- data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
- data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
- data/examples/wiki/war/public/wmd/wmd.js +0 -73
- data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
- data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
- data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
- data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
- data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
- data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
- data/javalib/dynalink-0.1.jar +0 -0
- data/javalib/jsr292-mock.jar +0 -0
- data/lib/mirah/class_loader.rb +0 -35
- data/lib/mirah/compilation_state.rb +0 -28
- data/lib/mirah/impl.rb +0 -273
- data/lib/mirah/jvm/base.rb +0 -267
- data/lib/mirah/jvm/source_compiler.rb +0 -760
- data/lib/mirah/transform2.rb +0 -752
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<div>
|
|
2
|
-
<% if @error %>
|
|
3
|
-
<div id=error><%=h @error %></div>
|
|
4
|
-
<% end %>
|
|
5
|
-
<div>
|
|
6
|
-
<form method=post>
|
|
7
|
-
<textarea id=body name=body style="width:95%;font-family:monospace" rows=5
|
|
8
|
-
><% if @page && @page.body %><%=h @page.body %><% end
|
|
9
|
-
%></textarea><br>
|
|
10
|
-
Your Name: <input name=nickname value="<%=h nickname %>"><br>
|
|
11
|
-
Comment: <input name=comment value=<% if @page %>
|
|
12
|
-
"Edited Page"
|
|
13
|
-
<% else %>
|
|
14
|
-
"Created Page"
|
|
15
|
-
<% end %>><br>
|
|
16
|
-
<input type=hidden name=version value="<%= @page ? @page.version : long(0) %>">
|
|
17
|
-
<% if admin? %>
|
|
18
|
-
Locked: <input name=locked value=locked type=checkbox <%= "checked" if @page && @page.locked%>><br>
|
|
19
|
-
<% end %>
|
|
20
|
-
<input type=submit name=Save>
|
|
21
|
-
</form>
|
|
22
|
-
</div>
|
|
23
|
-
<hr style="clear:all">
|
|
24
|
-
<div id=preview class="wmd-preview"></div>
|
|
25
|
-
<script>
|
|
26
|
-
(function(){
|
|
27
|
-
var ta = document.getElementById("body");
|
|
28
|
-
var sh = 0;
|
|
29
|
-
function resize() {
|
|
30
|
-
var nsh = ta.scrollHeight;
|
|
31
|
-
if (nsh != sh) {
|
|
32
|
-
ta.style.height = 0;
|
|
33
|
-
ta.style.height = (nsh + 100) + "px";
|
|
34
|
-
sh = ta.scrollHeight;
|
|
35
|
-
}
|
|
36
|
-
setTimeout(resize, 250);
|
|
37
|
-
}
|
|
38
|
-
resize();
|
|
39
|
-
})();
|
|
40
|
-
wmd_options={output:"markdown"};
|
|
41
|
-
</script>
|
|
42
|
-
<script type="text/javascript" src="/wmd/wmd.js""></script>
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
5
|
-
<title><%=h @title %></title>
|
|
6
|
-
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css">
|
|
7
|
-
<link href="/stylesheets/prettify.css" type="text/css" rel="stylesheet" />
|
|
8
|
-
<script type="text/javascript" src="/javascripts/prettify.js"></script>
|
|
9
|
-
</head>
|
|
10
|
-
<body onload="prettyPrint()">
|
|
11
|
-
<div id="page">
|
|
12
|
-
<div id="sidebar">
|
|
13
|
-
|
|
14
|
-
<h1>Mirah</h1>
|
|
15
|
-
|
|
16
|
-
<ul id="sidebar-items">
|
|
17
|
-
|
|
18
|
-
<li>
|
|
19
|
-
<h3>Join the community</h3>
|
|
20
|
-
<ul class="links">
|
|
21
|
-
<li><a href="/">Home Page</a></li>
|
|
22
|
-
<li><a href="http://github.com/mirah/mirah">github</a></li>
|
|
23
|
-
<li><a href="/wiki/Resources">Resources</a></li>
|
|
24
|
-
<li><a href="/wiki/MirahHowto">Howto</a></li>
|
|
25
|
-
<li><a
|
|
26
|
-
href="http://groups.google.com/group/mirah/"
|
|
27
|
-
target="_new">Send Feedback</a></li>
|
|
28
|
-
</ul>
|
|
29
|
-
</li>
|
|
30
|
-
|
|
31
|
-
<li>
|
|
32
|
-
<h3>Sample Apps</h3>
|
|
33
|
-
<ul class="links">
|
|
34
|
-
<li><a href="http://github.com/mirah/mirah/tree/master/examples/appengine/">Guestbook</a> |
|
|
35
|
-
<a href="http://github.com/jacortinas/appengine-rails-jquery-demo">Mustache</a></li>
|
|
36
|
-
</ul>
|
|
37
|
-
<a href="/wiki/MirahSamples">Sample Code</a>
|
|
38
|
-
</li>
|
|
39
|
-
|
|
40
|
-
<li>
|
|
41
|
-
<h3>Mirah Videos</h3>
|
|
42
|
-
<ul class="links">
|
|
43
|
-
<li><a href="http://www.youtube.com/watch?v=08rNKxW0PPo">ribrdb</a> |
|
|
44
|
-
<a href="http://confreaks.net/videos/196-rubyconf2009-ruby-mutants">headius</a></li>
|
|
45
|
-
</ul>
|
|
46
|
-
</li>
|
|
47
|
-
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<div id="content">
|
|
51
|
-
<div id=hlinks>
|
|
52
|
-
<% if user %>
|
|
53
|
-
<%=h user.getEmail %> |
|
|
54
|
-
<% extra_links.each do |_pair|;pair = List(_pair) %>
|
|
55
|
-
<a href="<%=h pair.get(1)%>"><%=h pair.get(0)%></a> |
|
|
56
|
-
<% end %>
|
|
57
|
-
<a href="<%=h users.createLogoutURL('/')%>">Sign Out</a>
|
|
58
|
-
<% else %>
|
|
59
|
-
<a href="<%=users.createLoginURL(url)%>">Sign In</a>
|
|
60
|
-
<% end %>
|
|
61
|
-
</div>
|
|
62
|
-
<div id=wikicontent>
|
|
63
|
-
<%= @content %>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
</body>
|
|
68
|
-
</html>
|
|
69
|
-
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
function newPage() {
|
|
3
|
-
var p=prompt('Page name', '')
|
|
4
|
-
if (p) {
|
|
5
|
-
document.location = '/edit/' + p
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
</script>
|
|
9
|
-
<% if @page %>
|
|
10
|
-
<%= markdown @page.body %>
|
|
11
|
-
<% else %>
|
|
12
|
-
<h1><%=h @name%></h1>
|
|
13
|
-
<p>That page does not exist. Click <a href="/edit/<%=h @name%>">here</a>
|
|
14
|
-
to create it.</p>
|
|
15
|
-
<% end%>
|
data/javalib/dynalink-0.1.jar
DELETED
|
Binary file
|
data/javalib/jsr292-mock.jar
DELETED
|
Binary file
|
data/lib/mirah/class_loader.rb
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# This is a custom classloader impl to allow loading classes with
|
|
2
|
-
# interdependencies by having findClass retrieve classes as needed from the
|
|
3
|
-
# collection of all classes generated by the target script.
|
|
4
|
-
module Mirah
|
|
5
|
-
class ClassLoader < java::security::SecureClassLoader
|
|
6
|
-
def initialize(parent, class_map)
|
|
7
|
-
super(parent)
|
|
8
|
-
@class_map = class_map
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def findClass(name)
|
|
12
|
-
if @class_map[name]
|
|
13
|
-
bytes = @class_map[name].to_java_bytes
|
|
14
|
-
defineClass(name, bytes, 0, bytes.length)
|
|
15
|
-
else
|
|
16
|
-
raise java.lang.ClassNotFoundException.new(name)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def loadClass(name, resolve)
|
|
21
|
-
cls = findLoadedClass(name)
|
|
22
|
-
if cls == nil
|
|
23
|
-
if @class_map[name]
|
|
24
|
-
cls = findClass(name)
|
|
25
|
-
else
|
|
26
|
-
cls = super(name, false)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
resolveClass(cls) if resolve
|
|
31
|
-
|
|
32
|
-
cls
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
module Mirah
|
|
2
|
-
class CompilationState
|
|
3
|
-
def initialize
|
|
4
|
-
BiteScript.bytecode_version = BiteScript::JAVA1_5
|
|
5
|
-
@save_extensions = true
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
attr_accessor :verbose, :destination
|
|
9
|
-
attr_accessor :version_printed
|
|
10
|
-
attr_accessor :help_printed
|
|
11
|
-
attr_accessor :save_extensions
|
|
12
|
-
|
|
13
|
-
def set_jvm_version(ver_str)
|
|
14
|
-
case ver_str
|
|
15
|
-
when '1.4'
|
|
16
|
-
BiteScript.bytecode_version = BiteScript::JAVA1_4
|
|
17
|
-
when '1.5'
|
|
18
|
-
BiteScript.bytecode_version = BiteScript::JAVA1_5
|
|
19
|
-
when '1.6'
|
|
20
|
-
BiteScript.bytecode_version = BiteScript::JAVA1_6
|
|
21
|
-
when '1.7'
|
|
22
|
-
BiteScript.bytecode_version = BiteScript::JAVA1_7
|
|
23
|
-
else
|
|
24
|
-
$stderr.puts "invalid bytecode version specified: #{ver_str}"
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
data/lib/mirah/impl.rb
DELETED
|
@@ -1,273 +0,0 @@
|
|
|
1
|
-
module Mirah
|
|
2
|
-
class Impl
|
|
3
|
-
def initialize
|
|
4
|
-
Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
|
5
|
-
@running = false
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def running?
|
|
9
|
-
@running
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def run(*args)
|
|
13
|
-
main = nil
|
|
14
|
-
class_map = {}
|
|
15
|
-
|
|
16
|
-
# we're running!
|
|
17
|
-
@running = true
|
|
18
|
-
|
|
19
|
-
# generate all bytes for all classes
|
|
20
|
-
generate(args) do |outfile, builder|
|
|
21
|
-
bytes = builder.generate
|
|
22
|
-
name = builder.class_name.gsub(/\//, '.')
|
|
23
|
-
class_map[name] = bytes
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# load all classes
|
|
27
|
-
dcl = Mirah::ClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
|
|
28
|
-
class_map.each do |name,|
|
|
29
|
-
cls = dcl.load_class(name)
|
|
30
|
-
# TODO: using first main; find correct one
|
|
31
|
-
main ||= cls.get_method("main", java::lang::String[].java_class) #rescue nil
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# run the main method we found
|
|
35
|
-
if main
|
|
36
|
-
begin
|
|
37
|
-
main.invoke(nil, [args.to_java(:string)].to_java)
|
|
38
|
-
rescue java.lang.Exception => e
|
|
39
|
-
e = e.cause if e.cause
|
|
40
|
-
raise e
|
|
41
|
-
end
|
|
42
|
-
else
|
|
43
|
-
puts "No main found" unless @state.version_printed || @state.help_printed
|
|
44
|
-
end
|
|
45
|
-
rescue Mirah::InternalCompilerError => ice
|
|
46
|
-
Mirah.print_error(ice.message, ice.position) if ice.node
|
|
47
|
-
raise ice
|
|
48
|
-
rescue Mirah::MirahError => ex
|
|
49
|
-
Mirah.print_error(ex.message, ex.position)
|
|
50
|
-
puts ex.backtrace if @state.verbose
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def compile(*args)
|
|
54
|
-
generate(args) do |filename, builder|
|
|
55
|
-
filename = "#{@state.destination}#{filename}"
|
|
56
|
-
FileUtils.mkdir_p(File.dirname(filename))
|
|
57
|
-
bytes = builder.generate
|
|
58
|
-
File.open(filename, 'wb') {|f| f.write(bytes)}
|
|
59
|
-
end
|
|
60
|
-
rescue Mirah::InternalCompilerError => ice
|
|
61
|
-
Mirah.print_error(ice.message, ice.position) if ice.position
|
|
62
|
-
puts "error on #{ice.node}(#{ice.node.object_id})"
|
|
63
|
-
raise ice
|
|
64
|
-
rescue Mirah::MirahError => ex
|
|
65
|
-
Mirah.print_error(ex.message, ex.position)
|
|
66
|
-
puts ex.backtrace if @state.verbose
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def generate(args, &block)
|
|
70
|
-
process_flags!(args)
|
|
71
|
-
|
|
72
|
-
# collect all ASTs from all files
|
|
73
|
-
all_nodes = []
|
|
74
|
-
puts "Parsing..." unless running?
|
|
75
|
-
expand_files(args).each do |duby_file|
|
|
76
|
-
if duby_file == '-e'
|
|
77
|
-
@filename = '-e'
|
|
78
|
-
next
|
|
79
|
-
elsif @filename == '-e'
|
|
80
|
-
puts " <inline script>" unless running?
|
|
81
|
-
all_nodes << parse('-e', duby_file)
|
|
82
|
-
else
|
|
83
|
-
puts " #{duby_file}" unless running?
|
|
84
|
-
all_nodes << parse(duby_file)
|
|
85
|
-
end
|
|
86
|
-
@filename = nil
|
|
87
|
-
exit 1 if @error
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
# enter all ASTs into inference engine
|
|
91
|
-
puts "Inferring types..." unless running?
|
|
92
|
-
infer_asts(all_nodes)
|
|
93
|
-
|
|
94
|
-
# compile each AST in turn
|
|
95
|
-
puts "Compiling..." unless running?
|
|
96
|
-
all_nodes.each do |ast|
|
|
97
|
-
puts " #{ast.position.file}" unless running?
|
|
98
|
-
compile_ast(ast, &block)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
puts "Done!" unless running?
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def parse(*args)
|
|
105
|
-
process_flags!(args)
|
|
106
|
-
@filename = args.shift
|
|
107
|
-
|
|
108
|
-
if @filename
|
|
109
|
-
if @filename == '-e'
|
|
110
|
-
@filename = 'DashE'
|
|
111
|
-
src = args[0]
|
|
112
|
-
else
|
|
113
|
-
src = File.read(@filename)
|
|
114
|
-
end
|
|
115
|
-
else
|
|
116
|
-
print_help
|
|
117
|
-
exit(1)
|
|
118
|
-
end
|
|
119
|
-
begin
|
|
120
|
-
ast = Mirah::AST.parse_ruby(src, @filename)
|
|
121
|
-
# rescue org.jrubyparser.lexer.SyntaxException => ex
|
|
122
|
-
# Mirah.print_error(ex.message, ex.position)
|
|
123
|
-
# raise ex if @state.verbose
|
|
124
|
-
end
|
|
125
|
-
@transformer = Mirah::Transform::Transformer.new(@state)
|
|
126
|
-
Java::MirahImpl::Builtin.initialize_builtins(@transformer)
|
|
127
|
-
@transformer.filename = @filename
|
|
128
|
-
ast = @transformer.transform(ast, nil)
|
|
129
|
-
@transformer.errors.each do |ex|
|
|
130
|
-
Mirah.print_error(ex.message, ex.position)
|
|
131
|
-
raise ex.cause || ex if @state.verbose
|
|
132
|
-
end
|
|
133
|
-
@error = @transformer.errors.size > 0
|
|
134
|
-
|
|
135
|
-
ast
|
|
136
|
-
rescue Mirah::InternalCompilerError => ice
|
|
137
|
-
Mirah.print_error(ice.message, ice.position) if ice.node
|
|
138
|
-
raise ice
|
|
139
|
-
rescue Mirah::MirahError => ex
|
|
140
|
-
Mirah.print_error(ex.message, ex.position)
|
|
141
|
-
puts ex.backtrace if @state.verbose
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
def infer_asts(asts)
|
|
145
|
-
typer = Mirah::Typer::JVM.new(@transformer)
|
|
146
|
-
asts.each {|ast| typer.infer(ast, true) }
|
|
147
|
-
begin
|
|
148
|
-
typer.resolve(false)
|
|
149
|
-
ensure
|
|
150
|
-
puts asts.inspect if @state.verbose
|
|
151
|
-
|
|
152
|
-
failed = !typer.errors.empty?
|
|
153
|
-
if failed
|
|
154
|
-
puts "Inference Error:"
|
|
155
|
-
typer.errors.each do |ex|
|
|
156
|
-
if ex.node
|
|
157
|
-
Mirah.print_error(ex.message, ex.position)
|
|
158
|
-
else
|
|
159
|
-
puts ex.message
|
|
160
|
-
end
|
|
161
|
-
puts ex.backtrace if @state.verbose
|
|
162
|
-
end
|
|
163
|
-
exit 1
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def compile_ast(ast, &block)
|
|
169
|
-
compiler = @compiler_class.new
|
|
170
|
-
ast.compile(compiler, false)
|
|
171
|
-
compiler.generate(&block)
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
def process_flags!(args)
|
|
175
|
-
@state ||= Mirah::CompilationState.new
|
|
176
|
-
while args.length > 0 && args[0] =~ /^-/
|
|
177
|
-
case args[0]
|
|
178
|
-
when '--classpath', '-c'
|
|
179
|
-
args.shift
|
|
180
|
-
Mirah::Env.decode_paths(args.shift, $CLASSPATH)
|
|
181
|
-
when '--cd'
|
|
182
|
-
args.shift
|
|
183
|
-
Dir.chdir(args.shift)
|
|
184
|
-
when '--dest', '-d'
|
|
185
|
-
args.shift
|
|
186
|
-
@state.destination = File.join(File.expand_path(args.shift), '')
|
|
187
|
-
when '-e'
|
|
188
|
-
break
|
|
189
|
-
when '--explicit-packages'
|
|
190
|
-
args.shift
|
|
191
|
-
Mirah::AST::Script.explicit_packages = true
|
|
192
|
-
when '--help', '-h'
|
|
193
|
-
print_help
|
|
194
|
-
args.clear
|
|
195
|
-
when '--java', '-j'
|
|
196
|
-
require 'mirah/jvm/source_compiler'
|
|
197
|
-
@compiler_class = Mirah::Compiler::JavaSource
|
|
198
|
-
args.shift
|
|
199
|
-
when '--jvm'
|
|
200
|
-
args.shift
|
|
201
|
-
@state.set_jvm_version(args.shift)
|
|
202
|
-
when '-I'
|
|
203
|
-
args.shift
|
|
204
|
-
$: << args.shift
|
|
205
|
-
when '--plugin', '-p'
|
|
206
|
-
args.shift
|
|
207
|
-
plugin = args.shift
|
|
208
|
-
require "mirah/plugin/#{plugin}"
|
|
209
|
-
when '--verbose', '-V'
|
|
210
|
-
Mirah::Typer.verbose = true
|
|
211
|
-
Mirah::AST.verbose = true
|
|
212
|
-
Mirah::Compiler::JVM.verbose = true
|
|
213
|
-
@state.verbose = true
|
|
214
|
-
args.shift
|
|
215
|
-
when '--version', '-v'
|
|
216
|
-
args.shift
|
|
217
|
-
print_version
|
|
218
|
-
when '--no-save-extensions'
|
|
219
|
-
args.shift
|
|
220
|
-
@state.save_extensions = false
|
|
221
|
-
else
|
|
222
|
-
puts "unrecognized flag: " + args[0]
|
|
223
|
-
print_help
|
|
224
|
-
args.clear
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
@state.destination ||= File.join(File.expand_path('.'), '')
|
|
228
|
-
@compiler_class ||= Mirah::Compiler::JVM
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def print_help
|
|
232
|
-
puts "#{$0} [flags] <files or -e SCRIPT>
|
|
233
|
-
-c, --classpath PATH\tAdd PATH to the Java classpath for compilation
|
|
234
|
-
--cd DIR\t\tSwitch to the specified DIR befor compilation
|
|
235
|
-
-d, --dir DIR\t\tUse DIR as the base dir for compilation, packages
|
|
236
|
-
-e CODE\t\tCompile or run the inline script following -e
|
|
237
|
-
\t\t\t (the class will be named \"DashE\")
|
|
238
|
-
--explicit-packages\tRequire explicit 'package' lines in source
|
|
239
|
-
-h, --help\t\tPrint this help message
|
|
240
|
-
-I DIR\t\tAdd DIR to the Ruby load path before running
|
|
241
|
-
-j, --java\t\tOutput .java source (compile mode only)
|
|
242
|
-
--jvm VERSION\t\tEmit JVM bytecode targeting specified JVM
|
|
243
|
-
\t\t\t version (1.4, 1.5, 1.6, 1.7)
|
|
244
|
-
-p, --plugin PLUGIN\trequire 'mirah/plugin/PLUGIN' before running
|
|
245
|
-
-v, --version\t\tPrint the version of Mirah to the console
|
|
246
|
-
-V, --verbose\t\tVerbose logging"
|
|
247
|
-
@state.help_printed = true
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def print_version
|
|
251
|
-
puts "Mirah v#{Mirah::VERSION}"
|
|
252
|
-
@state.version_printed = true
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
def expand_files(files)
|
|
256
|
-
expanded = []
|
|
257
|
-
files.each do |filename|
|
|
258
|
-
if File.directory?(filename)
|
|
259
|
-
Dir[File.join(filename, '*')].each do |child|
|
|
260
|
-
if File.directory?(child)
|
|
261
|
-
files << child
|
|
262
|
-
elsif child =~ /\.(duby|mirah)$/
|
|
263
|
-
expanded << child
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
else
|
|
267
|
-
expanded << filename
|
|
268
|
-
end
|
|
269
|
-
end
|
|
270
|
-
expanded
|
|
271
|
-
end
|
|
272
|
-
end
|
|
273
|
-
end
|