//===---------- TransformerClangTidyCheck.h - 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
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H

#include "../ClangTidyCheck.h"
#include "IncludeInserter.h"
#include "IncludeSorter.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Tooling/Transformer/Transformer.h"
#include <optional>

namespace clang::tidy::utils {

/// A base class for defining a ClangTidy check based on a `RewriteRule`.
//
// For example, given a rule `MyCheckAsRewriteRule`, one can define a tidy check
// as follows:
//
// class MyCheck : public TransformerClangTidyCheck {
//  public:
//   MyCheck(StringRef Name, ClangTidyContext *Context)
//       : TransformerClangTidyCheck(MyCheckAsRewriteRule, Name, Context) {}
// };
//
// `TransformerClangTidyCheck` recognizes this clang-tidy option:
//
//  * IncludeStyle. A string specifying which file naming convention is used by
//      the source code, 'llvm' or 'google'.  Default is 'llvm'. The naming
//      convention influences how canonical headers are distinguished from other
//      includes.
class TransformerClangTidyCheck : public ClangTidyCheck {
public:
  TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context);

  /// DEPRECATED: prefer the two argument constructor in conjunction with
  /// \c setRule.
  ///
  /// \p MakeRule generates the rewrite rule to be used by the check, based on
  /// the given language and clang-tidy options. It can return \c std::nullopt
  /// to handle cases where the options disable the check.
  ///
  /// See \c setRule for constraints on the rule.
  TransformerClangTidyCheck(
      std::function<std::optional<transformer::RewriteRuleWith<std::string>>(
          const LangOptions &, const OptionsView &)>
          MakeRule,
      StringRef Name, ClangTidyContext *Context);

  /// Convenience overload of the constructor when the rule doesn't have any
  /// dependencies.
  TransformerClangTidyCheck(transformer::RewriteRuleWith<std::string> R,
                            StringRef Name, ClangTidyContext *Context);

  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
                           Preprocessor *ModuleExpanderPP) override;
  void registerMatchers(ast_matchers::MatchFinder *Finder) final;
  void check(const ast_matchers::MatchFinder::MatchResult &Result) final;

  /// Derived classes that override this function should call this method from
  /// the overridden method.
  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;

  /// Set the rule that this check implements.  All cases in the rule must have
  /// a non-null \c Explanation, even though \c Explanation is optional for
  /// RewriteRule in general. Because the primary purpose of clang-tidy checks
  /// is to provide users with diagnostics, we assume that a missing explanation
  /// is a bug.  If no explanation is desired, indicate that explicitly (for
  /// example, by passing `text("no explanation")` to `makeRule` as the
  /// `Explanation` argument).
  void setRule(transformer::RewriteRuleWith<std::string> R);

private:
  transformer::RewriteRuleWith<std::string> Rule;
  IncludeInserter Inserter;
};

} // namespace clang::tidy::utils

#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H
