class RuboCop::Cop::Style::PerlBackrefs

puts Regexp.last_match(1)
# good
puts $1
# bad
@example
$1, $2, $&, &+, $MATCH, $PREMATCH, etc.
backreferences and their English versions like
Looks for uses of Perl-style regexp match

def constant_prefix(node)

Returns:
  • (String) -

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def constant_prefix(node)
  if node.each_ancestor(:class, :module).any?
    '::'
  else
    ''
  end
end

def derived_from_braceless_interpolation?(node)

Returns:
  • (Boolean) -

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def derived_from_braceless_interpolation?(node)
  %i[dstr regexp xstr].include?(node.parent&.type)
end

def format_message(node:, preferred_expression:)

Returns:
  • (String) -

Parameters:
  • preferred_expression (String) --
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def format_message(node:, preferred_expression:)
  original_expression = original_expression_of(node)
  format(
    MESSAGE_FORMAT,
    original_expression: original_expression,
    preferred_expression: preferred_expression
  )
end

def on_back_ref(node)

def on_back_ref(node)
  on_back_ref_or_gvar_or_nth_ref(node)
end

def on_back_ref_or_gvar_or_nth_ref(node)

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def on_back_ref_or_gvar_or_nth_ref(node)
  preferred_expression = preferred_expression_to_node_with_constant_prefix(node)
  return unless preferred_expression
  add_offense(
    node,
    message: format_message(node: node, preferred_expression: preferred_expression)
  ) do |corrector|
    if derived_from_braceless_interpolation?(node)
      preferred_expression = "{#{preferred_expression}}"
    end
    corrector.replace(node, preferred_expression)
  end
end

def on_gvar(node)

def on_gvar(node)
  on_back_ref_or_gvar_or_nth_ref(node)
end

def on_nth_ref(node)

def on_nth_ref(node)
  on_back_ref_or_gvar_or_nth_ref(node)
end

def original_expression_of(node)

Returns:
  • (String) -

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def original_expression_of(node)
  first = node.to_a.first
  if first.is_a?(::Integer)
    "$#{first}"
  else
    first.to_s
  end
end

def preferred_expression_to(node)

Returns:
  • (String, nil) -

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def preferred_expression_to(node)
  first = node.to_a.first
  case first
  when ::Integer
    "Regexp.last_match(#{first})"
  when :$&, :$MATCH
    'Regexp.last_match(0)'
  when :$`, :$PREMATCH
    'Regexp.last_match.pre_match'
  when :$', :$POSTMATCH
    'Regexp.last_match.post_match'
  when :$+, :$LAST_PAREN_MATCH
    'Regexp.last_match(-1)'
  end
end

def preferred_expression_to_node_with_constant_prefix(node)

Returns:
  • (String, nil) -

Parameters:
  • node (RuboCop::AST::Node) --

Other tags:
    Private: -
def preferred_expression_to_node_with_constant_prefix(node)
  expression = preferred_expression_to(node)
  return unless expression
  "#{constant_prefix(node)}#{expression}"
end