diff --git a/clang-tools-extra/clangd/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp --- a/clang-tools-extra/clangd/ParsedAST.cpp +++ b/clang-tools-extra/clangd/ParsedAST.cpp @@ -9,6 +9,7 @@ #include "ParsedAST.h" #include "../clang-tidy/ClangTidyCheck.h" #include "../clang-tidy/ClangTidyDiagnosticConsumer.h" +#include "../clang-tidy/ClangTidyModule.h" #include "../clang-tidy/ClangTidyModuleRegistry.h" #include "AST.h" #include "Compiler.h" @@ -25,7 +26,6 @@ #include "TidyProvider.h" #include "clang-include-cleaner/Record.h" #include "index/CanonicalIncludes.h" -#include "index/Index.h" #include "index/Symbol.h" #include "support/Logger.h" #include "support/Trace.h" @@ -50,7 +50,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" -#include #include #include #include @@ -476,9 +475,12 @@ // diagnostics. if (PreserveDiags) { trace::Span Tracer("ClangTidyInit"); - tidy::ClangTidyCheckFactories CTFactories; - for (const auto &E : tidy::ClangTidyModuleRegistry::entries()) - E.instantiate()->addCheckFactories(CTFactories); + static const tidy::ClangTidyCheckFactories CTFactories = [] { + tidy::ClangTidyCheckFactories CTFactories; + for (const auto &E : tidy::ClangTidyModuleRegistry::entries()) + E.instantiate()->addCheckFactories(CTFactories); + return CTFactories; + }(); CTContext.emplace(std::make_unique( tidy::ClangTidyGlobalOptions(), ClangTidyOpts)); CTContext->setDiagnosticsEngine(&Clang->getDiagnostics()); @@ -610,10 +612,8 @@ Macros = Patch->mainFileMacros(); Marks = Patch->marks(); } - auto& PP = Clang->getPreprocessor(); - PP.addPPCallbacks( - std::make_unique( - PP, Macros)); + auto &PP = Clang->getPreprocessor(); + PP.addPPCallbacks(std::make_unique(PP, Macros)); PP.addPPCallbacks( collectPragmaMarksCallback(Clang->getSourceManager(), Marks)); diff --git a/clang-tools-extra/clangd/TidyProvider.cpp b/clang-tools-extra/clangd/TidyProvider.cpp --- a/clang-tools-extra/clangd/TidyProvider.cpp +++ b/clang-tools-extra/clangd/TidyProvider.cpp @@ -8,6 +8,7 @@ #include "TidyProvider.h" #include "../clang-tidy/ClangTidyModuleRegistry.h" +#include "../clang-tidy/ClangTidyOptions.h" #include "Config.h" #include "support/FileCache.h" #include "support/Logger.h" @@ -283,11 +284,18 @@ tidy::ClangTidyOptions getTidyOptionsForFile(TidyProviderRef Provider, llvm::StringRef Filename) { - tidy::ClangTidyOptions Opts = tidy::ClangTidyOptions::getDefaults(); - Opts.Checks->clear(); - if (Provider) - Provider(Opts, Filename); - return Opts; + // getDefaults instantiates all check factories, which are registered at link + // time. So cache the results once. + static const auto Opts = [] { + auto Opts = tidy::ClangTidyOptions::getDefaults(); + Opts.Checks->clear(); + return Opts; + }(); + if (!Provider) + return Opts; + auto NewOpts = Opts; + Provider(NewOpts, Filename); + return NewOpts; } bool isRegisteredTidyCheck(llvm::StringRef Check) {