Clang: Send the diagnostics delayed

Change-Id: I6065e51d38c262cf59d977c11c6453dec85a6dfe
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
Marco Bubke
2015-08-26 16:33:32 +02:00
parent aa300e363f
commit 0267f2861d
6 changed files with 68 additions and 13 deletions

View File

@@ -63,6 +63,12 @@ ClangIpcServer::ClangIpcServer()
{ {
client()->diagnosticsChanged(message); client()->diagnosticsChanged(message);
}); });
sendDiagnosticsTimer.setInterval(2000);
sendDiagnosticsTimer.setSingleShot(true);
QObject::connect(&sendDiagnosticsTimer,
&QTimer::timeout,
[this] () { translationUnits.sendChangedDiagnostics(); });
} }
void ClangIpcServer::end() void ClangIpcServer::end()
@@ -79,6 +85,7 @@ void ClangIpcServer::registerTranslationUnitsForCodeCompletion(const ClangBackEn
if (newerFileContainers.size() > 0) { if (newerFileContainers.size() > 0) {
unsavedFiles.createOrUpdate(newerFileContainers); unsavedFiles.createOrUpdate(newerFileContainers);
translationUnits.createOrUpdate(newerFileContainers); translationUnits.createOrUpdate(newerFileContainers);
sendDiagnosticsTimer.start();
} }
} catch (const ProjectPartDoNotExistException &exception) { } catch (const ProjectPartDoNotExistException &exception) {
client()->projectPartsDoNotExist(ProjectPartsDoNotExistMessage(exception.projectPartIds())); client()->projectPartsDoNotExist(ProjectPartsDoNotExistMessage(exception.projectPartIds()));

View File

@@ -62,6 +62,7 @@ private:
ProjectParts projects; ProjectParts projects;
UnsavedFiles unsavedFiles; UnsavedFiles unsavedFiles;
TranslationUnits translationUnits; TranslationUnits translationUnits;
QTimer sendDiagnosticsTimer;
}; };
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -70,6 +70,7 @@ public:
CXIndex index = nullptr; CXIndex index = nullptr;
uint documentRevision = 0; uint documentRevision = 0;
bool needsToBeReparsed = false; bool needsToBeReparsed = false;
bool hasNewDiagnostics = false;
}; };
TranslationUnitData::TranslationUnitData(const Utf8String &filePath, TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
@@ -190,10 +191,17 @@ bool TranslationUnit::isNeedingReparse() const
return d->needsToBeReparsed; return d->needsToBeReparsed;
} }
bool TranslationUnit::hasNewDiagnostics() const
{
return d->hasNewDiagnostics;
}
DiagnosticSet TranslationUnit::diagnostics() const DiagnosticSet TranslationUnit::diagnostics() const
{ {
reparseTranslationUnitIfFilesAreChanged(); reparseTranslationUnitIfFilesAreChanged();
d->hasNewDiagnostics = false;
return DiagnosticSet(clang_getDiagnosticSetFromTU(cxTranslationUnit())); return DiagnosticSet(clang_getDiagnosticSetFromTU(cxTranslationUnit()));
} }
@@ -204,10 +212,12 @@ const QSet<Utf8String> &TranslationUnit::dependedFilePaths() const
return d->dependedFilePaths; return d->dependedFilePaths;
} }
void TranslationUnit::updateIsNeedingReparseIfDependencyIsMet(const Utf8String &filePath) void TranslationUnit::setDirtyIfDependencyIsMet(const Utf8String &filePath)
{ {
if (d->dependedFilePaths.contains(filePath)) if (d->dependedFilePaths.contains(filePath)) {
d->needsToBeReparsed = true; d->needsToBeReparsed = true;
d->hasNewDiagnostics = true;
}
} }
void TranslationUnit::checkIfNull() const void TranslationUnit::checkIfNull() const

View File

@@ -97,12 +97,13 @@ public:
const time_point &lastProjectPartChangeTimePoint() const; const time_point &lastProjectPartChangeTimePoint() const;
bool isNeedingReparse() const; bool isNeedingReparse() const;
bool hasNewDiagnostics() const;
DiagnosticSet diagnostics() const; DiagnosticSet diagnostics() const;
const QSet<Utf8String> &dependedFilePaths() const; const QSet<Utf8String> &dependedFilePaths() const;
void updateIsNeedingReparseIfDependencyIsMet(const Utf8String &filePath); void setDirtyIfDependencyIsMet(const Utf8String &filePath);
private: private:
void checkIfNull() const; void checkIfNull() const;

View File

