class RuboCop::Cop::Lint::RequireParentheses

end

if day.is? :tuesday && month == :jan
@example
an operand of &&/||.
be under the impression that the return value from the method call is
The idea behind warning for these constructs is that the user might
last argument.
the parameter list, and a boolean operator, && or ||, is used in the
method with at least one argument, where no parentheses are used around
This cop checks for expressions where there is a call to a predicate

def check_send(arg, node)

def check_send(arg, node)
  add_offense(node, :expression) if offense?(arg)
end

def check_ternary(arg, node)

def check_ternary(arg, node)
  condition, = *arg
  return unless offense?(condition)
  expr = node.source_range
  range = Parser::Source::Range.new(expr.source_buffer,
                                    expr.begin_pos,
                                    condition.source_range.end_pos)
  add_offense(range, range)
end

def offense?(node)

def offense?(node)
  [:and, :or].include?(node.type)
end

def on_send(node)

def on_send(node)
  _receiver, method_name, *args = *node
  return if parentheses?(node)
  return if args.empty?
  if ternary?(args.first)
    check_ternary(args.first, node)
  elsif predicate?(method_name)
    # We're only checking predicate methods. There would be false
    # positives otherwise.
    check_send(args.last, node)
  end
end

def predicate?(method_name)

def predicate?(method_name)
  method_name.to_s.end_with?('?')
end