1 //===--- HeaderGuard.h - clang-tidy -----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARD_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARD_H
11 
12 #include "../ClangTidyCheck.h"
13 #include "../utils/FileExtensionsUtils.h"
14 
15 namespace clang::tidy::utils {
16 
17 /// Finds and fixes header guards.
18 class HeaderGuardCheck : public ClangTidyCheck {
19 public:
HeaderGuardCheck(StringRef Name,ClangTidyContext * Context)20   HeaderGuardCheck(StringRef Name, ClangTidyContext *Context)
21       : ClangTidyCheck(Name, Context),
22         HeaderFileExtensions(Context->getHeaderFileExtensions()) {}
23 
24   void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
25                            Preprocessor *ModuleExpanderPP) override;
26 
27   /// Ensure that the provided header guard is a non-reserved identifier.
28   std::string sanitizeHeaderGuard(StringRef Guard);
29 
30   /// Returns ``true`` if the check should suggest inserting a trailing comment
31   /// on the ``#endif`` of the header guard. It will use the same name as
32   /// returned by ``HeaderGuardCheck::getHeaderGuard``.
33   virtual bool shouldSuggestEndifComment(StringRef Filename);
34   /// Returns ``true`` if the check should suggest changing an existing header
35   /// guard to the string returned by ``HeaderGuardCheck::getHeaderGuard``.
36   virtual bool shouldFixHeaderGuard(StringRef Filename);
37   /// Returns ``true`` if the check should add a header guard to the file
38   /// if it has none.
39   virtual bool shouldSuggestToAddHeaderGuard(StringRef Filename);
40   /// Returns a replacement for the ``#endif`` line with a comment mentioning
41   /// \p HeaderGuard. The replacement should start with ``endif``.
42   virtual std::string formatEndIf(StringRef HeaderGuard);
43   /// Gets the canonical header guard for a file.
44   virtual std::string getHeaderGuard(StringRef Filename,
45                                      StringRef OldGuard = StringRef()) = 0;
46 
47 private:
48   FileExtensionsSet HeaderFileExtensions;
49 };
50 
51 } // namespace clang::tidy::utils
52 
53 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARD_H
54