//===--- IntegerDivisionCheck.cpp - clang-tidy-----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "IntegerDivisionCheck.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"

using namespace clang::ast_matchers;

namespace clang {
namespace tidy {
namespace bugprone {

void IntegerDivisionCheck::registerMatchers(MatchFinder *Finder) {
  const auto IntType = hasType(isInteger());

  const auto BinaryOperators = binaryOperator(anyOf(
      hasOperatorName("%"), hasOperatorName("<<"), hasOperatorName(">>"),
      hasOperatorName("<<"), hasOperatorName("^"), hasOperatorName("|"),
      hasOperatorName("&"), hasOperatorName("||"), hasOperatorName("&&"),
      hasOperatorName("<"), hasOperatorName(">"), hasOperatorName("<="),
      hasOperatorName(">="), hasOperatorName("=="), hasOperatorName("!=")));

  const auto UnaryOperators =
      unaryOperator(anyOf(hasOperatorName("~"), hasOperatorName("!")));

  const auto Exceptions =
      anyOf(BinaryOperators, conditionalOperator(), binaryConditionalOperator(),
            callExpr(IntType), explicitCastExpr(IntType), UnaryOperators);

  Finder->addMatcher(
      binaryOperator(
          hasOperatorName("/"), hasLHS(expr(IntType)), hasRHS(expr(IntType)),
          hasAncestor(
              castExpr(hasCastKind(CK_IntegralToFloating)).bind("FloatCast")),
          unless(hasAncestor(
              expr(Exceptions,
                   hasAncestor(castExpr(equalsBoundNode("FloatCast")))))))
          .bind("IntDiv"),
      this);
}

void IntegerDivisionCheck::check(const MatchFinder::MatchResult &Result) {
  const auto *IntDiv = Result.Nodes.getNodeAs<BinaryOperator>("IntDiv");
  diag(IntDiv->getBeginLoc(), "result of integer division used in a floating "
                              "point context; possible loss of precision");
}

} // namespace bugprone
} // namespace tidy
} // namespace clang
