summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMads Ravn <madsravn@gmail.com>2016-08-26 05:59:53 +0000
committerMads Ravn <madsravn@gmail.com>2016-08-26 05:59:53 +0000
commit041b804a9f0097953d3767196fc539d2940ecde4 (patch)
tree8fd5ac3848d1bc4a221946a2bbf6e9968c4e48a9
parent510911f7bd7406ec7cd3b4d32349537f5448e578 (diff)
downloadbcm5719-llvm-041b804a9f0097953d3767196fc539d2940ecde4.tar.gz
bcm5719-llvm-041b804a9f0097953d3767196fc539d2940ecde4.zip
[clang-tidy] Added hh, hxx and hpp to header guard checks.
Changed the extension check to include the option of ",h,hh,hpp,hxx" instead of just returning whether the file ended with ".h". Differential revision: https://reviews.llvm.org/D20512 llvm-svn: 279803
-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