class RuboCop::Cop::InternalAffairs::LocationExists


node.loc_is?(:begin, ‘(’)
# good
node.loc.respond_to?(:begin) && node.loc.begin.source == ‘(’
# bad
node.loc_is?(:begin, ‘(’)
# good
node.loc.respond_to?(:begin) && node.loc.begin.is?(‘(’)
# bad
node.loc?(:begin)
# good
node.loc.respond_to?(:begin) && node.loc.begin
# bad
@example
the value.
can be used instead of calling ‘Node#respond_to?` before using
When a node location may not exist, `Node#loc?` or `Node#loc_is?`

def dot(node)

def dot(node)
  node.parent.loc.dot.source
end

def on_and(node)

def on_and(node)
  replace_with_loc(node) || replace_with_loc_is(node)
end

def register_offense(node, replacement)

def register_offense(node, replacement)
  message = format(MSG, replacement: replacement, source: node.source)
  add_offense(node, message: message) do |corrector|
    corrector.replace(node, replacement)
  end
end

def replace_assignment(receiver, location)

def replace_assignment(receiver, location)
  prefix = replace_receiver(receiver)
  "#{prefix}loc#{dot(receiver)}#{location.value} if #{prefix}loc?(#{location.source})"
end

def replace_receiver(receiver)

def replace_receiver(receiver)
  return '' unless receiver
  "#{receiver.source}#{dot(receiver)}"
end

def replace_with_loc(node)

def replace_with_loc(node)
  replaceable_with_loc(node) do |receiver, location|
    if node.parent&.assignment?
      register_offense(node, replace_assignment(receiver, location))
    else
      register_offense(node, replacement(receiver, "loc?(#{location.source})"))
    end
  end
end

def replace_with_loc_is(node)

def replace_with_loc_is(node)
  replaceable_with_loc_is(node) do |receiver, location, value|
    replacement = replacement(receiver, "loc_is?(#{location.source}, #{value.source})")
    register_offense(node, replacement)
  end
end

def replacement(receiver, rest)

def replacement(receiver, rest)
  "#{replace_receiver(receiver)}#{rest}"
end