class RuboCop::Cop::Style::PercentLiteralDelimiters

This cop enforces the consistent usage of `%`-literal delimiters.

Specify the 'default' key to set all preferred delimiters at once. You can continue to specify individual preferred delimiters to override the default.

@example

# Style/PercentLiteralDelimiters:
#   PreferredDelimiters:
#     default: '[]'
#     '%i':    '()'

# good
%w[alpha beta] + %i(gamma delta)

# bad
%W(alpha #{beta})

# bad
%I(alpha beta)

Public Instance Methods

message(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 50
def message(node)
  type = type(node)
  delimiters = preferred_delimiters_for(type)

  "`#{type}`-literals should be delimited by " \
  "`#{delimiters[0]}` and `#{delimiters[1]}`."
end
on_array(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 29
def on_array(node)
  process(node, '%w', '%W', '%i', '%I')
end
on_dstr(node)
Alias for: on_str
on_regexp(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 33
def on_regexp(node)
  process(node, '%r')
end
on_str(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 37
def on_str(node)
  process(node, '%', '%Q', '%q')
end
Also aliased as: on_dstr
on_sym(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 42
def on_sym(node)
  process(node, '%s')
end
on_xstr(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 46
def on_xstr(node)
  process(node, '%x')
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 60
def autocorrect(node)
  type = type(node)

  opening_delimiter, closing_delimiter = preferred_delimiters_for(type)

  lambda do |corrector|
    corrector.replace(node.loc.begin, "#{type}#{opening_delimiter}")
    corrector.replace(node.loc.end, closing_delimiter)
  end
end
contains_preferred_delimiter?(node, type) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 83
def contains_preferred_delimiter?(node, type)
  preferred_delimiters = preferred_delimiters_for(type)
  node
    .children.map { |n| string_source(n) }.compact
    .any? { |s| preferred_delimiters.any? { |d| s.include?(d) } }
end
on_percent_literal(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 71
def on_percent_literal(node)
  type = type(node)
  return if uses_preferred_delimiter?(node, type) ||
            contains_preferred_delimiter?(node, type)

  add_offense(node)
end
string_source(node) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 90
def string_source(node)
  if node.is_a?(String)
    node
  elsif node.respond_to?(:type) && node.str_type?
    node.source
  end
end
uses_preferred_delimiter?(node, type) click to toggle source
# File lib/rubocop/cop/style/percent_literal_delimiters.rb, line 79
def uses_preferred_delimiter?(node, type)
  preferred_delimiters_for(type)[0] == begin_source(node)[-1]
end