Clang: Process distinct documents concurrently

Speed ups the typical use cases that can profit from this:
 * Change a header file and switch then to source file
 * Open documents one after the other (Follow Symbol)
 * Change documents visible in splits (e.g. by refactoring action)
 * Restore a session with multiple splits

Fixes the test ClangIpcServer.GetCodeCompletionDependingOnArgumets.

Change-Id: Ia575bd59780df14146dfc091a4d48794e4a0543d
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-05-31 16:07:09 +02:00
parent 90f94363db
commit 38f72855b6
51 changed files with 3736 additions and 1061 deletions

View File

@@ -32,10 +32,11 @@
#include "clangtranslationunit.h"
#include "translationunits.h"
#include "unsavedfiles.h"
#include "clangjobs.h"
#include <utf8string.h>
#include <QMap>
#include <QScopedPointer>
#include <QTimer>
namespace ClangBackEnd {
@@ -57,18 +58,31 @@ public:
void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override;
void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override;
public /*for tests*/:
const TranslationUnits &translationUnitsForTestOnly() const;
const Jobs &jobsForTestOnly();
bool isTimerRunningForTestOnly() const;
void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value);
private:
Jobs &jobs();
void startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath);
void startDocumentAnnotations();
void reparseVisibleDocuments(std::vector<TranslationUnit> &translationUnits);
void addJobRequestsForDirtyAndVisibleDocuments();
void processJobsForDirtyAndVisibleDocuments();
void processInitialJobsForDocuments(const std::vector<TranslationUnit> &translationUnits);
JobRequest createJobRequest(const TranslationUnit &translationUnit,
JobRequest::Type type) const;
private:
ProjectParts projects;
UnsavedFiles unsavedFiles;
TranslationUnits translationUnits;
QTimer sendDocumentAnnotationsTimer;
QScopedPointer<Jobs> jobs_;
QTimer updateDocumentAnnotationsTimer;
int updateDocumentAnnotationsTimeOutInMs;
};
} // namespace ClangBackEnd