xref: /llvm-project/clang-tools-extra/clang-tidy/cppcoreguidelines/MacroUsageCheck.h (revision 4718da506091a37ca4863d979bc541e359b79b10)
1552b62edSJonas Toth //===--- MacroUsageCheck.h - clang-tidy--------------------------*- C++ -*-===//
2552b62edSJonas Toth //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6552b62edSJonas Toth //
7552b62edSJonas Toth //===----------------------------------------------------------------------===//
8552b62edSJonas Toth 
9552b62edSJonas Toth #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_MACROUSAGECHECK_H
10552b62edSJonas Toth #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_MACROUSAGECHECK_H
11552b62edSJonas Toth 
12860aefd0SNathan James #include "../ClangTidyCheck.h"
13860aefd0SNathan James #include "clang/Lex/MacroInfo.h"
14552b62edSJonas Toth #include <string>
15552b62edSJonas Toth 
16552b62edSJonas Toth namespace clang {
17860aefd0SNathan James class MacroDirective;
18*4718da50SCarlos Galvez namespace tidy::cppcoreguidelines {
19552b62edSJonas Toth 
20552b62edSJonas Toth /// Find macro usage that is considered problematic because better language
21552b62edSJonas Toth /// constructs exist for the task.
22552b62edSJonas Toth ///
23552b62edSJonas Toth /// For the user-facing documentation see:
246e566bc5SRichard /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines/macro-usage.html
25552b62edSJonas Toth class MacroUsageCheck : public ClangTidyCheck {
26552b62edSJonas Toth public:
MacroUsageCheck(StringRef Name,ClangTidyContext * Context)27552b62edSJonas Toth   MacroUsageCheck(StringRef Name, ClangTidyContext *Context)
28552b62edSJonas Toth       : ClangTidyCheck(Name, Context),
29552b62edSJonas Toth         AllowedRegexp(Options.get("AllowedRegexp", "^DEBUG_*")),
30672207c3SNathan James         CheckCapsOnly(Options.get("CheckCapsOnly", false)),
31672207c3SNathan James         IgnoreCommandLineMacros(Options.get("IgnoreCommandLineMacros", true)) {}
isLanguageVersionSupported(const LangOptions & LangOpts)32e40a742aSNathan James   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
33e40a742aSNathan James     return LangOpts.CPlusPlus11;
34e40a742aSNathan James   }
35552b62edSJonas Toth   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
36b6c4db99SAlexander Kornienko   void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
37b6c4db99SAlexander Kornienko                            Preprocessor *ModuleExpanderPP) override;
38c367ba19SRoman Lebedev   void warnMacro(const MacroDirective *MD, StringRef MacroName);
39c367ba19SRoman Lebedev   void warnNaming(const MacroDirective *MD, StringRef MacroName);
40552b62edSJonas Toth 
41552b62edSJonas Toth private:
42552b62edSJonas Toth   /// A regular expression that defines how allowed macros must look like.
43552b62edSJonas Toth   std::string AllowedRegexp;
44552b62edSJonas Toth   /// Control if only the check shall only test on CAPS_ONLY macros.
45552b62edSJonas Toth   bool CheckCapsOnly;
46c367ba19SRoman Lebedev   /// Should the macros without a valid location be diagnosed?
47c367ba19SRoman Lebedev   bool IgnoreCommandLineMacros;
48552b62edSJonas Toth };
49552b62edSJonas Toth 
50*4718da50SCarlos Galvez } // namespace tidy::cppcoreguidelines
51552b62edSJonas Toth } // namespace clang
52552b62edSJonas Toth 
53552b62edSJonas Toth #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_MACROUSAGECHECK_H
54