summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/clangd/ClangdLSPServer.cpp4
-rw-r--r--clang-tools-extra/clangd/ClangdLSPServer.h5
-rw-r--r--clang-tools-extra/clangd/ClangdServer.cpp10
-rw-r--r--clang-tools-extra/clangd/ClangdServer.h11
-rw-r--r--clang-tools-extra/clangd/ClangdUnit.cpp17
-rw-r--r--clang-tools-extra/clangd/ClangdUnit.h5
-rw-r--r--clang-tools-extra/clangd/tool/ClangdMain.cpp17
-rw-r--r--clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp3
-rw-r--r--clang-tools-extra/unittests/clangd/FileIndexTests.cpp3
-rw-r--r--clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp3
-rw-r--r--clang-tools-extra/unittests/clangd/TestTU.cpp2
-rw-r--r--clang-tools-extra/unittests/clangd/TestTU.h2
12 files changed, 62 insertions, 20 deletions
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp
index d3ee6aa5ef6..e90ee916184 100644
--- a/clang-tools-extra/clangd/ClangdLSPServer.cpp
+++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp
@@ -720,11 +720,13 @@ void ClangdLSPServer::onSymbolInfo(const TextDocumentPositionParams &Params,
}
ClangdLSPServer::ClangdLSPServer(class Transport &Transp,
+ const FileSystemProvider &FSProvider,
const clangd::CodeCompleteOptions &CCOpts,
llvm::Optional<Path> CompileCommandsDir,
bool UseDirBasedCDB,
const ClangdServer::Options &Opts)
- : Transp(Transp), MsgHandler(new MessageHandler(*this)), CCOpts(CCOpts),
+ : Transp(Transp), MsgHandler(new MessageHandler(*this)),
+ FSProvider(FSProvider), CCOpts(CCOpts),
SupportedSymbolKinds(defaultSymbolKinds()),
SupportedCompletionItemKinds(defaultCompletionItemKinds()),
UseDirBasedCDB(UseDirBasedCDB),
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.h b/clang-tools-extra/clangd/ClangdLSPServer.h
index d84c298e4c9..40b9fc40e90 100644
--- a/clang-tools-extra/clangd/ClangdLSPServer.h
+++ b/clang-tools-extra/clangd/ClangdLSPServer.h
@@ -37,7 +37,8 @@ public:
/// for compile_commands.json in all parent directories of each file.
/// If UseDirBasedCDB is false, compile commands are not read from disk.
// FIXME: Clean up signature around CDBs.
- ClangdLSPServer(Transport &Transp, const clangd::CodeCompleteOptions &CCOpts,
+ ClangdLSPServer(Transport &Transp, const FileSystemProvider &FSProvider,
+ const clangd::CodeCompleteOptions &CCOpts,
llvm::Optional<Path> CompileCommandsDir, bool UseDirBasedCDB,
const ClangdServer::Options &Opts);
~ClangdLSPServer();
@@ -128,7 +129,7 @@ private:
void call(StringRef Method, llvm::json::Value Params);
void notify(StringRef Method, llvm::json::Value Params);
- RealFileSystemProvider FSProvider;
+ const FileSystemProvider &FSProvider;
/// Options used for code completion
clangd::CodeCompleteOptions CCOpts;
/// Options used for diagnostics.
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp
index d70321da15c..5f494210ac3 100644
--- a/clang-tools-extra/clangd/ClangdServer.cpp
+++ b/clang-tools-extra/clangd/ClangdServer.cpp
@@ -105,6 +105,7 @@ ClangdServer::ClangdServer(const GlobalCompilationDatabase &CDB,
DynamicIdx(Opts.BuildDynamicSymbolIndex
? new FileIndex(Opts.HeavyweightDynamicSymbolIndex)
: nullptr),
+ ClangTidyOptProvider(Opts.ClangTidyOptProvider),
WorkspaceRoot(Opts.WorkspaceRoot),
PCHs(std::make_shared<PCHContainerOperations>()),
// Pass a callback into `WorkScheduler` to extract symbols from a newly
@@ -140,13 +141,16 @@ ClangdServer::ClangdServer(const GlobalCompilationDatabase &CDB,
void ClangdServer::addDocument(PathRef File, llvm::StringRef Contents,
WantDiagnostics WantDiags) {
+ tidy::ClangTidyOptions Options = tidy::ClangTidyOptions::getDefaults();
+ if (ClangTidyOptProvider)
+ Options = ClangTidyOptProvider->getOptions(File);
// FIXME: some build systems like Bazel will take time to preparing
// environment to build the file, it would be nice if we could emit a
// "PreparingBuild" status to inform users, it is non-trivial given the
// current implementation.
- WorkScheduler.update(File,
- ParseInputs{getCompileCommand(File),
- FSProvider.getFileSystem(), Contents.str()},
+ WorkScheduler.update(File, ParseInputs{getCompileCommand(File),
+ FSProvider.getFileSystem(),
+ Contents.str(), Options},
WantDiags);
}
diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h
index 20874c4bc0b..dc9581b504d 100644
--- a/clang-tools-extra/clangd/ClangdServer.h
+++ b/clang-tools-extra/clangd/ClangdServer.h
@@ -9,6 +9,7 @@
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_CLANGDSERVER_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_CLANGDSERVER_H
+#include "../clang-tidy/ClangTidyOptions.h"
#include "Cancellation.h"
#include "ClangdUnit.h"
#include "CodeComplete.h"
@@ -92,6 +93,13 @@ public:
/// If set, use this index to augment code completion results.
SymbolIndex *StaticIndex = nullptr;
+ /// If set, enable clang-tidy in clangd, used to get clang-tidy
+ /// configurations for a particular file.
+ /// Clangd supports only a small subset of ClangTidyOptions, these options
+ /// (Checks, CheckOptions) are about which clang-tidy checks will be
+ /// enabled.
+ tidy::ClangTidyOptionsProvider *ClangTidyOptProvider = nullptr;
+
/// Clangd's workspace root. Relevant for "workspace" operations not bound
/// to a particular file.
/// FIXME: If not set, should use the current working directory.
@@ -257,6 +265,9 @@ private:
// Storage for merged views of the various indexes.
std::vector<std::unique_ptr<SymbolIndex>> MergedIdx;
+ // The provider used to provide a clang-tidy option for a specific file.
+ tidy::ClangTidyOptionsProvider *ClangTidyOptProvider = nullptr;
+
// GUARDED_BY(CachedCompletionFuzzyFindRequestMutex)
llvm::StringMap<llvm::Optional<FuzzyFindRequest>>
CachedCompletionFuzzyFindRequestByFile;
diff --git a/clang-tools-extra/clangd/ClangdUnit.cpp b/clang-tools-extra/clangd/ClangdUnit.cpp
index f7b8b731e12..268f7d1bbb4 100644
--- a/clang-tools-extra/clangd/ClangdUnit.cpp
+++ b/clang-tools-extra/clangd/ClangdUnit.cpp
@@ -132,6 +132,9 @@ public:
CompilerInstance &Clang) {
auto &PP = Clang.getPreprocessor();
auto *ExistingCallbacks = PP.getPPCallbacks();
+ // No need to replay events if nobody is listening.
+ if (!ExistingCallbacks)
+ return;
PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(
new ReplayPreamble(Includes, ExistingCallbacks,
Clang.getSourceManager(), PP, Clang.getLangOpts())));
@@ -227,7 +230,8 @@ ParsedAST::build(std::unique_ptr<CompilerInvocation> CI,
std::shared_ptr<const PreambleData> Preamble,
std::unique_ptr<llvm::MemoryBuffer> Buffer,
std::shared_ptr<PCHContainerOperations> PCHs,
- llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
+ llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
+ const tidy::ClangTidyOptions &ClangTidyOpts) {
assert(CI);
// Command-line parsing sets DisableFree to true by default, but we don't want
// to leak memory in clangd.
@@ -264,15 +268,8 @@ ParsedAST::build(std::unique_ptr<CompilerInvocation> CI,
tidy::ClangTidyCheckFactories CTFactories;
for (const auto &E : tidy::ClangTidyModuleRegistry::entries())
E.instantiate()->addCheckFactories(CTFactories);
- auto CTOpts = tidy::ClangTidyOptions::getDefaults();
- // FIXME: this needs to be configurable, and we need to support .clang-tidy
- // files and other options providers.
- // These checks exercise the matcher- and preprocessor-based hooks.
- CTOpts.Checks = "bugprone-sizeof-expression,"
- "bugprone-macro-repeated-side-effects,"
- "modernize-deprecated-headers";
CTContext.emplace(llvm::make_unique<tidy::DefaultOptionsProvider>(
- tidy::ClangTidyGlobalOptions(), CTOpts));
+ tidy::ClangTidyGlobalOptions(), ClangTidyOpts));
CTContext->setDiagnosticsEngine(&Clang->getDiagnostics());
CTContext->setASTContext(&Clang->getASTContext());
CTContext->setCurrentFile(MainInput.getFile());
@@ -538,7 +535,7 @@ buildAST(PathRef FileName, std::unique_ptr<CompilerInvocation> Invocation,
return ParsedAST::build(llvm::make_unique<CompilerInvocation>(*Invocation),
Preamble,
llvm::MemoryBuffer::getMemBufferCopy(Inputs.Contents),
- PCHs, std::move(VFS));
+ PCHs, std::move(VFS), Inputs.ClangTidyOpts);
}
SourceLocation getBeginningOfIdentifier(ParsedAST &Unit, const Position &Pos,
diff --git a/clang-tools-extra/clangd/ClangdUnit.h b/clang-tools-extra/clangd/ClangdUnit.h
index abcefdb6bf6..3a4841d7080 100644
--- a/clang-tools-extra/clangd/ClangdUnit.h
+++ b/clang-tools-extra/clangd/ClangdUnit.h
@@ -9,6 +9,7 @@
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_CLANGDUNIT_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_CLANGDUNIT_H
+#include "../clang-tidy/ClangTidyOptions.h"
#include "Diagnostics.h"
#include "FS.h"
#include "Function.h"
@@ -64,6 +65,7 @@ struct ParseInputs {
tooling::CompileCommand CompileCommand;
IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
std::string Contents;
+ tidy::ClangTidyOptions ClangTidyOpts;
};
/// Stores and provides access to parsed AST.
@@ -76,7 +78,8 @@ public:
std::shared_ptr<const PreambleData> Preamble,
std::unique_ptr<llvm::MemoryBuffer> Buffer,
std::shared_ptr<PCHContainerOperations> PCHs,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS);
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS,
+ const tidy::ClangTidyOptions &ClangTidyOpts);
ParsedAST(ParsedAST &&Other);
ParsedAST &operator=(ParsedAST &&Other);
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index 80f3f45e672..c969a5b7cfb 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -201,6 +201,12 @@ static llvm::cl::opt<bool> EnableFunctionArgSnippets(
"placeholders for method parameters."),
llvm::cl::init(CodeCompleteOptions().EnableFunctionArgSnippets));
+static llvm::cl::opt<std::string> ClangTidyChecks(
+ "clang-tidy-checks",
+ llvm::cl::desc("List of clang-tidy checks to run (this will overrides "
+ ".clang-tidy files)"),
+ llvm::cl::init(""), llvm::cl::Hidden);
+
namespace {
/// \brief Supports a test URI scheme with relaxed constraints for lit tests.
@@ -408,6 +414,7 @@ int main(int argc, char *argv[]) {
CCOpts.EnableFunctionArgSnippets = EnableFunctionArgSnippets;
CCOpts.AllScopes = AllScopesCompletion;
+ RealFileSystemProvider FSProvider;
// Initialize and run ClangdLSPServer.
// Change stdin to binary to not lose \r\n on windows.
llvm::sys::ChangeStdinToBinary();
@@ -427,8 +434,16 @@ int main(int argc, char *argv[]) {
PrettyPrint, InputStyle);
}
+ // Create an empty clang-tidy option.
+ auto OverrideClangTidyOptions = tidy::ClangTidyOptions::getDefaults();
+ OverrideClangTidyOptions.Checks = ClangTidyChecks;
+ tidy::FileOptionsProvider ClangTidyOptProvider(
+ tidy::ClangTidyGlobalOptions(),
+ /* Default */ tidy::ClangTidyOptions::getDefaults(),
+ /* Override */ OverrideClangTidyOptions, FSProvider.getFileSystem());
+ Opts.ClangTidyOptProvider = &ClangTidyOptProvider;
ClangdLSPServer LSPServer(
- *TransportLayer, CCOpts, CompileCommandsDirPath,
+ *TransportLayer, FSProvider, CCOpts, CompileCommandsDirPath,
/*UseDirBasedCDB=*/CompileArgsFrom == FilesystemCompileArgs, Opts);
llvm::set_thread_name("clangd.main");
return LSPServer.run() ? 0
diff --git a/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp b/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp
index 041540784a6..b5e83a080f0 100644
--- a/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp
+++ b/clang-tools-extra/unittests/clangd/ClangdUnitTests.cpp
@@ -141,6 +141,9 @@ TEST(DiagnosticsTest, ClangTidy) {
)cpp");
auto TU = TestTU::withCode(Test.code());
TU.HeaderFilename = "assert.h"; // Suppress "not found" error.
+ TU.ClangTidyChecks =
+ "-*, bugprone-sizeof-expression, bugprone-macro-repeated-side-effects, "
+ "modernize-deprecated-headers";
EXPECT_THAT(
TU.build().getDiagnostics(),
UnorderedElementsAre(
diff --git a/clang-tools-extra/unittests/clangd/FileIndexTests.cpp b/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
index f471e10894b..b0c21c0d060 100644
--- a/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
+++ b/clang-tools-extra/unittests/clangd/FileIndexTests.cpp
@@ -363,7 +363,8 @@ TEST(FileIndexTest, ReferencesInMainFileWithPreamble) {
auto AST =
ParsedAST::build(createInvocationFromCommandLine(Cmd), PreambleData,
llvm::MemoryBuffer::getMemBufferCopy(Main.code()),
- std::make_shared<PCHContainerOperations>(), PI.FS);
+ std::make_shared<PCHContainerOperations>(), PI.FS,
+ tidy::ClangTidyOptions::getDefaults());
ASSERT_TRUE(AST);
FileIndex Index;
Index.updateMain(MainFile, *AST);
diff --git a/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp b/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp
index 261c9b549b9..79ee779da62 100644
--- a/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp
+++ b/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp
@@ -38,7 +38,8 @@ class TUSchedulerTests : public ::testing::Test {
protected:
ParseInputs getInputs(PathRef File, std::string Contents) {
return ParseInputs{*CDB.getCompileCommand(File),
- buildTestFS(Files, Timestamps), std::move(Contents)};
+ buildTestFS(Files, Timestamps), std::move(Contents),
+ tidy::ClangTidyOptions::getDefaults()};
}
void updateWithCallback(TUScheduler &S, PathRef File,
diff --git a/clang-tools-extra/unittests/clangd/TestTU.cpp b/clang-tools-extra/unittests/clangd/TestTU.cpp
index 740c492297f..067d3f3f1d3 100644
--- a/clang-tools-extra/unittests/clangd/TestTU.cpp
+++ b/clang-tools-extra/unittests/clangd/TestTU.cpp
@@ -35,6 +35,8 @@ ParsedAST TestTU::build() const {
Inputs.CompileCommand.Directory = testRoot();
Inputs.Contents = Code;
Inputs.FS = buildTestFS({{FullFilename, Code}, {FullHeaderName, HeaderCode}});
+ Inputs.ClangTidyOpts = tidy::ClangTidyOptions::getDefaults();
+ Inputs.ClangTidyOpts.Checks = ClangTidyChecks;
auto PCHs = std::make_shared<PCHContainerOperations>();
auto CI = buildCompilerInvocation(Inputs);
assert(CI && "Failed to build compilation invocation.");
diff --git a/clang-tools-extra/unittests/clangd/TestTU.h b/clang-tools-extra/unittests/clangd/TestTU.h
index 26b48b32e15..7b84e4b5abf 100644
--- a/clang-tools-extra/unittests/clangd/TestTU.h
+++ b/clang-tools-extra/unittests/clangd/TestTU.h
@@ -48,6 +48,8 @@ struct TestTU {
// Extra arguments for the compiler invocation.
std::vector<const char *> ExtraArgs;
+ llvm::Optional<std::string> ClangTidyChecks;
+
ParsedAST build() const;
SymbolSlab headerSymbols() const;
std::unique_ptr<SymbolIndex> index() const;
OpenPOWER on IntegriCloud