mirah 0.0.7-java → 0.0.8-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. data/History.txt +181 -0
  2. data/README.txt +6 -10
  3. data/Rakefile +86 -9
  4. data/bin/mirah +2 -0
  5. data/bin/mirahc +2 -0
  6. data/bin/mirahp +2 -0
  7. data/{bin/dubyp → examples/interfaces.mirah} +16 -9
  8. data/examples/macros/square.mirah +12 -0
  9. data/examples/macros/square_int.mirah +12 -0
  10. data/examples/macros/string-each-char.mirah +14 -0
  11. data/examples/maven/README.txt +2 -0
  12. data/examples/maven/pom.xml +23 -0
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +9 -0
  14. data/examples/rosettacode/100-doors.mirah +44 -0
  15. data/examples/rosettacode/99-bottles-of-beer.mirah +13 -0
  16. data/examples/rosettacode/README.txt +9 -0
  17. data/examples/rosettacode/boolean-values.mirah +29 -0
  18. data/examples/rosettacode/comments.mirah +2 -0
  19. data/examples/rosettacode/copy-a-string.mirah +10 -0
  20. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +40 -0
  21. data/examples/rosettacode/create-a-file.mirah +6 -0
  22. data/examples/rosettacode/empty-string.mirah +9 -0
  23. data/examples/rosettacode/factorial.mirah +10 -0
  24. data/examples/rosettacode/fibonacci.mirah +21 -0
  25. data/examples/rosettacode/file-size.mirah +5 -0
  26. data/examples/rosettacode/fizz-buzz.mirah +21 -0
  27. data/examples/rosettacode/flatten-a-list.mirah +24 -0
  28. data/examples/rosettacode/guess-the-number.mirah +21 -0
  29. data/examples/rosettacode/is-string-numeric.mirah +127 -0
  30. data/examples/rosettacode/palindrome.mirah +14 -0
  31. data/examples/rosettacode/repeat-a-string.mirah +9 -0
  32. data/examples/rosettacode/reverse-a-string.mirah +6 -0
  33. data/examples/rosettacode/rot-13.mirah +20 -0
  34. data/examples/rosettacode/user-input.mirah +4 -0
  35. data/examples/sort_closure.mirah +1 -1
  36. data/javalib/dynalink-0.2.jar +0 -0
  37. data/javalib/mirah-bootstrap.jar +0 -0
  38. data/lib/mirah.rb +7 -16
  39. data/lib/mirah/ast.rb +22 -92
  40. data/lib/mirah/ast/call.rb +41 -9
  41. data/lib/mirah/ast/class.rb +34 -6
  42. data/lib/mirah/ast/flow.rb +17 -5
  43. data/lib/mirah/ast/intrinsics.rb +50 -8
  44. data/lib/mirah/ast/literal.rb +7 -0
  45. data/lib/mirah/ast/local.rb +9 -1
  46. data/lib/mirah/ast/method.rb +21 -8
  47. data/lib/mirah/ast/scope.rb +1 -1
  48. data/lib/mirah/ast/structure.rb +81 -15
  49. data/lib/mirah/ast/type.rb +4 -0
  50. data/{bin/dubyc → lib/mirah/commands.rb} +4 -11
  51. data/lib/mirah/commands/base.rb +54 -0
  52. data/lib/mirah/commands/compile.rb +39 -0
  53. data/{examples/wiki/Rakefile → lib/mirah/commands/parse.rb} +18 -17
  54. data/lib/mirah/commands/run.rb +73 -0
  55. data/lib/mirah/compiler.rb +37 -417
  56. data/lib/mirah/compiler/call.rb +45 -0
  57. data/lib/mirah/compiler/class.rb +81 -0
  58. data/lib/mirah/compiler/flow.rb +109 -0
  59. data/lib/mirah/compiler/literal.rb +130 -0
  60. data/lib/mirah/compiler/local.rb +59 -0
  61. data/lib/mirah/compiler/method.rb +44 -0
  62. data/lib/mirah/compiler/structure.rb +65 -0
  63. data/lib/mirah/compiler/type.rb +27 -0
  64. data/lib/mirah/env.rb +4 -6
  65. data/lib/mirah/generator.rb +61 -0
  66. data/lib/mirah/jvm/compiler.rb +8 -867
  67. data/lib/mirah/jvm/compiler/base.rb +270 -0
  68. data/lib/mirah/jvm/compiler/java_source.rb +779 -0
  69. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +851 -0
  70. data/lib/mirah/jvm/method_lookup.rb +21 -2
  71. data/lib/mirah/jvm/source_generator/builder.rb +10 -13
  72. data/lib/mirah/jvm/source_generator/loops.rb +99 -93
  73. data/lib/mirah/jvm/source_generator/precompile.rb +3 -2
  74. data/lib/mirah/jvm/typer.rb +3 -3
  75. data/lib/mirah/jvm/types.rb +10 -426
  76. data/lib/mirah/jvm/types/array_type.rb +62 -0
  77. data/lib/mirah/jvm/types/basic_types.rb +1 -0
  78. data/lib/mirah/jvm/types/dynamic_type.rb +46 -0
  79. data/lib/mirah/jvm/types/factory.rb +23 -5
  80. data/lib/mirah/jvm/types/interface_definition.rb +20 -0
  81. data/lib/mirah/jvm/types/intrinsics.rb +15 -3
  82. data/lib/mirah/jvm/types/meta_type.rb +45 -0
  83. data/lib/mirah/jvm/types/methods.rb +12 -5
  84. data/lib/mirah/jvm/types/null_type.rb +27 -0
  85. data/lib/mirah/jvm/types/primitive_type.rb +38 -0
  86. data/lib/mirah/jvm/types/source_mirror.rb +266 -0
  87. data/lib/mirah/jvm/types/type.rb +173 -0
  88. data/lib/mirah/jvm/types/type_definition.rb +55 -0
  89. data/lib/mirah/jvm/types/unreachable_type.rb +27 -0
  90. data/lib/mirah/jvm/types/void_type.rb +19 -0
  91. data/lib/mirah/parser.rb +90 -0
  92. data/lib/mirah/plugin/gwt.rb +5 -5
  93. data/lib/mirah/plugin/java.rb +1 -1
  94. data/lib/mirah/transform.rb +4 -321
  95. data/lib/mirah/transform/ast_ext.rb +63 -0
  96. data/lib/mirah/transform/error.rb +13 -0
  97. data/lib/mirah/transform/helper.rb +761 -0
  98. data/lib/mirah/transform/transformer.rb +255 -0
  99. data/lib/mirah/typer.rb +2 -383
  100. data/{bin/duby → lib/mirah/typer/base.rb} +12 -10
  101. data/lib/mirah/typer/simple.rb +377 -0
  102. data/lib/mirah/util/argument_processor.rb +114 -0
  103. data/lib/mirah/util/class_loader.rb +37 -0
  104. data/lib/mirah/util/compilation_state.rb +51 -0
  105. data/lib/mirah/util/process_errors.rb +33 -0
  106. data/lib/mirah/version.rb +1 -1
  107. data/lib/mirah_task.rb +3 -2
  108. data/test/{test_ast.rb → core/test_ast.rb} +6 -0
  109. data/test/{test_compilation.rb → core/test_compilation.rb} +0 -0
  110. data/test/{test_env.rb → core/test_env.rb} +24 -25
  111. data/test/{test_macros.rb → core/test_macros.rb} +2 -4
  112. data/test/{test_typer.rb → core/test_typer.rb} +0 -3
  113. data/test/jvm/bytecode_test_helper.rb +181 -0
  114. data/test/{test_javac_compiler.rb → jvm/javac_test_helper.rb} +38 -22
  115. data/test/jvm/test_enumerable.rb +304 -0
  116. data/test/{test_java_typer.rb → jvm/test_java_typer.rb} +2 -4
  117. data/test/{test_jvm_compiler.rb → jvm/test_jvm_compiler.rb} +146 -443
  118. data/test/jvm/test_macros.rb +147 -0
  119. data/test/jvm/test_main_method.rb +15 -0
  120. data/test/{test_gwt.rb → plugins/test_gwt.rb} +0 -2
  121. metadata +103 -91
  122. data/bin/jrubyp +0 -52
  123. data/examples/wiki/src/org/mirah/wiki/MirahWiki.duby +0 -339
  124. data/examples/wiki/src/org/mirah/wiki/edit.eduby.html +0 -42
  125. data/examples/wiki/src/org/mirah/wiki/error.eduby.html +0 -2
  126. data/examples/wiki/src/org/mirah/wiki/layout.eduby.html +0 -69
  127. data/examples/wiki/src/org/mirah/wiki/parser.eduby.html +0 -7
  128. data/examples/wiki/src/org/mirah/wiki/view.eduby.html +0 -15
  129. data/examples/wiki/war/WEB-INF/classes/test/HeredocContext.class +0 -0
  130. data/examples/wiki/war/WEB-INF/classes/test/MirahParser.class +0 -0
  131. data/examples/wiki/war/WEB-INF/lib/appengine-api.jar +0 -0
  132. data/examples/wiki/war/WEB-INF/lib/dubydatastore.jar +0 -0
  133. data/examples/wiki/war/WEB-INF/lib/jmeta-runtime.jar +0 -0
  134. data/examples/wiki/war/WEB-INF/lib/pegdown-stubs.jar +0 -0
  135. data/examples/wiki/war/WEB-INF/pegdown.jar +0 -0
  136. data/examples/wiki/war/app.yaml +0 -21
  137. data/examples/wiki/war/public/favicon.ico +0 -0
  138. data/examples/wiki/war/public/images/appengine_duby.png +0 -0
  139. data/examples/wiki/war/public/images/back.gif +0 -0
  140. data/examples/wiki/war/public/images/dir.gif +0 -0
  141. data/examples/wiki/war/public/images/file.gif +0 -0
  142. data/examples/wiki/war/public/javascripts/prettify.js +0 -61
  143. data/examples/wiki/war/public/robots.txt +0 -0
  144. data/examples/wiki/war/public/stylesheets/main.css +0 -156
  145. data/examples/wiki/war/public/stylesheets/prettify.css +0 -1
  146. data/examples/wiki/war/public/stylesheets/sh_style.css +0 -66
  147. data/examples/wiki/war/public/stylesheets/source.css +0 -21
  148. data/examples/wiki/war/public/wmd/images/bg-fill.png +0 -0
  149. data/examples/wiki/war/public/wmd/images/bg.png +0 -0
  150. data/examples/wiki/war/public/wmd/images/blockquote.png +0 -0
  151. data/examples/wiki/war/public/wmd/images/bold.png +0 -0
  152. data/examples/wiki/war/public/wmd/images/code.png +0 -0
  153. data/examples/wiki/war/public/wmd/images/h1.png +0 -0
  154. data/examples/wiki/war/public/wmd/images/hr.png +0 -0
  155. data/examples/wiki/war/public/wmd/images/img.png +0 -0
  156. data/examples/wiki/war/public/wmd/images/italic.png +0 -0
  157. data/examples/wiki/war/public/wmd/images/link.png +0 -0
  158. data/examples/wiki/war/public/wmd/images/ol.png +0 -0
  159. data/examples/wiki/war/public/wmd/images/redo.png +0 -0
  160. data/examples/wiki/war/public/wmd/images/separator.png +0 -0
  161. data/examples/wiki/war/public/wmd/images/ul.png +0 -0
  162. data/examples/wiki/war/public/wmd/images/undo.png +0 -0
  163. data/examples/wiki/war/public/wmd/images/wmd-on.png +0 -0
  164. data/examples/wiki/war/public/wmd/images/wmd.png +0 -0
  165. data/examples/wiki/war/public/wmd/showdown.js +0 -421
  166. data/examples/wiki/war/public/wmd/wmd-base.js +0 -1799
  167. data/examples/wiki/war/public/wmd/wmd-plus.js +0 -311
  168. data/examples/wiki/war/public/wmd/wmd.js +0 -73
  169. data/examples/wiki/war/src/org/mirah/wiki/MirahWiki.duby +0 -339
  170. data/examples/wiki/war/src/org/mirah/wiki/edit.eduby.html +0 -42
  171. data/examples/wiki/war/src/org/mirah/wiki/error.eduby.html +0 -2
  172. data/examples/wiki/war/src/org/mirah/wiki/layout.eduby.html +0 -69
  173. data/examples/wiki/war/src/org/mirah/wiki/parser.eduby.html +0 -7
  174. data/examples/wiki/war/src/org/mirah/wiki/view.eduby.html +0 -15
  175. data/javalib/dynalink-0.1.jar +0 -0
  176. data/javalib/jsr292-mock.jar +0 -0
  177. data/lib/mirah/class_loader.rb +0 -35
  178. data/lib/mirah/compilation_state.rb +0 -28
  179. data/lib/mirah/impl.rb +0 -273
  180. data/lib/mirah/jvm/base.rb +0 -267
  181. data/lib/mirah/jvm/source_compiler.rb +0 -760
  182. data/lib/mirah/transform2.rb +0 -752
