Index: clang-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.h +++ clang-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.h @@ -17,13 +17,30 @@ namespace llvm { /// Finds and fixes header guards that do not adhere to LLVM style. +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/llvm-header-guard.html +/// 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-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/llvm/HeaderGuardCheck.cpp @@ -13,8 +13,8 @@ namespace tidy { namespace llvm { -bool LLVMHeaderGuardCheck::shouldFixHeaderGuard(StringRef Filename) { - return Filename.endswith(".h"); +bool LLVMHeaderGuardCheck::shouldFixHeaderGuard(StringRef FileName) { + return utils::isHeaderFileExtension(FileName, HeaderFileExtensions); } std::string LLVMHeaderGuardCheck::getHeaderGuard(StringRef Filename, Index: clang-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.h +++ clang-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.h @@ -12,8 +12,8 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/SmallSet.h" +#include "llvm/ADT/StringRef.h" namespace clang { namespace tidy { @@ -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-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.cpp +++ clang-tools-extra/trunk/clang-tidy/utils/HeaderFileExtensionsUtils.cpp @@ -61,6 +61,15 @@ return true; } +bool isHeaderFileExtension(StringRef FileName, + HeaderFileExtensionsSet HeaderFileExtensions) { + StringRef extension = ::llvm::sys::path::extension(FileName); + if (extension.startswith(".")) + extension = extension.substr(1); + + return HeaderFileExtensions.count(extension) > 0; +} + } // namespace utils } // namespace tidy } // namespace clang Index: clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.h +++ clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.h @@ -11,16 +11,28 @@ #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_HEADERGUARD_H #include "../ClangTidy.h" +#include "../utils/HeaderFileExtensionsUtils.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; /// Returns ``true`` if the check should suggest inserting a trailing comment @@ -39,6 +51,10 @@ /// Gets the canonical header guard for a file. virtual std::string getHeaderGuard(StringRef Filename, StringRef OldGuard = StringRef()) = 0; + +private: + std::string RawStringHeaderFileExtensions; + utils::HeaderFileExtensionsSet HeaderFileExtensions; }; } // namespace utils Index: clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.cpp +++ clang-tools-extra/trunk/clang-tidy/utils/HeaderGuard.cpp @@ -20,7 +20,7 @@ /// \brief canonicalize a path by removing ./ and ../ components. static std::string cleanPath(StringRef Path) { - SmallString<256> Result = Path; + SmallString<256> Result = Path; llvm::sys::path::remove_dots(Result, true); return Result.str(); } @@ -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) { Index: clang-tools-extra/trunk/docs/clang-tidy/checks/llvm-header-guard.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/llvm-header-guard.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/llvm-header-guard.rst @@ -3,4 +3,11 @@ llvm-header-guard ================= -TODO: add docs +Finds and fixes header guards that do not adhere to LLVM style. + +Options +------- + +.. option:: HeaderFileExtensions + + A comma-separated list of filename extensions of header files (The filename extension should not contain "." prefix). Default value is ",h,hh,hpp,hxx". For extension-less header files, using an empty string or leaving an empty string between "," if there are other filename extensions.