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