njames93 created this revision.
Herald added subscribers: carlosgalvezp, usaxena95, kadircet, arphaman, 
kbarton, xazax.hun, mgorny, nemanjai.
Eugene.Zelenko added reviewers: aaron.ballman, LegalizeAdulthood.
Eugene.Zelenko added a project: clang-tools-extra.
njames93 updated this revision to Diff 400365.
njames93 added a comment.
njames93 marked 10 inline comments as done.
njames93 updated this revision to Diff 400472.
njames93 marked 3 inline comments as done.
njames93 published this revision for review.
Herald added a subscriber: cfe-commits.

Update some includes


njames93 added a comment.

Address comments



================
Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:489
+  if (Context.hasIncludeInserter()) {
+    auto Mapping = IncludeSorter::getStyleMapping();
+    auto Index = 
static_cast<unsigned>(Context.getIncludeInserter().getStyle());
----------------
Please do not use `auto`, because type is not spelled explicitly in statement.


================
Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:434
+  if (Context.hasIncludeInserter())
+    Context.getIncludeInserter().registerPreprocessor(PP);
+
----------------
Why not just `Context.registerIncludeInserter(PP)` and follow the Law of 
Demeter?

Let `Context` do the `hasIncludeInserter()` check itself.


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp:220-238
+llvm::Optional<FixItHint>
+ClangTidyCheck::createMainFileIncludeInsertion(StringRef Include) {
+  if (!Context->hasIncludeInserter()) {
+    // Only crash on debug builds
+    assert(false && "No IncludeInserter registered");
+    return llvm::None;
+  }
----------------
Law of Demeter.  Move this to `ClangTidyContext` and let it handle the details.


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp:220-238
+llvm::Optional<FixItHint>
+ClangTidyCheck::createMainFileIncludeInsertion(StringRef Include) {
+  if (!Context->hasIncludeInserter()) {
+    // Only crash on debug builds
+    assert(false && "No IncludeInserter registered");
+    return llvm::None;
+  }
----------------
LegalizeAdulthood wrote:
> Law of Demeter.  Move this to `ClangTidyContext` and let it handle the 
> details.
Are you suggesting I create methods for createIncludeInsertion in the 
ClangTidyContext?


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.h:420
+
+  llvm::Optional<FixItHint> createMainFileIncludeInsertion(StringRef Include);
+  llvm::Optional<FixItHint> createIncludeInsertion(FileID File,
----------------
`diag` has visibility public.  Any reason why these are visibility `protected`?


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:219
       std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
+  this->Inserter.reset();
 }
----------------
is `this->` necessary here?


================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:569
+  StringRef Closest;
+  auto Mapping = IncludeSorter::getStyleMapping();
+  for (unsigned I = 0, E = Mapping.size(); I < E; ++I) {
----------------
Ditto.


================
Comment at: clang-tools-extra/clang-tidy/IncludeInserter.h:20
 namespace tidy {
-namespace utils {
 
----------------
What's the guidance on what belongs in `clang::tidy`
and what belongs in `clang::tidy::utils`?


================
Comment at: clang-tools-extra/clang-tidy/IncludeInserter.h:20
 namespace tidy {
-namespace utils {
 
----------------
LegalizeAdulthood wrote:
> What's the guidance on what belongs in `clang::tidy`
> and what belongs in `clang::tidy::utils`?
Well as the file moved out of utils, its no longer in the utils namespace.


================
Comment at: clang-tools-extra/clang-tidy/IncludeSorter.h:14
+#include "clang/Basic/SourceLocation.h"
+#include "llvm/ADT/StringMap.h"
 #include <string>
----------------
Since you introduced `ArrayRef<StringRef>` as a data type, I was expecting
the includes for those to be included instead of `StringMap`; are we really
using `StringMap` in this header?

"Include what you use" would seem to imply that we should be including:
- StringRef
- ArrayRef
- Optional
- FixItHint


================
Comment at: clang-tools-extra/clang-tidy/IncludeSorter.h:14
+#include "clang/Basic/SourceLocation.h"
+#include "llvm/ADT/StringMap.h"
 #include <string>
----------------
LegalizeAdulthood wrote:
> Since you introduced `ArrayRef<StringRef>` as a data type, I was expecting
> the includes for those to be included instead of `StringMap`; are we really
> using `StringMap` in this header?
> 
> "Include what you use" would seem to imply that we should be including:
> - StringRef
> - ArrayRef
> - Optional
> - FixItHint
IWYU should strictly be followed but in practice throughout clang/llvm it never 
really is.
We are actually using StringMap in this header.
All I really did here was using clangd's include information fix-its to make it 
compile.


================
Comment at: clang-tools-extra/clangd/ParsedAST.cpp:432-433
     Preprocessor *PP = &Clang->getPreprocessor();
+    if (CTContext->hasIncludeInserter())
+      CTContext->getIncludeInserter().registerPreprocessor(PP);
     for (const auto &Check : CTChecks) {
----------------
Law of Demeter


================
Comment at: clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h:71-72
+
+    if (Context.hasIncludeInserter())
+      Context.getIncludeInserter().registerPreprocessor(PP);
+
----------------
Law of Demeter


================
Comment at: 
clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp:259-289
-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"
----------------
Am I correct in thinking that these are now redundant tests
because IncludeInserterTest covers these cases?


================
Comment at: 
clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp:259-289
-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"
----------------
LegalizeAdulthood wrote:
> Am I correct in thinking that these are now redundant tests
> because IncludeInserterTest covers these cases?
This test is redundant as checks no longer look for a local IncludeStyle 
instead just reading the global IncludeStyle which is what the following test 
is checking for.


Following on from D117129 <https://reviews.llvm.org/D117129>, This changes 
fundamentally how IncludeInserter works.
Now each check that wants to create includes just calls 
`registerIncludeInserter` in their constructor.
This in turn enables a shared IncludeInserter in the ClangTidyContext.
Going this route means only 1 instance of IncludeInserter is needed and 
prevents different checks conflicting when they both try to create the same 
include.
Only using 1 instance also means there is only 1 possible IncludeStyle which is 
now sourced from global check options solely, rather that getting a local 
option for each check that wants to use it. This is a partially breaking change 
so warnings have been added for any old configs that try to use local options 
to set IncludeStyle.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D117409

Files:
  clang-tools-extra/clang-tidy/CMakeLists.txt
  clang-tools-extra/clang-tidy/ClangTidy.cpp
  clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
  clang-tools-extra/clang-tidy/ClangTidyCheck.h
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
  clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
  clang-tools-extra/clang-tidy/IncludeInserter.cpp
  clang-tools-extra/clang-tidy/IncludeInserter.h
  clang-tools-extra/clang-tidy/IncludeSorter.cpp
  clang-tools-extra/clang-tidy/IncludeSorter.h
  clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
  clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h
  
clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp
  
clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h
  clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp
  clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h
  
clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
  
clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h
  clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp
  clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h
  clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
  clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h
  clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
  clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h
  clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
  clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
  clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
  clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
  clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
  clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h
  clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp
  clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h
  clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
  clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h
  clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h
  clang-tools-extra/clang-tidy/utils/CMakeLists.txt
  clang-tools-extra/clang-tidy/utils/IncludeInserter.cpp
  clang-tools-extra/clang-tidy/utils/IncludeInserter.h
  clang-tools-extra/clang-tidy/utils/IncludeSorter.cpp
  clang-tools-extra/clang-tidy/utils/IncludeSorter.h
  clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
  clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
  clang-tools-extra/clangd/ParsedAST.cpp
  clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
  clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp
  clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp

Index: clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
===================================================================
--- clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/TransformerClangTidyCheckTest.cpp
@@ -256,38 +256,6 @@
       : 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";
Index: clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp
===================================================================
--- clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp
+++ clang-tools-extra/unittests/clang-tidy/IncludeInserterTest.cpp
@@ -6,7 +6,6 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "../clang-tidy/utils/IncludeInserter.h"
 #include "clang/Lex/Preprocessor.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "ClangTidyTest.h"
@@ -28,14 +27,11 @@
 
 class IncludeInserterCheckBase : public ClangTidyCheck {
 public:
-  IncludeInserterCheckBase(StringRef CheckName, ClangTidyContext *Context,
-                           utils::IncludeSorter::IncludeStyle Style =
-                               utils::IncludeSorter::IS_Google)
-      : ClangTidyCheck(CheckName, Context), Inserter(Style) {}
-
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override {
-    Inserter.registerPreprocessor(PP);
+  IncludeInserterCheckBase(
+      StringRef CheckName, ClangTidyContext *Context,
+      IncludeSorter::IncludeStyle Style = IncludeSorter::IS_Google)
+      : ClangTidyCheck(CheckName, Context) {
+    Context->registerIncludeInserter(Style);
   }
 
   void registerMatchers(ast_matchers::MatchFinder *Finder) override {
@@ -46,13 +42,11 @@
     auto Diag = diag(Result.Nodes.getNodeAs<DeclStmt>("stmt")->getBeginLoc(),
                      "foo, bar");
     for (StringRef Header : headersToInclude()) {
-      Diag << Inserter.createMainFileIncludeInsertion(Header);
+      Diag << createMainFileIncludeInsertion(Header);
     }
   }
 
   virtual std::vector<StringRef> headersToInclude() const = 0;
-
-  utils::IncludeInserter Inserter;
 };
 
 class NonSystemHeaderInserterCheck : public IncludeInserterCheckBase {
@@ -118,7 +112,7 @@
   ObjCEarlyInAlphabetHeaderInserterCheck(StringRef CheckName,
                                          ClangTidyContext *Context)
       : IncludeInserterCheckBase(CheckName, Context,
-                                 utils::IncludeSorter::IS_Google_ObjC) {}
+                                 IncludeSorter::IS_Google_ObjC) {}
 
   std::vector<StringRef> headersToInclude() const override {
     return {"a/header.h"};
@@ -130,7 +124,7 @@
   ObjCCategoryHeaderInserterCheck(StringRef CheckName,
                                   ClangTidyContext *Context)
       : IncludeInserterCheckBase(CheckName, Context,
-                                 utils::IncludeSorter::IS_Google_ObjC) {}
+                                 IncludeSorter::IS_Google_ObjC) {}
 
   std::vector<StringRef> headersToInclude() const override {
     return {"top_level_test_header+foo.h"};
@@ -142,7 +136,7 @@
   ObjCGeneratedHeaderInserterCheck(StringRef CheckName,
                                    ClangTidyContext *Context)
       : IncludeInserterCheckBase(CheckName, Context,
-                                 utils::IncludeSorter::IS_Google_ObjC) {}
+                                 IncludeSorter::IS_Google_ObjC) {}
 
   std::vector<StringRef> headersToInclude() const override {
     return {"clang_tidy/tests/generated_file.proto.h"};
Index: clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
===================================================================
--- clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
+++ clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
@@ -67,6 +67,9 @@
     // `getLangOpts()`).
     CheckFactory<CheckTypes...>::createChecks(&Context, Checks);
     assert(!Checks.empty() && "No checks created");
+
+    Context.addInserterCallbacks(PP);
+
     for (auto &Check : Checks) {
       assert(Check.get() && "Checks can't be null");
       if (!Check->isLanguageVersionSupported(Context.getLangOpts()))
Index: clang-tools-extra/clangd/ParsedAST.cpp
===================================================================
--- clang-tools-extra/clangd/ParsedAST.cpp
+++ clang-tools-extra/clangd/ParsedAST.cpp
@@ -429,6 +429,7 @@
       return !Check->isLanguageVersionSupported(CTContext->getLangOpts());
     });
     Preprocessor *PP = &Clang->getPreprocessor();
+    CTContext->addInserterCallbacks(PP);
     for (const auto &Check : CTChecks) {
       Check->registerPPCallbacks(Clang->getSourceManager(), PP, PP);
       Check->registerMatchers(&CTFinder);
Index: clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
+++ clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.h
@@ -10,8 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_TRANSFORMER_CLANG_TIDY_CHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "IncludeInserter.h"
-#include "IncludeSorter.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Tooling/Transformer/Transformer.h"
 
@@ -30,12 +28,6 @@
 //       : 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:
   TransformerClangTidyCheck(StringRef Name, ClangTidyContext *Context);
@@ -58,15 +50,9 @@
   TransformerClangTidyCheck(transformer::RewriteRule R, StringRef Name,
                             ClangTidyContext *Context);
 
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) final;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) final;
 
-  /// Derived classes that override this function should call this method from
-  /// the overridden method.
-  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
-
   /// Set the rule that this check implements.  All cases in the rule must have
   /// a non-null \c Explanation, even though \c Explanation is optional for
   /// RewriteRule in general. Because the primary purpose of clang-tidy checks
@@ -78,7 +64,6 @@
 
 private:
   transformer::RewriteRule Rule;
-  IncludeInserter Inserter;
 };
 
 } // namespace utils
Index: clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
+++ clang-tools-extra/clang-tidy/utils/TransformerClangTidyCheck.cpp
@@ -29,10 +29,9 @@
 
 TransformerClangTidyCheck::TransformerClangTidyCheck(StringRef Name,
                                                      ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context),
-      Inserter(
-          Options.getLocalOrGlobal("IncludeStyle", IncludeSorter::IS_LLVM)) {}
-
+    : ClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
+}
 // This constructor cannot dispatch to the simpler one (below), because, in
 // order to get meaningful results from `getLangOpts` and `Options`, we need the
 // `ClangTidyCheck()` constructor to have been called. If we were to dispatch,
@@ -44,6 +43,7 @@
         MakeRule,
     StringRef Name, ClangTidyContext *Context)
     : TransformerClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
   if (Optional<RewriteRule> R = MakeRule(getLangOpts(), Options))
     setRule(std::move(*R));
 }
@@ -52,6 +52,7 @@
                                                      StringRef Name,
                                                      ClangTidyContext *Context)
     : TransformerClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
   setRule(std::move(R));
 }
 
@@ -60,11 +61,6 @@
   Rule = std::move(R);
 }
 
-void TransformerClangTidyCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void TransformerClangTidyCheck::registerMatchers(
     ast_matchers::MatchFinder *Finder) {
   if (!Rule.Cases.empty())
@@ -104,17 +100,12 @@
       Diag << FixItHint::CreateReplacement(T.Range, T.Replacement);
       break;
     case transformer::EditKind::AddInclude:
-      Diag << Inserter.createIncludeInsertion(
+      Diag << createIncludeInsertion(
           Result.SourceManager->getFileID(T.Range.getBegin()), T.Replacement);
       break;
     }
 }
 
-void TransformerClangTidyCheck::storeOptions(
-    ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
-}
-
 } // namespace utils
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/utils/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/utils/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/utils/CMakeLists.txt
@@ -12,8 +12,6 @@
   FileExtensionsUtils.cpp
   FixItHintUtils.cpp
   HeaderGuard.cpp
