shard-ameba/src/ameba/rule/lint/redundant_string_coercion.cr

49 lines
1.0 KiB
Crystal

module Ameba::Rule::Lint
# A rule that disallows string conversion in string interpolation,
# which is redundant.
#
# For example, this is considered invalid:
#
# ```
# "Hello, #{name.to_s}"
# ```
#
# And this is valid:
#
# ```
# "Hello, #{name}"
# ```
#
# YAML configuration example:
#
# ```
# Lint/RedundantStringCoercion
# Enabled: true
# ```
class RedundantStringCoercion < Base
include AST::Util
properties do
description "Disallows redundant string conversions in interpolation"
end
MSG = "Redundant use of `Object#to_s` in interpolation"
def test(source, node : Crystal::StringInterpolation)
string_coercion_nodes(node).each do |expr|
issue_for expr.name_location, expr.end_location, MSG
end
end
private def string_coercion_nodes(node)
node.expressions.select do |exp|
exp.is_a?(Crystal::Call) &&
exp.name == "to_s" &&
exp.args.size.zero? &&
exp.named_args.nil? &&
exp.obj
end
end
end
end