class RuboCop::Cop::Layout::SpaceInsideReferenceBrackets


foo[ ]
# good
foo[ ]
foo[]
# bad
# empty reference brackets contain exactly one space.
# The ‘space` EnforcedStyleForEmptyBrackets style enforces that
@example EnforcedStyleForEmptyBrackets: space
foo[]
# good
foo[ ]
foo[ ]
# bad
# empty reference brackets do not contain spaces.
# The `no_space` EnforcedStyleForEmptyBrackets style enforces that
@example EnforcedStyleForEmptyBrackets: no_space (default)
array[ index ]
hash[ :key ]
# good

array[index]
hash[:key]
# bad
# surrounding space.
# The `space` style enforces that reference brackets have
@example EnforcedStyle: space

array[index]
hash[:key]
# good
array[ index ]
hash[ :key ]
# bad
# no surrounding space.
# The `no_space` style enforces that reference brackets have
@example EnforcedStyle: no_space (default)
surrounding space depending on configuration.
Checks that reference brackets have or don’t have

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    left, right = reference_brackets(node)
    if empty_brackets?(left, right)
      SpaceCorrector.empty_corrections(processed_source, corrector,
                                       empty_config, left, right)
    elsif style == :no_space
      SpaceCorrector.remove_space(processed_source, corrector,
                                  left, right)
    else
      SpaceCorrector.add_space(processed_source, corrector, left, right)
    end
  end
end

def bracket_method?(node)

def bracket_method?(node)
  BRACKET_METHODS.include?(node.method_name)
end

def closing_bracket(tokens, opening_bracket)

def closing_bracket(tokens, opening_bracket)
  i = tokens.index(opening_bracket)
  inner_left_brackets_needing_closure = 0
  tokens[i..-1].each do |token|
    inner_left_brackets_needing_closure += 1 if token.left_bracket?
    inner_left_brackets_needing_closure -= 1 if token.right_bracket?
    if inner_left_brackets_needing_closure.zero? && token.right_bracket?
      return token
    end
  end
end

def empty_config

def empty_config
  cop_config['EnforcedStyleForEmptyBrackets']
end

def left_ref_bracket(node, tokens)

def left_ref_bracket(node, tokens)
  current_token = tokens.reverse.find(&:left_ref_bracket?)
  previous_token = previous_token(current_token)
  if node.method?(:[]=) ||
     previous_token && !previous_token.right_bracket?
    tokens.find(&:left_ref_bracket?)
  else
    current_token
  end
end

def on_send(node)

def on_send(node)
  return if node.multiline?
  return unless bracket_method?(node)
  tokens = tokens(node)
  left_token = left_ref_bracket(node, tokens)
  return unless left_token
  right_token = closing_bracket(tokens, left_token)
  if empty_brackets?(left_token, right_token)
    return empty_offenses(node, left_token, right_token, EMPTY_MSG)
  end
  if style == :no_space
    no_space_offenses(node, left_token, right_token, MSG)
  else
    space_offenses(node, left_token, right_token, MSG)
  end
end

def previous_token(current_token)

def previous_token(current_token)
  index = processed_source.tokens.index(current_token)
  index.nil? || index.zero? ? nil : processed_source.tokens[index - 1]
end

def reference_brackets(node)

def reference_brackets(node)
  tokens = tokens(node)
  left = left_ref_bracket(node, tokens)
  [left, closing_bracket(tokens, left)]
end