class RuboCop::Cop::Lint::LiteralInCondition
end
do_something
if some_var && true
end
do_something
if 20
@example
if/while/until.
operands in and/or expressions serving as the conditions of
This cop checks for literals used as the conditions or as
def basic_literal?(node)
def basic_literal?(node) if node && node.type == :array primitive_array?(node) else BASIC_LITERALS.include?(node.type) end end
def check_case_cond(node)
def check_case_cond(node) return if node.type == :array && !primitive_array?(node) return if node.type == :dstr handle_node(node) end
def check_for_literal(node)
def check_for_literal(node) cond, = *node # if the cond node is literal we obviously have a problem if literal?(cond) add_offense(cond, :expression) else # alternatively we have to consider a logical node with a # literal argument check_node(cond) end end
def check_node(node)
def check_node(node) return unless node if not?(node) receiver, = *node handle_node(receiver) elsif [:and, :or].include?(node.type) *operands = *node operands.each do |op| handle_node(op) end elsif node.type == :begin && node.children.size == 1 child_node = node.children.first handle_node(child_node) end end
def handle_node(node)
def handle_node(node) if literal?(node) add_offense(node, :expression) elsif [:send, :and, :or, :begin].include?(node.type) check_node(node) end end
def literal?(node)
def literal?(node) LITERALS.include?(node.type) end
def message(node)
def message(node) format(MSG, node.loc.expression.source) end
def not?(node)
def not?(node) return false unless node && node.type == :send _receiver, method_name, *_args = *node method_name == :! end
def on_case(node)
def on_case(node) cond, *whens, _else = *node if cond check_case_cond(cond) else whens.each do |when_node| check_for_literal(when_node) end end end
def on_if(node)
def on_if(node) check_for_literal(node) end
def on_until(node)
def on_until(node) check_for_literal(node) end
def on_until_post(node)
def on_until_post(node) check_for_literal(node) end
def on_while(node)
def on_while(node) check_for_literal(node) end
def on_while_post(node)
def on_while_post(node) check_for_literal(node) end
def primitive_array?(node)
def primitive_array?(node) node.children.all? { |n| basic_literal?(n) } end