//===--- ClangTidyCheck.h - clang-tidy --------------------------*- C++ -*-===// // // 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_CLANGTIDYCHECK_H #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYCHECK_H #include "ClangTidyDiagnosticConsumer.h" #include "ClangTidyOptions.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Basic/Diagnostic.h" #include <optional> #include <type_traits> #include <utility> #include <vector> namespace clang { class SourceManager; namespace tidy { /// This class should be specialized by any enum type that needs to be converted /// to and from an \ref llvm::StringRef. template <class T> struct OptionEnumMapping { … }; /// Base class for all clang-tidy checks. /// /// To implement a ``ClangTidyCheck``, write a subclass and override some of the /// base class's methods. E.g. to implement a check that validates namespace /// declarations, override ``registerMatchers``: /// /// ~~~{.cpp} /// void registerMatchers(ast_matchers::MatchFinder *Finder) override { /// Finder->addMatcher(namespaceDecl().bind("namespace"), this); /// } /// ~~~ /// /// and then override ``check(const MatchResult &Result)`` to do the actual /// check for each match. /// /// A new ``ClangTidyCheck`` instance is created per translation unit. /// /// FIXME: Figure out whether carrying information from one TU to another is /// useful/necessary. class ClangTidyCheck : public ast_matchers::MatchFinder::MatchCallback { … }; /// Read a named option from the ``Context`` and parse it as a bool. /// /// Reads the option with the check-local name \p LocalName from the /// ``CheckOptions``. If the corresponding key is not present, return /// ``std::nullopt``. /// /// If the corresponding key can't be parsed as a bool, emit a /// diagnostic and return ``std::nullopt``. template <> std::optional<bool> ClangTidyCheck::OptionsView::get<bool>(StringRef LocalName) const; /// Read a named option from the ``Context`` and parse it as a bool. /// /// Reads the option with the check-local name \p LocalName from the /// ``CheckOptions``. If the corresponding key is not present, return /// \p Default. /// /// If the corresponding key can't be parsed as a bool, emit a /// diagnostic and return \p Default. template <> std::optional<bool> ClangTidyCheck::OptionsView::getLocalOrGlobal<bool>(StringRef LocalName) const; /// Stores an option with the check-local name \p LocalName with /// bool value \p Value to \p Options. template <> void ClangTidyCheck::OptionsView::store<bool>( ClangTidyOptions::OptionMap &Options, StringRef LocalName, bool Value) const; } // namespace tidy } // namespace clang #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CLANGTIDYCHECK_H