forked from qt-creator/qt-creator
Clang: Send the diagnostics delayed
Change-Id: I6065e51d38c262cf59d977c11c6453dec85a6dfe Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
@@ -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()));
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ private:
|
|||||||
ProjectParts projects;
|
ProjectParts projects;
|
||||||
UnsavedFiles unsavedFiles;
|
UnsavedFiles unsavedFiles;
|
||||||
TranslationUnits translationUnits;
|
TranslationUnits translationUnits;
|
||||||
|
QTimer sendDiagnosticsTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ClangBackEnd
|
} // namespace ClangBackEnd
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"));
|
||||||
|
|||||||
Reference in New Issue
Block a user