class RuboCop::Cop::Style::UnneededInterpolation
@var
# good if @var is already a String
@var.to_s
# good
“#{@var}”
# bad
@example
This cop checks for strings that are just an interpolated expression.
def self.autocorrect_incompatible_with
def self.autocorrect_incompatible_with [Style::LineEndConcatenation] end
def autocorrect(node)
def autocorrect(node) embedded_node = node.children.first if variable_interpolation?(embedded_node) autocorrect_variable_interpolation(embedded_node, node) elsif single_variable_interpolation?(embedded_node) autocorrect_single_variable_interpolation(embedded_node, node) else autocorrect_other(embedded_node, node) end end
def autocorrect_other(embedded_node, node)
def autocorrect_other(embedded_node, node) loc = node.loc embedded_loc = embedded_node.loc lambda do |corrector| corrector.replace(loc.begin, '') corrector.replace(loc.end, '') corrector.replace(embedded_loc.begin, '(') corrector.replace(embedded_loc.end, ').to_s') end end
def autocorrect_single_variable_interpolation(embedded_node, node)
def autocorrect_single_variable_interpolation(embedded_node, node) variable_loc = embedded_node.children.first.loc replacement = "#{variable_loc.expression.source}.to_s" ->(corrector) { corrector.replace(node.loc.expression, replacement) } end
def autocorrect_variable_interpolation(embedded_node, node)
def autocorrect_variable_interpolation(embedded_node, node) replacement = "#{embedded_node.loc.expression.source}.to_s" ->(corrector) { corrector.replace(node.loc.expression, replacement) } end
def embedded_in_percent_array?(node)
def embedded_in_percent_array?(node) node.parent && node.parent.array_type? && percent_literal?(node.parent) end
def implicit_concatenation?(node)
def implicit_concatenation?(node) node.parent && node.parent.dstr_type? end
def interpolation?(node)
def interpolation?(node) variable_interpolation?(node) || node.begin_type? end
def on_dstr(node)
def on_dstr(node) add_offense(node) if single_interpolation?(node) end
def single_interpolation?(node)
def single_interpolation?(node) node.children.one? && interpolation?(node.children.first) && !implicit_concatenation?(node) && !embedded_in_percent_array?(node) end
def single_variable_interpolation?(node)
def single_variable_interpolation?(node) node.children.one? && variable_interpolation?(node.children.first) end
def variable_interpolation?(node)
def variable_interpolation?(node) node.variable? || node.reference? end