[clang-tools-extra] c5b1a03 - [clang-tidy] In TransformerClangTidyCheck, support option IncludeStyle.
Yitzhak Mandelbaum via cfe-commits
cfe-commits at lists.llvm.org
Tue May 5 07:47:27 PDT 2020
Author: Yitzhak Mandelbaum
Date: 2020-05-05T10:38:31-04:00
New Revision: c5b1a0352535e138af867f7b63cf5b4793fd6de7
URL: https://github.com/llvm/llvm-project/commit/c5b1a0352535e138af867f7b63cf5b4793fd6de7
DIFF: https://github.com/llvm/llvm-project/commit/c5b1a0352535e138af867f7b63cf5b4793fd6de7.diff
LOG: [clang-tidy] In TransformerClangTidyCheck, support option IncludeStyle.
Summary:
The new option allows the user to specify which file naming convention is used
by the source code ('llvm' or 'google').
Reviewers: gribozavr2
Subscribers: xazax.hun, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D79380
Added:
Modified:
clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
index 821c6290fe01..3f7edd659c63 100644
--- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
@@ -30,7 +30,10 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(
const OptionsView &)>
MakeRule,
StringRef Name, ClangTidyContext *Context)
- : ClangTidyCheck(Name, Context), Rule(MakeRule(getLangOpts(), Options)) {
+ : ClangTidyCheck(Name, Context), Rule(MakeRule(getLangOpts(), Options)),
+ IncludeStyle(Options.getLocalOrGlobal("IncludeStyle",
+ IncludeSorter::getMapping(),
+ IncludeSorter::IS_LLVM)) {
if (Rule)
assert(llvm::all_of(Rule->Cases, hasExplanation) &&
"clang-tidy checks must have an explanation by default;"
@@ -40,7 +43,10 @@ TransformerClangTidyCheck::TransformerClangTidyCheck(
TransformerClangTidyCheck::TransformerClangTidyCheck(RewriteRule R,
StringRef Name,
ClangTidyContext *Context)
- : ClangTidyCheck(Name, Context), Rule(std::move(R)) {
+ : ClangTidyCheck(Name, Context), Rule(std::move(R)),
+ IncludeStyle(Options.getLocalOrGlobal("IncludeStyle",
+ IncludeSorter::getMapping(),
+ IncludeSorter::IS_LLVM)) {
assert(llvm::all_of(Rule->Cases, hasExplanation) &&
"clang-tidy checks must have an explanation by default;"
" explicitly provide an empty explanation if none is desired");
@@ -53,8 +59,8 @@ void TransformerClangTidyCheck::registerPPCallbacks(
if (Rule && llvm::any_of(Rule->Cases, [](const RewriteRule::Case &C) {
return !C.AddedIncludes.empty();
})) {
- Inserter = std::make_unique<IncludeInserter>(
- SM, getLangOpts(), utils::IncludeSorter::IS_LLVM);
+ Inserter =
+ std::make_unique<IncludeInserter>(SM, getLangOpts(), IncludeStyle);
PP->addPPCallbacks(Inserter->CreatePPCallbacks());
}
}
diff --git a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
index e411a3f6f0f5..796222373eb5 100644
--- a/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
+++ b/clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
@@ -10,7 +10,8 @@
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H
#include "../ClangTidy.h"
-#include "../utils/IncludeInserter.h"
+#include "IncludeInserter.h"
+#include "IncludeSorter.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Tooling/Transformer/Transformer.h"
@@ -31,6 +32,13 @@ namespace utils {
// MyCheck(StringRef Name, ClangTidyContext *Context)
// : TransformerClangTidyCheck(MyCheckAsRewriteRule, Name, Context) {}
// };
+//
+// `TransformerClangTidyCheck` recognizes this clang-tidy option:
+//
+// * IncludeStyle. A string specifying which file naming convention is used by
+// the source code, 'llvm' or 'google'. Default is 'llvm'. The naming
+// convention influences how canonical headers are distinguished from other
+// includes.
class TransformerClangTidyCheck : public ClangTidyCheck {
public:
// \p MakeRule generates the rewrite rule to be used by the check, based on
@@ -61,7 +69,8 @@ class TransformerClangTidyCheck : public ClangTidyCheck {
private:
Optional<transformer::RewriteRule> Rule;
- std::unique_ptr<clang::tidy::utils::IncludeInserter> Inserter;
+ const IncludeSorter::IncludeStyle IncludeStyle;
+ std::unique_ptr<IncludeInserter> Inserter;
};
} // namespace utils
diff --git a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
index ebf5f59ce4a6..76de7711cee9 100644
--- a/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
+++ b/clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
@@ -221,6 +221,84 @@ TEST(TransformerClangTidyCheckTest, AddIncludeAngled) {
test::runCheckOnCode<IncludeCheck<IncludeFormat::Angled>>(Input));
}
+class IncludeOrderCheck : public TransformerClangTidyCheck {
+ static RewriteRule rule() {
+ using namespace ::clang::ast_matchers;
+ RewriteRule Rule = transformer::makeRule(integerLiteral(), change(cat("5")),
+ cat("no message"));
+ addInclude(Rule, "bar.h", IncludeFormat::Quoted);
+ return Rule;
+ }
+
+public:
+ IncludeOrderCheck(StringRef Name, ClangTidyContext *Context)
+ : TransformerClangTidyCheck(rule(), Name, Context) {}
+};
+
+TEST(TransformerClangTidyCheckTest, AddIncludeObeysSortStyleLocalOption) {
+ std::string Input = R"cc(#include "input.h"
+int h(int x) { return 3; })cc";
+
+ std::string TreatsAsLibraryHeader = R"cc(#include "input.h"
+
+#include "bar.h"
+int h(int x) { return 5; })cc";
+
+ std::string TreatsAsNormalHeader = R"cc(#include "bar.h"
+#include "input.h"
+int h(int x) { return 5; })cc";
+
+ ClangTidyOptions Options;
+ std::map<StringRef, StringRef> PathsToContent = {{"input.h", "\n"}};
+ Options.CheckOptions["test-check-0.IncludeStyle"] = "llvm";
+ EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "inputTest.cpp", None,
+ Options, PathsToContent));
+ EXPECT_EQ(TreatsAsNormalHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "input_test.cpp", None,
+ Options, PathsToContent));
+
+ Options.CheckOptions["test-check-0.IncludeStyle"] = "google";
+ EXPECT_EQ(TreatsAsNormalHeader,
+ test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "inputTest.cc", None, Options, PathsToContent));
+ EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "input_test.cc", None,
+ Options, PathsToContent));
+}
+
+TEST(TransformerClangTidyCheckTest, AddIncludeObeysSortStyleGlobalOption) {
+ std::string Input = R"cc(#include "input.h"
+int h(int x) { return 3; })cc";
+
+ std::string TreatsAsLibraryHeader = R"cc(#include "input.h"
+
+#include "bar.h"
+int h(int x) { return 5; })cc";
+
+ std::string TreatsAsNormalHeader = R"cc(#include "bar.h"
+#include "input.h"
+int h(int x) { return 5; })cc";
+
+ ClangTidyOptions Options;
+ std::map<StringRef, StringRef> PathsToContent = {{"input.h", "\n"}};
+ Options.CheckOptions["IncludeStyle"] = "llvm";
+ EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "inputTest.cpp", None,
+ Options, PathsToContent));
+ EXPECT_EQ(TreatsAsNormalHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "input_test.cpp", None,
+ Options, PathsToContent));
+
+ Options.CheckOptions["IncludeStyle"] = "google";
+ EXPECT_EQ(TreatsAsNormalHeader,
+ test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "inputTest.cc", None, Options, PathsToContent));
+ EXPECT_EQ(TreatsAsLibraryHeader, test::runCheckOnCode<IncludeOrderCheck>(
+ Input, nullptr, "input_test.cc", None,
+ Options, PathsToContent));
+}
+
} // namespace
} // namespace utils
} // namespace tidy
More information about the cfe-commits
mailing list