[clangd] Only re-open files if their flags changed

Reviewers: sammccall

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D72647
This commit is contained in:
David Goldman 2020-01-13 17:01:10 -05:00
parent 2f63d549f1
commit 60249c2c3b
3 changed files with 17 additions and 15 deletions

View File

@ -1126,10 +1126,8 @@ void ClangdLSPServer::onResolveTypeHierarchy(
void ClangdLSPServer::applyConfiguration(
const ConfigurationSettings &Settings) {
// Per-file update to the compilation database.
bool ShouldReparseOpenFiles = false;
llvm::StringSet<> ModifiedFiles;
for (auto &Entry : Settings.compilationDatabaseChanges) {
/// The opened files need to be reparsed only when some existing
/// entries are changed.
PathRef File = Entry.first;
auto Old = CDB->getCompileCommand(File);
auto New =
@ -1138,11 +1136,11 @@ void ClangdLSPServer::applyConfiguration(
/*Output=*/"");
if (Old != New) {
CDB->setCompileCommand(File, std::move(New));
ShouldReparseOpenFiles = true;
ModifiedFiles.insert(File);
}
}
if (ShouldReparseOpenFiles)
reparseOpenedFiles();
reparseOpenedFiles(ModifiedFiles);
}
void ClangdLSPServer::publishSemanticHighlighting(
@ -1463,10 +1461,15 @@ void ClangdLSPServer::onFileUpdated(PathRef File, const TUStatus &Status) {
notify("textDocument/clangd.fileStatus", Status.render(File));
}
void ClangdLSPServer::reparseOpenedFiles() {
void ClangdLSPServer::reparseOpenedFiles(
const llvm::StringSet<> &ModifiedFiles) {
if (ModifiedFiles.empty())
return;
// Reparse only opened files that were modified.
for (const Path &FilePath : DraftMgr.getActiveFiles())
Server->addDocument(FilePath, *DraftMgr.getDraft(FilePath),
WantDiagnostics::Auto);
if (ModifiedFiles.find(FilePath) != ModifiedFiles.end())
Server->addDocument(FilePath, *DraftMgr.getDraft(FilePath),
WantDiagnostics::Auto);
}
} // namespace clangd

View File

@ -20,6 +20,7 @@
#include "Transport.h"
#include "clang/Tooling/Core/Replacement.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringSet.h"
#include <memory>
namespace clang {
@ -123,10 +124,10 @@ private:
/// produce '->' and '::', respectively.
bool shouldRunCompletion(const CompletionParams &Params) const;
/// Forces a reparse of all currently opened files. As a result, this method
/// may be very expensive. This method is normally called when the
/// compilation database is changed.
void reparseOpenedFiles();
/// Forces a reparse of all currently opened files which were modified. As a
/// result, this method may be very expensive. This method is normally called
/// when the compilation database is changed.
void reparseOpenedFiles(const llvm::StringSet<> &ModifiedFiles);
void applyConfiguration(const ConfigurationSettings &Settings);
/// Sends a "publishSemanticHighlighting" notification to the LSP client.

View File

@ -46,8 +46,6 @@
# ERR: Updating file {{.*}}foo.c with command
# ERR: [{{.*}}clangd-test2]
# ERR: clang -c foo.c -Wall -Werror
# Don't reparse the second file:
# ERR: Skipping rebuild of the AST for {{.*}}bar.c
---
{"jsonrpc":"2.0","id":5,"method":"shutdown"}
---