summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp4
-rw-r--r--clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h19
-rw-r--r--clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.cpp9
-rw-r--r--clang-tools-extra/clang-tidy/utils/HeaderFileExtensionsUtils.h6
-rw-r--r--clang-tools-extra/clang-tidy/utils/HeaderGuard.cpp6
-rw-r--r--clang-tools-extra/clang-tidy/utils/HeaderGuard.h18
-rw-r--r--clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst9
7 files changed, 62 insertions, 9 deletions
diff --git a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
index c44abbd9b5a..f0984b0e8c6 100644
--- a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
+++ b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp
@@ -13,8 +13,8 @@ namespace clang {
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,
diff --git a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
index f13dd5b1e99..76aaf5f56c7 100644
--- a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
+++ b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.h
@@ -17,13 +17,30 @@ namespace tidy {
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
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
diff --git a/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst b/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst
index 1643dfaba50..dacaeefdf2c 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/llvm-header-guard.rst
+++ b/clang-tools-extra/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.
OpenPOWER on IntegriCloud