class Thor::Options

def parse(args) # rubocop:disable MethodLength

rubocop:disable MethodLength
def parse(args) # rubocop:disable MethodLength
  @pile = args.dup
  @parsing_options = true
  while peek
    if parsing_options?
      match, is_switch = current_is_switch?
      shifted = shift
      if is_switch
        case shifted
        when SHORT_SQ_RE
          unshift($1.split('').map { |f| "-#{f}" })
          next
        when EQ_RE, SHORT_NUM
          unshift($2)
          switch = $1
        when LONG_RE, SHORT_RE
          switch = $1
        end
        switch = normalize_switch(switch)
        option = switch_option(switch)
        @assigns[option.human_name] = parse_peek(switch, option)
      elsif @stop_on_unknown
        @parsing_options = false
        @extra << shifted
        @extra << shift while peek
        break
      elsif match
        @extra << shifted
        @extra << shift while peek && peek !~ /^-/
      else
        @extra << shifted
      end
    else
      @extra << shift
    end
  end
  check_requirement!
  assigns = Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
  assigns.freeze
  assigns
end