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
Source
# File lib/rubocop/cop/lint/interpolation_check.rb, line 28 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 return unless valid_syntax?(node) add_offense(node) { |corrector| autocorrect(corrector, node) } end
rubocop:disable Metrics/CyclomaticComplexity
Private Instance Methods
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
rubocop:enable Metrics/CyclomaticComplexity
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
Source
# File lib/rubocop/cop/lint/interpolation_check.rb, line 56 def valid_syntax?(node) double_quoted_string = node.source.gsub(/\A'|'\z/, '"') parse(double_quoted_string).valid_syntax? end