module Risc
  # The Collection for the Risc level is a collection of Risc level Method compilers,
  # plus functions to translate from the risc to cpu specific code.
  #
  class RiscCollection
    attr_reader :method_compilers

    # Initialize with an array of risc MethodCompilers
    def initialize(compilers = [])
      @method_compilers = nil
      compilers.each{|c| add_compiler(c)}
    end

    # collects constants from all compilers into one array
    def constants
      all = []
      method_compilers.each_compiler{|comp| all +=  comp.constants }
      all
    end

    def append(collection)
      @method_compilers.add_method_compiler( collection.method_compilers)
      self
    end

    def add_compiler(compiler)
      if(@method_compilers)
        @method_compilers.add_method_compiler(compiler)
      else
        @method_compilers = compiler
      end
      self
    end

    # Translate code to whatever cpu is specified.
    # Currently only :arm and :interpret
    #
    # Translating means translating the initial jump
    # and then translating all methods
    def translate( platform_sym )
      platform_sym = platform_sym.to_s.capitalize
      platform = Platform.for(platform_sym)
      assemblers = []
      @method_compilers.each_compiler do |compiler|
        compiler.translate_method( platform , assemblers)
      end
      Risc::Linker.new(platform , assemblers , constants)
    end

  end
end