-  IncludeInserter.cpp
-  IncludeSorter.cpp
   LexerUtils.cpp
   NamespaceAliaser.cpp
   OptionsUtils.cpp
Index: clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h
+++ clang-tools-extra/clang-tidy/readability/UseAnyOfAllOfCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_USEALGORITHMCHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_UNNECESSARY_VALUE_PARAM_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 #include "clang/Analysis/Analyses/ExprMutationAnalyzer.h"
 
 namespace clang {
@@ -30,8 +29,6 @@
   }
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void onEndOfTranslationUnit() override;
 
@@ -41,7 +38,6 @@
 
   llvm::DenseMap<const FunctionDecl *, FunctionParmMutationAnalyzer>
       MutationAnalyzers;
-  utils::IncludeInserter Inserter;
   const std::vector<std::string> AllowedTypes;
 };
 
Index: clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/UnnecessaryValueParamCheck.cpp
@@ -68,10 +68,10 @@
 UnnecessaryValueParamCheck::UnnecessaryValueParamCheck(
     StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)),
       AllowedTypes(
-          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {}
+          utils::options::parseStringList(Options.get("AllowedTypes", ""))) {
+  registerIncludeInserter();
+}
 
 void UnnecessaryValueParamCheck::registerMatchers(MatchFinder *Finder) {
   const auto ExpensiveValueParamDecl = parmVarDecl(
@@ -168,14 +168,8 @@
   }
 }
 
