Clang: Centralize job related switch code

...and where applicable, ensure that a warning is printed once a
jobrequest type is not handled.

Change-Id: Ida0b5a175947ebf75c1c4e5116a77f0270825336
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-09-20 16:38:22 +02:00
parent be868863e5
commit 3b415dbd04
6 changed files with 85 additions and 79 deletions

View File

@@ -25,49 +25,10 @@
#include "clangiasyncjob.h"
#include "clangcompletecodejob.h"
#include "clangcreateinitialdocumentpreamblejob.h"
#include "clangfollowsymboljob.h"
#include "clangparsesupportivetranslationunitjob.h"
#include "clangreparsesupportivetranslationunitjob.h"
#include "clangrequestdocumentannotationsjob.h"
#include "clangrequestreferencesjob.h"
#include "clangresumedocumentjob.h"
#include "clangsuspenddocumentjob.h"
#include "clangupdatedocumentannotationsjob.h"
Q_LOGGING_CATEGORY(jobsLog, "qtc.clangbackend.jobs");
namespace ClangBackEnd {
IAsyncJob *IAsyncJob::create(JobRequest::Type type)
{
switch (type) {
case JobRequest::Type::UpdateDocumentAnnotations:
return new UpdateDocumentAnnotationsJob();
case JobRequest::Type::ParseSupportiveTranslationUnit:
return new ParseSupportiveTranslationUnitJob();
case JobRequest::Type::ReparseSupportiveTranslationUnit:
return new ReparseSupportiveTranslationUnitJob();
case JobRequest::Type::CreateInitialDocumentPreamble:
return new CreateInitialDocumentPreambleJob();
case JobRequest::Type::CompleteCode:
return new CompleteCodeJob();
case JobRequest::Type::RequestDocumentAnnotations:
return new RequestDocumentAnnotationsJob();
case JobRequest::Type::RequestReferences:
return new RequestReferencesJob();
case JobRequest::Type::FollowSymbol:
return new FollowSymbolJob();
case JobRequest::Type::SuspendDocument:
return new SuspendDocumentJob();
case JobRequest::Type::ResumeDocument:
return new ResumeDocumentJob();
}
return nullptr;
}
IAsyncJob::IAsyncJob()
: m_context(JobContext())
{

View File

@@ -39,8 +39,6 @@ namespace ClangBackEnd {
class IAsyncJob
{
public:
static IAsyncJob *create(JobRequest::Type type);
struct AsyncPrepareResult {
operator bool() const { return !translationUnitId.isEmpty(); }
Utf8String translationUnitId;

View File

@@ -25,6 +25,22 @@
#include "clangjobrequest.h"
#include "clangcompletecodejob.h"
#include "clangcreateinitialdocumentpreamblejob.h"
#include "clangfollowsymboljob.h"
#include "clangparsesupportivetranslationunitjob.h"
#include "clangreparsesupportivetranslationunitjob.h"
#include "clangrequestdocumentannotationsjob.h"
#include "clangrequestreferencesjob.h"
#include "clangresumedocumentjob.h"
#include "clangsuspenddocumentjob.h"
#include "clangupdatedocumentannotationsjob.h"
#include <clangsupport/clangcodemodelclientinterface.h>
#include <clangsupport/cmbcodecompletedmessage.h>
#include <clangsupport/followsymbolmessage.h>
#include <clangsupport/referencesmessage.h>
#include <QFileInfo>
#include <ostream>
@@ -102,6 +118,68 @@ JobRequest::JobRequest()
id = ++idCounter;
}
IAsyncJob *JobRequest::createJob() const
{
switch (type) {
case JobRequest::Type::UpdateDocumentAnnotations:
return new UpdateDocumentAnnotationsJob();
case JobRequest::Type::ParseSupportiveTranslationUnit:
return new ParseSupportiveTranslationUnitJob();
case JobRequest::Type::ReparseSupportiveTranslationUnit:
return new ReparseSupportiveTranslationUnitJob();
case JobRequest::Type::CreateInitialDocumentPreamble:
return new CreateInitialDocumentPreambleJob();
case JobRequest::Type::CompleteCode:
return new CompleteCodeJob();
case JobRequest::Type::RequestDocumentAnnotations:
return new RequestDocumentAnnotationsJob();
case JobRequest::Type::RequestReferences:
return new RequestReferencesJob();
case JobRequest::Type::FollowSymbol:
return new FollowSymbolJob();
case JobRequest::Type::SuspendDocument:
return new SuspendDocumentJob();
case JobRequest::Type::ResumeDocument:
return new ResumeDocumentJob();
}
return nullptr;
}
void JobRequest::cancelJob(ClangCodeModelClientInterface &client) const
{
// If a job request with a ticket number is cancelled, the plugin side
// must get back some results in order to clean up the state there.
switch (type) {
case JobRequest::Type::UpdateDocumentAnnotations:
case JobRequest::Type::ParseSupportiveTranslationUnit:
case JobRequest::Type::ReparseSupportiveTranslationUnit:
case JobRequest::Type::CreateInitialDocumentPreamble:
case JobRequest::Type::RequestDocumentAnnotations:
case JobRequest::Type::SuspendDocument:
case JobRequest::Type::ResumeDocument:
break;
case JobRequest::Type::RequestReferences:
client.references(ReferencesMessage(FileContainer(),
QVector<SourceRangeContainer>(),
false,
ticketNumber));
break;
case JobRequest::Type::CompleteCode:
client.codeCompleted(CodeCompletedMessage(CodeCompletions(),
CompletionCorrection::NoCorrection,
ticketNumber));
break;
case JobRequest::Type::FollowSymbol:
client.followSymbol(FollowSymbolMessage(FileContainer(),
SourceRangeContainer(),
true,
ticketNumber));
break;
}
}
bool JobRequest::operator==(const JobRequest &other) const
{
return type == other.type

View File

@@ -39,7 +39,9 @@
namespace ClangBackEnd {
class ClangCodeModelClientInterface;
class Document;
class IAsyncJob;
class JobRequest
{
@@ -91,6 +93,9 @@ public:
JobRequest();
IAsyncJob *createJob() const;
void cancelJob(ClangCodeModelClientInterface &client) const;
bool operator==(const JobRequest &other) const;
public:

View File

@@ -29,10 +29,6 @@
#include "clangiasyncjob.h"
#include "projects.h"
#include <clangsupport/cmbcodecompletedmessage.h>
#include <clangsupport/followsymbolmessage.h>
#include <clangsupport/referencesmessage.h>
#include <QDebug>
#include <QFutureSynchronizer>
#include <QLoggingCategory>
@@ -59,7 +55,7 @@ Jobs::Jobs(Documents &documents,
return isJobRunningForJobRequest(jobRequest);
});
m_queue.setCancelJobRequest([this](const JobRequest &jobRequest) {
return cancelJobRequest(jobRequest);
jobRequest.cancelJob(m_client);
});
}
@@ -132,7 +128,7 @@ JobRequests Jobs::runJobs(const JobRequests &jobsRequests)
bool Jobs::runJob(const JobRequest &jobRequest)
{
IAsyncJob *asyncJob = IAsyncJob::create(jobRequest.type);
IAsyncJob *asyncJob = jobRequest.createJob();
QTC_ASSERT(asyncJob, return false);
JobContext context(jobRequest, &m_documents, &m_unsavedFiles, &m_client);
@@ -204,35 +200,4 @@ bool Jobs::isJobRunningForJobRequest(const JobRequest &jobRequest) const
return Utils::anyOf(m_running.values(), hasJobRequest);
}
void Jobs::cancelJobRequest(const JobRequest &jobRequest)
{
// TODO: Consider to refactor this. Jobs should not know anything about
// concrete messages. On the other hand, having this here avoids
// duplication in multiple job classes.
// If a job request with a ticket number is cancelled, the plugin side
// must get back some results in order to clean up the state there.
switch (jobRequest.type) {
case JobRequest::Type::RequestReferences:
m_client.references(ReferencesMessage(FileContainer(),
QVector<SourceRangeContainer>(),
false,
jobRequest.ticketNumber));
break;
case JobRequest::Type::CompleteCode:
m_client.codeCompleted(CodeCompletedMessage(CodeCompletions(),
CompletionCorrection::NoCorrection,
jobRequest.ticketNumber));
break;
case JobRequest::Type::FollowSymbol:
m_client.followSymbol(FollowSymbolMessage(FileContainer(),
SourceRangeContainer(),
true,
jobRequest.ticketNumber));
break;
default:
break;
}
}
} // namespace ClangBackEnd

View File

@@ -80,7 +80,6 @@ public /*for tests*/:
bool isJobRunningForJobRequest(const JobRequest &jobRequest) const;
private:
void cancelJobRequest(const JobRequest &jobRequest);
JobRequests runJobs(const JobRequests &jobRequest);
bool runJob(const JobRequest &jobRequest);
void onJobFinished(IAsyncJob *asyncJob);