class RuboCop::Cop::Lint::InterpolationCheck

Checks for interpolation in a single quoted string.

@safety

This cop is generally safe, but is marked as unsafe because
it is possible to actually intentionally have text inside
`#{...}` in a single quoted string.

@example

# bad

foo = 'something with #{interpolation} inside'

@example

# 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 30
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 41
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 52
def heredoc?(node)
  node.loc.is_a?(Parser::Source::Map::Heredoc) || (node.parent && heredoc?(node.parent))
end