aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clang-tidy/utils
diff options
context:
space:
mode:
authorJonathan Roelofs <jroelofs@jroelofs.com>2020-03-04 09:55:45 -0700
committerJonathan Roelofs <jroelofs@jroelofs.com>2020-03-09 15:54:32 -0600
commit1e0669bfe05f0f48ee88152c4a1d581f484f8d67 (patch)
tree7f93624f9b5f1e55d6b474a5860180b632c872ad /clang-tools-extra/clang-tidy/utils
parent6309334b9574017523f73648da879fa5e6ef017a (diff)
downloadllvm-1e0669bfe05f0f48ee88152c4a1d581f484f8d67.zip
llvm-1e0669bfe05f0f48ee88152c4a1d581f484f8d67.tar.gz
llvm-1e0669bfe05f0f48ee88152c4a1d581f484f8d67.tar.bz2
[clang-tidy] New check: bugprone-suspicious-include
Detects and fixes suspicious code like: `#include "foo.cpp"`. Inspired by: https://twitter.com/lefticus/status/1228458240364687360?s=20 https://reviews.llvm.org/D74669
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils')
-rw-r--r--clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.cpp15
-rw-r--r--clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.h12
2 files changed, 23 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.cpp b/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.cpp
index d6f4b2a..4eaf8bc 100644
--- a/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.cpp
+++ b/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.cpp
@@ -53,13 +53,20 @@ bool parseFileExtensions(StringRef AllFileExtensions,
return true;
}
-bool isFileExtension(StringRef FileName,
- const FileExtensionsSet &FileExtensions) {
+llvm::Optional<StringRef>
+getFileExtension(StringRef FileName, const FileExtensionsSet &FileExtensions) {
StringRef Extension = llvm::sys::path::extension(FileName);
if (Extension.empty())
- return false;
+ return llvm::None;
// Skip "." prefix.
- return FileExtensions.count(Extension.substr(1)) > 0;
+ if (!FileExtensions.count(Extension.substr(1)))
+ return llvm::None;
+ return Extension;
+}
+
+bool isFileExtension(StringRef FileName,
+ const FileExtensionsSet &FileExtensions) {
+ return getFileExtension(FileName, FileExtensions).hasValue();
}
} // namespace utils
diff --git a/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.h b/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.h
index 43fc573..e5dfae1 100644
--- a/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.h
+++ b/clang-tools-extra/clang-tidy/utils/FileExtensionsUtils.h
@@ -11,6 +11,7 @@
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
+#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringRef.h"
@@ -36,6 +37,12 @@ bool isSpellingLocInHeaderFile(SourceLocation Loc, SourceManager &SM,
/// extensions.
inline StringRef defaultHeaderFileExtensions() { return ";h;hh;hpp;hxx"; }
+/// Returns recommended default value for the list of implementaiton file
+/// extensions.
+inline StringRef defaultImplementationFileExtensions() {
+ return "c;cc;cpp;cxx";
+}
+
/// Returns recommended default value for the list of file extension
/// delimiters.
inline StringRef defaultFileExtensionDelimiters() { return ",;"; }
@@ -45,6 +52,11 @@ bool parseFileExtensions(StringRef AllFileExtensions,
FileExtensionsSet &FileExtensions,
StringRef Delimiters);
+/// Decides whether a file has a header file extension.
+/// Returns the file extension, if included in the provided set.
+llvm::Optional<StringRef>
+getFileExtension(StringRef FileName, const FileExtensionsSet &FileExtensions);
+
/// Decides whether a file has one of the specified file extensions.
bool isFileExtension(StringRef FileName,
const FileExtensionsSet &FileExtensions);