mirah 0.0.12-java → 0.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
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