Index: clang-tidy/llvm/HeaderGuardCheck.h =================================================================== --- clang-tidy/llvm/HeaderGuardCheck.h +++ clang-tidy/llvm/HeaderGuardCheck.h @@ -17,13 +17,27 @@ namespace llvm { /// Finds and fixes header guards that do not adhere to LLVM style. +/// The check supports these options: +/// - `HeaderFileExtensions`: a comma-separated list of filename extensions of +/// header files (The filename extension should not contain "." prefix). +/// ",h,hh,hpp,hxx" by default. +/// For extension-less header files, using an empty string or leaving an +/// empty string between "," if there are other filename extensions. class LLVMHeaderGuardCheck : public utils::HeaderGuardCheck { public: LLVMHeaderGuardCheck(StringRef Name, ClangTidyContext *Context) - : HeaderGuardCheck(Name, Context) {} + : HeaderGuardCheck(Name, Context), RawStringHeaderFileExtensions( + Options.getLocalOrGlobal("HeaderFileExtensions", ",h,hh,hpp,hxx")) { + utils::parseHeaderFileExtensions(RawStringHeaderFileExtensions, + HeaderFileExtensions, + ','); + } bool shouldSuggestEndifComment(StringRef Filename) override { return false; } bool shouldFixHeaderGuard(StringRef Filename) override; std::string getHeaderGuard(StringRef Filename, StringRef OldGuard) override; +private: + std::string RawStringHeaderFileExtensions; + utils::HeaderFileExtensionsSet HeaderFileExtensions; }; } // namespace llvm Index: clang-tidy/llvm/HeaderGuardCheck.cpp =================================================================== --- clang-tidy/llvm/HeaderGuardCheck.cpp +++ clang-tidy/llvm/HeaderGuardCheck.cpp @@ -14,7 +14,15 @@ namespace llvm { bool LLVMHeaderGuardCheck::shouldFixHeaderGuard(StringRef Filename) { - return Filename.endswith(".h"); + StringRef extension = ::llvm::sys::path::extension(Filename); + if (extension.size() > 0 && extension.front() == '.') { + extension = extension.substr(1); + } + + if (HeaderFileExtensions.count(extension)) + return true; + + return false; } std::string LLVMHeaderGuardCheck::getHeaderGuard(StringRef Filename, Index: clang-tidy/utils/HeaderFileExtensionsUtils.h =================================================================== --- clang-tidy/utils/HeaderFileExtensionsUtils.h +++ clang-tidy/utils/HeaderFileExtensionsUtils.h @@ -41,6 +41,10 @@ HeaderFileExtensionsSet &HeaderFileExtensions, char delimiter); +/// \brief Decides whether a file has a header file extension +bool isHeaderFileExtension(StringRef FileName, + HeaderFileExtensionsSet HeaderFileExtensions); + } // namespace utils } // namespace tidy } // namespace clang Index: clang-tidy/utils/HeaderFileExtensionsUtils.cpp =================================================================== --- clang-tidy/utils/HeaderFileExtensionsUtils.cpp +++ clang-tidy/utils/HeaderFileExtensionsUtils.cpp @@ -61,6 +61,17 @@ return true; } +bool isHeaderFileExtension(StringRef FileName, HeaderFileExtensionsSet HeaderFileExtensions) { + StringRef extension = ::llvm::sys::path::extension(FileName); + if (extension.size() > 0 && extension.front() == '.') { + extension = extension.substr(1); + } + if (HeaderFileExtensions.count(extension)) + return true; + + return false; +} + } // namespace utils } // namespace tidy } // namespace clang Index: clang-tidy/utils/HeaderGuard.h =================================================================== --- clang-tidy/utils/HeaderGuard.h +++ clang-tidy/utils/HeaderGuard.h @@ -11,16 +11,29 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARD_H #include "../ClangTidy.h" +#include "../utils/HeaderFileExtensionsUtils.h" +#include "llvm/Support/Path.h" namespace clang { namespace tidy { namespace utils { /// Finds and fixes header guards. +/// The check supports these options: +/// - `HeaderFileExtensions`: a comma-separated list of filename extensions of +/// header files (The filename extension should not contain "." prefix). +/// ",h,hh,hpp,hxx" by default. +/// For extension-less header files, using an empty string or leaving an +/// empty string between "," if there are other filename extensions. class HeaderGuardCheck : public ClangTidyCheck { public: HeaderGuardCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + : ClangTidyCheck(Name, Context), + RawStringHeaderFileExtensions( + Options.getLocalOrGlobal("HeaderFileExtensions", ",h,hh,hpp,hxx")) { + utils::parseHeaderFileExtensions(RawStringHeaderFileExtensions, + HeaderFileExtensions, ','); + } void registerPPCallbacks(CompilerInstance &Compiler) override; /// \brief Returns true if the checker should suggest inserting a trailing @@ -39,6 +52,9 @@ /// \brief Get the canonical header guard for a file. virtual std::string getHeaderGuard(StringRef Filename, StringRef OldGuard = StringRef()) = 0; +private: + utils::HeaderFileExtensionsSet HeaderFileExtensions; + std::string RawStringHeaderFileExtensions; }; } // namespace utils Index: clang-tidy/utils/HeaderGuard.cpp =================================================================== --- clang-tidy/utils/HeaderGuard.cpp +++ clang-tidy/utils/HeaderGuard.cpp @@ -274,13 +274,13 @@ } bool HeaderGuardCheck::shouldSuggestEndifComment(StringRef FileName) { - return FileName.endswith(".h"); + return utils::isHeaderFileExtension(FileName, HeaderFileExtensions); } bool HeaderGuardCheck::shouldFixHeaderGuard(StringRef FileName) { return true; } bool HeaderGuardCheck::shouldSuggestToAddHeaderGuard(StringRef FileName) { - return FileName.endswith(".h"); + return utils::isHeaderFileExtension(FileName, HeaderFileExtensions); } std::string HeaderGuardCheck::formatEndIf(StringRef HeaderGuard) {