diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index a9932ddb9a3..49a8008aed9 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -61,7 +61,7 @@ ClangCodeModelServer::ClangCodeModelServer() QObject::connect(&updateAnnotationsTimer, &QTimer::timeout, [this]() { - processJobsForDirtyAndVisibleDocuments(); + processJobsForVisibleDocuments(); }); updateVisibleButNotCurrentDocumentsTimer.setSingleShot(true); @@ -180,7 +180,7 @@ void ClangCodeModelServer::projectPartsUpdated(const ProjectPartsUpdatedMessage resetDocuments(toDocumentResetInfos(affectedDocuments)); - processJobsForDirtyAndVisibleDocuments(); + processJobsForVisibleDocuments(); } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::projectPartsUpdated:" << exception.what(); } @@ -373,20 +373,30 @@ bool ClangCodeModelServer::isTimerRunningForTestOnly() const return updateAnnotationsTimer.isActive(); } -void ClangCodeModelServer::processJobsForDirtyAndVisibleDocuments() +void ClangCodeModelServer::processJobsForVisibleDocuments() { - processJobsForDirtyCurrentDocument(); + processJobsForCurrentDocument(); processTimerForVisibleButNotCurrentDocuments(); } -void ClangCodeModelServer::processJobsForDirtyCurrentDocument() +void ClangCodeModelServer::processJobsForCurrentDocument() { - auto currentDirtyDocuments = documents.filtered([](const Document &document) { - return document.isDirty() && document.isUsedByCurrentEditor(); + auto currentDocuments = documents.filtered([](const Document &document) { + return document.isUsedByCurrentEditor() + && (document.isDirty() || document.documentRevision() == 1); }); - QTC_CHECK(currentDirtyDocuments.size() <= 1); + QTC_CHECK(currentDocuments.size() <= 1); - addAndRunUpdateJobs(currentDirtyDocuments); + addAndRunUpdateJobs(currentDocuments); +} + +static void addUpdateAnnotationsJobsAndProcess(DocumentProcessor &processor) +{ + processor.addJob(JobRequest::Type::UpdateAnnotations, + PreferredTranslationUnit::PreviouslyParsed); + processor.addJob(JobRequest::Type::UpdateExtraAnnotations, + PreferredTranslationUnit::RecentlyParsed); + processor.process(); } void ClangCodeModelServer::addAndRunUpdateJobs(std::vector documents) @@ -395,11 +405,7 @@ void ClangCodeModelServer::addAndRunUpdateJobs(std::vector documents) DocumentProcessor processor = documentProcessors().processor(document); // Run the regular edit-reparse-job - processor.addJob(JobRequest::Type::UpdateAnnotations, - PreferredTranslationUnit::PreviouslyParsed); - processor.addJob(JobRequest::Type::UpdateExtraAnnotations, - PreferredTranslationUnit::RecentlyParsed); - processor.process(); + addUpdateAnnotationsJobsAndProcess(processor); // If requested, run jobs to increase the responsiveness of the document if (useSupportiveTranslationUnit() && document.isResponsivenessIncreaseNeeded()) { @@ -478,9 +484,7 @@ void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector &documents); - void processJobsForDirtyAndVisibleDocuments(); - void processJobsForDirtyCurrentDocument(); + void processJobsForVisibleDocuments(); + void processJobsForCurrentDocument(); void processTimerForVisibleButNotCurrentDocuments(); void processSuspendResumeJobs(const std::vector &documents); diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index ea4238975e3..bde56e21608 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -258,6 +258,21 @@ TEST_F(ClangCodeModelServerSlowTest, NoInitialAnnotationsForClosedDocument) closeDocument(filePathA); } +TEST_F(ClangCodeModelServerSlowTest, AnnotationsForInitiallyNotVisibleDocument) +{ + const int expectedAnnotationsCount = 2; + updateProjectPart(); + updateVisibilty(filePathA, filePathA); + expectAnnotations(expectedAnnotationsCount); + clangServer.documentsOpened( // Open document while another is still visible + DocumentsOpenedMessage({FileContainer(filePathB, projectPartId, Utf8String(), false, 1)}, + filePathA, {filePathA})); + clangServer.unsavedFilesUpdated( // Invalidate added jobs + UnsavedFilesUpdatedMessage({FileContainer(Utf8StringLiteral("aFile"), Utf8String())})); + + updateVisibilty(filePathB, filePathB); +} + TEST_F(ClangCodeModelServerSlowTest, NoAnnotationsForClosedDocument) { const int expectedAnnotationsCount = AnnotationJobsMultiplier; // Only for registration.