-void UnnecessaryValueParamCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void UnnecessaryValueParamCheck::storeOptions(
     ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
   Options.store(Opts, "AllowedTypes",
                 utils::options::serializeStringList(AllowedTypes));
 }
@@ -199,8 +193,8 @@
                                            Context.getLangOpts());
   Diag << FixItHint::CreateInsertion(CopyArgument.getBeginLoc(), "std::move(")
        << FixItHint::CreateInsertion(EndLoc, ")")
-       << Inserter.createIncludeInsertion(
-              SM.getFileID(CopyArgument.getBeginLoc()), "<utility>");
+       << createIncludeInsertion(SM.getFileID(CopyArgument.getBeginLoc()),
+                                 "<utility>");
 }
 
 } // namespace performance
Index: clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h
+++ clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_PERFORMANCE_TYPE_PROMOTION_IN_MATH_FN_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -29,14 +28,8 @@
 public:
   TypePromotionInMathFnCheck(StringRef Name, ClangTidyContext *Context);
 
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
-  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-
-private:
-  utils::IncludeInserter IncludeInserter;
 };
 
 } // namespace performance
Index: clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp
+++ clang-tools-extra/clang-tidy/performance/TypePromotionInMathFnCheck.cpp
@@ -30,19 +30,8 @@
 
 TypePromotionInMathFnCheck::TypePromotionInMathFnCheck(
     StringRef Name, ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context),
-      IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
-                                               utils::IncludeSorter::IS_LLVM)) {
-}
-
-void TypePromotionInMathFnCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  IncludeInserter.registerPreprocessor(PP);
-}
-
-void TypePromotionInMathFnCheck::storeOptions(
-    ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
+    : ClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
 }
 
 void TypePromotionInMathFnCheck::registerMatchers(MatchFinder *Finder) {
@@ -190,7 +179,7 @@
   // <math.h>, because the functions we're suggesting moving away from are all
   // declared in <math.h>.
   if (FnInCmath)
-    Diag << IncludeInserter.createIncludeInsertion(
+    Diag << createIncludeInsertion(
         Result.Context->getSourceManager().getFileID(Call->getBeginLoc()),
         "<cmath>");
 }
Index: clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h
+++ clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_RANDOM_SHUFFLE_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -24,17 +23,11 @@
 class ReplaceRandomShuffleCheck : public ClangTidyCheck {
 public:
   ReplaceRandomShuffleCheck(StringRef Name, ClangTidyContext *Context);
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
     return LangOpts.CPlusPlus11;
   }
-  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-
-private:
-  utils::IncludeInserter IncludeInserter;
 };
 
 } // namespace modernize
Index: clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ReplaceRandomShuffleCheck.cpp
@@ -22,9 +22,8 @@
 
 ReplaceRandomShuffleCheck::ReplaceRandomShuffleCheck(StringRef Name,
                                                      ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context),
-      IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
-                                               utils::IncludeSorter::IS_LLVM)) {
+    : ClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
 }
 
 void ReplaceRandomShuffleCheck::registerMatchers(MatchFinder *Finder) {
@@ -43,16 +42,6 @@
       this);
 }
 
-void ReplaceRandomShuffleCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  IncludeInserter.registerPreprocessor(PP);
-}
-
-void ReplaceRandomShuffleCheck::storeOptions(
-    ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
-}
-
 void ReplaceRandomShuffleCheck::check(const MatchFinder::MatchResult &Result) {
   const auto *MatchedDecl = Result.Nodes.getNodeAs<DeclRefExpr>("name");
   const auto *MatchedArgumentThree = Result.Nodes.getNodeAs<Expr>("randomFunc");
@@ -90,10 +79,9 @@
 
   Diag << FixItHint::CreateRemoval(MatchedDecl->getSourceRange());
   Diag << FixItHint::CreateInsertion(MatchedDecl->getBeginLoc(), NewName);
-  Diag << IncludeInserter.createIncludeInsertion(
-      Result.Context->getSourceManager().getFileID(
-          MatchedCallExpr->getBeginLoc()),
-      "<random>");
+  Diag << createIncludeInsertion(Result.Context->getSourceManager().getFileID(
+                                     MatchedCallExpr->getBeginLoc()),
+                                 "<random>");
 }
 
 } // namespace modernize
Index: clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
+++ clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REPLACE_AUTO_PTR_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -46,14 +45,8 @@
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
     return LangOpts.CPlusPlus;
   }
-  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-
-private:
-  utils::IncludeInserter Inserter;
 };
 
 } // namespace modernize
Index: clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/ReplaceAutoPtrCheck.cpp
@@ -39,14 +39,9 @@
 
 ReplaceAutoPtrCheck::ReplaceAutoPtrCheck(StringRef Name,
                                          ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)) {}
-
-void ReplaceAutoPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
+    : ClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
 }
-
 void ReplaceAutoPtrCheck::registerMatchers(MatchFinder *Finder) {
   auto AutoPtrDecl = recordDecl(hasName("auto_ptr"), isInStdNamespace());
   auto AutoPtrType = qualType(hasDeclaration(AutoPtrDecl));
@@ -94,12 +89,6 @@
       this);
 }
 
-void ReplaceAutoPtrCheck::registerPPCallbacks(const SourceManager &SM,
-                                              Preprocessor *PP,
-                                              Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void ReplaceAutoPtrCheck::check(const MatchFinder::MatchResult &Result) {
   SourceManager &SM = *Result.SourceManager;
   if (const auto *E =
@@ -113,7 +102,7 @@
     auto Diag = diag(Range.getBegin(), "use std::move to transfer ownership")
                 << FixItHint::CreateInsertion(Range.getBegin(), "std::move(")
                 << FixItHint::CreateInsertion(Range.getEnd(), ")")
-                << Inserter.createMainFileIncludeInsertion("<utility>");
+                << createMainFileIncludeInsertion("<utility>");
 
     return;
   }
Index: clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
+++ clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_PASS_BY_VALUE_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 #include <memory>
 
@@ -25,13 +24,9 @@
     return LangOpts.CPlusPlus;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
 
-private:
-  utils::IncludeInserter Inserter;
   const bool ValuesOnly;
 };
 
Index: clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
@@ -189,12 +189,11 @@
 
 PassByValueCheck::PassByValueCheck(StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)),
-      ValuesOnly(Options.get("ValuesOnly", false)) {}
+      ValuesOnly(Options.get("ValuesOnly", false)) {
+  registerIncludeInserter();
+}
 
 void PassByValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
   Options.store(Opts, "ValuesOnly", ValuesOnly);
 }
 
@@ -233,12 +232,6 @@
       this);
 }
 
-void PassByValueCheck::registerPPCallbacks(const SourceManager &SM,
-                                           Preprocessor *PP,
-                                           Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void PassByValueCheck::check(const MatchFinder::MatchResult &Result) {
   const auto *Ctor = Result.Nodes.getNodeAs<CXXConstructorDecl>("Ctor");
   const auto *ParamDecl = Result.Nodes.getNodeAs<ParmVarDecl>("Param");
@@ -298,7 +291,7 @@
   Diag << FixItHint::CreateInsertion(Initializer->getRParenLoc(), ")")
        << FixItHint::CreateInsertion(
               Initializer->getLParenLoc().getLocWithOffset(1), "std::move(")
-       << Inserter.createIncludeInsertion(
+       << createIncludeInsertion(
               Result.SourceManager->getFileID(Initializer->getSourceLocation()),
               "<utility>");
 }
Index: clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
+++ clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp
@@ -109,8 +109,6 @@
 
     Opts["modernize-loop-convert.MinConfidence"] = "reasonable";
     Opts["modernize-loop-convert.NamingStyle"] = "CamelCase";
-    Opts["modernize-pass-by-value.IncludeStyle"] = "llvm";    // Also: "google".
-    Opts["modernize-replace-auto-ptr.IncludeStyle"] = "llvm"; // Also: "google".
 
     // Comma-separated list of macros that behave like NULL.
     Opts["modernize-use-nullptr.NullMacros"] = "NULL";
Index: clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h
+++ clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.h
@@ -10,9 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_MAKE_SMART_PTR_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include "clang/ASTMatchers/ASTMatchersInternal.h"
 #include "llvm/ADT/StringRef.h"
 #include <string>
 
@@ -26,8 +23,6 @@
   MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context,
                     StringRef MakeSmartPtrFunctionName);
   void registerMatchers(ast_matchers::MatchFinder *Finder) final;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) final;
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
 
@@ -46,7 +41,6 @@
   static const char PointerType[];
 
 private:
-  utils::IncludeInserter Inserter;
   const std::string MakeSmartPtrFunctionHeader;
   const std::string MakeSmartPtrFunctionName;
   const bool IgnoreMacros;
Index: clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/MakeSmartPtrCheck.cpp
@@ -43,18 +43,17 @@
 MakeSmartPtrCheck::MakeSmartPtrCheck(StringRef Name, ClangTidyContext *Context,
                                      StringRef MakeSmartPtrFunctionName)
     : ClangTidyCheck(Name, Context),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)),
       MakeSmartPtrFunctionHeader(
           Options.get("MakeSmartPtrFunctionHeader", "<memory>")),
       MakeSmartPtrFunctionName(
           Options.get("MakeSmartPtrFunction", MakeSmartPtrFunctionName)),
       IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", true)),
       IgnoreDefaultInitialization(
-          Options.get("IgnoreDefaultInitialization", true)) {}
+          Options.get("IgnoreDefaultInitialization", true)) {
+  registerIncludeInserter();
+}
 
 void MakeSmartPtrCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
   Options.store(Opts, "MakeSmartPtrFunctionHeader", MakeSmartPtrFunctionHeader);
   Options.store(Opts, "MakeSmartPtrFunction", MakeSmartPtrFunctionName);
   Options.store(Opts, "IgnoreMacros", IgnoreMacros);
@@ -67,12 +66,6 @@
   return LangOpts.CPlusPlus11;
 }
 
