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.
Files changed (171) hide show
  1. data/History.txt +372 -0
  2. data/README.txt +4 -5
  3. data/Rakefile +178 -55
  4. data/examples/appengine/Readme +3 -3
  5. data/examples/appengine/src/org/mirah/MirahApp.mirah +1 -1
  6. data/examples/appengine/src/org/mirah/list.dhtml +1 -1
  7. data/examples/bintrees.mirah +1 -1
  8. data/examples/edb.mirah +1 -1
  9. data/examples/fib.mirah +1 -1
  10. data/examples/interfaces.mirah +1 -1
  11. data/examples/macros/{string-each-char.mirah → string_each_char.mirah} +4 -5
  12. data/examples/maven/README.txt +1 -1
  13. data/examples/maven/src/main/mirah/hello_mirah.mirah +1 -1
  14. data/examples/plugins/appengine/Rakefile +1 -1
  15. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/MetaModel.mirah +1 -1
  16. data/examples/plugins/appengine/src/com/google/appengine/ext/duby/db/Model.duby +1 -1
  17. data/examples/plugins/appengine/test/com/google/appengine/ext/duby/db/ModelTest.duby +1 -1
  18. data/examples/rosettacode/100-doors.mirah +6 -6
  19. data/examples/rosettacode/README.txt +3 -3
  20. data/examples/rosettacode/boolean-values.mirah +1 -1
  21. data/examples/rosettacode/comments.mirah +1 -1
  22. data/examples/rosettacode/count-occurrences-of-a-substring.mirah +1 -1
  23. data/examples/rosettacode/factorial.mirah +1 -1
  24. data/examples/rosettacode/fibonacci.mirah +1 -1
  25. data/examples/rosettacode/fizz-buzz.mirah +2 -2
  26. data/examples/rosettacode/flatten-a-list.mirah +4 -4
  27. data/examples/rosettacode/guess-the-number.mirah +2 -2
  28. data/examples/rosettacode/hamming-numbers.mirah +4 -4
  29. data/examples/rosettacode/is-string-numeric.mirah +22 -22
  30. data/examples/rosettacode/palindrome.mirah +2 -2
  31. data/examples/rosettacode/random-numbers.mirah +1 -1
  32. data/examples/rosettacode/repeat-a-string.mirah +1 -1
  33. data/examples/rosettacode/reverse-a-string.mirah +1 -1
  34. data/examples/rosettacode/rot-13.mirah +5 -5
  35. data/examples/rosettacode/secure-temporary-file.mirah +2 -2
  36. data/examples/rosettacode/sleep.mirah +1 -1
  37. data/examples/rosettacode/string-length.mirah +5 -5
  38. data/examples/swing.mirah +1 -1
  39. data/examples/test.edb +1 -1
  40. data/javalib/mirah-bootstrap.jar +0 -0
  41. data/javalib/mirah-builtins.jar +0 -0
  42. data/javalib/mirah-parser.jar +0 -0
  43. data/javalib/mirah-util.jar +0 -0
  44. data/lib/duby.rb +1 -1
  45. data/lib/mirah.rb +50 -28
  46. data/lib/mirah/ast.rb +15 -605
  47. data/lib/mirah/ast/scope.rb +98 -69
  48. data/lib/mirah/commands.rb +1 -1
  49. data/lib/mirah/commands/base.rb +7 -7
  50. data/lib/mirah/commands/compile.rb +3 -3
  51. data/lib/mirah/commands/parse.rb +7 -5
  52. data/lib/mirah/commands/run.rb +12 -19
  53. data/lib/mirah/compiler.rb +15 -23
  54. data/lib/mirah/errors.rb +16 -1
  55. data/lib/mirah/generator.rb +79 -39
  56. data/lib/mirah/jvm/compiler.rb +1 -19
  57. data/lib/mirah/jvm/compiler/base.rb +233 -90
  58. data/lib/mirah/jvm/compiler/jvm_bytecode.rb +675 -363
  59. data/lib/mirah/jvm/method_lookup.rb +134 -65
  60. data/lib/mirah/jvm/typer.rb +10 -5
  61. data/lib/mirah/jvm/types.rb +10 -2
  62. data/lib/mirah/jvm/types/array_type.rb +10 -12
  63. data/lib/mirah/{compiler/type.rb → jvm/types/ast_ext.rb} +12 -8
  64. data/lib/mirah/jvm/types/basic_types.rb +26 -33
  65. data/lib/mirah/jvm/types/bitescript_ext.rb +1 -1
  66. data/lib/mirah/jvm/types/block_type.rb +15 -0
  67. data/lib/mirah/jvm/types/boolean.rb +8 -4
  68. data/lib/mirah/jvm/types/dynamic_type.rb +12 -13
  69. data/lib/mirah/jvm/types/enumerable.rb +7 -7
  70. data/lib/mirah/jvm/types/extensions.rb +11 -6
  71. data/lib/mirah/jvm/types/factory.rb +624 -94
  72. data/lib/mirah/jvm/types/floats.rb +21 -15
  73. data/lib/mirah/jvm/types/generic_type.rb +72 -0
  74. data/lib/mirah/jvm/types/implicit_nil_type.rb +29 -0
  75. data/lib/mirah/jvm/types/integers.rb +26 -71
  76. data/lib/mirah/jvm/types/interface_definition.rb +3 -3
  77. data/lib/mirah/jvm/types/intrinsics.rb +203 -168
  78. data/lib/mirah/jvm/types/literals.rb +6 -6
  79. data/lib/mirah/jvm/types/meta_type.rb +13 -4
  80. data/lib/mirah/jvm/types/methods.rb +281 -93
  81. data/lib/mirah/jvm/types/null_type.rb +17 -5
  82. data/lib/mirah/jvm/types/number.rb +10 -7
  83. data/lib/mirah/jvm/types/primitive_type.rb +17 -6
  84. data/lib/mirah/jvm/types/source_mirror.rb +12 -7
  85. data/lib/mirah/jvm/types/type.rb +107 -23
  86. data/lib/mirah/jvm/types/type_definition.rb +25 -10
  87. data/lib/mirah/jvm/types/unreachable_type.rb +1 -1
  88. data/lib/mirah/jvm/types/void_type.rb +3 -3
  89. data/lib/mirah/parser.rb +154 -16
  90. data/lib/mirah/plugin/edb.rb +1 -1
  91. data/lib/mirah/transform.rb +1 -2
  92. data/lib/mirah/transform/ast_ext.rb +24 -43
  93. data/lib/mirah/transform/transformer.rb +29 -224
  94. data/lib/mirah/typer.rb +2 -16
  95. data/lib/mirah/util/argument_processor.rb +25 -10
  96. data/lib/mirah/util/class_loader.rb +1 -1
  97. data/lib/mirah/util/compilation_state.rb +16 -17
  98. data/lib/mirah/util/delegate.rb +2 -2
  99. data/lib/mirah/util/logging.rb +110 -0
  100. data/lib/mirah/util/process_errors.rb +69 -11
  101. data/lib/mirah/version.rb +1 -1
  102. data/test/core/commands_test.rb +6 -24
  103. data/test/core/env_test.rb +5 -5
  104. data/{lib/mirah/jvm/source_generator/typer.rb → test/core/generator_test.rb} +9 -9
  105. data/test/core/typer_test.rb +196 -158
  106. data/test/core/util/argument_processor_test.rb +10 -10
  107. data/test/core/util/class_loader_test.rb +6 -5
  108. data/test/fixtures/org/foo/LowerCaseInnerClass$inner.class +0 -0
  109. data/test/fixtures/org/foo/LowerCaseInnerClass.class +0 -0
  110. data/test/fixtures/org/foo/LowerCaseInnerClass.java +7 -0
  111. data/test/jvm/annotations_test.rb +5 -5
  112. data/test/jvm/blocks_test.rb +140 -88
  113. data/test/jvm/bytecode_test_helper.rb +112 -94
  114. data/test/jvm/cast_test.rb +162 -0
  115. data/test/jvm/constructors_test.rb +18 -8
  116. data/test/jvm/enumerable_test.rb +77 -44
  117. data/test/jvm/example_test.rb +53 -0
  118. data/test/jvm/factory_test.rb +7 -1
  119. data/test/jvm/generics_test.rb +57 -0
  120. data/test/jvm/hash_test.rb +106 -0
  121. data/test/jvm/import_test.rb +81 -0
  122. data/test/jvm/interface_test.rb +73 -0
  123. data/test/jvm/java_typer_test.rb +92 -66
  124. data/{lib/mirah/typer/base.rb → test/jvm/jvm_commands_test.rb} +6 -10
  125. data/test/jvm/jvm_compiler_test.rb +170 -604
  126. data/test/jvm/list_extensions_test.rb +23 -0
  127. data/test/jvm/macros_test.rb +197 -32
  128. data/test/jvm/main_method_test.rb +4 -4
  129. data/test/jvm/numeric_extensions_test.rb +13 -0
  130. data/test/jvm/rescue_test.rb +73 -16
  131. data/test/jvm/varargs_test.rb +65 -0
  132. data/test/test_helper.rb +1 -2
  133. metadata +234 -251
  134. data/examples/SortClosure$__xform_tmp_1.class +0 -0
  135. data/examples/SortClosure$__xform_tmp_2.class +0 -0
  136. data/examples/SortClosure.class +0 -0
  137. data/examples/macros/StringEachChar$Extension1.class +0 -0
  138. data/lib/mirah/ast/call.rb +0 -345
  139. data/lib/mirah/ast/class.rb +0 -359
  140. data/lib/mirah/ast/flow.rb +0 -381
  141. data/lib/mirah/ast/intrinsics.rb +0 -563
  142. data/lib/mirah/ast/literal.rb +0 -178
  143. data/lib/mirah/ast/local.rb +0 -112
  144. data/lib/mirah/ast/method.rb +0 -408
  145. data/lib/mirah/ast/structure.rb +0 -387
  146. data/lib/mirah/ast/type.rb +0 -146
  147. data/lib/mirah/commands/base.rb~ +0 -57
  148. data/lib/mirah/compiler/call.rb +0 -45
  149. data/lib/mirah/compiler/class.rb +0 -81
  150. data/lib/mirah/compiler/flow.rb +0 -109
  151. data/lib/mirah/compiler/literal.rb +0 -130
  152. data/lib/mirah/compiler/local.rb +0 -59
  153. data/lib/mirah/compiler/method.rb +0 -44
  154. data/lib/mirah/compiler/structure.rb +0 -65
  155. data/lib/mirah/jvm/compiler/java_source.rb +0 -787
  156. data/lib/mirah/jvm/method_lookup.rb~ +0 -247
  157. data/lib/mirah/jvm/source_generator/builder.rb +0 -468
  158. data/lib/mirah/jvm/source_generator/loops.rb +0 -131
  159. data/lib/mirah/jvm/source_generator/precompile.rb +0 -210
  160. data/lib/mirah/plugin/gwt.rb +0 -189
  161. data/lib/mirah/plugin/java.rb +0 -70
  162. data/lib/mirah/transform/error.rb +0 -13
  163. data/lib/mirah/transform/helper.rb +0 -765
  164. data/lib/mirah/typer/simple.rb +0 -384
  165. data/lib/mirah/version.rb~ +0 -18
  166. data/test/core/ast_test.rb +0 -382
  167. data/test/core/compilation_test.rb +0 -130
  168. data/test/core/macros_test.rb +0 -61
  169. data/test/jvm/javac_test_helper.rb +0 -89
  170. data/test/jvm/jvm_compiler_test.rb~ +0 -2181
  171. data/test/plugins/gwt_test.rb +0 -69
