//===--- CleanupCtadCheck.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 "CleanupCtadCheck.h"
#include "../utils/TransformerClangTidyCheck.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/Tooling/Transformer/RangeSelector.h"
#include "clang/Tooling/Transformer/RewriteRule.h"
#include "clang/Tooling/Transformer/Stencil.h"
#include "llvm/ADT/StringRef.h"

using namespace ::clang::ast_matchers;
using namespace ::clang::transformer;

namespace clang {
namespace tidy {
namespace abseil {

RewriteRule CleanupCtadCheckImpl() {
  auto warning_message = cat("prefer absl::Cleanup's class template argument "
                             "deduction pattern in C++17 and higher");

  return makeRule(
      declStmt(has(varDecl(
          hasType(autoType()), hasTypeLoc(typeLoc().bind("auto_type_loc")),
          hasInitializer(traverse(
              clang::TK_IgnoreUnlessSpelledInSource,
              callExpr(callee(functionDecl(hasName("absl::MakeCleanup"))),
                       argumentCountIs(1),
                       hasArgument(0, expr().bind("make_cleanup_argument")))
                  .bind("make_cleanup_call")))))),
      {changeTo(node("auto_type_loc"), cat("absl::Cleanup")),
       changeTo(node("make_cleanup_call"), cat(node("make_cleanup_argument")))},
      warning_message);
}

CleanupCtadCheck::CleanupCtadCheck(StringRef Name, ClangTidyContext *Context)
    : utils::TransformerClangTidyCheck(CleanupCtadCheckImpl(), Name, Context) {}

} // namespace abseil
} // namespace tidy
} // namespace clang
