diff --git a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp index aa084c7a03b..0d93268d520 100644 --- a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp +++ b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp @@ -68,7 +68,7 @@ void ClangFileSystemWatcher::addFiles(const QSet &filePaths) void ClangFileSystemWatcher::updateTranslationUnitsWithChangedDependencies(const QString &filePath) { - translationUnits.updateTranslationUnitsWithChangedDependencies(filePath); + translationUnits.updateTranslationUnitsWithChangedDependency(filePath); watcher.addPath(filePath); emit fileChanged(); diff --git a/src/tools/clangbackend/ipcsource/translationunits.cpp b/src/tools/clangbackend/ipcsource/translationunits.cpp index 2e38e34fdd0..fce9ae9e0e5 100644 --- a/src/tools/clangbackend/ipcsource/translationunits.cpp +++ b/src/tools/clangbackend/ipcsource/translationunits.cpp @@ -62,7 +62,7 @@ void TranslationUnits::createOrUpdate(const QVector &fileContaine { for (const FileContainer &fileContainer : fileContainers) { createOrUpdateTranslationUnit(fileContainer); - updateTranslationUnitsWithChangedDependencies(fileContainer.filePath()); + updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); } } @@ -82,17 +82,8 @@ void TranslationUnits::remove(const QVector &fileContainers) { checkIfProjectPartsExists(fileContainers); - QVector processedFileContainers = fileContainers; - - auto removeBeginIterator = std::remove_if(translationUnits_.begin(), translationUnits_.end(), [&processedFileContainers] (const TranslationUnit &translationUnit) { - return removeFromFileContainer(processedFileContainers, translationUnit); - }); - - translationUnits_.erase(removeBeginIterator, translationUnits_.end()); - - if (!processedFileContainers.isEmpty()) - throw TranslationUnitDoesNotExistException(processedFileContainers.first()); - + removeTranslationUnits(fileContainers); + updateTranslationUnitsWithChangedDependencies(fileContainers); } const TranslationUnit &TranslationUnits::translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const @@ -127,12 +118,18 @@ void TranslationUnits::addWatchedFiles(QSet &filePaths) fileSystemWatcher.addFiles(filePaths); } -void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const Utf8String &filePath) +void TranslationUnits::updateTranslationUnitsWithChangedDependency(const Utf8String &filePath) { for (auto &translationUnit : translationUnits_) translationUnit.setDirtyIfDependencyIsMet(filePath); } +void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const QVector &fileContainers) +{ + for (const FileContainer &fileContainer : fileContainers) + updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); +} + void TranslationUnits::sendChangedDiagnostics() { for (const auto &translationUnit : translationUnits_) { @@ -228,5 +225,19 @@ void TranslationUnits::sendDiagnosticChangedMessage(const TranslationUnit &trans } } +void TranslationUnits::removeTranslationUnits(const QVector &fileContainers) +{ + QVector processedFileContainers = fileContainers; + + auto removeBeginIterator = std::remove_if(translationUnits_.begin(), translationUnits_.end(), [&processedFileContainers] (const TranslationUnit &translationUnit) { + return removeFromFileContainer(processedFileContainers, translationUnit); + }); + + translationUnits_.erase(removeBeginIterator, translationUnits_.end()); + + if (!processedFileContainers.isEmpty()) + throw TranslationUnitDoesNotExistException(processedFileContainers.first()); +} + } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/translationunits.h b/src/tools/clangbackend/ipcsource/translationunits.h index bf8990ea5da..186e00f2582 100644 --- a/src/tools/clangbackend/ipcsource/translationunits.h +++ b/src/tools/clangbackend/ipcsource/translationunits.h @@ -63,7 +63,8 @@ public: void addWatchedFiles(QSet &filePaths); - void updateTranslationUnitsWithChangedDependencies(const Utf8String &filePath); + void updateTranslationUnitsWithChangedDependency(const Utf8String &filePath); + void updateTranslationUnitsWithChangedDependencies(const QVector &fileContainers); void sendChangedDiagnostics(); @@ -80,6 +81,7 @@ private: void checkIfProjectPartExists(const Utf8String &projectFileName) const; void checkIfProjectPartsExists(const QVector &fileContainers) const; void sendDiagnosticChangedMessage(const TranslationUnit &translationUnit); + void removeTranslationUnits(const QVector &fileContainers); private: ClangFileSystemWatcher fileSystemWatcher; diff --git a/tests/unit/unittest/translationunitstest.cpp b/tests/unit/unittest/translationunitstest.cpp index 8fccfff37c3..b6096b1f5ed 100644 --- a/tests/unit/unittest/translationunitstest.cpp +++ b/tests/unit/unittest/translationunitstest.cpp @@ -28,6 +28,7 @@ ** ****************************************************************************/ +#include #include #include #include @@ -149,6 +150,32 @@ TEST_F(TranslationUnits, UpdateUnsavedFileAndCheckForReparse) ASSERT_TRUE(translationUnits.translationUnit(filePath, projectPartId).isNeedingReparse()); } +TEST_F(TranslationUnits, UpdateUnsavedFileAndCheckForDiagnostics) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, 74u); + ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, 74u); + ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); + translationUnits.createOrUpdate({fileContainer, headerContainer}); + translationUnits.translationUnit(filePath, projectPartId).diagnostics(); + + translationUnits.createOrUpdate({headerContainerWithUnsavedContent}); + + ASSERT_TRUE(translationUnits.translationUnit(filePath, projectPartId).hasNewDiagnostics()); +} + +TEST_F(TranslationUnits, RemoveFileAndCheckForDiagnostics) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, 74u); + ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, 74u); + ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); + translationUnits.createOrUpdate({fileContainer, headerContainer}); + translationUnits.translationUnit(filePath, projectPartId).diagnostics(); + + translationUnits.remove({headerContainerWithUnsavedContent}); + + ASSERT_TRUE(translationUnits.translationUnit(filePath, projectPartId).hasNewDiagnostics()); +} + TEST_F(TranslationUnits, DontGetNewerFileContainerIfRevisionIsTheSame) { ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, 74u);