-void MakeSmartPtrCheck::registerPPCallbacks(const SourceManager &SM,
-                                            Preprocessor *PP,
-                                            Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void MakeSmartPtrCheck::registerMatchers(ast_matchers::MatchFinder *Finder) {
   // Calling make_smart_ptr from within a member function of a type with a
   // private or protected constructor would be ill-formed.
@@ -435,7 +428,7 @@
   if (MakeSmartPtrFunctionHeader.empty()) {
     return;
   }
-  Diag << Inserter.createIncludeInsertion(FD, MakeSmartPtrFunctionHeader);
+  Diag << createIncludeInsertion(FD, MakeSmartPtrFunctionHeader);
 }
 
 } // namespace modernize
Index: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h
+++ clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 #include "LoopConvertUtils.h"
 
 namespace clang {
@@ -25,8 +24,6 @@
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
 
 private:
@@ -78,7 +75,6 @@
   const unsigned long long MaxCopySize;
   const Confidence::Level MinConfidence;
   const VariableNamer::NamingStyle NamingStyle;
-  utils::IncludeInserter Inserter;
   bool UseReverseRanges;
   const bool UseCxx20IfAvailable;
   std::string ReverseFunction;
Index: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
@@ -462,11 +462,10 @@
       MaxCopySize(Options.get("MaxCopySize", 16ULL)),
       MinConfidence(Options.get("MinConfidence", Confidence::CL_Reasonable)),
       NamingStyle(Options.get("NamingStyle", VariableNamer::NS_CamelCase)),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)),
       UseCxx20IfAvailable(Options.get("UseCxx20ReverseRanges", true)),
       ReverseFunction(Options.get("MakeReverseRangeFunction", "")),
       ReverseHeader(Options.get("MakeReverseRangeHeader", "")) {
+  registerIncludeInserter();
 
   if (ReverseFunction.empty() && !ReverseHeader.empty()) {
     configurationDiag(
@@ -485,18 +484,11 @@
   Options.store(Opts, "MaxCopySize", MaxCopySize);
   Options.store(Opts, "MinConfidence", MinConfidence);
   Options.store(Opts, "NamingStyle", NamingStyle);
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
   Options.store(Opts, "UseCxx20ReverseRanges", UseCxx20IfAvailable);
   Options.store(Opts, "MakeReverseRangeFunction", ReverseFunction);
   Options.store(Opts, "MakeReverseRangeHeader", ReverseHeader);
 }
 
-void LoopConvertCheck::registerPPCallbacks(const SourceManager &SM,
-                                           Preprocessor *PP,
-                                           Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
-}
-
 void LoopConvertCheck::registerMatchers(MatchFinder *Finder) {
   Finder->addMatcher(traverse(TK_AsIs, makeArrayLoopMatcher()), this);
   Finder->addMatcher(traverse(TK_AsIs, makeIteratorLoopMatcher(false)), this);
@@ -671,7 +663,7 @@
       CharSourceRange::getTokenRange(ParenRange), Range));
 
   if (Descriptor.NeedsReverseCall && !getReverseHeader().empty()) {
-    if (Optional<FixItHint> Insertion = Inserter.createIncludeInsertion(
+    if (Optional<FixItHint> Insertion = createIncludeInsertion(
             Context->getSourceManager().getFileID(Loop->getBeginLoc()),
             getReverseHeader()))
       FixIts.push_back(*Insertion);
Index: clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h
+++ clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_UNIQUEPTRRESETRELEASECHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -37,14 +36,8 @@
     // provide any benefit to other languages, despite being benign.
     return LangOpts.CPlusPlus11;
   }
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
-
-private:
-  utils::IncludeInserter Inserter;
 };
 
 } // namespace misc
Index: clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp
+++ clang-tools-extra/clang-tidy/misc/UniqueptrResetReleaseCheck.cpp
@@ -18,18 +18,8 @@
 
 UniqueptrResetReleaseCheck::UniqueptrResetReleaseCheck(
     StringRef Name, ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)) {}
-
-void UniqueptrResetReleaseCheck::storeOptions(
-    ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
-}
-
-void UniqueptrResetReleaseCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
+    : ClangTidyCheck(Name, Context) {
+  registerIncludeInserter();
 }
 
 void UniqueptrResetReleaseCheck::registerMatchers(MatchFinder *Finder) {
@@ -143,7 +133,7 @@
                                           ResetCall->getEndLoc()),
            TrailingText);
   if (NeedsUtilityInclude)
-    D << Inserter.createIncludeInsertion(
+    D << createIncludeInsertion(
         Result.SourceManager->getFileID(ResetMember->getBeginLoc()),
         "<utility>");
 }
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_BOUNDS_CONSTANT_ARRAY_INDEX_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -23,15 +22,12 @@
 /// http://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines-pro-bounds-constant-array-index.html
 class ProBoundsConstantArrayIndexCheck : public ClangTidyCheck {
   const std::string GslHeader;
-  utils::IncludeInserter Inserter;
 
 public:
   ProBoundsConstantArrayIndexCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
     return LangOpts.CPlusPlus;
   }
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProBoundsConstantArrayIndexCheck.cpp
@@ -20,19 +20,12 @@
 
 ProBoundsConstantArrayIndexCheck::ProBoundsConstantArrayIndexCheck(
     StringRef Name, ClangTidyContext *Context)
-    : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")),
-      Inserter(Options.getLocalOrGlobal("IncludeStyle",
-                                        utils::IncludeSorter::IS_LLVM)) {}
-
+    : ClangTidyCheck(Name, Context), GslHeader(Options.get("GslHeader", "")) {
+  registerIncludeInserter();
+}
 void ProBoundsConstantArrayIndexCheck::storeOptions(
     ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "GslHeader", GslHeader);
-  Options.store(Opts, "IncludeStyle", Inserter.getStyle());
-}
-
-void ProBoundsConstantArrayIndexCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  Inserter.registerPreprocessor(PP);
 }
 
 void ProBoundsConstantArrayIndexCheck::registerMatchers(MatchFinder *Finder) {
@@ -85,7 +78,7 @@
                               IndexRange.getBegin().getLocWithOffset(-1)),
                   ", ")
            << FixItHint::CreateReplacement(Matched->getEndLoc(), ")")
-           << Inserter.createMainFileIncludeInsertion(GslHeader);
+           << createMainFileIncludeInsertion(GslHeader);
     }
     return;
   }
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_INITVARIABLESCHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 #include "../utils/OptionsUtils.h"
 
 namespace clang {
@@ -25,13 +24,10 @@
 public:
   InitVariablesCheck(StringRef Name, ClangTidyContext *Context);
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
 
 private:
-  utils::IncludeInserter IncludeInserter;
   const std::string MathHeader;
 };
 
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/InitVariablesCheck.cpp
@@ -26,12 +26,11 @@
 InitVariablesCheck::InitVariablesCheck(StringRef Name,
                                        ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context),