@@ -0,0 +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
+
16
+ require 'mirah/generator'
17
+ require 'fileutils'
18
+
19
+ module Mirah
20
+ module Commands
21
+ class Compile < Base
22
+ def execute
23
+ execute_base do
24
+ generator = Mirah::Generator.new(@state, @state.compiler_class, true, @state.verbose)
25
+
26
+ generator.generate(@state.args).each do |result|
27
+ filename = "#{@state.destination}#{result.filename}"
28
+ FileUtils.mkdir_p(File.dirname(filename))
29
+ File.open(filename, 'wb') {|f| f.write(result.bytes)}
30
+ end
31
+ end
32
+ end
33
+
34
+ def command_name
35
+ :compile
36
+ end
37
+ end
38
+ end
39
+ end
@@ -13,21 +13,22 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- # Hack to use the latest version instead of the gems when developing Mirah
17
- if File.exist?('../../lib/mirah.rb')
18
- $: << File.expand_path('../../lib')
19
- end
20
- if File.exist?('../../../bitescript/lib/bitescript.rb')
21
- $: << File.expand_path('../../../bitescript/lib/')
22
- end
23
- require 'mirah/appengine_tasks'
16
+ require 'mirah/parser'
24
17
 
25
- appengine_app :app
26
-
27
- DUBY_APP = "#{Mirah.dest_path}/org/mirah/wiki/MirahWiki.class"
28
- Templates = Dir.glob("#{Mirah.source_path}/org/mirah/wiki/*.eduby.html")
29
-
30
- Rake::Task[DUBY_APP].enhance(Templates)
31
-
32
- task :app => DUBY_APP
33
- task :default => :server
18
+ module Mirah
19
+ module Commands
20
+ class Parse < Base
21
+ def execute
22
+ execute_base do
23
+ parser = Mirah::Parser.new(@state, false)
24
+
25
+ parser.parse_from_args(args)
26
+ end
27
+ end
28
+
29
+ def command_name
30
+ :parse
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,73 @@
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/generator'
17
+ require 'mirah/util/class_loader'
18
+
19
+ module Mirah
20
+ module Commands
21
+ class Run < Base
22
+ def execute
23
+ execute_base do
24
+ main = nil
25
+ class_map = {}
26
+
27
+ # generate all bytes for all classes
28
+ generator = Mirah::Generator.new(@state, @state.compiler_class, false, @state.verbose)
29
+
30
+ generator.generate(args).each do |result|
31
+ class_map[result.classname.gsub(/\//, '.')] = result.bytes
32
+ end
33
+
34
+ # load all classes
35
+ main = load_classes_and_find_main(class_map)
36
+
37
+ # run the main method we found
38
+ run_main(main)
39
+ end
40
+ end
41
+
42
+ def command_name
43
+ :run
44
+ end
45
+
46
+ private
47
+
48
+ def load_classes_and_find_main(class_map)
49
+ main = nil
50
+ dcl = Mirah::Util::ClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
51
+ class_map.each do |name,|
52
+ cls = dcl.load_class(name)
53
+ # TODO: using first main; find correct one?
54
+ main ||= cls.get_method("main", java::lang::String[].java_class)
55
+ end
56
+ main
57
+ end
58
+
59
+ def run_main(main)
60
+ if main
61
+ begin
62
+ main.invoke(nil, [args.to_java(:string)].to_java)
63
+ rescue java.lang.Exception => e
64
+ e = e.cause if e.cause
65
+ raise e
66
+ end
67
+ else
68
+ puts "No main found" unless @state.version_printed || @state.help_printed
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -13,430 +13,50 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- require 'mirah'
16
+ require 'mirah/compiler/call'
17
+ require 'mirah/compiler/class'
18
+ require 'mirah/compiler/flow'
19
+ require 'mirah/compiler/literal'
20
+ require 'mirah/compiler/local'
21
+ require 'mirah/compiler/method'
22
+ require 'mirah/compiler/structure'
23
+ require 'mirah/compiler/type'
17
24
 
18
25
  module Mirah
19
- module AST
20
- class Fixnum
21
- def compile(compiler, expression)
22
- if expression
23
- compiler.line(line_number)
24
- compiler.fixnum(inferred_type, literal)
25
- end
26
- rescue Exception => ex
27
- raise Mirah::InternalCompilerError.wrap(ex, self)
28
- end
29
- end
30
-
31
- class Regexp
32
- def compile(compiler, expression)
33
- if expression
34
- compiler.line(line_number)
35
- compiler.regexp(literal)
36
- end
37
- rescue Exception => ex
38
- raise Mirah::InternalCompilerError.wrap(ex, self)
39
- end
40
- end
41
-
42
- class String
43
- def compile(compiler, expression)
44
- if expression
45
- compiler.line(line_number)
46
- compiler.string(literal)
47
- end
48
- rescue Exception => ex
49
- raise Mirah::InternalCompilerError.wrap(ex, self)
50
- end
51
- end
52
-
53
- class StringConcat
54
- def compile(compiler, expression)
55
- compiler.build_string(children, expression)
56
- rescue Exception => ex
57
- raise Mirah::InternalCompilerError.wrap(ex, self)
58
- end
59
- end
60
-
61
- class ToString
62
- def compile(compiler, expression)
63
- compiler.to_string(body, expression)
64
- rescue Exception => ex
65
- raise Mirah::InternalCompilerError.wrap(ex, self)
66
- end
67
- end
68
-
69
- class Float
70
- def compile(compiler, expression)
71
- if expression
72
- compiler.line(line_number)
73
- compiler.float(inferred_type, literal)
74
- end
75
- rescue Exception => ex
76
- raise Mirah::InternalCompilerError.wrap(ex, self)
77
- end
78
- end
79
-
80
- class Boolean
81
- def compile(compiler, expression)
82
- if expression
83
- compiler.line(line_number)
84
- compiler.boolean(literal)
85
- end
86
- rescue Exception => ex
87
- raise Mirah::InternalCompilerError.wrap(ex, self)
88
- end
89
- end
90
-
91
- class Array
92
- def compile(compiler, expression)
93
- compiler.array(self, expression)
94
- rescue Exception => ex
95
- raise Mirah::InternalCompilerError.wrap(ex, self)
96
- end
97
- end
98
-
99
- class Body
100
- def compile(compiler, expression)
101
- compiler.line(line_number)
102
- compiler.body(self, expression)
103
- rescue Exception => ex
104
- raise Mirah::InternalCompilerError.wrap(ex, self)
105
- end
106
- end
107
-
108
- class ScopedBody
109
- def compile(compiler, expression)
110
- compiler.line(line_number)
111
- compiler.scoped_body(self, expression)
112
- rescue Exception => ex
113
- raise Mirah::InternalCompilerError.wrap(ex, self)
114
- end
115
- end
116
-
117
- class Import
118
- def compile(compiler, expression)
119
- # TODO: what does it mean for import to be an expression?
120
- compiler.import(short, long)
121
- rescue Exception => ex
122
- raise Mirah::InternalCompilerError.wrap(ex, self)
123
- end
124
- end
125
-
126
- class Constant
127
- def compile(compiler, expression)
128
- if expression
129
- compiler.line(line_number)
130
- compiler.constant(self)
131
- end
132
- rescue Exception => ex
133
- raise Mirah::InternalCompilerError.wrap(ex, self)
134
- end
135
- end
136
-
137
- class Print
138
- def compile(compiler, expression)
139
- # TODO: what does it mean for printline to be an expression?
140
- compiler.line(line_number)
141
- compiler.print(self)
142
- rescue Exception => ex
143
- raise Mirah::InternalCompilerError.wrap(ex, self)
144
- end
145
- end
146
-
147
- class Local
148
- def compile(compiler, expression)
149
- if expression
150
- compiler.line(line_number)
151
- if captured? && scope.has_binding?
152
- compiler.captured_local(containing_scope, name, inferred_type)
153
- else
154
- compiler.local(containing_scope, name, inferred_type)
26
+ module Compiler
27
+ class ASTCompiler
28
+ def initialize(compiler_class, logging)
29
+ @compiler_class = compiler_class
30
+ @logging = logging
31
+ end
32
+
33
+ attr_accessor :compiler_class, :logging
34
+
35
+ def compile_asts(nodes)
36
+ results = []
37
+ puts "Compiling..." if logging
38
+ nodes.each do |ast|
39
+ puts " #{ast.position.file}" if logging
40
+ compile_ast(ast) do |filename, builder|
41
+ results << CompilerResult.new(filename, builder.class_name, builder.generate)
155
42
  end
156
43
  end
157
- rescue Exception => ex
158
- raise Mirah::InternalCompilerError.wrap(ex, self)
159
- end
160
- end
161
-
162
- class LocalDeclaration
163
- def compile(compiler, expression)
164
- compiler.line(line_number)
165
- if captured? && scope.has_binding?
166
- compiler.captured_local_declare(containing_scope, name, type)
167
- else
168
- compiler.local_declare(containing_scope, name, type)
169
- end
170
- rescue Exception => ex
171
- raise Mirah::InternalCompilerError.wrap(ex, self)
172
- end
173
- end
174
-
175
- class LocalAssignment
176
- def compile(compiler, expression)
177
- compiler.line(line_number)
178
- if captured? && scope.has_binding?
179
- compiler.captured_local_assign(self, expression)
180
- else
181
- compiler.local_assign(containing_scope, name, inferred_type, expression, value)
182
- end
183
- rescue Exception => ex
184
- raise Mirah::InternalCompilerError.wrap(ex, self)
185
- end
186
- end
187
-
188
- class Script
189
- def compile(compiler, expression)
190
- # TODO: what does it mean for a script to be an expression? possible?
191
- compiler.define_main(self)
192
- rescue Exception => ex
193
- raise Mirah::InternalCompilerError.wrap(ex, self)
194
- end
195
- end
196
-
197
- class MethodDefinition
198
- def compile(compiler, expression)
199
- # TODO: what does it mean for a method to be an expression?
200
- compiler.define_method(self)
201
- rescue Exception => ex
202
- raise Mirah::InternalCompilerError.wrap(ex, self)
203
- end
204
- end
205
-
206
- class ConstructorDefinition
207
- def compile(compiler, expression)
208
- compiler.constructor(self)
209
- rescue Exception => ex
210
- raise Mirah::InternalCompilerError.wrap(ex, self)
211
- end
212
- end
213
-
214
- class Arguments
215
- def compile(compiler, expression)
216
- # TODO: what does it mean for a method to be an expression?
217
- args.each {|arg| compiler.declare_argument(arg.name, arg.inferred_type)} if args
218
- rescue Exception => ex
219
- raise Mirah::InternalCompilerError.wrap(ex, self)
220
- end
221
- end
222
-
223
- class Noop
224
- def compile(compiler, expression)
225
- # TODO: what does it mean for a noop to be an expression
226
- # nothing
227
- rescue Exception => ex
228
- raise Mirah::InternalCompilerError.wrap(ex, self)
229
- end
230
- end
231
-
232
- class If
233
- def compile(compiler, expression)
234
- compiler.line(line_number)
235
- compiler.branch(self, expression)
236
- rescue Exception => ex
237
- raise Mirah::InternalCompilerError.wrap(ex, self)
238
- end
239
- end
240
-
241
- class Condition
242
- def compile(compiler, expression)
243
- # TODO: can a condition ever be an expression? I don't think it can...
244
- compiler.line(line_number)
245
- predicate.compile(compiler, expression)
246
- rescue Exception => ex
247
- raise Mirah::InternalCompilerError.wrap(ex, self)
248
- end
249
- end
250
-
251
- class FunctionalCall
252
- def compile(compiler, expression)
253
- compiler.line(line_number)
254
- compiler.self_call(self, expression)
255
- rescue Exception => ex
256
- raise Mirah::InternalCompilerError.wrap(ex, self)
257
- end
258
- end
259
-
260
- class Call
261
- def compile(compiler, expression)
262
- compiler.line(line_number)
263
- compiler.call(self, expression)
264
- rescue Exception => ex
265
- raise Mirah::InternalCompilerError.wrap(ex, self)
266
- end
267
- end
268
-
269
- class Super
270
- def compile(compiler, expression)
271
- compiler.line(line_number)
272
- compiler.super_call(self, expression)
273
- rescue Exception => ex
274
- raise Mirah::InternalCompilerError.wrap(ex, self)
275
- end
276
- end
277
-
278
- class Loop
279
- def compile(compiler, expression)
280
- compiler.line(line_number)
281
- compiler.loop(self, expression)
282
- rescue Exception => ex
283
- raise Mirah::InternalCompilerError.wrap(ex, self)
284
- end
285
- end
286
-
287
- class ClassDefinition
288
- def compile(compiler, expression)
289
- compiler.define_class(self, expression)
290
- rescue Exception => ex
291
- raise Mirah::InternalCompilerError.wrap(ex, self)
292
- end
293
- end
294
-
295
- class ClosureDefinition
296
- def compile(compiler, expression)
297
- compiler.define_closure(self, expression)
298
- rescue Exception => ex
299
- raise Mirah::InternalCompilerError.wrap(ex, self)
300
- end
301
- end
302
-
303
- class FieldDeclaration
304
- def compile(compiler, expression)
305
- compiler.field_declare(name, inferred_type, annotations, static)
306
- rescue Exception => ex
307
- raise Mirah::InternalCompilerError.wrap(ex, self)
308
- end
309
- end
310
-
311
- class FieldAssignment
312
- def compile(compiler, expression)
313
- compiler.line(line_number)
314
- compiler.field_assign(name, inferred_type, expression, value, annotations, static)
315
- rescue Exception => ex
316
- raise Mirah::InternalCompilerError.wrap(ex, self)
317
- end
318
- end
319
-
320
- class Field
321
- def compile(compiler, expression)
322
- compiler.line(line_number)
323
- if expression
324
- compiler.field(name, inferred_type, annotations, static)
325
- end
326
- rescue Exception => ex
327
- raise Mirah::InternalCompilerError.wrap(ex, self)
44
+ results
328
45
  end
329
- end
330
-
331
- class AccessLevel
332
- def compile(compiler, expression); end
333
- end
334
-
335
- class Return
336
- def compile(compiler, expression)
337
- compiler.line(line_number)
338
- compiler.return(self)
339
- rescue Exception => ex
340
- raise Mirah::InternalCompilerError.wrap(ex, self)
341
- end
342
- end
343
-
344
- class EmptyArray
345
- def compile(compiler, expression)
346
- if expression
347
- compiler.line(line_number)
348
- compiler.empty_array(component_type, size)
349
- end
350
- rescue Exception => ex
351
- raise Mirah::InternalCompilerError.wrap(ex, self)
352
- end
353
- end
354
-
355
- class Null
356
- def compile(compiler, expression)
357
- if expression
358
- compiler.line(line_number)
359
- compiler.null
360
- end
361
- rescue Exception => ex
362
- raise Mirah::InternalCompilerError.wrap(ex, self)
363
- end
364
- end
365
-
366
- class Break
367
- def compile(compiler, expression)
368
- compiler.line(line_number)
369
- compiler.break(self)
370
- rescue Exception => ex
371
- raise Mirah::InternalCompilerError.wrap(ex, self)
372
- end
373
- end
374
-
375
- class Next
376
- def compile(compiler, expression)
377
- compiler.line(line_number)
378
- compiler.next(self)
379
- rescue Exception => ex
380
- raise Mirah::InternalCompilerError.wrap(ex, self)
381
- end
382
- end
383
-
384
- class Redo
385
- def compile(compiler, expression)
386
- compiler.line(line_number)
387
- compiler.redo(self)
388
- rescue Exception => ex
389
- raise Mirah::InternalCompilerError.wrap(ex, self)
390
- end
391
- end
392
-
393
- class Raise
394
- def compile(compiler, expression)
395
- compiler.line(line_number)
396
- compiler._raise(exception)
397
- rescue Exception => ex
398
- raise Mirah::InternalCompilerError.wrap(ex, self)
46
+
47
+ def compile_ast(ast, &block)
48
+ compiler = compiler_class.new
49
+ ast.compile(compiler, false)
50
+ compiler.generate(&block)
399
51
  end
400
52
  end
401
-
402
- class Rescue
403
- def compile(compiler, expression)
404
- compiler.line(line_number)
405
- compiler.rescue(self, expression)
406
- rescue Exception => ex
407
- raise Mirah::InternalCompilerError.wrap(ex, self)
408
- end
409
- end
410
-
411
- class Ensure
412
- def compile(compiler, expression)
413
- compiler.line(line_number)
414
- compiler.ensure(self, expression)
415
- rescue Exception => ex
416
- raise Mirah::InternalCompilerError.wrap(ex, self)
417
- end
418
- end
419
-
420
- class Self
421
- def compile(compiler, expression)
422
- if expression
423
- compiler.line(line_number)
424
- compiler.compile_self
425
- end
426
- rescue Exception => ex
427
- raise Mirah::InternalCompilerError.wrap(ex, self)
428
- end
429
- end
430
-
431
- class BindingReference
432
- def compile(compiler, expression)
433
- if expression
434
- compiler.line(line_number)
435
- compiler.binding_reference
436
- end
437
- rescue Exception => ex
438
- raise Mirah::InternalCompilerError.wrap(ex, self)
53
+
54
+ class CompilerResult
55
+ def initialize(filename, classname, bytes)
56
+ @filename, @classname, @bytes = filename, classname, bytes
439
57
  end
58
+
59
+ attr_accessor :filename, :classname, :bytes
440
60
  end
441
61
  end
442
- end
62
+ end