diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp index 8abe9f337dc..469a6e68428 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp @@ -201,14 +201,14 @@ void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode"); try { - auto document = documents.document(message.filePath(), message.projectPartId()); + Document document = documents.document(message.filePath(), message.projectPartId()); + DocumentProcessor processor = documentProcessors().processor(document); - JobRequest jobRequest = createJobRequest(document, JobRequest::Type::CompleteCode); + JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::CompleteCode); jobRequest.line = message.line(); jobRequest.column = message.column(); jobRequest.ticketNumber = message.ticketNumber(); - DocumentProcessor processor = documentProcessors().processor(document); processor.addJob(jobRequest); processor.process(); } catch (const std::exception &exception) { @@ -224,11 +224,8 @@ void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnot auto document = documents.document(message.fileContainer().filePath(), message.fileContainer().projectPartId()); - const JobRequest jobRequest = createJobRequest(document, - JobRequest::Type::RequestDocumentAnnotations); - DocumentProcessor processor = documentProcessors().processor(document); - processor.addJob(jobRequest); + processor.addJob(JobRequest::Type::RequestDocumentAnnotations); processor.process(); } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::requestDocumentAnnotations:" << exception.what(); @@ -294,9 +291,8 @@ void ClangCodeModelServer::addAndRunUpdateJobs(const std::vector &docu { for (const auto &document : documents) { DocumentProcessor processor = documentProcessors().processor(document); - processor.addJob(createJobRequest(document, - JobRequest::Type::UpdateDocumentAnnotations, - PreferredTranslationUnit::PreviouslyParsed)); + processor.addJob(JobRequest::Type::UpdateDocumentAnnotations, + PreferredTranslationUnit::PreviouslyParsed); processor.process(); } } @@ -320,15 +316,8 @@ void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector &documents); - JobRequest createJobRequest(const Document &document, - JobRequest::Type type, - PreferredTranslationUnit preferredTranslationUnit - = PreferredTranslationUnit::RecentlyParsed) const; - private: ProjectParts projects; UnsavedFiles unsavedFiles; diff --git a/src/tools/clangbackend/ipcsource/clangdocumentprocessor.cpp b/src/tools/clangbackend/ipcsource/clangdocumentprocessor.cpp index b0a0e0122f1..fdefb9ab447 100644 --- a/src/tools/clangbackend/ipcsource/clangdocumentprocessor.cpp +++ b/src/tools/clangbackend/ipcsource/clangdocumentprocessor.cpp @@ -62,7 +62,6 @@ public: Jobs jobs; SupportiveTranslationUnitInitializer supportiveTranslationUnitInitializer; - JobRequestCreator jobRequestCreator; }; DocumentProcessor::DocumentProcessor(const Document &document, @@ -78,9 +77,11 @@ DocumentProcessor::DocumentProcessor(const Document &document, { } -void DocumentProcessor::setJobRequestCreator(const JobRequestCreator &creator) +JobRequest DocumentProcessor::createJobRequest( + JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit) const { - d->supportiveTranslationUnitInitializer.setJobRequestCreator(creator); + return d->jobs.createJobRequest(d->document, type, preferredTranslationUnit); } void DocumentProcessor::addJob(const JobRequest &jobRequest) @@ -88,6 +89,11 @@ void DocumentProcessor::addJob(const JobRequest &jobRequest) d->jobs.add(jobRequest); } +void DocumentProcessor::addJob(JobRequest::Type type, PreferredTranslationUnit preferredTranslationUnit) +{ + d->jobs.add(d->document, type, preferredTranslationUnit); +} + JobRequests DocumentProcessor::process() { return d->jobs.process(); diff --git a/src/tools/clangbackend/ipcsource/clangdocumentprocessor.h b/src/tools/clangbackend/ipcsource/clangdocumentprocessor.h index 364d1fecaea..dc193f83628 100644 --- a/src/tools/clangbackend/ipcsource/clangdocumentprocessor.h +++ b/src/tools/clangbackend/ipcsource/clangdocumentprocessor.h @@ -49,9 +49,15 @@ public: ProjectParts &projects, ClangCodeModelClientInterface &client); - void setJobRequestCreator(const JobRequestCreator &creator); + JobRequest createJobRequest(JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit + = PreferredTranslationUnit::RecentlyParsed) const; void addJob(const JobRequest &jobRequest); + void addJob(JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit + = PreferredTranslationUnit::RecentlyParsed); + JobRequests process(); Document document() const; diff --git a/src/tools/clangbackend/ipcsource/clangjobrequest.h b/src/tools/clangbackend/ipcsource/clangjobrequest.h index 258763de945..d266bcd9950 100644 --- a/src/tools/clangbackend/ipcsource/clangjobrequest.h +++ b/src/tools/clangbackend/ipcsource/clangjobrequest.h @@ -93,9 +93,6 @@ public: }; using JobRequests = QVector; -using JobRequestCreator = std::function; QDebug operator<<(QDebug debug, const JobRequest &jobRequest); diff --git a/src/tools/clangbackend/ipcsource/clangjobs.cpp b/src/tools/clangbackend/ipcsource/clangjobs.cpp index 10cc1293157..a06d5b16c60 100644 --- a/src/tools/clangbackend/ipcsource/clangjobs.cpp +++ b/src/tools/clangbackend/ipcsource/clangjobs.cpp @@ -25,7 +25,9 @@ #include "clangjobs.h" +#include "clangdocument.h" #include "clangiasyncjob.h" +#include "projects.h" #include #include @@ -42,6 +44,7 @@ Jobs::Jobs(Documents &documents, ClangCodeModelClientInterface &client) : m_documents(documents) , m_unsavedFiles(unsavedFiles) + , m_projectParts(projectParts) , m_client(client) , m_queue(documents, projectParts) { @@ -66,11 +69,37 @@ Jobs::~Jobs() delete asyncJob; } +JobRequest Jobs::createJobRequest(const Document &document, + JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit) const +{ + JobRequest jobRequest; + jobRequest.type = type; + jobRequest.requirements = JobRequest::requirementsForType(type); + jobRequest.filePath = document.filePath(); + jobRequest.projectPartId = document.projectPartId(); + jobRequest.unsavedFilesChangeTimePoint = m_unsavedFiles.lastChangeTimePoint(); + jobRequest.documentRevision = document.documentRevision(); + jobRequest.preferredTranslationUnit = preferredTranslationUnit; + const ProjectPart &projectPart = m_projectParts.project(document.projectPartId()); + jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint(); + + return jobRequest; +} + void Jobs::add(const JobRequest &job) { m_queue.add(job); } +void Jobs::add(const Document &document, + JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit) +{ + const JobRequest jobRequest = createJobRequest(document, type, preferredTranslationUnit); + m_queue.add(jobRequest); +} + JobRequests Jobs::process() { const JobRequests jobsToRun = m_queue.processQueue(); diff --git a/src/tools/clangbackend/ipcsource/clangjobs.h b/src/tools/clangbackend/ipcsource/clangjobs.h index 02e8ff249d1..794577da910 100644 --- a/src/tools/clangbackend/ipcsource/clangjobs.h +++ b/src/tools/clangbackend/ipcsource/clangjobs.h @@ -59,7 +59,15 @@ public: ClangCodeModelClientInterface &client); ~Jobs(); + JobRequest createJobRequest(const Document &document, JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit + = PreferredTranslationUnit::RecentlyParsed) const; + void add(const JobRequest &job); + void add(const Document &document, + JobRequest::Type type, + PreferredTranslationUnit preferredTranslationUnit + = PreferredTranslationUnit::RecentlyParsed); JobRequests process(); @@ -79,6 +87,7 @@ private: private: Documents &m_documents; UnsavedFiles &m_unsavedFiles; + ProjectParts &m_projectParts; ClangCodeModelClientInterface &m_client; JobQueue m_queue; diff --git a/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.cpp b/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.cpp index d421ca05cbb..72b431a5f2d 100644 --- a/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.cpp +++ b/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.cpp @@ -42,11 +42,6 @@ SupportiveTranslationUnitInitializer::SupportiveTranslationUnitInitializer( { } -void SupportiveTranslationUnitInitializer::setJobRequestCreator(const JobRequestCreator &creator) -{ - m_jobRequestCreator = creator; -} - void SupportiveTranslationUnitInitializer::setIsDocumentClosedChecker( const IsDocumentClosedChecker &isDocumentClosedChecker) { @@ -124,11 +119,8 @@ bool SupportiveTranslationUnitInitializer::abortIfDocumentIsClosed() void SupportiveTranslationUnitInitializer::addJob(JobRequest::Type jobRequestType) { - QTC_CHECK(m_jobRequestCreator); - - const JobRequest jobRequest = m_jobRequestCreator(m_document, - jobRequestType, - PreferredTranslationUnit::LastUninitialized); + const JobRequest jobRequest = m_jobs.createJobRequest( + m_document, jobRequestType, PreferredTranslationUnit::LastUninitialized); m_jobs.add(jobRequest); } diff --git a/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.h b/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.h index f65cc4afd22..18a01864ddc 100644 --- a/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.h +++ b/src/tools/clangbackend/ipcsource/clangsupportivetranslationunitinitializer.h @@ -24,7 +24,6 @@ ****************************************************************************/ #include "clangdocument.h" -#include "clangjobrequest.h" #include "clangjobs.h" #include @@ -49,7 +48,6 @@ public: public: SupportiveTranslationUnitInitializer(const Document &document, Jobs &jobs); - void setJobRequestCreator(const JobRequestCreator &creator); void setIsDocumentClosedChecker(const IsDocumentClosedChecker &isDocumentClosedChecker); State state() const; @@ -61,7 +59,6 @@ public: // for tests void checkIfReparseJobFinished(const Jobs::RunningJob &job); private: - bool abortIfDocumentIsClosed(); void addJob(JobRequest::Type jobRequestType); @@ -70,7 +67,6 @@ private: Jobs &m_jobs; State m_state = State::NotInitialized; - JobRequestCreator m_jobRequestCreator; IsDocumentClosedChecker m_isDocumentClosedChecker; }; diff --git a/tests/unit/unittest/clangdocumentprocessor-test.cpp b/tests/unit/unittest/clangdocumentprocessor-test.cpp index 0898ec73c01..2e3dd99e2f0 100644 --- a/tests/unit/unittest/clangdocumentprocessor-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessor-test.cpp @@ -44,17 +44,17 @@ using namespace ClangBackEnd; namespace { -class DocumentProcessor : public ::testing::Test -{ -protected: - void SetUp() override; - void TearDown() override; +struct Data { + Data() + { + projects.createOrUpdate({ProjectPartContainer(projectPartId)}); - ClangBackEnd::JobRequest createJobRequest(ClangBackEnd::JobRequest::Type type) const; + const QVector fileContainer{FileContainer(filePath, projectPartId)}; + document = documents.create(fileContainer).front(); + documents.setVisibleInEditors({filePath}); + documents.setUsedByCurrentEditor(filePath); + } - bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const; - -protected: ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::Documents documents{projects, unsavedFiles}; @@ -64,65 +64,60 @@ protected: Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")}; Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; +}; - ClangBackEnd::DocumentProcessor documentProcessor{document, - documents, - unsavedFiles, - projects, - dummyIpcClient}; +class DocumentProcessor : public ::testing::Test +{ +protected: + void SetUp() override; + void TearDown() override; + +protected: + std::unique_ptr d; + std::unique_ptr documentProcessor; + + bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const; }; using DocumentProcessorSlowTest = DocumentProcessor; TEST_F(DocumentProcessor, ProcessEmpty) { - const JobRequests jobsStarted = documentProcessor.process(); + const JobRequests jobsStarted = documentProcessor->process(); ASSERT_THAT(jobsStarted.size(), 0); } TEST_F(DocumentProcessorSlowTest, ProcessSingleJob) { - const JobRequest jobRequest = createJobRequest(JobRequest::Type::UpdateDocumentAnnotations); - documentProcessor.addJob(jobRequest); + const JobRequest jobRequest + = documentProcessor->createJobRequest(JobRequest::Type::UpdateDocumentAnnotations); + documentProcessor->addJob(jobRequest); - const JobRequests jobsStarted = documentProcessor.process(); + const JobRequests jobsStarted = documentProcessor->process(); ASSERT_THAT(jobsStarted.size(), 1); } void DocumentProcessor::SetUp() { - projects.createOrUpdate({ProjectPartContainer(projectPartId)}); - - const QVector fileContainer{FileContainer(filePath, projectPartId)}; - document = documents.create(fileContainer).front(); - documents.setVisibleInEditors({filePath}); - documents.setUsedByCurrentEditor(filePath); + d.reset(new Data); + documentProcessor.reset(new ClangBackEnd::DocumentProcessor(d->document, + d->documents, + d->unsavedFiles, + d->projects, + d->dummyIpcClient)); } void DocumentProcessor::TearDown() { ASSERT_TRUE(waitUntilAllJobsFinished()); // QFuture/QFutureWatcher is implemented with events -} - -JobRequest DocumentProcessor::createJobRequest(JobRequest::Type type) const -{ - JobRequest jobRequest; - jobRequest.type = type; - jobRequest.requirements = JobRequest::requirementsForType(type); - jobRequest.filePath = filePath; - jobRequest.projectPartId = projectPartId; - jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = document.documentRevision(); - jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); - - return jobRequest; + d.reset(); } bool DocumentProcessor::waitUntilAllJobsFinished(int timeOutInMs) const { - const auto noJobsRunningAnymore = [this](){ return documentProcessor.runningJobs().isEmpty(); }; + const auto noJobsRunningAnymore = [this](){ return documentProcessor->runningJobs().isEmpty(); }; return ProcessEventUtilities::processEventsUntilTrue(noJobsRunningAnymore, timeOutInMs); } diff --git a/tests/unit/unittest/clangdocumentprocessors-test.cpp b/tests/unit/unittest/clangdocumentprocessors-test.cpp index 340c7144a0c..10eba470c6b 100644 --- a/tests/unit/unittest/clangdocumentprocessors-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessors-test.cpp @@ -54,8 +54,6 @@ protected: void SetUp() override; void TearDown() override; - ClangBackEnd::JobRequest createJobRequest(ClangBackEnd::JobRequest::Type type) const; - bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const; protected: @@ -149,8 +147,7 @@ TEST_F(DocumentProcessors, ProcessEmpty) TEST_F(DocumentProcessorsSlowTest, ProcessSingle) { DocumentProcessor documentProcessor = documentProcessors.create(document); - const JobRequest jobRequest = createJobRequest(JobRequest::Type::UpdateDocumentAnnotations); - documentProcessor.addJob(jobRequest); + documentProcessor.addJob(JobRequest::Type::UpdateDocumentAnnotations); const JobRequests jobsStarted = documentProcessors.process(); @@ -172,20 +169,6 @@ void DocumentProcessors::TearDown() ASSERT_TRUE(waitUntilAllJobsFinished()); // QFuture/QFutureWatcher is implemented with events } -JobRequest DocumentProcessors::createJobRequest(JobRequest::Type type) const -{ - JobRequest jobRequest; - jobRequest.type = type; - jobRequest.requirements = JobRequest::requirementsForType(type); - jobRequest.filePath = filePath; - jobRequest.projectPartId = projectPartId; - jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = document.documentRevision(); - jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); - - return jobRequest; -} - bool DocumentProcessors::waitUntilAllJobsFinished(int timeOutInMs) const { const auto noJobsRunningAnymore = [this](){ return documentProcessors.runningJobs().isEmpty(); }; diff --git a/tests/unit/unittest/clangjobs-test.cpp b/tests/unit/unittest/clangjobs-test.cpp index f688df3f601..427dab2e06f 100644 --- a/tests/unit/unittest/clangjobs-test.cpp +++ b/tests/unit/unittest/clangjobs-test.cpp @@ -58,9 +58,6 @@ protected: bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const; bool waitUntilJobChainFinished(int timeOutInMs = 10000) const; - JobRequest createJobRequest(const Utf8String &filePath, - JobRequest::Type type) const; - protected: ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; @@ -86,7 +83,7 @@ TEST_F(Jobs, ProcessEmptyQueue) TEST_F(JobsSlowTest, ProcessQueueWithSingleJob) { - jobs.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); const JobRequests jobsStarted = jobs.process(); @@ -96,9 +93,9 @@ TEST_F(JobsSlowTest, ProcessQueueWithSingleJob) TEST_F(JobsSlowTest, ProcessQueueUntilEmpty) { - jobs.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobs.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - jobs.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); + jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); + jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); jobs.process(); @@ -107,7 +104,7 @@ TEST_F(JobsSlowTest, ProcessQueueUntilEmpty) TEST_F(JobsSlowTest, IsJobRunning) { - jobs.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); + jobs.add(document, JobRequest::Type::UpdateDocumentAnnotations); jobs.process(); const bool isJobRunning = jobs.isJobRunningForTranslationUnit(document.translationUnit().id()); @@ -146,19 +143,4 @@ bool Jobs::waitUntilJobChainFinished(int timeOutInMs) const return ProcessEventUtilities::processEventsUntilTrue(noJobsRunningAnymore, timeOutInMs); } -JobRequest Jobs::createJobRequest(const Utf8String &filePath, - JobRequest::Type type) const -{ - JobRequest jobRequest; - jobRequest.type = type; - jobRequest.requirements = JobRequest::requirementsForType(type); - jobRequest.filePath = filePath; - jobRequest.projectPartId = projectPartId; - jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = document.documentRevision(); - jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); - - return jobRequest; -} - } // anonymous diff --git a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp index 82041220e6e..7afb3fa54e5 100644 --- a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp +++ b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp @@ -65,32 +65,8 @@ public: const Utf8String &projectPartId) { return !documents.hasDocument(filePath, projectPartId); }; - const auto jobRequestCreator = [this](const Document &document, - JobRequest::Type type, - PreferredTranslationUnit preferredTranslationUnit) { - return createJobRequest(document, type, preferredTranslationUnit); - }; initializer.reset(new ClangBackEnd::SupportiveTranslationUnitInitializer{document, jobs}); initializer->setIsDocumentClosedChecker(isDocumentClosed); - initializer->setJobRequestCreator(jobRequestCreator); - } - - JobRequest createJobRequest(const Document &document, - JobRequest::Type type, - PreferredTranslationUnit preferredTranslationUnit) const - { - JobRequest jobRequest; - jobRequest.type = type; - jobRequest.requirements = JobRequest::requirementsForType(type); - jobRequest.filePath = document.filePath(); - jobRequest.projectPartId = document.projectPartId(); - jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = document.documentRevision(); - jobRequest.preferredTranslationUnit = preferredTranslationUnit; - const ProjectPart &projectPart = projects.project(document.projectPartId()); - jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint(); - - return jobRequest; } public: @@ -234,9 +210,9 @@ void SupportiveTranslationUnitInitializer::parse() Jobs::RunningJob SupportiveTranslationUnitInitializer::createRunningJob(JobRequest::Type type) const { - const JobRequest jobRequest = d.createJobRequest(document, - type, - PreferredTranslationUnit::LastUninitialized); + const JobRequest jobRequest = jobs.createJobRequest(document, + type, + PreferredTranslationUnit::LastUninitialized); return Jobs::RunningJob{jobRequest, Utf8String(), QFuture()}; }