forked from qt-creator/qt-creator
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:
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user