Clang: Move createJobRequest into Jobs

This simplifies the high level client ClangCodeModelServer and removes
quite some duplication in tests.

Change-Id: I4c6ab8646c8728990ebaca2b920ae514e949c54a
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-05-04 12:43:38 +02:00
parent b091b20685
commit ac59e2be40
13 changed files with 107 additions and 171 deletions

View File

@@ -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<Document> &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<Docu
{
for (const auto &document : documents) {
DocumentProcessor processor = documentProcessors().create(document);
const auto jobRequestCreator = [this](const Document &document,
JobRequest::Type jobRequestType,
PreferredTranslationUnit preferredTranslationUnit) {
return createJobRequest(document, jobRequestType, preferredTranslationUnit);
};
processor.setJobRequestCreator(jobRequestCreator);
processor.addJob(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations));
processor.addJob(createJobRequest(document, JobRequest::Type::CreateInitialDocumentPreamble));
processor.addJob(JobRequest::Type::UpdateDocumentAnnotations);
processor.addJob(JobRequest::Type::CreateInitialDocumentPreamble);
processor.process();
}
}
@@ -357,25 +346,6 @@ void ClangCodeModelServer::startInitializingSupportiveTranslationUnits(
}
}
JobRequest ClangCodeModelServer::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;
}
void ClangCodeModelServer::setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value)
{
updateDocumentAnnotationsTimeOutInMs = value;

View File

@@ -82,11 +82,6 @@ private:
void addAndRunUpdateJobs(const std::vector<Document> &documents);
JobRequest createJobRequest(const Document &document,
JobRequest::Type type,
PreferredTranslationUnit preferredTranslationUnit
= PreferredTranslationUnit::RecentlyParsed) const;
private:
ProjectParts projects;
UnsavedFiles unsavedFiles;

View File

@@ -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();

View File

@@ -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;

View File

@@ -93,9 +93,6 @@ public:
};
using JobRequests = QVector<JobRequest>;
using JobRequestCreator = std::function<JobRequest(const Document &,
JobRequest::Type ,
PreferredTranslationUnit)>;
QDebug operator<<(QDebug debug, const JobRequest &jobRequest);

View File

@@ -25,7 +25,9 @@
#include "clangjobs.h"
#include "clangdocument.h"
#include "clangiasyncjob.h"
#include "projects.h"
#include <QDebug>
#include <QFutureSynchronizer>
@@ -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();

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -24,7 +24,6 @@
****************************************************************************/
#include "clangdocument.h"
#include "clangjobrequest.h"
#include "clangjobs.h"
#include <functional>
@@ -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;
};

View File

@@ -44,54 +44,8 @@ using namespace ClangBackEnd;
namespace {
class DocumentProcessor : public ::testing::Test
{
protected:
void SetUp() override;
void TearDown() override;
ClangBackEnd::JobRequest createJobRequest(ClangBackEnd::JobRequest::Type type) const;
bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const;
protected:
ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::Document document;
DummyIpcClient dummyIpcClient;
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")};
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
ClangBackEnd::DocumentProcessor documentProcessor{document,
documents,
unsavedFiles,
projects,
dummyIpcClient};
};
using DocumentProcessorSlowTest = DocumentProcessor;
TEST_F(DocumentProcessor, ProcessEmpty)
{
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 JobRequests jobsStarted = documentProcessor.process();
ASSERT_THAT(jobsStarted.size(), 1);
}
void DocumentProcessor::SetUp()
struct Data {
Data()
{
projects.createOrUpdate({ProjectPartContainer(projectPartId)});
@@ -101,28 +55,69 @@ void DocumentProcessor::SetUp()
documents.setUsedByCurrentEditor(filePath);
}
ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::Document document;
DummyIpcClient dummyIpcClient;
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp")};
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
};
class DocumentProcessor : public ::testing::Test
{
protected:
void SetUp() override;
void TearDown() override;
protected:
std::unique_ptr<Data> d;
std::unique_ptr<ClangBackEnd::DocumentProcessor> documentProcessor;
bool waitUntilAllJobsFinished(int timeOutInMs = 10000) const;
};
using DocumentProcessorSlowTest = DocumentProcessor;
TEST_F(DocumentProcessor, ProcessEmpty)
{
const JobRequests jobsStarted = documentProcessor->process();
ASSERT_THAT(jobsStarted.size(), 0);
}
TEST_F(DocumentProcessorSlowTest, ProcessSingleJob)
{
const JobRequest jobRequest
= documentProcessor->createJobRequest(JobRequest::Type::UpdateDocumentAnnotations);
documentProcessor->addJob(jobRequest);
const JobRequests jobsStarted = documentProcessor->process();
ASSERT_THAT(jobsStarted.size(), 1);
}
void DocumentProcessor::SetUp()
{
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);
}

View File

@@ -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(); };

View File

@@ -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

View File

@@ -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,7 +210,7 @@ void SupportiveTranslationUnitInitializer::parse()
Jobs::RunningJob SupportiveTranslationUnitInitializer::createRunningJob(JobRequest::Type type) const
{
const JobRequest jobRequest = d.createJobRequest(document,
const JobRequest jobRequest = jobs.createJobRequest(document,
type,
PreferredTranslationUnit::LastUninitialized);
return Jobs::RunningJob{jobRequest, Utf8String(), QFuture<void>()};