class RuboCop::Cop::Style::RegexpLiteral

This cop enforces using // or %r around regular expressions.

@example

# Good if EnforcedStyle is slashes or mixed, bad if percent_r.
snake_case = /^[\dA-Z_]+$/

# Good if EnforcedStyle is percent_r, bad if slashes or mixed.
snake_case = %r{^[\dA-Z_]+$}

# Good if EnforcedStyle is slashes, bad if percent_r or mixed.
regex = /
  foo
  (bar)
  (baz)
/x

# Good if EnforcedStyle is percent_r or mixed, bad if slashes.
regex = %r{
  foo
  (bar)
  (baz)
}x

# Bad unless AllowInnerSlashes is true.
x =~ /home\//

Constants

MSG_USE_PERCENT_R
MSG_USE_SLASHES

Public Instance Methods

on_regexp(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 37
def on_regexp(node)
  if slash_literal?(node)
    check_slash_literal(node)
  else
    check_percent_r_literal(node)
  end
end

Private Instance Methods

allow_inner_slashes?() click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 73
def allow_inner_slashes?
  cop_config['AllowInnerSlashes']
end
autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 91
def autocorrect(node)
  return if contains_slash?(node)

  replacement = if slash_literal?(node)
                  ['%r', ''].zip(preferred_delimiters).map(&:join)
                else
                  %w(/ /)
                end

  lambda do |corrector|
    corrector.replace(node.loc.begin, replacement.first)
    corrector.replace(node.loc.end, replacement.last)
  end
end
check_percent_r_literal(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 56
def check_percent_r_literal(node)
  return if style == :slashes && contains_disallowed_slash?(node)
  return if style == :percent_r
  return if style == :mixed && node.multiline?
  return if style == :mixed && contains_disallowed_slash?(node)

  add_offense(node, :expression, MSG_USE_SLASHES)
end
check_slash_literal(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 47
def check_slash_literal(node)
  return if style == :slashes && !contains_disallowed_slash?(node)
  return if style == :mixed &&
            node.single_line? &&
            !contains_disallowed_slash?(node)

  add_offense(node, :expression, MSG_USE_PERCENT_R)
end
contains_disallowed_slash?(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 65
def contains_disallowed_slash?(node)
  !allow_inner_slashes? && contains_slash?(node)
end
contains_slash?(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 69
def contains_slash?(node)
  node_body(node).include?('/')
end
node_body(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 77
def node_body(node)
  string_parts = node.children.select { |child| child.type == :str }
  string_parts.map(&:source).join
end
preferred_delimiters() click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 86
def preferred_delimiters
  config.for_cop('Style/PercentLiteralDelimiters')              ['PreferredDelimiters']['%r'].split(//)
end
slash_literal?(node) click to toggle source
# File lib/rubocop/cop/style/regexp_literal.rb, line 82
def slash_literal?(node)
  node.loc.begin.source == '/'
end