module Soml
  Compiler.class_eval do

      #    attr_reader  :name
      # compiling name needs to check if it's a variable and if so resolve it
      # otherwise it's a method without args and a send is issued.
      # whichever way this goes the result is stored in the return slot (as all compiles)
      def on_name statement
        name = statement.to_a.first
        if( name == :self)
          ret = use_reg @clazz.name
          add_code Register.get_slot(statement , :message , :receiver , ret )
          return ret
        end
        if(name == :space)
          space = Parfait::Space.object_space
          reg = use_reg :Space , space
          add_code Register::LoadConstant.new( statement, space , reg )
          return reg
        end
        # either an argument, so it's stored in message
        if( index = @method.has_arg(name))
          ret = use_reg @method.arguments[index].type
          add_code Register.get_slot(statement , :message , Parfait::Message.get_indexed(index), ret )
          return ret
        else # or a local so it is in the frame
          index = @method.has_local( name )
          if(index)
            frame = use_reg :Frame
            add_code Register.get_slot(statement , :message , :frame , frame )
            ret = use_reg @method.locals[index].type
            add_code Register.get_slot(statement , frame , Parfait::Frame.get_indexed(index), ret )
            return ret
          end
        end
        raise "must define variable #{name} before using it"
      end

  end #module
end