class RuboCop::Cop::Lint::InterpolationCheck

Checks for interpolation in a single quoted string.

@safety

This cop's autocorrection is unsafe because although it always replaces single quotes as
if it were miswritten double quotes, it is not always the case. For example,
`'#{foo} bar'` would be replaced by `"#{foo} bar"`, so the replaced code would evaluate
the expression `foo`.

@example

# bad
foo = 'something with #{interpolation} inside'

# good
foo = "something with #{interpolation} inside"

Constants

MSG

Public Instance Methods

on_str(node) click to toggle source
# File lib/rubocop/cop/lint/interpolation_check.rb, line 27
def on_str(node)
  return if node.parent&.regexp_type?
  return unless /(?<!\\)#\{.*\}/.match?(node.source)
  return if heredoc?(node)
  return unless node.loc.begin && node.loc.end

  add_offense(node) { |corrector| autocorrect(corrector, node) }
end

Private Instance Methods

autocorrect(corrector, node) click to toggle source
# File lib/rubocop/cop/lint/interpolation_check.rb, line 38
def autocorrect(corrector, node)
  starting_token, ending_token = if node.source.include?('"')
                                   ['%{', '}']
                                 else
                                   ['"', '"']
                                 end

  corrector.replace(node.loc.begin, starting_token)
  corrector.replace(node.loc.end, ending_token)
end
heredoc?(node) click to toggle source
# File lib/rubocop/cop/lint/interpolation_check.rb, line 49
def heredoc?(node)
  node.loc.is_a?(Parser::Source::Map::Heredoc) || (node.parent && heredoc?(node.parent))
end