module Vool
  class ClassStatement < Statement
    attr_reader :name, :super_class_name , :body
    attr_reader :clazz

    def initialize( name , supe , body)
      @name , @super_class_name , @body = name , supe , body
    end

    def normalize
      ClassStatement.new(@name , @super_class_name, @body&.normalize )
    end

    # there is no mom equivalent for a class, this should never be called
    def to_mom( _ )
      raise "should not be called (call create_objects)"
    end

    def each(&block)
      block.call(self)
      @body.each(&block) if @body
    end

    def create_objects
      create_class_object
      mom = nil #return mom for test purpose
      self.each {|node| mom = node.create_objects(@clazz) if node.is_a?(MethodStatement)  }
      mom
    end

    def create_class_object
      @clazz = Parfait.object_space.get_class_by_name(@name )
      if(@clazz)
        #FIXME super class check with "sup"
        #existing class, don't overwrite type (parfait only?)
      else
        @clazz = Parfait.object_space.create_class(@name , @super_class_name )
        ivar_hash = {}
        self.each do |node|
          next unless node.is_a?(InstanceVariable) or node.is_a?(IvarAssignment)
          ivar_hash[node.name] = :Object
        end
        @clazz.set_instance_type( Parfait::Type.for_hash( @clazz ,  ivar_hash ) )
      end
    end
  end
end