@@ -64,8 +64,6 @@ void TranslationUnits::createOrUpdate(const QVector<FileContainer> &fileContaine
createOrUpdateTranslationUnit(fileContainer); createOrUpdateTranslationUnit(fileContainer);
updateTranslationUnitsWithChangedDependencies(fileContainer.filePath()); updateTranslationUnitsWithChangedDependencies(fileContainer.filePath());
} }
sendChangedDiagnostics();
} }
static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const TranslationUnit &translationUnit) static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const TranslationUnit &translationUnit)
@@ -132,14 +130,14 @@ void TranslationUnits::addWatchedFiles(QSet<Utf8String> &filePaths)
void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const Utf8String &filePath) void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const Utf8String &filePath)
{ {
for (auto &translationUnit : translationUnits_) for (auto &translationUnit : translationUnits_)
translationUnit.updateIsNeedingReparseIfDependencyIsMet(filePath); translationUnit.setDirtyIfDependencyIsMet(filePath);
} }
void TranslationUnits::sendChangedDiagnostics() void TranslationUnits::sendChangedDiagnostics()
{ {
for (const auto &translationUnit : translationUnits_) { for (const auto &translationUnit : translationUnits_) {
if (translationUnit.isNeedingReparse()) if (translationUnit.hasNewDiagnostics())
sendDiagnosticChangedMessage(translationUnit); sendDiagnosticChangedMessage(translationUnit);
} }
} }

View File

@@ -28,6 +28,7 @@
** **
****************************************************************************/ ****************************************************************************/
#include <diagnosticset.h>
#include <filecontainer.h> #include <filecontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
@@ -179,7 +180,7 @@ TEST_F(TranslationUnit, NoNeedForReparsingForIndependendFile)
{ {
translationUnit.cxTranslationUnit(); translationUnit.cxTranslationUnit();
translationUnit.updateIsNeedingReparseIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h")); translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h"));
ASSERT_FALSE(translationUnit.isNeedingReparse()); ASSERT_FALSE(translationUnit.isNeedingReparse());
} }
@@ -188,7 +189,7 @@ TEST_F(TranslationUnit, NeedsReparsingForDependendFile)
{ {
translationUnit.cxTranslationUnit(); translationUnit.cxTranslationUnit();
translationUnit.updateIsNeedingReparseIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"));
ASSERT_TRUE(translationUnit.isNeedingReparse()); ASSERT_TRUE(translationUnit.isNeedingReparse());
} }
@@ -197,21 +198,58 @@ TEST_F(TranslationUnit, NeedsReparsingForMainFile)
{ {
translationUnit.cxTranslationUnit(); translationUnit.cxTranslationUnit();
translationUnit.updateIsNeedingReparseIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")); translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"));
ASSERT_TRUE(translationUnit.isNeedingReparse()); ASSERT_TRUE(translationUnit.isNeedingReparse());
} }
TEST_F(TranslationUnit, NeedsNoReparsingForDependendFileAfterReparsing) TEST_F(TranslationUnit, NeedsNoReparsingAfterReparsing)
{ {
translationUnit.cxTranslationUnit(); translationUnit.cxTranslationUnit();
translationUnit.updateIsNeedingReparseIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"));
translationUnit.cxTranslationUnit(); translationUnit.cxTranslationUnit();
ASSERT_FALSE(translationUnit.isNeedingReparse()); ASSERT_FALSE(translationUnit.isNeedingReparse());
} }
TEST_F(TranslationUnit, HasNoNewDiagnosticsForIndependendFile)
{
translationUnit.cxTranslationUnit();
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h"));
ASSERT_FALSE(translationUnit.hasNewDiagnostics());
}
TEST_F(TranslationUnit, HasNewDiagnosticsForDependendFile)
{
translationUnit.cxTranslationUnit();
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"));
ASSERT_TRUE(translationUnit.hasNewDiagnostics());
}
TEST_F(TranslationUnit, HasNewDiagnosticsForMainFile)
{
translationUnit.cxTranslationUnit();
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"));
ASSERT_TRUE(translationUnit.hasNewDiagnostics());
}
TEST_F(TranslationUnit, HasNoNewDiagnosticsAfterGettingDiagnostics)
{
translationUnit.cxTranslationUnit();
translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"));
translationUnit.diagnostics();
ASSERT_FALSE(translationUnit.hasNewDiagnostics());
}
//TEST_F(TranslationUnit, ThrowParseErrorForWrongArguments) //TEST_F(TranslationUnit, ThrowParseErrorForWrongArguments)
//{ //{
// ProjectPart project(Utf8StringLiteral("/path/to/projectfile")); // ProjectPart project(Utf8StringLiteral("/path/to/projectfile"));