diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils')
4 files changed, 34 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.cpp b/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.cpp index 557f119b5d4..7c1fef9696a 100644 --- a/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.cpp +++ b/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.cpp @@ -61,6 +61,15 @@ bool parseHeaderFileExtensions(StringRef AllHeaderFileExtensions, 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 diff --git a/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.h b/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.h index 70bdc812091..e0457a8b068 100644 --- a/clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.h +++ b/clang-tools-extra/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 @@ bool parseHeaderFileExtensions(StringRef AllHeaderFileExtensions, 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 diff --git a/clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp b/clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp index 6eb241cbd42..acd63d3b0ad 100644 --- a/clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp +++ b/clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp @@ -20,7 +20,7 @@ namespace utils { /// \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 @@ void HeaderGuardCheck::registerPPCallbacks(CompilerInstance &Compiler) { } 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) { diff --git a/clang-tools-extra/clang-tidy/utils/HeaderGuard.h b/clang-tools-extra/clang-tidy/utils/HeaderGuard.h index cb88f083e3f..c90a3127b90 100644 --- a/clang-tools-extra/clang-tidy/utils/HeaderGuard.h +++ b/clang-tools-extra/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 @@ public: /// 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 |