-      IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
-                                               utils::IncludeSorter::IS_LLVM)),
-      MathHeader(Options.get("MathHeader", "<math.h>")) {}
+      MathHeader(Options.get("MathHeader", "<math.h>")) {
+  registerIncludeInserter();
+}
 
 void InitVariablesCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
-  Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
   Options.store(Opts, "MathHeader", MathHeader);
 }
 
@@ -48,12 +47,6 @@
       this);
 }
 
-void InitVariablesCheck::registerPPCallbacks(const SourceManager &SM,
-                                             Preprocessor *PP,
-                                             Preprocessor *ModuleExpanderPP) {
-  IncludeInserter.registerPreprocessor(PP);
-}
-
 void InitVariablesCheck::check(const MatchFinder::MatchResult &Result) {
   const auto *MatchedDecl = Result.Nodes.getNodeAs<VarDecl>("vardecl");
   const ASTContext &Context = *Result.Context;
@@ -105,7 +98,7 @@
               MatchedDecl->getName().size()),
           *InitializationString);
     if (AddMathInclude) {
-      Diagnostic << IncludeInserter.createIncludeInsertion(
+      Diagnostic << createIncludeInsertion(
           Source.getFileID(MatchedDecl->getBeginLoc()), MathHeader);
     }
   }
Index: clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h
+++ clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_IMPLICITWIDENINGOFMULTIPLICATIONRESULTCHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 
 namespace clang {
 namespace tidy {
@@ -33,8 +32,6 @@
 public:
   ImplicitWideningOfMultiplicationResultCheck(StringRef Name,
                                               ClangTidyContext *Context);
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
@@ -42,7 +39,6 @@
 private:
   const bool UseCXXStaticCastsInCppSources;
   const bool UseCXXHeadersInCppSources;
-  utils::IncludeInserter IncludeInserter;
 };
 
 } // namespace bugprone
Index: clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp
+++ clang-tools-extra/clang-tidy/bugprone/ImplicitWideningOfMultiplicationResultCheck.cpp
@@ -41,14 +41,9 @@
     : ClangTidyCheck(Name, Context),
       UseCXXStaticCastsInCppSources(
           Options.get("UseCXXStaticCastsInCppSources", true)),
-      UseCXXHeadersInCppSources(Options.get("UseCXXHeadersInCppSources", true)),
-      IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
-                                               utils::IncludeSorter::IS_LLVM)) {
-}
-
-void ImplicitWideningOfMultiplicationResultCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  IncludeInserter.registerPreprocessor(PP);
+      UseCXXHeadersInCppSources(
+          Options.get("UseCXXHeadersInCppSources", true)) {
+  registerIncludeInserter();
 }
 
 void ImplicitWideningOfMultiplicationResultCheck::storeOptions(
@@ -56,15 +51,14 @@
   Options.store(Opts, "UseCXXStaticCastsInCppSources",
                 UseCXXStaticCastsInCppSources);
   Options.store(Opts, "UseCXXHeadersInCppSources", UseCXXHeadersInCppSources);
-  Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
 }
 
 llvm::Optional<FixItHint>
 ImplicitWideningOfMultiplicationResultCheck::includeStddefHeader(
     SourceLocation File) {
-  return IncludeInserter.createIncludeInsertion(
-      Result->SourceManager->getFileID(File),
-      ShouldUseCXXHeader ? "<cstddef>" : "<stddef.h>");
+  return createIncludeInsertion(Result->SourceManager->getFileID(File),
+                                ShouldUseCXXHeader ? "<cstddef>"
+                                                   : "<stddef.h>");
 }
 
 void ImplicitWideningOfMultiplicationResultCheck::handleImplicitCastExpr(
Index: clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h
+++ clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.h
@@ -10,7 +10,6 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTARTSWITHCHECK_H
 
 #include "../ClangTidyCheck.h"
-#include "../utils/IncludeInserter.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 
 #include <memory>
@@ -28,15 +27,12 @@
 public:
   using ClangTidyCheck::ClangTidyCheck;
   StringFindStartswithCheck(StringRef Name, ClangTidyContext *Context);
-  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
-                           Preprocessor *ModuleExpanderPP) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
 
 private:
   const std::vector<std::string> StringLikeClasses;
-  utils::IncludeInserter IncludeInserter;
   const std::string AbseilStringsMatchHeader;
 };
 
Index: clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
+++ clang-tools-extra/clang-tidy/abseil/StringFindStartswithCheck.cpp
@@ -26,10 +26,10 @@
     : ClangTidyCheck(Name, Context),
       StringLikeClasses(utils::options::parseStringList(
           Options.get("StringLikeClasses", "::std::basic_string"))),
