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/ast/scope.rb
CHANGED
|
@@ -15,50 +15,19 @@
|
|
|
15
15
|
|
|
16
16
|
module Mirah
|
|
17
17
|
module AST
|
|
18
|
-
module Scoped
|
|
19
|
-
def scope
|
|
20
|
-
@scope ||= begin
|
|
21
|
-
scope = parent
|
|
22
|
-
until scope.nil? || scope.class.include?(Scope)
|
|
23
|
-
scope = scope.parent
|
|
24
|
-
end
|
|
25
|
-
scope
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def containing_scope
|
|
30
|
-
scope = self.scope.static_scope
|
|
31
|
-
while !scope.shadowed?(name) && scope.parent && scope.parent.include?(name)
|
|
32
|
-
scope = scope.parent
|
|
33
|
-
end
|
|
34
|
-
scope
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
module Scope
|
|
39
|
-
include Scoped
|
|
40
|
-
attr_writer :static_scope, :type_scope
|
|
41
|
-
def static_scope
|
|
42
|
-
@static_scope ||= StaticScope.new(self)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
module ClassScoped
|
|
47
|
-
def class_scope
|
|
48
|
-
@class_scope ||= begin
|
|
49
|
-
scope = parent
|
|
50
|
-
scope = scope.parent until scope.nil? || ClassDefinition === scope
|
|
51
|
-
scope
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
18
|
class StaticScope
|
|
57
19
|
java_import 'java.util.LinkedHashMap'
|
|
20
|
+
java_import 'org.mirah.typer.Scope'
|
|
21
|
+
java_import 'org.mirah.typer.AssignableTypeFuture'
|
|
22
|
+
java_import 'org.mirah.typer.BaseTypeFuture'
|
|
23
|
+
java_import 'org.mirah.typer.LocalFuture'
|
|
24
|
+
java_import 'org.mirah.typer.ErrorType'
|
|
25
|
+
include Scope
|
|
26
|
+
|
|
58
27
|
attr_reader :parent
|
|
59
|
-
attr_writer :self_type, :self_node
|
|
28
|
+
attr_writer :self_type, :self_node
|
|
60
29
|
|
|
61
|
-
def initialize(node, parent=nil)
|
|
30
|
+
def initialize(node, scoper, parent=nil)
|
|
62
31
|
@scope_node = node
|
|
63
32
|
@vars = {}
|
|
64
33
|
@var_types = {}
|
|
@@ -67,8 +36,41 @@ module Mirah
|
|
|
67
36
|
@imports = {}
|
|
68
37
|
@search_packages = []
|
|
69
38
|
@shadowed = {}
|
|
39
|
+
@scoper = scoper
|
|
40
|
+
@temps = Hash.new {|h,k| h[k] = -1}
|
|
41
|
+
@package_block = nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def context
|
|
45
|
+
@scope_node
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def to_s
|
|
49
|
+
"#<StaticScope node=#{@scope_node.inspect}>"
|
|
70
50
|
end
|
|
71
51
|
|
|
52
|
+
def inspect
|
|
53
|
+
result = "#<StaticScope\n node=#{@scope_node.inspect}\n "
|
|
54
|
+
result << "parent=#{@parent}\n " if @parent
|
|
55
|
+
result << "vars=#{locals.inspect}\n " if @vars.size > 0
|
|
56
|
+
result << "shadowed=#{@shadowed.keys.inspect}\n " if @shadowed.size > 0
|
|
57
|
+
result << "temps=#{@temps.keys.inspect}\n " if @temps.size > 0
|
|
58
|
+
result << "package=#{@package}\n " if @package
|
|
59
|
+
result << "imports=#{@imports.inspect}\n " if @imports.size > 0
|
|
60
|
+
result << "search=#{@search_packages.inspect}\n " if @search_packages.size > 0
|
|
61
|
+
result << "self=#{@self_node.inspect}\n " if @self_node
|
|
62
|
+
if @self_type
|
|
63
|
+
result << "self_type=#{@self_type}"
|
|
64
|
+
if @self_type.isResolved
|
|
65
|
+
result << " (#{@self_type.resolve.full_name})"
|
|
66
|
+
end
|
|
67
|
+
result << "\n "
|
|
68
|
+
end
|
|
69
|
+
result << ">"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def toString; inspect; end
|
|
73
|
+
|
|
72
74
|
def <<(name)
|
|
73
75
|
@vars[name] = true
|
|
74
76
|
end
|
|
@@ -85,22 +87,19 @@ module Mirah
|
|
|
85
87
|
@vars.keys
|
|
86
88
|
end
|
|
87
89
|
|
|
88
|
-
def
|
|
89
|
-
@
|
|
90
|
+
def temp(name="tmp")
|
|
91
|
+
"$#{name}$#{@temps[name] += 1}"
|
|
90
92
|
end
|
|
91
93
|
|
|
92
|
-
def
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
"variable of type #{existing_type.full_name}")
|
|
94
|
+
def local_type(name, position=nil)
|
|
95
|
+
@var_types[name] ||= begin
|
|
96
|
+
type = LocalFuture.new(name, position)
|
|
97
|
+
type.onUpdate {|_, resolved| self << name unless resolved.isError}
|
|
98
|
+
if parent && !shadowed?(name)
|
|
99
|
+
# TODO what if a var of the same name is later declared in the parent scope?
|
|
100
|
+
type.parent_set(parent.local_type(name, position))
|
|
100
101
|
end
|
|
101
|
-
|
|
102
|
-
elsif type
|
|
103
|
-
@var_types[name] = type
|
|
102
|
+
type
|
|
104
103
|
end
|
|
105
104
|
end
|
|
106
105
|
|
|
@@ -138,8 +137,9 @@ module Mirah
|
|
|
138
137
|
end
|
|
139
138
|
|
|
140
139
|
def outer_scope
|
|
141
|
-
node = @scope_node
|
|
142
|
-
node
|
|
140
|
+
node = @scope_node
|
|
141
|
+
return nil if node.nil? || node.parent.nil?
|
|
142
|
+
@scoper.getScope(node)
|
|
143
143
|
end
|
|
144
144
|
|
|
145
145
|
def self_type
|
|
@@ -156,19 +156,11 @@ module Mirah
|
|
|
156
156
|
@self_node
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
def binding_type
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
name = "#{defining_class.name}$#{mirah.tmp}"
|
|
165
|
-
factory = Mirah::AST.type_factory
|
|
166
|
-
if factory
|
|
167
|
-
factory.declare_type(@scope_node, name)
|
|
168
|
-
else
|
|
169
|
-
Mirah::AST::TypeReference.new(name, false, false)
|
|
170
|
-
end
|
|
171
|
-
end
|
|
159
|
+
def binding_type
|
|
160
|
+
if parent
|
|
161
|
+
parent.binding_type
|
|
162
|
+
else
|
|
163
|
+
@binding_type
|
|
172
164
|
end
|
|
173
165
|
end
|
|
174
166
|
|
|
@@ -179,13 +171,26 @@ module Mirah
|
|
|
179
171
|
@binding_type = type
|
|
180
172
|
end
|
|
181
173
|
end
|
|
174
|
+
alias :binding_type_set :binding_type=
|
|
182
175
|
|
|
183
176
|
def has_binding?
|
|
184
177
|
@binding_type != nil || (parent && parent.has_binding?)
|
|
185
178
|
end
|
|
186
179
|
|
|
187
180
|
def package
|
|
188
|
-
@package || outer_scope.package
|
|
181
|
+
@package || (outer_scope && outer_scope.package)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def package=(package)
|
|
185
|
+
raise ArgumentError, "Package already set to #{@package.inspect}" if @package
|
|
186
|
+
@package = package
|
|
187
|
+
if @package_block
|
|
188
|
+
@package_block.call
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def on_package_change(&block)
|
|
193
|
+
@package_block = block
|
|
189
194
|
end
|
|
190
195
|
|
|
191
196
|
def fetch_imports(map)
|
|
@@ -210,14 +215,38 @@ module Mirah
|
|
|
210
215
|
@cached_packages ||= fetch_packages([])
|
|
211
216
|
end
|
|
212
217
|
|
|
218
|
+
def staticImport(type)
|
|
219
|
+
future = BaseTypeFuture.new(self_type.position)
|
|
220
|
+
extended = self_type.resolve.include(type.resolve)
|
|
221
|
+
future.resolved(extended)
|
|
222
|
+
self.self_type = future
|
|
223
|
+
end
|
|
224
|
+
|
|
213
225
|
def import(full_name, short_name)
|
|
214
226
|
return if full_name == short_name
|
|
215
227
|
if short_name == '*'
|
|
216
228
|
@search_packages << full_name.sub(/\.\*$/, '')
|
|
229
|
+
@cached_packages = nil
|
|
217
230
|
else
|
|
218
231
|
@imports[short_name] = full_name
|
|
232
|
+
@cached_imports = nil
|
|
219
233
|
end
|
|
220
234
|
end
|
|
235
|
+
def selfType
|
|
236
|
+
self_type
|
|
237
|
+
end # Should this be resolved?
|
|
238
|
+
def selfType_set(type)
|
|
239
|
+
self.self_type = type
|
|
240
|
+
end
|
|
241
|
+
def parent_set(scope)
|
|
242
|
+
self.parent = scope
|
|
243
|
+
end
|
|
244
|
+
def package_set(package)
|
|
245
|
+
self.package = package
|
|
246
|
+
end
|
|
247
|
+
def resetDefaultSelfNode
|
|
248
|
+
self.self_node = :self
|
|
249
|
+
end
|
|
221
250
|
end
|
|
222
251
|
end
|
|
223
252
|
end
|
data/lib/mirah/commands.rb
CHANGED
data/lib/mirah/commands/base.rb
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
16
|
-
require 'mirah/jvm/types'
|
|
16
|
+
#require 'mirah/jvm/types'
|
|
17
17
|
require 'mirah/util/compilation_state'
|
|
18
18
|
require 'mirah/util/argument_processor'
|
|
19
19
|
require 'mirah/errors'
|
|
@@ -21,16 +21,17 @@ require 'mirah/errors'
|
|
|
21
21
|
module Mirah
|
|
22
22
|
module Commands
|
|
23
23
|
class Base
|
|
24
|
+
include Mirah::Logging::Logged
|
|
24
25
|
def initialize(args)
|
|
25
|
-
Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
|
26
|
+
#Mirah::AST.type_factory = Mirah::JVM::Types::TypeFactory.new
|
|
26
27
|
@state = Mirah::Util::CompilationState.new
|
|
27
28
|
@state.command = command_name
|
|
28
29
|
@args = args
|
|
29
30
|
@argument_processor = Mirah::Util::ArgumentProcessor.new(@state, @args)
|
|
30
31
|
end
|
|
31
|
-
|
|
32
|
+
|
|
32
33
|
attr_accessor :state, :args, :argument_processor
|
|
33
|
-
|
|
34
|
+
|
|
34
35
|
def execute_base
|
|
35
36
|
argument_processor.process
|
|
36
37
|
if argument_processor.exit?
|
|
@@ -44,11 +45,10 @@ module Mirah
|
|
|
44
45
|
yield
|
|
45
46
|
rescue Mirah::InternalCompilerError => ice
|
|
46
47
|
Mirah.print_error(ice.message, ice.position) if ice.node
|
|
47
|
-
raise ice.cause
|
|
48
|
-
raise ice
|
|
48
|
+
raise ice.cause || ice
|
|
49
49
|
rescue Mirah::MirahError => ex
|
|
50
50
|
Mirah.print_error(ex.message, ex.position)
|
|
51
|
-
|
|
51
|
+
log "{0}\n{1}", [ex.message, ex.backtrace.join("\n")]
|
|
52
52
|
throw :exit, 1
|
|
53
53
|
end
|
|
54
54
|
0
|
|
@@ -22,7 +22,7 @@ module Mirah
|
|
|
22
22
|
def execute
|
|
23
23
|
execute_base do
|
|
24
24
|
generator = Mirah::Generator.new(@state, @state.compiler_class, true, @state.verbose)
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
generator.generate(@state.args).each do |result|
|
|
27
27
|
filename = "#{@state.destination}#{result.filename}"
|
|
28
28
|
FileUtils.mkdir_p(File.dirname(filename))
|
|
@@ -30,10 +30,10 @@ module Mirah
|
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
def command_name
|
|
35
35
|
:compile
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
|
-
end
|
|
39
|
+
end
|
data/lib/mirah/commands/parse.rb
CHANGED
|
@@ -20,15 +20,17 @@ module Mirah
|
|
|
20
20
|
class Parse < Base
|
|
21
21
|
def execute
|
|
22
22
|
execute_base do
|
|
23
|
-
parser = Mirah::Parser.new(@state, false)
|
|
24
|
-
|
|
25
|
-
parser.parse_from_args(args)
|
|
23
|
+
parser = Mirah::Parser.new(@state, nil, false)
|
|
24
|
+
|
|
25
|
+
parser.parse_from_args(args).each do |ast|
|
|
26
|
+
puts parser.format_ast(ast)
|
|
27
|
+
end
|
|
26
28
|
end
|
|
27
29
|
end
|
|
28
|
-
|
|
30
|
+
|
|
29
31
|
def command_name
|
|
30
32
|
:parse
|
|
31
33
|
end
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
|
-
end
|
|
36
|
+
end
|
data/lib/mirah/commands/run.rb
CHANGED
|
@@ -22,35 +22,29 @@ module Mirah
|
|
|
22
22
|
def execute
|
|
23
23
|
execute_base do
|
|
24
24
|
main = nil
|
|
25
|
+
class_map = {}
|
|
25
26
|
|
|
26
|
-
|
|
27
27
|
# generate all bytes for all classes
|
|
28
|
-
|
|
29
|
-
|
|
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(/\//, '.')] = Mirah::Util::ClassLoader.binary_string result.bytes
|
|
32
|
+
end
|
|
33
|
+
|
|
30
34
|
# load all classes
|
|
31
35
|
main = load_classes_and_find_main(class_map)
|
|
32
|
-
|
|
36
|
+
|
|
33
37
|
# run the main method we found
|
|
34
38
|
run_main(main)
|
|
35
39
|
end
|
|
36
40
|
end
|
|
37
|
-
|
|
41
|
+
|
|
38
42
|
def command_name
|
|
39
43
|
:run
|
|
40
44
|
end
|
|
41
|
-
|
|
42
|
-
private
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
generator = Mirah::Generator.new(@state, @state.compiler_class, false, @state.verbose)
|
|
46
|
+
private
|
|
46
47
|
|
|
47
|
-
class_map = {}
|
|
48
|
-
generator.generate(args).each do |result|
|
|
49
|
-
class_map[result.classname.gsub(/\//, '.')] = Mirah::Util::ClassLoader.binary_string result.bytes
|
|
50
|
-
end
|
|
51
|
-
class_map
|
|
52
|
-
end
|
|
53
|
-
|
|
54
48
|
def load_classes_and_find_main(class_map)
|
|
55
49
|
main = nil
|
|
56
50
|
dcl = Mirah::Util::ClassLoader.new(JRuby.runtime.jruby_class_loader, class_map)
|
|
@@ -61,7 +55,7 @@ module Mirah
|
|
|
61
55
|
end
|
|
62
56
|
main
|
|
63
57
|
end
|
|
64
|
-
|
|
58
|
+
|
|
65
59
|
def run_main(main)
|
|
66
60
|
if main
|
|
67
61
|
begin
|
|
@@ -71,8 +65,7 @@ module Mirah
|
|
|
71
65
|
raise e
|
|
72
66
|
end
|
|
73
67
|
else
|
|
74
|
-
|
|
75
|
-
exit 1
|
|
68
|
+
puts "No main found" unless @state.version_printed || @state.help_printed
|
|
76
69
|
end
|
|
77
70
|
end
|
|
78
71
|
end
|
data/lib/mirah/compiler.rb
CHANGED
|
@@ -13,50 +13,42 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
|
|
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'
|
|
24
|
-
|
|
25
16
|
module Mirah
|
|
26
17
|
module Compiler
|
|
27
18
|
class ASTCompiler
|
|
28
|
-
def initialize(compiler_class, logging)
|
|
19
|
+
def initialize(config, compiler_class, logging)
|
|
20
|
+
@config = config
|
|
29
21
|
@compiler_class = compiler_class
|
|
30
22
|
@logging = logging
|
|
31
23
|
end
|
|
32
|
-
|
|
33
|
-
attr_accessor :compiler_class, :logging
|
|
34
|
-
|
|
35
|
-
def compile_asts(nodes)
|
|
24
|
+
|
|
25
|
+
attr_accessor :compiler_class, :compiler, :logging
|
|
26
|
+
|
|
27
|
+
def compile_asts(nodes, scoper, typer)
|
|
36
28
|
results = []
|
|
37
29
|
puts "Compiling..." if logging
|
|
38
30
|
nodes.each do |ast|
|
|
39
|
-
puts " #{ast.position.
|
|
40
|
-
compile_ast(ast) do |filename, builder|
|
|
31
|
+
puts " #{ast.position.source.name}" if logging
|
|
32
|
+
compile_ast(ast, scoper, typer) do |filename, builder|
|
|
41
33
|
results << CompilerResult.new(filename, builder.class_name, builder.generate)
|
|
42
34
|
end
|
|
43
35
|
end
|
|
44
36
|
results
|
|
45
37
|
end
|
|
46
|
-
|
|
47
|
-
def compile_ast(ast, &block)
|
|
48
|
-
compiler = compiler_class.new
|
|
49
|
-
|
|
38
|
+
|
|
39
|
+
def compile_ast(ast, scoper, typer, &block)
|
|
40
|
+
@compiler = compiler_class.new(@config, scoper, typer)
|
|
41
|
+
compiler.visit(ast, nil)
|
|
50
42
|
compiler.generate(&block)
|
|
51
43
|
end
|
|
52
44
|
end
|
|
53
|
-
|
|
45
|
+
|
|
54
46
|
class CompilerResult
|
|
55
47
|
def initialize(filename, classname, bytes)
|
|
56
48
|
@filename, @classname, @bytes = filename, classname, bytes
|
|
57
49
|
end
|
|
58
|
-
|
|
50
|
+
|
|
59
51
|
attr_accessor :filename, :classname, :bytes
|
|
60
52
|
end
|
|
61
53
|
end
|
|
62
|
-
end
|
|
54
|
+
end
|