diff options
6 files changed, 30 insertions, 2 deletions
diff --git a/src/tools/clangbackend/source/clangjobqueue.cpp b/src/tools/clangbackend/source/clangjobqueue.cpp index 7f3b64c65eb..f3e722ab971 100644 --- a/src/tools/clangbackend/source/clangjobqueue.cpp +++ b/src/tools/clangbackend/source/clangjobqueue.cpp @@ -247,6 +247,12 @@ bool JobQueue::areRunConditionsMet(const JobRequest &request, const Document &do } } + if (conditions.testFlag(Condition::DocumentParsed) + && !document.translationUnits().hasParsedTranslationUnit()) { + qCDebugJobs() << "Not choosing due to not yet parsed translation unit:" << request; + return false; + } + return true; } diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index 9f8eb55f77f..93017fc9569 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -156,6 +156,9 @@ static JobRequest::RunConditions conditionsForType(JobRequest::Type type) if (type == Type::RequestReferences) conditions |= Condition::CurrentDocumentRevision; + if (type != Type::UpdateDocumentAnnotations && type != Type::ParseSupportiveTranslationUnit) + conditions |= Condition::DocumentParsed; + return conditions; } diff --git a/src/tools/clangbackend/source/clangjobrequest.h b/src/tools/clangbackend/source/clangjobrequest.h index fb72491e4bd..4b79f22792e 100644 --- a/src/tools/clangbackend/source/clangjobrequest.h +++ b/src/tools/clangbackend/source/clangjobrequest.h @@ -70,7 +70,8 @@ public: DocumentNotVisible = 1 << 2, DocumentSuspended = 1 << 3, DocumentUnsuspended = 1 << 4, - CurrentDocumentRevision = 1 << 5, + DocumentParsed = 1 << 5, + CurrentDocumentRevision = 1 << 6, }; Q_DECLARE_FLAGS(RunConditions, RunCondition) diff --git a/src/tools/clangbackend/source/clangtranslationunits.cpp b/src/tools/clangbackend/source/clangtranslationunits.cpp index 432da3d02ce..f47513b6dca 100644 --- a/src/tools/clangbackend/source/clangtranslationunits.cpp +++ b/src/tools/clangbackend/source/clangtranslationunits.cpp @@ -111,6 +111,13 @@ bool TranslationUnits::areAllTranslationUnitsParsed() const }); } +bool TranslationUnits::hasParsedTranslationUnit() const +{ + return Utils::anyOf(m_units, [](const TranslationUnitDataPtr &unit) { + return unit->parseTimePoint != TimePoint(); + }); +} + int TranslationUnits::size() const { return m_units.size(); diff --git a/src/tools/clangbackend/source/clangtranslationunits.h b/src/tools/clangbackend/source/clangtranslationunits.h index e89d0ebd250..eed9b2d1ea8 100644 --- a/src/tools/clangbackend/source/clangtranslationunits.h +++ b/src/tools/clangbackend/source/clangtranslationunits.h @@ -65,6 +65,7 @@ public: void updateParseTimePoint(const Utf8String &translationUnitId, TimePoint timePoint); bool areAllTranslationUnitsParsed() const; + bool hasParsedTranslationUnit() const; public: // for tests int size() const; diff --git a/tests/unit/unittest/clangjobqueue-test.cpp b/tests/unit/unittest/clangjobqueue-test.cpp index 202e9762ab3..b9c336551f4 100644 --- a/tests/unit/unittest/clangjobqueue-test.cpp +++ b/tests/unit/unittest/clangjobqueue-test.cpp @@ -66,6 +66,8 @@ protected: PreferredTranslationUnit preferredTranslationUnit = PreferredTranslationUnit::RecentlyParsed) const; + void pretendParsedTranslationUnit(); + void updateDocumentRevision(); void updateUnsavedFiles(); void updateProject(); @@ -173,7 +175,7 @@ TEST_F(JobQueue, ProcessSingleJob) TEST_F(JobQueue, ProcessUntilEmpty) { jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CreateInitialDocumentPreamble)); + jobQueue.add(createJobRequest(filePath1, JobRequest::Type::ParseSupportiveTranslationUnit)); JobRequests jobsToRun; ASSERT_THAT(jobQueue.size(), Eq(2)); @@ -421,6 +423,7 @@ TEST_F(JobQueue, RequestCompleteCodeOutdatableByDocumentClose) TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByUnsavedFilesChange) { + pretendParsedTranslationUnit(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CompleteCode)); updateUnsavedFiles(); @@ -431,6 +434,7 @@ TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByUnsavedFilesChange) TEST_F(JobQueue, RequestCompleteCodeNotOutdatableByDocumentRevisionChange) { + pretendParsedTranslationUnit(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::CompleteCode)); updateDocumentRevision(); @@ -461,6 +465,7 @@ TEST_F(JobQueue, RequestCompleteCodeOutdatableByDocumentRevisionChange) TEST_F(JobQueue, RequestReferencesRunsForCurrentDocumentRevision) { + pretendParsedTranslationUnit(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::RequestReferences)); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -549,6 +554,11 @@ JobRequest JobQueue::createJobRequest( return jobRequest; } +void JobQueue::pretendParsedTranslationUnit() +{ + document.translationUnits().updateParseTimePoint(document.translationUnit().id(), Clock::now()); +} + void JobQueue::updateDocumentRevision() { documents.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)}); |