-      IncludeInserter(Options.getLocalOrGlobal("IncludeStyle",
-                                               utils::IncludeSorter::IS_LLVM)),
       AbseilStringsMatchHeader(
-          Options.get("AbseilStringsMatchHeader", "absl/strings/match.h")) {}
+          Options.get("AbseilStringsMatchHeader", "absl/strings/match.h")) {
+  registerIncludeInserter();
+}
 
 void StringFindStartswithCheck::registerMatchers(MatchFinder *Finder) {
   auto ZeroLiteral = integerLiteral(equals(0));
@@ -124,21 +124,15 @@
 
   // Create a preprocessor #include FixIt hint (createIncludeInsertion checks
   // whether this already exists).
-  Diagnostic << IncludeInserter.createIncludeInsertion(
+  Diagnostic << createIncludeInsertion(
       Source.getFileID(ComparisonExpr->getBeginLoc()),
       AbseilStringsMatchHeader);
 }
 
-void StringFindStartswithCheck::registerPPCallbacks(
-    const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
-  IncludeInserter.registerPreprocessor(PP);
-}
-
 void StringFindStartswithCheck::storeOptions(
     ClangTidyOptions::OptionMap &Opts) {
   Options.store(Opts, "StringLikeClasses",
                 utils::options::serializeStringList(StringLikeClasses));
-  Options.store(Opts, "IncludeStyle", IncludeInserter.getStyle());
   Options.store(Opts, "AbseilStringsMatchHeader", AbseilStringsMatchHeader);
 }
 
Index: clang-tools-extra/clang-tidy/IncludeSorter.h
===================================================================
--- clang-tools-extra/clang-tidy/IncludeSorter.h
+++ clang-tools-extra/clang-tidy/IncludeSorter.h
@@ -9,12 +9,17 @@
 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H
 
-#include "../ClangTidyCheck.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/SourceLocation.h"
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/Optional.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
 #include <string>
 
 namespace clang {
+class SourceManager;
 namespace tidy {
-namespace utils {
 
 /// Class used by ``IncludeInserterCallback`` to record the names of the
 /// inclusions in a given source file being processed and generate the necessary
@@ -24,6 +29,7 @@
 public:
   /// Supported include styles.
   enum IncludeStyle { IS_LLVM = 0, IS_Google = 1, IS_Google_ObjC };
+  static ArrayRef<StringRef> getStyleMapping();
 
   /// The classifications of inclusions, in the order they should be sorted.
   enum IncludeKinds {
@@ -35,8 +41,8 @@
     IK_InvalidInclude = 5    ///< total number of valid ``IncludeKind``s
   };
 
-  /// ``IncludeSorter`` constructor; takes the FileID and name of the file to be
-  /// processed by the sorter.
+  /// ``IncludeSorter`` constructor; takes the FileID and name of the file to
+  /// be processed by the sorter.
   IncludeSorter(const SourceManager *SourceMgr, const FileID FileID,
                 StringRef FileName, IncludeStyle Style);
 
@@ -44,8 +50,9 @@
   void addInclude(StringRef FileName, bool IsAngled,
                   SourceLocation HashLocation, SourceLocation EndLocation);
 
-  /// Creates a quoted inclusion directive in the right sort order. Returns None
-  /// on error or if header inclusion directive for header already exists.
+  /// Creates a quoted inclusion directive in the right sort order. Returns
+  /// None on error or if header inclusion directive for header already
+  /// exists.
   Optional<FixItHint> createIncludeInsertion(StringRef FileName, bool IsAngled);
 
 private:
@@ -63,13 +70,6 @@
   /// Includes sorted into buckets.
   SmallVector<std::string, 1> IncludeBucket[IK_InvalidInclude];
 };
-
-} // namespace utils
-
-template <> struct OptionEnumMapping<utils::IncludeSorter::IncludeStyle> {
-  static ArrayRef<std::pair<utils::IncludeSorter::IncludeStyle, StringRef>>
-  getEnumMapping();
-};
 } // namespace tidy
 } // namespace clang
 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDESORTER_H
Index: clang-tools-extra/clang-tidy/IncludeSorter.cpp
===================================================================
--- clang-tools-extra/clang-tidy/IncludeSorter.cpp
+++ clang-tools-extra/clang-tidy/IncludeSorter.cpp
@@ -13,7 +13,6 @@
 
 namespace clang {
 namespace tidy {
-namespace utils {
 
 namespace {
 
@@ -49,8 +48,7 @@
     if (StartIndex == StringRef::npos) {
       StartIndex = 0;
     }
-    return Canonical.substr(
-        0, Canonical.find_first_of('+', StartIndex));
+    return Canonical.substr(0, Canonical.find_first_of('+', StartIndex));
   }
   return removeFirstSuffix(
       removeFirstSuffix(Str, {".cc", ".cpp", ".c", ".h", ".hpp"}),
@@ -77,8 +75,8 @@
                                       : IncludeSorter::IK_CXXSystemInclude;
   }
   StringRef CanonicalInclude = makeCanonicalName(IncludeFile, Style);
-  if (CanonicalFile.endswith(CanonicalInclude)
-      || CanonicalInclude.endswith(CanonicalFile)) {
+  if (CanonicalFile.endswith(CanonicalInclude) ||
+      CanonicalInclude.endswith(CanonicalFile)) {
     return IncludeSorter::IK_MainTUInclude;
   }
   if ((Style == IncludeSorter::IS_Google) ||
@@ -222,15 +220,8 @@
   return FixItHint::CreateInsertion(FirstIncludeLocation.getBegin(),
                                     IncludeStmt);
 }
-
-} // namespace utils
-
-llvm::ArrayRef<std::pair<utils::IncludeSorter::IncludeStyle, StringRef>>
-OptionEnumMapping<utils::IncludeSorter::IncludeStyle>::getEnumMapping() {
-  static constexpr std::pair<utils::IncludeSorter::IncludeStyle, StringRef>
-      Mapping[] = {{utils::IncludeSorter::IS_LLVM, "llvm"},
-                   {utils::IncludeSorter::IS_Google, "google"},
-                   {utils::IncludeSorter::IS_Google_ObjC, "google-objc"}};
+static constexpr StringRef Mapping[] = {"llvm", "google", "google-objc"};
+llvm::ArrayRef<StringRef> IncludeSorter::getStyleMapping() {
   return makeArrayRef(Mapping);
 }
 } // namespace tidy
Index: clang-tools-extra/clang-tidy/IncludeInserter.h
===================================================================
--- clang-tools-extra/clang-tidy/IncludeInserter.h
+++ clang-tools-extra/clang-tidy/IncludeInserter.h
@@ -17,7 +17,6 @@
 namespace clang {
 class Preprocessor;
 namespace tidy {
-namespace utils {
 
 /// Produces fixes to insert specified includes to source files, if not
 /// yet present.
@@ -96,7 +95,6 @@
   friend class IncludeInserterCallback;
 };
 
-} // namespace utils
 } // namespace tidy
 } // namespace clang
 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_INCLUDEINSERTER_H
Index: clang-tools-extra/clang-tidy/IncludeInserter.cpp
===================================================================
--- clang-tools-extra/clang-tidy/IncludeInserter.cpp
+++ clang-tools-extra/clang-tidy/IncludeInserter.cpp
@@ -13,7 +13,6 @@
 
 namespace clang {
 namespace tidy {
-namespace utils {
 
 class IncludeInserterCallback : public PPCallbacks {
 public:
@@ -95,6 +94,5 @@
   getOrCreate(FileID).addInclude(FileName, IsAngled, HashLocation, EndLocation);
 }
 
-} // namespace utils
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -11,7 +11,9 @@
 
 #include "ClangTidyOptions.h"
 #include "ClangTidyProfiling.h"
+#include "IncludeInserter.h"
 #include "clang/Basic/Diagnostic.h"
+#include "clang/Lex/Preprocessor.h"
 #include "clang/Tooling/Core/Diagnostic.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/Support/Regex.h"
@@ -183,6 +185,16 @@
             DiagEngine->getDiagnosticIDs()->getDescription(DiagnosticID)));
   }
 
+  bool hasIncludeInserter() const { return Inserter.hasValue(); }
+  IncludeInserter &getIncludeInserter() {
+    assert(hasIncludeInserter());
+    return *Inserter;
+  }
+
+  void registerIncludeInserter(IncludeSorter::IncludeStyle Style);
+  void registerIncludeInserter(StringRef CheckName);
+  void addInserterCallbacks(Preprocessor *PP);
+
 private:
   // Writes to Stats.
   friend class ClangTidyDiagnosticConsumer;
@@ -193,6 +205,8 @@
   std::string CurrentFile;
   ClangTidyOptions CurrentOptions;
 
+  llvm::Optional<IncludeInserter> Inserter;
+
   std::unique_ptr<CachedGlobList> CheckFilter;
   std::unique_ptr<CachedGlobList> WarningAsErrorFilter;
 
Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -18,6 +18,7 @@
 #include "ClangTidyDiagnosticConsumer.h"
 #include "ClangTidyOptions.h"
 #include "GlobList.h"
+#include "IncludeSorter.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTDiagnostic.h"
 #include "clang/AST/Attr.h"
@@ -215,6 +216,7 @@
   CheckFilter = std::make_unique<CachedGlobList>(*getOptions().Checks);
   WarningAsErrorFilter =
       std::make_unique<CachedGlobList>(*getOptions().WarningsAsErrors);
+  Inserter.reset();
 }
 
 void ClangTidyContext::setASTContext(ASTContext *Context) {
@@ -536,6 +538,64 @@
   return Result;
 }
 