@@ -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, :package
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 local_type(name)
89
- @var_types[name]
90
+ def temp(name="tmp")
91
+ "$#{name}$#{@temps[name] += 1}"
90
92
  end
91
93
 
92
- def learn_local_type(name, type)
93
- return unless type
94
- existing_type = local_type(name)
95
- if existing_type
96
- unless existing_type.compatible?(type)
97
- raise Mirah::Typer::InferenceError.new(
98
- "Can't assign #{type.full_name} to " \
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
- existing_type
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.scope
142
- node && node.static_scope
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(defining_class=nil, mirah=nil)
160
- @binding_type ||= begin
161
- if parent
162
- parent.binding_type(defining_class, mirah)
163
- else
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
@@ -16,4 +16,4 @@
16
16
  require 'mirah/commands/base'
17
17
  require 'mirah/commands/run'
18
18
  require 'mirah/commands/compile'
19
- require 'mirah/commands/parse'
19
+ require 'mirah/commands/parse'
@@ -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 if (ice.cause && state.verbose)
48
- raise ice
48
+ raise ice.cause || ice
49
49
  rescue Mirah::MirahError => ex
50
50
  Mirah.print_error(ex.message, ex.position)
51
- puts ex.backtrace if state.verbose
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
@@ -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
@@ -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
- class_map = generate_class_map
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
- def generate_class_map
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
- $stderr.puts "No main found"
75
- exit 1
68
+ puts "No main found" unless @state.version_printed || @state.help_printed
76
69
  end
77
70
  end
78
71
  end
@@ -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.file}" if logging
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
- ast.compile(compiler, false)
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