forked from qt-creator/qt-creator
Clang: Base JobQueue on translation unit
This enables a job per translation unit instead of per document. This does not change any behavior yet. Change-Id: Iafb8dab5da32b53dbb3010c16241bf89cbb81b38 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include "clangjobqueue.h"
|
||||
#include "clangdocument.h"
|
||||
#include "clangdocuments.h"
|
||||
#include "clangtranslationunits.h"
|
||||
#include "projects.h"
|
||||
#include "unsavedfiles.h"
|
||||
|
||||
@@ -164,43 +165,43 @@ void JobQueue::prioritizeRequests()
|
||||
JobRequests JobQueue::takeJobRequestsToRunNow()
|
||||
{
|
||||
JobRequests jobsToRun;
|
||||
QSet<DocumentId> documentsScheduledForThisRun;
|
||||
using TranslationUnitIds = QSet<Utf8String>;
|
||||
TranslationUnitIds translationUnitsScheduledForThisRun;
|
||||
|
||||
QMutableVectorIterator<JobRequest> i(m_queue);
|
||||
while (i.hasNext()) {
|
||||
const JobRequest &jobRequest = i.next();
|
||||
const JobRequest &request = i.next();
|
||||
|
||||
try {
|
||||
const Document &document
|
||||
= m_documents.document(jobRequest.filePath,
|
||||
jobRequest.projectPartId);
|
||||
const DocumentId documentId = DocumentId(jobRequest.filePath, jobRequest.projectPartId);
|
||||
const Document &document = m_documents.document(request.filePath,
|
||||
request.projectPartId);
|
||||
|
||||
if (!document.isUsedByCurrentEditor() && !document.isVisibleInEditor())
|
||||
continue;
|
||||
|
||||
if (documentsScheduledForThisRun.contains(documentId))
|
||||
const Utf8String id = document.translationUnit(request.preferredTranslationUnit).id();
|
||||
if (translationUnitsScheduledForThisRun.contains(id))
|
||||
continue;
|
||||
|
||||
if (isJobRunningForDocument(documentId))
|
||||
if (isJobRunningForTranslationUnit(id))
|
||||
continue;
|
||||
|
||||
documentsScheduledForThisRun.insert(documentId);
|
||||
jobsToRun += jobRequest;
|
||||
translationUnitsScheduledForThisRun.insert(id);
|
||||
jobsToRun += request;
|
||||
i.remove();
|
||||
} catch (const std::exception &exception) {
|
||||
qWarning() << "Error in Jobs::takeJobRequestsToRunNow for"
|
||||
<< jobRequest << ":" << exception.what();
|
||||
<< request << ":" << exception.what();
|
||||
}
|
||||
}
|
||||
|
||||
return jobsToRun;
|
||||
}
|
||||
|
||||
bool JobQueue::isJobRunningForDocument(const JobQueue::DocumentId &documentId)
|
||||
bool JobQueue::isJobRunningForTranslationUnit(const Utf8String &translationUnitId)
|
||||
{
|
||||
if (m_isJobRunningHandler)
|
||||
return m_isJobRunningHandler(documentId.first, documentId.second);
|
||||
return m_isJobRunningHandler(translationUnitId);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user