+void ClangTidyContext::registerIncludeInserter(
+    IncludeSorter::IncludeStyle Style) {
+  if (!Inserter) {
+    Inserter.emplace(Style);
+  }
+}
+
+void ClangTidyContext::registerIncludeInserter(StringRef CheckName) {
+  const ClangTidyOptions::OptionMap &Options = getOptions().CheckOptions;
+  {
+    // Check and warn if the option was set Locally, for old clang-tidy configs.
+    SmallString<64> Buffer{CheckName, ".IncludeStyle"};
+    if (Options.count(Buffer)) {
+      configurationDiag(
+          "Option '%0' is deprecated; use the global 'IncludeStyle' instead")
+          << Buffer;
+    }
+  }
+  if (Inserter)
+    return;
+  auto SetDefault = [this] { registerIncludeInserter(IncludeSorter::IS_LLVM); };
+  auto It = Options.find("IncludeStyle");
+  if (It == Options.end()) {
+    SetDefault();
+    return;
+  }
+  StringRef Input = It->getValue().Value;
+  StringRef Closest;
+  ArrayRef<llvm::StringRef> Mapping = IncludeSorter::getStyleMapping();
+  for (unsigned I = 0, E = Mapping.size(); I < E; ++I) {
+    if (Input == Mapping[I]) {
+      registerIncludeInserter(static_cast<IncludeSorter::IncludeStyle>(I));
+      return;
+    }
+    if (Input.equals_insensitive(Mapping[I])) {
+      Closest = Mapping[I];
+      break;
+    }
+    auto Edit = Input.edit_distance(Mapping[I], true, 1);
+    if (Edit < 2) {
+      Closest = Mapping[I];
+      break;
+    }
+  }
+  if (Closest.empty())
+    configurationDiag("Couldn't parse '%0' as an 'IncludeStyle'")
+        << It->getValue().Value;
+  else
+    configurationDiag(
+        "Couldn't parse '%0' as an 'IncludeStyle'; did you mean %1")
+        << It->getValue().Value << Closest;
+  SetDefault();
+}
+
+void ClangTidyContext::addInserterCallbacks(Preprocessor *PP) {
+  if (hasIncludeInserter())
+    Inserter->registerPreprocessor(PP);
+}
 } // namespace tidy
 } // namespace clang
 
Index: clang-tools-extra/clang-tidy/ClangTidyCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyCheck.h
+++ clang-tools-extra/clang-tidy/ClangTidyCheck.h
@@ -125,6 +125,10 @@
   configurationDiag(StringRef Description,
                     DiagnosticIDs::Level Level = DiagnosticIDs::Warning) const;
 
+  llvm::Optional<FixItHint> createMainFileIncludeInsertion(StringRef Include);
+  llvm::Optional<FixItHint> createIncludeInsertion(FileID File,
+                                                   StringRef Include);
+
   /// Should store all options supported by this check with their
   /// current values or default values for options that haven't been overridden.
   ///
@@ -413,6 +417,10 @@
   ClangTidyContext *Context;
 
 protected:
+  void registerIncludeInserter() {
+    Context->registerIncludeInserter(CheckName);
+  }
+
   OptionsView Options;
   /// Returns the main file name of the current translation unit.
   StringRef getCurrentMainFile() const { return Context->getCurrentFile(); }
Index: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
+++ clang-tools-extra/clang-tidy/ClangTidyCheck.cpp
@@ -216,5 +216,25 @@
     return std::move(*Val);
   return Default.str();
 }
+
+llvm::Optional<FixItHint>
+ClangTidyCheck::createMainFileIncludeInsertion(StringRef Include) {
+  if (!Context->hasIncludeInserter()) {
+    // Only crash on debug builds
+    assert(false && "No IncludeInserter registered");
+    return llvm::None;
+  }
+  return Context->getIncludeInserter().createMainFileIncludeInsertion(Include);
+}
+
+llvm::Optional<FixItHint>
+ClangTidyCheck::createIncludeInsertion(FileID File, StringRef Include) {
+  if (!Context->hasIncludeInserter()) {
+    // Only crash on debug builds
+    assert(false && "No IncludeInserter registered");
+    return llvm::None;
+  }
+  return Context->getIncludeInserter().createIncludeInsertion(File, Include);
+}
 } // namespace tidy
 } // namespace clang
Index: clang-tools-extra/clang-tidy/ClangTidy.cpp
===================================================================
--- clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -430,6 +430,8 @@
     PP->addPPCallbacks(std::move(ModuleExpander));
   }
 
+  Context.addInserterCallbacks(PP);
+
   for (auto &Check : Checks) {
     Check->registerMatchers(&*Finder);
     Check->registerPPCallbacks(*SM, PP, ModuleExpanderPP);
@@ -482,6 +484,12 @@
   ClangTidyOptions::OptionMap Options;
   std::vector<std::unique_ptr<ClangTidyCheck>> Checks =
       CheckFactories->createChecks(&Context);
+  if (Context.hasIncludeInserter()) {
+    ArrayRef<StringRef> Mapping = IncludeSorter::getStyleMapping();
+    auto Index = static_cast<unsigned>(Context.getIncludeInserter().getStyle());
+    assert(Index < Mapping.size());
+    Options["IncludeStyle"] = Mapping[Index];
+  }
   for (const auto &Check : Checks)
     Check->storeOptions(Options);
   return Options;
Index: clang-tools-extra/clang-tidy/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/CMakeLists.txt
@@ -17,6 +17,8 @@
   ClangTidyProfiling.cpp
   ExpandModularHeadersPPCallbacks.cpp
   GlobList.cpp
+  IncludeSorter.cpp
+  IncludeInserter.cpp
 
   DEPENDS
   ClangSACheckers
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to