Class: Mirah::Generator

Inherits:
Object
  • Object
show all
Includes:
Util::ProcessErrors
Defined in:
lib/mirah/generator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util::ProcessErrors

#process_errors

Constructor Details

#initialize(state, compiler_class, logging, verbose) ⇒ Generator

Returns a new instance of Generator.



20
21
22
23
24
25
# File 'lib/mirah/generator.rb', line 20

def initialize(state, compiler_class, logging, verbose)
  @parser = Mirah::Parser.new(state, logging)
  @compiler = Mirah::Compiler::ASTCompiler.new(compiler_class, logging)
  @logging = logging
  @verbose = verbose
end

Instance Attribute Details

#compilerObject

Returns the value of attribute compiler.



27
28
29
# File 'lib/mirah/generator.rb', line 27

def compiler
  @compiler
end

#loggingObject

Returns the value of attribute logging.



27
28
29
# File 'lib/mirah/generator.rb', line 27

def logging
  @logging
end

#parserObject

Returns the value of attribute parser.



27
28
29
# File 'lib/mirah/generator.rb', line 27

def parser
  @parser
end

#verboseObject

Returns the value of attribute verbose.



27
28
29
# File 'lib/mirah/generator.rb', line 27

def verbose
  @verbose
end

Instance Method Details

#generate(arguments) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/mirah/generator.rb', line 29

def generate(arguments)
  # collect all ASTs from all files
  top_nodes = parser.parse_from_args(arguments)
  
  # enter all ASTs into inference engine
  puts "Inferring types..." if logging
  infer_asts(top_nodes)
  
  # compile each AST in turn
  compiler_results = compiler.compile_asts(top_nodes)
  
  puts "Done!" if logging
  
  compiler_results
end

#infer_asts(nodes) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/mirah/generator.rb', line 45

def infer_asts(nodes)
  typer = Mirah::JVM::Typer.new(parser.transformer)
  nodes.each {|ast| typer.infer(ast, true) }
  begin
    typer.resolve(false)
  ensure
    puts nodes.inspect if verbose
    
    failed = !typer.errors.empty?
    if failed
      puts "Inference Error:"
      process_errors(typer.errors)
    end
  end
end