diff options
Diffstat (limited to 'src')
28 files changed, 539 insertions, 547 deletions
diff --git a/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri b/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri index f47655a6ea..7994e63d35 100644 --- a/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri +++ b/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri @@ -10,7 +10,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \ $$PWD/unsavedfile.h \ $$PWD/unsavedfiles.h \ $$PWD/projects.h \ - $$PWD/translationunits.h \ + $$PWD/clangdocuments.h \ $$PWD/translationunitparseerrorexception.h \ $$PWD/translationunitreparseerrorexception.h \ $$PWD/projectpart.h \ @@ -29,7 +29,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \ $$PWD/commandlinearguments.h \ $$PWD/cursor.h \ $$PWD/skippedsourceranges.h \ - $$PWD/clangtranslationunit.h \ + $$PWD/clangdocument.h \ $$PWD/clangtranslationunitupdater.h \ $$PWD/clangtype.h \ $$PWD/highlightingmark.h \ @@ -60,7 +60,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \ $$PWD/unsavedfile.cpp \ $$PWD/unsavedfiles.cpp \ $$PWD/projects.cpp \ - $$PWD/translationunits.cpp \ + $$PWD/clangdocuments.cpp \ $$PWD/translationunitparseerrorexception.cpp \ $$PWD/translationunitreparseerrorexception.cpp \ $$PWD/projectpart.cpp \ @@ -78,7 +78,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \ $$PWD/commandlinearguments.cpp \ $$PWD/cursor.cpp \ $$PWD/skippedsourceranges.cpp \ - $$PWD/clangtranslationunit.cpp \ + $$PWD/clangdocument.cpp \ $$PWD/clangtranslationunitupdater.cpp \ $$PWD/clangtype.cpp \ $$PWD/highlightingmark.cpp \ diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp index 5f1161717a..ed30fafb55 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp @@ -25,6 +25,7 @@ #include "clangcodemodelserver.h" +#include "clangdocuments.h" #include "clangfilesystemwatcher.h" #include "codecompleter.h" #include "diagnosticset.h" @@ -35,7 +36,6 @@ #include "translationunitfilenotexitexception.h" #include "translationunitisnullexception.h" #include "translationunitparseerrorexception.h" -#include "translationunits.h" #include <clangbackendipcdebugutils.h> #include <cmbcodecompletedmessage.h> @@ -85,7 +85,7 @@ int delayedDocumentAnnotationsTimerInterval() } // anonymous ClangCodeModelServer::ClangCodeModelServer() - : translationUnits(projects, unsavedFiles) + : documents(projects, unsavedFiles) , updateDocumentAnnotationsTimeOutInMs(delayedDocumentAnnotationsTimerInterval()) { updateDocumentAnnotationsTimer.setSingleShot(true); @@ -96,7 +96,7 @@ ClangCodeModelServer::ClangCodeModelServer() processJobsForDirtyAndVisibleDocuments(); }); - QObject::connect(translationUnits.clangFileSystemWatcher(), + QObject::connect(documents.clangFileSystemWatcher(), &ClangFileSystemWatcher::fileChanged, [this](const Utf8String &filePath) { ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(filePath); @@ -113,10 +113,10 @@ void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd: TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor"); try { - auto createdTranslationUnits = translationUnits.create(message.fileContainers()); + auto createdTranslationUnits = documents.create(message.fileContainers()); unsavedFiles.createOrUpdate(message.fileContainers()); - translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath()); - translationUnits.setVisibleInEditors(message.visibleEditorFilePaths()); + documents.setUsedByCurrentEditor(message.currentEditorFilePath()); + documents.setVisibleInEditors(message.visibleEditorFilePaths()); processInitialJobsForDocuments(createdTranslationUnits); } catch (const ProjectPartDoNotExistException &exception) { @@ -131,9 +131,9 @@ void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslati TIME_SCOPE_DURATION("ClangCodeModelServer::updateTranslationUnitsForEditor"); try { - const auto newerFileContainers = translationUnits.newerFileContainers(message.fileContainers()); + const auto newerFileContainers = documents.newerFileContainers(message.fileContainers()); if (newerFileContainers.size() > 0) { - translationUnits.update(newerFileContainers); + documents.update(newerFileContainers); unsavedFiles.createOrUpdate(newerFileContainers); updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs); @@ -152,7 +152,7 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterTranslationUnitsForEditor"); try { - translationUnits.remove(message.fileContainers()); + documents.remove(message.fileContainers()); unsavedFiles.remove(message.fileContainers()); } catch (const TranslationUnitDoesNotExistException &exception) { client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer())); @@ -169,7 +169,7 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa try { projects.createOrUpdate(message.projectContainers()); - translationUnits.setTranslationUnitsDirtyIfProjectPartChanged(); + documents.setDocumentsDirtyIfProjectPartChanged(); processJobsForDirtyAndVisibleDocuments(); } catch (const std::exception &exception) { @@ -196,7 +196,7 @@ void ClangCodeModelServer::registerUnsavedFilesForEditor(const RegisterUnsavedFi try { unsavedFiles.createOrUpdate(message.fileContainers()); - translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers()); + documents.updateDocumentsWithChangedDependencies(message.fileContainers()); updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs); } catch (const ProjectPartDoNotExistException &exception) { @@ -212,7 +212,7 @@ void ClangCodeModelServer::unregisterUnsavedFilesForEditor(const UnregisterUnsav try { unsavedFiles.remove(message.fileContainers()); - translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers()); + documents.updateDocumentsWithChangedDependencies(message.fileContainers()); } catch (const TranslationUnitDoesNotExistException &exception) { client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer())); } catch (const ProjectPartDoNotExistException &exception) { @@ -227,10 +227,9 @@ void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode"); try { - auto translationUnit = translationUnits.translationUnit(message.filePath(), - message.projectPartId()); + auto document = documents.document(message.filePath(), message.projectPartId()); - JobRequest jobRequest = createJobRequest(translationUnit, JobRequest::Type::CompleteCode); + JobRequest jobRequest = createJobRequest(document, JobRequest::Type::CompleteCode); jobRequest.line = message.line(); jobRequest.column = message.column(); jobRequest.ticketNumber = message.ticketNumber(); @@ -251,10 +250,10 @@ void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnot TIME_SCOPE_DURATION("ClangCodeModelServer::requestDocumentAnnotations"); try { - auto translationUnit = translationUnits.translationUnit(message.fileContainer().filePath(), - message.fileContainer().projectPartId()); + auto document = documents.document(message.fileContainer().filePath(), + message.fileContainer().projectPartId()); - const JobRequest jobRequest = createJobRequest(translationUnit, + const JobRequest jobRequest = createJobRequest(document, JobRequest::Type::RequestDocumentAnnotations); jobs().add(jobRequest); @@ -273,22 +272,22 @@ void ClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTran TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits"); try { - translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath()); - translationUnits.setVisibleInEditors(message.visibleEditorFilePaths()); + documents.setUsedByCurrentEditor(message.currentEditorFilePath()); + documents.setVisibleInEditors(message.visibleEditorFilePaths()); updateDocumentAnnotationsTimer.start(0); } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::updateVisibleTranslationUnits:" << exception.what(); } } -const TranslationUnits &ClangCodeModelServer::translationUnitsForTestOnly() const +const Documents &ClangCodeModelServer::documentsForTestOnly() const { - return translationUnits; + return documents; } void ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath) { - if (!translationUnits.hasTranslationUnitWithFilePath(filePath)) + if (!documents.hasDocumentWithFilePath(filePath)) updateDocumentAnnotationsTimer.start(0); } @@ -304,11 +303,9 @@ bool ClangCodeModelServer::isTimerRunningForTestOnly() const void ClangCodeModelServer::addJobRequestsForDirtyAndVisibleDocuments() { - for (const auto &translationUnit : translationUnits.translationUnits()) { - if (translationUnit.isNeedingReparse() && translationUnit.isVisibleInEditor()) { - jobs().add(createJobRequest(translationUnit, - JobRequest::Type::UpdateDocumentAnnotations)); - } + for (const auto &document : documents.documents()) { + if (document.isNeedingReparse() && document.isVisibleInEditor()) + jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations)); } } @@ -318,30 +315,27 @@ void ClangCodeModelServer::processJobsForDirtyAndVisibleDocuments() jobs().process(); } -void ClangCodeModelServer::processInitialJobsForDocuments( - const std::vector<TranslationUnit> &translationUnits) +void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector<Document> &documents) { - for (const auto &translationUnit : translationUnits) { - jobs().add(createJobRequest(translationUnit, - JobRequest::Type::UpdateDocumentAnnotations)); - jobs().add(createJobRequest(translationUnit, - JobRequest::Type::CreateInitialDocumentPreamble)); + for (const auto &document : documents) { + jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations)); + jobs().add(createJobRequest(document, JobRequest::Type::CreateInitialDocumentPreamble)); } jobs().process(); } -JobRequest ClangCodeModelServer::createJobRequest(const TranslationUnit &translationUnit, +JobRequest ClangCodeModelServer::createJobRequest(const Document &document, JobRequest::Type type) const { JobRequest jobRequest; jobRequest.type = type; jobRequest.requirements = JobRequest::requirementsForType(type); - jobRequest.filePath = translationUnit.filePath(); - jobRequest.projectPartId = translationUnit.projectPartId(); + jobRequest.filePath = document.filePath(); + jobRequest.projectPartId = document.projectPartId(); jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = translationUnit.documentRevision(); - const ProjectPart &projectPart = projects.project(translationUnit.projectPartId()); + jobRequest.documentRevision = document.documentRevision(); + const ProjectPart &projectPart = projects.project(document.projectPartId()); jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint(); return jobRequest; @@ -358,7 +352,7 @@ Jobs &ClangCodeModelServer::jobs() // Jobs needs a reference to the client, but the client is not known at // construction time of ClangCodeModelServer, so construct Jobs in a // lazy manner. - jobs_.reset(new Jobs(translationUnits, unsavedFiles, projects, *client())); + jobs_.reset(new Jobs(documents, unsavedFiles, projects, *client())); } return *jobs_.data(); diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h index 82c64b560d..8fb481eebc 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h @@ -29,8 +29,8 @@ #include "projectpart.h" #include "projects.h" -#include "clangtranslationunit.h" -#include "translationunits.h" +#include "clangdocument.h" +#include "clangdocuments.h" #include "unsavedfiles.h" #include "clangjobs.h" @@ -59,7 +59,7 @@ public: void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; public /*for tests*/: - const TranslationUnits &translationUnitsForTestOnly() const; + const Documents &documentsForTestOnly() const; const Jobs &jobsForTestOnly(); bool isTimerRunningForTestOnly() const; void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value); @@ -70,15 +70,14 @@ private: void startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath); void addJobRequestsForDirtyAndVisibleDocuments(); void processJobsForDirtyAndVisibleDocuments(); - void processInitialJobsForDocuments(const std::vector<TranslationUnit> &translationUnits); + void processInitialJobsForDocuments(const std::vector<Document> &documents); - JobRequest createJobRequest(const TranslationUnit &translationUnit, - JobRequest::Type type) const; + JobRequest createJobRequest(const Document &document, JobRequest::Type type) const; private: ProjectParts projects; UnsavedFiles unsavedFiles; - TranslationUnits translationUnits; + Documents documents; QScopedPointer<Jobs> jobs_; QTimer updateDocumentAnnotationsTimer; diff --git a/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp b/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp index d85c93190c..bf33e469b7 100644 --- a/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp +++ b/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp @@ -61,9 +61,9 @@ bool CompleteCodeJob::prepareAsyncRun() QTC_ASSERT(jobRequest.type == JobRequest::Type::CompleteCode, return false); try { - m_pinnedTranslationUnit = context().translationUnitForJobRequest(); + m_pinnedDocument = context().documentForJobRequest(); - const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); + const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore(); const UnsavedFiles unsavedFiles = *context().unsavedFiles; const quint32 line = jobRequest.line; const quint32 column = jobRequest.column; diff --git a/src/tools/clangbackend/ipcsource/clangcompletecodejob.h b/src/tools/clangbackend/ipcsource/clangcompletecodejob.h index d3ee9dbc6b..30c0bb8e3f 100644 --- a/src/tools/clangbackend/ipcsource/clangcompletecodejob.h +++ b/src/tools/clangbackend/ipcsource/clangcompletecodejob.h @@ -26,7 +26,7 @@ #pragma once #include "clangasyncjob.h" -#include "clangtranslationunit.h" +#include "clangdocument.h" #include <clangbackendipc/codecompletion.h> @@ -47,7 +47,7 @@ public: void finalizeAsyncRun() override; private: - TranslationUnit m_pinnedTranslationUnit; + Document m_pinnedDocument; }; } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.cpp b/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.cpp index 77ee981518..a882ec53bc 100644 --- a/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.cpp +++ b/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.cpp @@ -49,11 +49,11 @@ bool CreateInitialDocumentPreambleJob::prepareAsyncRun() QTC_ASSERT(jobRequest.type == JobRequest::Type::CreateInitialDocumentPreamble, return false); try { - m_pinnedTranslationUnit = context().translationUnitForJobRequest(); - m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); + m_pinnedDocument = context().documentForJobRequest(); + m_pinnedFileContainer = m_pinnedDocument.fileContainer(); - const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); - const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput(); + const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore(); + const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput(); setRunner([translationUnitCore, updateInput]() { return runAsyncHelper(translationUnitCore, updateInput); }); diff --git a/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.h b/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.h index 023a34c8f3..21fc875982 100644 --- a/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.h +++ b/src/tools/clangbackend/ipcsource/clangcreateinitialdocumentpreamblejob.h @@ -26,7 +26,7 @@ #pragma once #include "clangasyncjob.h" -#include "clangtranslationunit.h" +#include "clangdocument.h" namespace ClangBackEnd { @@ -37,7 +37,7 @@ public: void finalizeAsyncRun() override; private: - TranslationUnit m_pinnedTranslationUnit; + Document m_pinnedDocument; FileContainer m_pinnedFileContainer; }; diff --git a/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp b/src/tools/clangbackend/ipcsource/clangdocument.cpp index 8907a285bd..6cce9bc9b7 100644 --- a/src/tools/clangbackend/ipcsource/clangtranslationunit.cpp +++ b/src/tools/clangbackend/ipcsource/clangdocument.cpp @@ -23,8 +23,9 @@ ** ****************************************************************************/ -#include "clangtranslationunit.h" +#include "clangdocument.h" +#include "clangdocuments.h" #include "clangstring.h" #include "clangunsavedfilesshallowarguments.h" #include "codecompleter.h" @@ -35,7 +36,6 @@ #include "translationunitreparseerrorexception.h" #include "clangtranslationunitcore.h" #include "clangtranslationunitupdater.h" -#include "translationunits.h" #include "unsavedfiles.h" #include "unsavedfile.h" @@ -49,17 +49,17 @@ namespace ClangBackEnd { -class TranslationUnitData +class DocumentData { public: - TranslationUnitData(const Utf8String &filePath, - const ProjectPart &projectPart, - const Utf8StringVector &fileArguments, - TranslationUnits &translationUnits); - ~TranslationUnitData(); + DocumentData(const Utf8String &filePath, + const ProjectPart &projectPart, + const Utf8StringVector &fileArguments, + Documents &documents); + ~DocumentData(); public: - TranslationUnits &translationUnits; + Documents &documents; const Utf8String filePath; const Utf8StringVector fileArguments; @@ -80,11 +80,11 @@ public: bool isVisibleInEditor = false; }; -TranslationUnitData::TranslationUnitData(const Utf8String &filePath, - const ProjectPart &projectPart, - const Utf8StringVector &fileArguments, - TranslationUnits &translationUnits) - : translationUnits(translationUnits), +DocumentData::DocumentData(const Utf8String &filePath, + const ProjectPart &projectPart, + const Utf8StringVector &fileArguments, + Documents &documents) + : documents(documents), filePath(filePath), fileArguments(fileArguments), projectPart(projectPart), @@ -94,74 +94,74 @@ TranslationUnitData::TranslationUnitData(const Utf8String &filePath, dependedFilePaths.insert(filePath); } -TranslationUnitData::~TranslationUnitData() +DocumentData::~DocumentData() { clang_disposeTranslationUnit(translationUnit); clang_disposeIndex(index); } -TranslationUnit::TranslationUnit(const Utf8String &filePath, - const ProjectPart &projectPart, - const Utf8StringVector &fileArguments, - TranslationUnits &translationUnits, - FileExistsCheck fileExistsCheck) - : d(std::make_shared<TranslationUnitData>(filePath, - projectPart, - fileArguments, - translationUnits)) +Document::Document(const Utf8String &filePath, + const ProjectPart &projectPart, + const Utf8StringVector &fileArguments, + Documents &documents, + FileExistsCheck fileExistsCheck) + : d(std::make_shared<DocumentData>(filePath, + projectPart, + fileArguments, + documents)) { if (fileExistsCheck == CheckIfFileExists) checkIfFileExists(); } -TranslationUnit::~TranslationUnit() = default; -TranslationUnit::TranslationUnit(const TranslationUnit &) = default; -TranslationUnit &TranslationUnit::operator=(const TranslationUnit &) = default; +Document::~Document() = default; +Document::Document(const Document &) = default; +Document &Document::operator=(const Document &) = default; -TranslationUnit::TranslationUnit(TranslationUnit &&other) +Document::Document(Document &&other) : d(std::move(other.d)) { } -TranslationUnit &TranslationUnit::operator=(TranslationUnit &&other) +Document &Document::operator=(Document &&other) { d = std::move(other.d); return *this; } -void TranslationUnit::reset() +void Document::reset() { d.reset(); } -bool TranslationUnit::isNull() const +bool Document::isNull() const { return !d; } -bool TranslationUnit::isIntact() const +bool Document::isIntact() const { return !isNull() && fileExists() && !d->hasParseOrReparseFailed; } -Utf8String TranslationUnit::filePath() const +Utf8String Document::filePath() const { checkIfNull(); return d->filePath; } -Utf8StringVector TranslationUnit::fileArguments() const +Utf8StringVector Document::fileArguments() const { checkIfNull(); return d->fileArguments; } -FileContainer TranslationUnit::fileContainer() const +FileContainer Document::fileContainer() const { checkIfNull(); @@ -172,103 +172,103 @@ FileContainer TranslationUnit::fileContainer() const d->documentRevision); } -Utf8String TranslationUnit::projectPartId() const +Utf8String Document::projectPartId() const { checkIfNull(); return d->projectPart.projectPartId(); } -const ProjectPart &TranslationUnit::projectPart() const +const ProjectPart &Document::projectPart() const { checkIfNull(); return d->projectPart; } -const time_point TranslationUnit::lastProjectPartChangeTimePoint() const +const time_point Document::lastProjectPartChangeTimePoint() const { checkIfNull(); return d->lastProjectPartChangeTimePoint; } -bool TranslationUnit::isProjectPartOutdated() const +bool Document::isProjectPartOutdated() const { checkIfNull(); return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint; } -uint TranslationUnit::documentRevision() const +uint Document::documentRevision() const { checkIfNull(); return d->documentRevision; } -void TranslationUnit::setDocumentRevision(uint revision) +void Document::setDocumentRevision(uint revision) { checkIfNull(); d->documentRevision = revision; } -bool TranslationUnit::isUsedByCurrentEditor() const +bool Document::isUsedByCurrentEditor() const { checkIfNull(); return d->isUsedByCurrentEditor; } -void TranslationUnit::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor) +void Document::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor) { checkIfNull(); d->isUsedByCurrentEditor = isUsedByCurrentEditor; } -bool TranslationUnit::isVisibleInEditor() const +bool Document::isVisibleInEditor() const { checkIfNull(); return d->isVisibleInEditor; } -void TranslationUnit::setIsVisibleInEditor(bool isVisibleInEditor) +void Document::setIsVisibleInEditor(bool isVisibleInEditor) { checkIfNull(); d->isVisibleInEditor = isVisibleInEditor; } -time_point TranslationUnit::isNeededReparseChangeTimePoint() const +time_point Document::isNeededReparseChangeTimePoint() const { checkIfNull(); return d->needsToBeReparsedChangeTimePoint; } -bool TranslationUnit::isNeedingReparse() const +bool Document::isNeedingReparse() const { checkIfNull(); return d->needsToBeReparsed; } -void TranslationUnit::setDirtyIfProjectPartIsOutdated() +void Document::setDirtyIfProjectPartIsOutdated() { if (isProjectPartOutdated()) setDirty(); } -void TranslationUnit::setDirtyIfDependencyIsMet(const Utf8String &filePath) +void Document::setDirtyIfDependencyIsMet(const Utf8String &filePath) { if (d->dependedFilePaths.contains(filePath) && isMainFileAndExistsOrIsOtherFile(filePath)) setDirty(); } -TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const +TranslationUnitUpdateInput Document::createUpdateInput() const { TranslationUnitUpdateInput updateInput; updateInput.parseNeeded = isProjectPartOutdated(); @@ -276,14 +276,14 @@ TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const updateInput.needsToBeReparsedChangeTimePoint = d->needsToBeReparsedChangeTimePoint; updateInput.filePath = filePath(); updateInput.fileArguments = fileArguments(); - updateInput.unsavedFiles = d->translationUnits.unsavedFiles(); + updateInput.unsavedFiles = d->documents.unsavedFiles(); updateInput.projectId = projectPart().projectPartId(); updateInput.projectArguments = projectPart().arguments(); return updateInput; } -TranslationUnitUpdater TranslationUnit::createUpdater() const +TranslationUnitUpdater Document::createUpdater() const { const TranslationUnitUpdateInput updateInput = createUpdateInput(); TranslationUnitUpdater updater(d->index, d->translationUnit, updateInput); @@ -291,12 +291,12 @@ TranslationUnitUpdater TranslationUnit::createUpdater() const return updater; } -void TranslationUnit::setHasParseOrReparseFailed(bool hasFailed) +void Document::setHasParseOrReparseFailed(bool hasFailed) { d->hasParseOrReparseFailed = hasFailed; } -void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const +void Document::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const { d->hasParseOrReparseFailed = result.hasParseOrReparseFailed; if (d->hasParseOrReparseFailed) { @@ -310,7 +310,7 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult if (result.parseTimePointIsSet || result.reparsed) d->dependedFilePaths = result.dependedOnFilePaths; - d->translationUnits.addWatchedFiles(d->dependedFilePaths); + d->documents.addWatchedFiles(d->dependedFilePaths); if (result.reparsed && result.needsToBeReparsedChangeTimePoint == d->needsToBeReparsedChangeTimePoint) { @@ -318,14 +318,14 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult } } -TranslationUnitCore TranslationUnit::translationUnitCore() const +TranslationUnitCore Document::translationUnitCore() const { checkIfNull(); return TranslationUnitCore(d->filePath, d->index, d->translationUnit); } -void TranslationUnit::parse() const +void Document::parse() const { checkIfNull(); @@ -335,7 +335,7 @@ void TranslationUnit::parse() const incorporateUpdaterResult(result); } -void TranslationUnit::reparse() const +void Document::reparse() const { checkIfNull(); @@ -345,7 +345,7 @@ void TranslationUnit::reparse() const incorporateUpdaterResult(result); } -const QSet<Utf8String> TranslationUnit::dependedFilePaths() const +const QSet<Utf8String> Document::dependedFilePaths() const { checkIfNull(); checkIfFileExists(); @@ -353,30 +353,30 @@ const QSet<Utf8String> TranslationUnit::dependedFilePaths() const return d->dependedFilePaths; } -void TranslationUnit::setDirty() +void Document::setDirty() { d->needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now(); d->needsToBeReparsed = true; } -void TranslationUnit::checkIfNull() const +void Document::checkIfNull() const { if (isNull()) throw TranslationUnitIsNullException(); } -void TranslationUnit::checkIfFileExists() const +void Document::checkIfFileExists() const { if (!fileExists()) throw TranslationUnitFileNotExitsException(d->filePath); } -bool TranslationUnit::fileExists() const +bool Document::fileExists() const { return QFileInfo::exists(d->filePath.toString()); } -bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const +bool Document::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const { if (filePath == d->filePath) return QFileInfo::exists(d->filePath); @@ -384,17 +384,17 @@ bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePat return true; } -bool operator==(const TranslationUnit &first, const TranslationUnit &second) +bool operator==(const Document &first, const Document &second) { return first.filePath() == second.filePath() && first.projectPartId() == second.projectPartId(); } -void PrintTo(const TranslationUnit &translationUnit, ::std::ostream *os) +void PrintTo(const Document &document, ::std::ostream *os) { - *os << "TranslationUnit(" - << translationUnit.filePath().constData() << ", " - << translationUnit.projectPartId().constData() << ", " - << translationUnit.documentRevision() << ")"; + *os << "Document(" + << document.filePath().constData() << ", " + << document.projectPartId().constData() << ", " + << document.documentRevision() << ")"; } } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangtranslationunit.h b/src/tools/clangbackend/ipcsource/clangdocument.h index e3ec05fa87..f727424e3e 100644 --- a/src/tools/clangbackend/ipcsource/clangtranslationunit.h +++ b/src/tools/clangbackend/ipcsource/clangdocument.h @@ -44,15 +44,15 @@ class Utf8String; namespace ClangBackEnd { class TranslationUnitCore; -class TranslationUnitData; +class DocumentData; class TranslationUnitUpdateResult; class ProjectPart; class FileContainer; -class TranslationUnits; +class Documents; using time_point = std::chrono::steady_clock::time_point; -class TranslationUnit +class Document { public: enum FileExistsCheck { @@ -60,19 +60,19 @@ public: DoNotCheckIfFileExists }; - TranslationUnit() = default; - TranslationUnit(const Utf8String &filePath, - const ProjectPart &projectPart, - const Utf8StringVector &fileArguments, - TranslationUnits &translationUnits, - FileExistsCheck fileExistsCheck = CheckIfFileExists); - ~TranslationUnit(); + Document() = default; + Document(const Utf8String &filePath, + const ProjectPart &projectPart, + const Utf8StringVector &fileArguments, + Documents &documents, + FileExistsCheck fileExistsCheck = CheckIfFileExists); + ~Document(); - TranslationUnit(const TranslationUnit &cxTranslationUnit); - TranslationUnit &operator=(const TranslationUnit &cxTranslationUnit); + Document(const Document &cxTranslationUnit); + Document &operator=(const Document &cxTranslationUnit); - TranslationUnit(TranslationUnit &&cxTranslationUnit); - TranslationUnit &operator=(TranslationUnit &&cxTranslationUnit); + Document(Document &&cxTranslationUnit); + Document &operator=(Document &&cxTranslationUnit); void reset(); @@ -124,9 +124,9 @@ private: bool isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const; private: - mutable std::shared_ptr<TranslationUnitData> d; + mutable std::shared_ptr<DocumentData> d; }; -bool operator==(const TranslationUnit &first, const TranslationUnit &second); -void PrintTo(const TranslationUnit &translationUnit, ::std::ostream *os); +bool operator==(const Document &first, const Document &second); +void PrintTo(const Document &document, ::std::ostream *os); } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangdocuments.cpp b/src/tools/clangbackend/ipcsource/clangdocuments.cpp new file mode 100644 index 0000000000..1903760b23 --- /dev/null +++ b/src/tools/clangbackend/ipcsource/clangdocuments.cpp @@ -0,0 +1,311 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "clangdocuments.h" + +#include <diagnosticset.h> +#include <documentannotationschangedmessage.h> +#include <highlightingmarks.h> +#include <projectpartsdonotexistexception.h> +#include <projects.h> +#include <skippedsourceranges.h> +#include <translationunitalreadyexistsexception.h> +#include <translationunitdoesnotexistexception.h> +#include <unsavedfiles.h> + +#include <QDebug> + +#include <algorithm> + +namespace ClangBackEnd { + +bool operator==(const FileContainer &fileContainer, const Document &document) +{ + return fileContainer.filePath() == document.filePath() && fileContainer.projectPartId() == document.projectPartId(); +} + +bool operator==(const Document &document, const FileContainer &fileContainer) +{ + return fileContainer == document; +} + +Documents::Documents(ProjectParts &projects, UnsavedFiles &unsavedFiles) + : fileSystemWatcher(*this), + projectParts(projects), + unsavedFiles_(unsavedFiles) +{ +} + +std::vector<Document> Documents::create(const QVector<FileContainer> &fileContainers) +{ + checkIfDocumentsDoNotExist(fileContainers); + + std::vector<Document> createdTranslationUnits; + + for (const FileContainer &fileContainer : fileContainers) + createdTranslationUnits.push_back(createDocument(fileContainer)); + + return createdTranslationUnits; +} + +void Documents::update(const QVector<FileContainer> &fileContainers) +{ + checkIfDocumentsForFilePathsExist(fileContainers); + + for (const FileContainer &fileContainer : fileContainers) { + updateDocument(fileContainer); + updateDocumentsWithChangedDependency(fileContainer.filePath()); + } +} + +static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const Document &document) +{ + auto position = std::remove(fileContainers.begin(), fileContainers.end(), document); + + bool entryIsRemoved = position != fileContainers.end(); + + fileContainers.erase(position, fileContainers.end()); + + return entryIsRemoved; +} + +void Documents::remove(const QVector<FileContainer> &fileContainers) +{ + checkIfProjectPartsExists(fileContainers); + + removeDocuments(fileContainers); + updateDocumentsWithChangedDependencies(fileContainers); +} + +void Documents::setUsedByCurrentEditor(const Utf8String &filePath) +{ + for (Document &document : documents_) + document.setIsUsedByCurrentEditor(document.filePath() == filePath); +} + +void Documents::setVisibleInEditors(const Utf8StringVector &filePaths) +{ + for (Document &document : documents_) + document.setIsVisibleInEditor(filePaths.contains(document.filePath())); +} + +const Document &Documents::document(const Utf8String &filePath, const Utf8String &projectPartId) const +{ + checkIfProjectPartExists(projectPartId); + + auto findIterator = findDocument(filePath, projectPartId); + + if (findIterator == documents_.end()) + throw TranslationUnitDoesNotExistException(FileContainer(filePath, projectPartId)); + + return *findIterator; +} + +const Document &Documents::document(const FileContainer &fileContainer) const +{ + return document(fileContainer.filePath(), fileContainer.projectPartId()); +} + +bool Documents::hasDocument(const Utf8String &filePath, + const Utf8String &projectPartId) const +{ + return hasDocument(FileContainer(filePath, projectPartId)); +} + +const std::vector<Document> &Documents::documents() const +{ + return documents_; +} + +UnsavedFiles Documents::unsavedFiles() const +{ + return unsavedFiles_; +} + +void Documents::addWatchedFiles(QSet<Utf8String> &filePaths) +{ + fileSystemWatcher.addFiles(filePaths); +} + +void Documents::updateDocumentsWithChangedDependency(const Utf8String &filePath) +{ + for (auto &document : documents_) + document.setDirtyIfDependencyIsMet(filePath); +} + +void Documents::updateDocumentsWithChangedDependencies(const QVector<FileContainer> &fileContainers) +{ + for (const FileContainer &fileContainer : fileContainers) + updateDocumentsWithChangedDependency(fileContainer.filePath()); +} + +void Documents::setDocumentsDirtyIfProjectPartChanged() +{ + for (auto &document : documents_) + document.setDirtyIfProjectPartIsOutdated(); +} + +QVector<FileContainer> Documents::newerFileContainers(const QVector<FileContainer> &fileContainers) const +{ + QVector<FileContainer> newerContainers; + + auto translationUnitIsNewer = [this] (const FileContainer &fileContainer) { + try { + return document(fileContainer).documentRevision() != fileContainer.documentRevision(); + } catch (const TranslationUnitDoesNotExistException &) { + return true; + } + }; + + std::copy_if(fileContainers.cbegin(), + fileContainers.cend(), + std::back_inserter(newerContainers), + translationUnitIsNewer); + + return newerContainers; +} + +const ClangFileSystemWatcher *Documents::clangFileSystemWatcher() const +{ + return &fileSystemWatcher; +} + +Document Documents::createDocument(const FileContainer &fileContainer) +{ + Document::FileExistsCheck checkIfFileExists = fileContainer.hasUnsavedFileContent() ? Document::DoNotCheckIfFileExists : Document::CheckIfFileExists; + + documents_.emplace_back(fileContainer.filePath(), + projectParts.project(fileContainer.projectPartId()), + fileContainer.fileArguments(), + *this, + checkIfFileExists); + + documents_.back().setDocumentRevision(fileContainer.documentRevision()); + + return documents_.back(); +} + +void Documents::updateDocument(const FileContainer &fileContainer) +{ + const auto documents = findAllDocumentsWithFilePath(fileContainer.filePath()); + + for (auto document : documents) + document.setDocumentRevision(fileContainer.documentRevision()); +} + +std::vector<Document>::iterator Documents::findDocument(const FileContainer &fileContainer) +{ + return std::find(documents_.begin(), documents_.end(), fileContainer); +} + +std::vector<Document> Documents::findAllDocumentsWithFilePath(const Utf8String &filePath) +{ + const auto filePathCompare = [&filePath] (const Document &document) { + return document.filePath() == filePath; + }; + + std::vector<Document> documents; + std::copy_if(documents_.begin(), + documents_.end(), + std::back_inserter(documents), + filePathCompare); + + return documents; +} + +std::vector<Document>::const_iterator Documents::findDocument(const Utf8String &filePath, const Utf8String &projectPartId) const +{ + FileContainer fileContainer(filePath, projectPartId); + return std::find(documents_.begin(), documents_.end(), fileContainer); +} + +bool Documents::hasDocument(const FileContainer &fileContainer) const +{ + auto findIterator = std::find(documents_.begin(), documents_.end(), fileContainer); + + return findIterator != documents_.end(); +} + +bool Documents::hasDocumentWithFilePath(const Utf8String &filePath) const +{ + auto filePathCompare = [&filePath] (const Document &document) { + return document.filePath() == filePath; + }; + + auto findIterator = std::find_if(documents_.begin(), documents_.end(), filePathCompare); + + return findIterator != documents_.end(); +} + +void Documents::checkIfProjectPartExists(const Utf8String &projectFileName) const +{ + projectParts.project(projectFileName); +} + +void Documents::checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const +{ + Utf8StringVector notExistingProjectParts; + + for (const FileContainer &fileContainer : fileContainers) { + if (!projectParts.hasProjectPart(fileContainer.projectPartId())) + notExistingProjectParts.push_back(fileContainer.projectPartId()); + } + + if (!notExistingProjectParts.isEmpty()) + throw ProjectPartDoNotExistException(notExistingProjectParts); + +} + +void Documents::checkIfDocumentsDoNotExist(const QVector<FileContainer> &fileContainers) const +{ + for (const FileContainer &fileContainer : fileContainers) { + if (hasDocument(fileContainer)) + throw TranslationUnitAlreadyExistsException(fileContainer); + } +} + +void Documents::checkIfDocumentsForFilePathsExist(const QVector<FileContainer> &fileContainers) const +{ + for (const FileContainer &fileContainer : fileContainers) { + if (!hasDocumentWithFilePath(fileContainer.filePath())) + throw TranslationUnitDoesNotExistException(fileContainer); + } +} + +void Documents::removeDocuments(const QVector<FileContainer> &fileContainers) +{ + QVector<FileContainer> processedFileContainers = fileContainers; + + auto removeBeginIterator = std::remove_if(documents_.begin(), documents_.end(), [&processedFileContainers] (const Document &document) { + return removeFromFileContainer(processedFileContainers, document); + }); + + documents_.erase(removeBeginIterator, documents_.end()); + + if (!processedFileContainers.isEmpty()) + throw TranslationUnitDoesNotExistException(processedFileContainers.first()); +} + +} // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/translationunits.h b/src/tools/clangbackend/ipcsource/clangdocuments.h index 5607ebb665..3af689145b 100644 --- a/src/tools/clangbackend/ipcsource/translationunits.h +++ b/src/tools/clangbackend/ipcsource/clangdocuments.h @@ -25,8 +25,8 @@ #pragma once +#include "clangdocument.h" #include "clangfilesystemwatcher.h" -#include "clangtranslationunit.h" #include <filecontainer.h> @@ -39,54 +39,54 @@ namespace ClangBackEnd { class ProjectParts; class UnsavedFiles; -class TranslationUnits +class Documents { public: - TranslationUnits(ProjectParts &projectParts, UnsavedFiles &unsavedFiles); + Documents(ProjectParts &projectParts, UnsavedFiles &unsavedFiles); - std::vector<TranslationUnit> create(const QVector<FileContainer> &fileContainers); + std::vector<Document> create(const QVector<FileContainer> &fileContainers); void update(const QVector<FileContainer> &fileContainers); void remove(const QVector<FileContainer> &fileContainers); void setUsedByCurrentEditor(const Utf8String &filePath); void setVisibleInEditors(const Utf8StringVector &filePaths); - const TranslationUnit &translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; - const TranslationUnit &translationUnit(const FileContainer &fileContainer) const; - bool hasTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; - bool hasTranslationUnitWithFilePath(const Utf8String &filePath) const; + const Document &document(const Utf8String &filePath, const Utf8String &projectPartId) const; + const Document &document(const FileContainer &fileContainer) const; + bool hasDocument(const Utf8String &filePath, const Utf8String &projectPartId) const; + bool hasDocumentWithFilePath(const Utf8String &filePath) const; - const std::vector<TranslationUnit> &translationUnits() const; + const std::vector<Document> &documents() const; UnsavedFiles unsavedFiles() const; void addWatchedFiles(QSet<Utf8String> &filePaths); - void updateTranslationUnitsWithChangedDependency(const Utf8String &filePath); - void updateTranslationUnitsWithChangedDependencies(const QVector<FileContainer> &fileContainers); - void setTranslationUnitsDirtyIfProjectPartChanged(); + void updateDocumentsWithChangedDependency(const Utf8String &filePath); + void updateDocumentsWithChangedDependencies(const QVector<FileContainer> &fileContainers); + void setDocumentsDirtyIfProjectPartChanged(); QVector<FileContainer> newerFileContainers(const QVector<FileContainer> &fileContainers) const; const ClangFileSystemWatcher *clangFileSystemWatcher() const; private: - TranslationUnit createTranslationUnit(const FileContainer &fileContainer); - void updateTranslationUnit(const FileContainer &fileContainer); - std::vector<TranslationUnit>::iterator findTranslationUnit(const FileContainer &fileContainer); - std::vector<TranslationUnit> findAllTranslationUnitWithFilePath(const Utf8String &filePath); - std::vector<TranslationUnit>::const_iterator findTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; - bool hasTranslationUnit(const FileContainer &fileContainer) const; + Document createDocument(const FileContainer &fileContainer); + void updateDocument(const FileContainer &fileContainer); + std::vector<Document>::iterator findDocument(const FileContainer &fileContainer); + std::vector<Document> findAllDocumentsWithFilePath(const Utf8String &filePath); + std::vector<Document>::const_iterator findDocument(const Utf8String &filePath, const Utf8String &projectPartId) const; + bool hasDocument(const FileContainer &fileContainer) const; void checkIfProjectPartExists(const Utf8String &projectFileName) const; void checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const; - void checkIfTranslationUnitsDoesNotExists(const QVector<FileContainer> &fileContainers) const; - void checkIfTranslationUnitsForFilePathsDoesExists(const QVector<FileContainer> &fileContainers) const; + void checkIfDocumentsDoNotExist(const QVector<FileContainer> &fileContainers) const; + void checkIfDocumentsForFilePathsExist(const QVector<FileContainer> &fileContainers) const; - void removeTranslationUnits(const QVector<FileContainer> &fileContainers); + void removeDocuments(const QVector<FileContainer> &fileContainers); private: ClangFileSystemWatcher fileSystemWatcher; - std::vector<TranslationUnit> translationUnits_; + std::vector<Document> documents_; ProjectParts &projectParts; UnsavedFiles &unsavedFiles_; }; diff --git a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp index df333a84ed..10b586b882 100644 --- a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp +++ b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp @@ -25,7 +25,7 @@ #include "clangfilesystemwatcher.h" -#include "translationunits.h" +#include "clangdocuments.h" #include <utf8stringvector.h> @@ -64,8 +64,8 @@ QStringList filterExistingFiles(QStringList &&filePaths) } } -ClangFileSystemWatcher::ClangFileSystemWatcher(TranslationUnits &translationUnits) - : translationUnits(translationUnits) +ClangFileSystemWatcher::ClangFileSystemWatcher(Documents &documents) + : documents(documents) { connect(&watcher, &QFileSystemWatcher::fileChanged, @@ -83,7 +83,7 @@ void ClangFileSystemWatcher::addFiles(const QSet<Utf8String> &filePaths) void ClangFileSystemWatcher::updateTranslationUnitsWithChangedDependencies(const QString &filePath) { - translationUnits.updateTranslationUnitsWithChangedDependency(filePath); + documents.updateDocumentsWithChangedDependency(filePath); emit fileChanged(filePath); } diff --git a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.h b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.h index 4d6be96a21..8d14be153e 100644 --- a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.h +++ b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.h @@ -32,14 +32,14 @@ class Utf8String; namespace ClangBackEnd { -class TranslationUnits; +class Documents; class ClangFileSystemWatcher : public QObject { Q_OBJECT public: - ClangFileSystemWatcher(TranslationUnits &translationUnits); + ClangFileSystemWatcher(Documents &documents); void addFiles(const QSet<Utf8String> &filePaths); @@ -51,7 +51,7 @@ private: private: QFileSystemWatcher watcher; - TranslationUnits &translationUnits; + Documents &documents; }; } // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangjobcontext.cpp b/src/tools/clangbackend/ipcsource/clangjobcontext.cpp index 9c9c520fce..f09235ca32 100644 --- a/src/tools/clangbackend/ipcsource/clangjobcontext.cpp +++ b/src/tools/clangbackend/ipcsource/clangjobcontext.cpp @@ -25,24 +25,24 @@ #include "clangiasyncjob.h" -#include "translationunits.h" +#include "clangdocuments.h" namespace ClangBackEnd { JobContext::JobContext(const JobRequest &jobRequest, - TranslationUnits *translationUnits, + Documents *documents, UnsavedFiles *unsavedFiles, ClangCodeModelClientInterface *clientInterface) : jobRequest(jobRequest) - , translationUnits(translationUnits) + , documents(documents) , unsavedFiles(unsavedFiles) , client(clientInterface) { } -TranslationUnit JobContext::translationUnitForJobRequest() const +Document JobContext::documentForJobRequest() const { - return translationUnits->translationUnit(jobRequest.filePath, jobRequest.projectPartId); + return documents->document(jobRequest.filePath, jobRequest.projectPartId); } bool JobContext::isOutdated() const @@ -53,7 +53,7 @@ bool JobContext::isOutdated() const bool JobContext::isDocumentOpen() const { const bool hasTranslationUnit - = translationUnits->hasTranslationUnit(jobRequest.filePath, jobRequest.projectPartId); + = documents->hasDocument(jobRequest.filePath, jobRequest.projectPartId); if (!hasTranslationUnit) qCDebug(jobsLog) << "Document already closed for results of" << jobRequest; @@ -63,9 +63,8 @@ bool JobContext::isDocumentOpen() const bool JobContext::documentRevisionChanged() const { - const TranslationUnit &translationUnit - = translationUnits->translationUnit(jobRequest.filePath, jobRequest.projectPartId); - const bool revisionChanged = translationUnit.documentRevision() != jobRequest.documentRevision; + const Document &document = documents->document(jobRequest.filePath, jobRequest.projectPartId); + const bool revisionChanged = document.documentRevision() != jobRequest.documentRevision; if (revisionChanged) qCDebug(jobsLog) << "Document revision changed for results of" << jobRequest; diff --git a/src/tools/clangbackend/ipcsource/clangjobcontext.h b/src/tools/clangbackend/ipcsource/clangjobcontext.h index 6e124c609e..629d8320bd 100644 --- a/src/tools/clangbackend/ipcsource/clangjobcontext.h +++ b/src/tools/clangbackend/ipcsource/clangjobcontext.h @@ -30,8 +30,8 @@ namespace ClangBackEnd { class ClangCodeModelClientInterface; -class TranslationUnit; -class TranslationUnits; +class Document; +class Documents; class UnsavedFiles; class JobContext @@ -39,11 +39,11 @@ class JobContext public: JobContext() = default; JobContext(const JobRequest &jobRequest, - TranslationUnits *translationUnits, + Documents *documents, UnsavedFiles *unsavedFiles, ClangCodeModelClientInterface *client); - TranslationUnit translationUnitForJobRequest() const; + Document documentForJobRequest() const; bool isOutdated() const; bool isDocumentOpen() const; @@ -51,7 +51,7 @@ public: public: JobRequest jobRequest; - TranslationUnits *translationUnits = nullptr; + Documents *documents = nullptr; UnsavedFiles *unsavedFiles = nullptr; ClangCodeModelClientInterface *client = nullptr; }; diff --git a/src/tools/clangbackend/ipcsource/clangjobqueue.cpp b/src/tools/clangbackend/ipcsource/clangjobqueue.cpp index 6a3ae96015..1beb1cdace 100644 --- a/src/tools/clangbackend/ipcsource/clangjobqueue.cpp +++ b/src/tools/clangbackend/ipcsource/clangjobqueue.cpp @@ -25,8 +25,8 @@ #include "clangiasyncjob.h" #include "clangjobqueue.h" -#include "clangtranslationunit.h" -#include "translationunits.h" +#include "clangdocument.h" +#include "clangdocuments.h" #include "projects.h" #include "unsavedfiles.h" @@ -34,8 +34,8 @@ namespace ClangBackEnd { -JobQueue::JobQueue(TranslationUnits &translationUnits, ProjectParts &projectParts) - : m_translationUnits(translationUnits) +JobQueue::JobQueue(Documents &documents, ProjectParts &projectParts) + : m_documents(documents) , m_projectParts(projectParts) { } @@ -81,7 +81,7 @@ void JobQueue::removeOutDatedRequests() bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const { const JobRequest::Requirements requirements = jobRequest.requirements; - const UnsavedFiles unsavedFiles = m_translationUnits.unsavedFiles(); + const UnsavedFiles unsavedFiles = m_documents.unsavedFiles(); if (requirements.testFlag(JobRequest::CurrentUnsavedFiles)) { if (jobRequest.unsavedFilesChangeTimePoint != unsavedFiles.lastChangeTimePoint()) { @@ -93,7 +93,7 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const bool projectCheckedAndItExists = false; if (requirements.testFlag(JobRequest::DocumentValid)) { - if (!m_translationUnits.hasTranslationUnit(jobRequest.filePath, jobRequest.projectPartId)) { + if (!m_documents.hasDocument(jobRequest.filePath, jobRequest.projectPartId)) { qCDebug(jobsLog) << "Removing due to already closed document:" << jobRequest; return true; } @@ -104,15 +104,15 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const } projectCheckedAndItExists = true; - const TranslationUnit translationUnit - = m_translationUnits.translationUnit(jobRequest.filePath, jobRequest.projectPartId); - if (!translationUnit.isIntact()) { + const Document document + = m_documents.document(jobRequest.filePath, jobRequest.projectPartId); + if (!document.isIntact()) { qCDebug(jobsLog) << "Removing due to not intact translation unit:" << jobRequest; return true; } if (requirements.testFlag(JobRequest::CurrentDocumentRevision)) { - if (translationUnit.documentRevision() != jobRequest.documentRevision) { + if (document.documentRevision() != jobRequest.documentRevision) { qCDebug(jobsLog) << "Removing due to changed document revision:" << jobRequest; return true; } @@ -135,14 +135,14 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const return false; } -static int priority(const TranslationUnit &translationUnit) +static int priority(const Document &document) { int thePriority = 0; - if (translationUnit.isUsedByCurrentEditor()) + if (document.isUsedByCurrentEditor()) thePriority += 1000; - if (translationUnit.isVisibleInEditor()) + if (document.isVisibleInEditor()) thePriority += 100; return thePriority; @@ -152,8 +152,8 @@ void JobQueue::prioritizeRequests() { const auto lessThan = [this] (const JobRequest &r1, const JobRequest &r2) { // TODO: Getting the TU is O(n) currently, so this might become expensive for large n. - const TranslationUnit &t1 = m_translationUnits.translationUnit(r1.filePath, r1.projectPartId); - const TranslationUnit &t2 = m_translationUnits.translationUnit(r2.filePath, r2.projectPartId); + const Document &t1 = m_documents.document(r1.filePath, r1.projectPartId); + const Document &t2 = m_documents.document(r2.filePath, r2.projectPartId); return priority(t1) > priority(t2); }; @@ -171,12 +171,12 @@ JobRequests JobQueue::takeJobRequestsToRunNow() const JobRequest &jobRequest = i.next(); try { - const TranslationUnit &translationUnit - = m_translationUnits.translationUnit(jobRequest.filePath, + const Document &document + = m_documents.document(jobRequest.filePath, jobRequest.projectPartId); const DocumentId documentId = DocumentId(jobRequest.filePath, jobRequest.projectPartId); - if (!translationUnit.isUsedByCurrentEditor() && !translationUnit.isVisibleInEditor()) + if (!document.isUsedByCurrentEditor() && !document.isVisibleInEditor()) continue; if (documentsScheduledForThisRun.contains(documentId)) diff --git a/src/tools/clangbackend/ipcsource/clangjobqueue.h b/src/tools/clangbackend/ipcsource/clangjobqueue.h index fe71502473..1be38ceaf0 100644 --- a/src/tools/clangbackend/ipcsource/clangjobqueue.h +++ b/src/tools/clangbackend/ipcsource/clangjobqueue.h @@ -32,12 +32,12 @@ namespace ClangBackEnd { class ProjectParts; -class TranslationUnits; +class Documents; class JobQueue { public: - JobQueue(TranslationUnits &translationUnits, ProjectParts &projects); + JobQueue(Documents &documents, ProjectParts &projects); void add(const JobRequest &job); @@ -59,7 +59,7 @@ private: bool isJobRequestOutDated(const JobRequest &jobRequest) const; private: - TranslationUnits &m_translationUnits; + Documents &m_documents; ProjectParts &m_projectParts; IsJobRunningHandler m_isJobRunningHandler; diff --git a/src/tools/clangbackend/ipcsource/clangjobs.cpp b/src/tools/clangbackend/ipcsource/clangjobs.cpp index 54465f1527..536e43fb89 100644 --- a/src/tools/clangbackend/ipcsource/clangjobs.cpp +++ b/src/tools/clangbackend/ipcsource/clangjobs.cpp @@ -36,15 +36,15 @@ namespace ClangBackEnd { -Jobs::Jobs(TranslationUnits &translationUnits, +Jobs::Jobs(Documents &documents, UnsavedFiles &unsavedFiles, ProjectParts &projectParts, ClangCodeModelClientInterface &client) - : m_translationUnits(translationUnits) + : m_documents(documents) , m_unsavedFiles(unsavedFiles) , m_projectParts(projectParts) , m_client(client) - , m_queue(translationUnits, projectParts) + , m_queue(documents, projectParts) { m_queue.setIsJobRunningHandler([this](const Utf8String &filePath, const Utf8String &projectPartId) { @@ -89,7 +89,7 @@ JobRequests Jobs::runJobs(const JobRequests &jobsRequests) bool Jobs::runJob(const JobRequest &jobRequest) { if (IAsyncJob *asyncJob = IAsyncJob::create(jobRequest.type)) { - JobContext context(jobRequest, &m_translationUnits, &m_unsavedFiles, &m_client); + JobContext context(jobRequest, &m_documents, &m_unsavedFiles, &m_client); asyncJob->setContext(context); if (asyncJob->prepareAsyncRun()) { diff --git a/src/tools/clangbackend/ipcsource/clangjobs.h b/src/tools/clangbackend/ipcsource/clangjobs.h index 30e2fef7d8..94a507e3ef 100644 --- a/src/tools/clangbackend/ipcsource/clangjobs.h +++ b/src/tools/clangbackend/ipcsource/clangjobs.h @@ -34,9 +34,9 @@ namespace ClangBackEnd { class ClangCodeModelClientInterface; +class Documents; class IAsyncJob; class ProjectParts; -class TranslationUnits; class UnsavedFiles; class Jobs @@ -49,7 +49,7 @@ public: using RunningJobs = QHash<IAsyncJob *, RunningJob>; public: - Jobs(TranslationUnits &translationUnits, + Jobs(Documents &documents, UnsavedFiles &unsavedFiles, ProjectParts &projects, ClangCodeModelClientInterface &client); @@ -70,7 +70,7 @@ private: void onJobFinished(IAsyncJob *asyncJob); private: - TranslationUnits &m_translationUnits; + Documents &m_documents; UnsavedFiles &m_unsavedFiles; ProjectParts &m_projectParts; ClangCodeModelClientInterface &m_client; diff --git a/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.cpp b/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.cpp index ce9106d5cb..b745c4fe86 100644 --- a/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.cpp +++ b/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.cpp @@ -57,10 +57,10 @@ bool RequestDocumentAnnotationsJob::prepareAsyncRun() QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestDocumentAnnotations, return false); try { - m_pinnedTranslationUnit = context().translationUnitForJobRequest(); - m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); + m_pinnedDocument = context().documentForJobRequest(); + m_pinnedFileContainer = m_pinnedDocument.fileContainer(); - const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); + const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore(); setRunner([translationUnitCore]() { return runAsyncHelper(translationUnitCore); }); diff --git a/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.h b/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.h index f44c50b190..04bdd7cfc3 100644 --- a/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.h +++ b/src/tools/clangbackend/ipcsource/clangrequestdocumentannotationsjob.h @@ -26,7 +26,7 @@ #pragma once #include "clangasyncjob.h" -#include "clangtranslationunit.h" +#include "clangdocument.h" #include <clangbackendipc/diagnosticcontainer.h> #include <clangbackendipc/highlightingmarkcontainer.h> @@ -53,7 +53,7 @@ private: void sendAnnotations(const AsyncResult &result); private: - TranslationUnit m_pinnedTranslationUnit; + Document m_pinnedDocument; FileContainer m_pinnedFileContainer; }; diff --git a/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.cpp b/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.cpp index 2e61c50b92..0c62be4f9e 100644 --- a/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.cpp +++ b/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.cpp @@ -63,11 +63,11 @@ bool UpdateDocumentAnnotationsJob::prepareAsyncRun() QTC_ASSERT(jobRequest.type == JobRequest::Type::UpdateDocumentAnnotations, return false); try { - m_pinnedTranslationUnit = context().translationUnitForJobRequest(); - m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); + m_pinnedDocument = context().documentForJobRequest(); + m_pinnedFileContainer = m_pinnedDocument.fileContainer(); - const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); - const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput(); + const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore(); + const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput(); setRunner([translationUnitCore, updateInput]() { return runAsyncHelper(translationUnitCore, updateInput); }); @@ -92,7 +92,7 @@ void UpdateDocumentAnnotationsJob::finalizeAsyncRun() void UpdateDocumentAnnotationsJob::incorporateUpdaterResult(const AsyncResult &result) { - m_pinnedTranslationUnit.incorporateUpdaterResult(result.updateResult); + m_pinnedDocument.incorporateUpdaterResult(result.updateResult); } void UpdateDocumentAnnotationsJob::sendAnnotations(const AsyncResult &result) diff --git a/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.h b/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.h index 643df07571..c2ca0d13aa 100644 --- a/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.h +++ b/src/tools/clangbackend/ipcsource/clangupdatedocumentannotationsjob.h @@ -26,7 +26,7 @@ #pragma once #include "clangasyncjob.h" -#include "clangtranslationunit.h" +#include "clangdocument.h" #include "clangtranslationunitupdater.h" #include <clangbackendipc/diagnosticcontainer.h> @@ -57,7 +57,7 @@ private: void sendAnnotations(const AsyncResult &result); private: - TranslationUnit m_pinnedTranslationUnit; + Document m_pinnedDocument; FileContainer m_pinnedFileContainer; }; diff --git a/src/tools/clangbackend/ipcsource/codecompleter.cpp b/src/tools/clangbackend/ipcsource/codecompleter.cpp index db396ffab3..7756001bcb 100644 --- a/src/tools/clangbackend/ipcsource/codecompleter.cpp +++ b/src/tools/clangbackend/ipcsource/codecompleter.cpp @@ -34,7 +34,7 @@ #include "sourcelocation.h" #include "unsavedfile.h" #include "unsavedfiles.h" -#include "clangtranslationunit.h" +#include "clangdocument.h" #include "sourcerange.h" #include "clangunsavedfilesshallowarguments.h" #include "clangtranslationunitupdater.h" diff --git a/src/tools/clangbackend/ipcsource/skippedsourceranges.h b/src/tools/clangbackend/ipcsource/skippedsourceranges.h index ddbf3e62b5..a2c6c6a374 100644 --- a/src/tools/clangbackend/ipcsource/skippedsourceranges.h +++ b/src/tools/clangbackend/ipcsource/skippedsourceranges.h @@ -34,7 +34,7 @@ class SourceRangeContainer; class SkippedSourceRanges { public: - SkippedSourceRanges(CXTranslationUnit TranslationUnit, const char *filePath); + SkippedSourceRanges(CXTranslationUnit Document, const char *filePath); ~SkippedSourceRanges(); SkippedSourceRanges(const SkippedSourceRanges &) = delete; diff --git a/src/tools/clangbackend/ipcsource/sourcelocation.cpp b/src/tools/clangbackend/ipcsource/sourcelocation.cpp index 992599785d..5d54600c3c 100644 --- a/src/tools/clangbackend/ipcsource/sourcelocation.cpp +++ b/src/tools/clangbackend/ipcsource/sourcelocation.cpp @@ -25,9 +25,9 @@ #include "sourcelocation.h" +#include "clangdocument.h" #include "clangfilepath.h" #include "clangstring.h" -#include "clangtranslationunit.h" #include <utf8string.h> diff --git a/src/tools/clangbackend/ipcsource/sourcelocation.h b/src/tools/clangbackend/ipcsource/sourcelocation.h index 7fc7205ba2..6c2776c2be 100644 --- a/src/tools/clangbackend/ipcsource/sourcelocation.h +++ b/src/tools/clangbackend/ipcsource/sourcelocation.h @@ -32,7 +32,7 @@ namespace ClangBackEnd { class SourceLocationContainer; -class TranslationUnit; +class Document; class SourceLocation { diff --git a/src/tools/clangbackend/ipcsource/translationunits.cpp b/src/tools/clangbackend/ipcsource/translationunits.cpp deleted file mode 100644 index 5fde27b8b9..0000000000 --- a/src/tools/clangbackend/ipcsource/translationunits.cpp +++ /dev/null @@ -1,311 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "translationunits.h" - -#include <diagnosticset.h> -#include <documentannotationschangedmessage.h> -#include <highlightingmarks.h> -#include <projectpartsdonotexistexception.h> -#include <projects.h> -#include <skippedsourceranges.h> -#include <translationunitalreadyexistsexception.h> -#include <translationunitdoesnotexistexception.h> -#include <unsavedfiles.h> - -#include <QDebug> - -#include <algorithm> - -namespace ClangBackEnd { - -bool operator==(const FileContainer &fileContainer, const TranslationUnit &translationUnit) -{ - return fileContainer.filePath() == translationUnit.filePath() && fileContainer.projectPartId() == translationUnit.projectPartId(); -} - -bool operator==(const TranslationUnit &translationUnit, const FileContainer &fileContainer) -{ - return fileContainer == translationUnit; -} - -TranslationUnits::TranslationUnits(ProjectParts &projects, UnsavedFiles &unsavedFiles) - : fileSystemWatcher(*this), - projectParts(projects), - unsavedFiles_(unsavedFiles) -{ -} - -std::vector<TranslationUnit> TranslationUnits::create(const QVector<FileContainer> &fileContainers) -{ - checkIfTranslationUnitsDoesNotExists(fileContainers); - - std::vector<TranslationUnit> createdTranslationUnits; - - for (const FileContainer &fileContainer : fileContainers) - createdTranslationUnits.push_back(createTranslationUnit(fileContainer)); - - return createdTranslationUnits; -} - -void TranslationUnits::update(const QVector<FileContainer> &fileContainers) -{ - checkIfTranslationUnitsForFilePathsDoesExists(fileContainers); - - for (const FileContainer &fileContainer : fileContainers) { - updateTranslationUnit(fileContainer); - updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); - } -} - -static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const TranslationUnit &translationUnit) -{ - auto position = std::remove(fileContainers.begin(), fileContainers.end(), translationUnit); - - bool entryIsRemoved = position != fileContainers.end(); - - fileContainers.erase(position, fileContainers.end()); - - return entryIsRemoved; -} - -void TranslationUnits::remove(const QVector<FileContainer> &fileContainers) -{ - checkIfProjectPartsExists(fileContainers); - - removeTranslationUnits(fileContainers); - updateTranslationUnitsWithChangedDependencies(fileContainers); -} - -void TranslationUnits::setUsedByCurrentEditor(const Utf8String &filePath) -{ - for (TranslationUnit &translationUnit : translationUnits_) - translationUnit.setIsUsedByCurrentEditor(translationUnit.filePath() == filePath); -} - -void TranslationUnits::setVisibleInEditors(const Utf8StringVector &filePaths) -{ - for (TranslationUnit &translationUnit : translationUnits_) - translationUnit.setIsVisibleInEditor(filePaths.contains(translationUnit.filePath())); -} - -const TranslationUnit &TranslationUnits::translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const -{ - checkIfProjectPartExists(projectPartId); - - auto findIterator = findTranslationUnit(filePath, projectPartId); - - if (findIterator == translationUnits_.end()) - throw TranslationUnitDoesNotExistException(FileContainer(filePath, projectPartId)); - - return *findIterator; -} - -const TranslationUnit &TranslationUnits::translationUnit(const FileContainer &fileContainer) const -{ - return translationUnit(fileContainer.filePath(), fileContainer.projectPartId()); -} - -bool TranslationUnits::hasTranslationUnit(const Utf8String &filePath, - const Utf8String &projectPartId) const -{ - return hasTranslationUnit(FileContainer(filePath, projectPartId)); -} - -const std::vector<TranslationUnit> &TranslationUnits::translationUnits() const -{ - return translationUnits_; -} - -UnsavedFiles TranslationUnits::unsavedFiles() const -{ - return unsavedFiles_; -} - -void TranslationUnits::addWatchedFiles(QSet<Utf8String> &filePaths) -{ - fileSystemWatcher.addFiles(filePaths); -} - -void TranslationUnits::updateTranslationUnitsWithChangedDependency(const Utf8String &filePath) -{ - for (auto &translationUnit : translationUnits_) - translationUnit.setDirtyIfDependencyIsMet(filePath); -} - -void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const QVector<FileContainer> &fileContainers) -{ - for (const FileContainer &fileContainer : fileContainers) - updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); -} - -void TranslationUnits::setTranslationUnitsDirtyIfProjectPartChanged() -{ - for (auto &translationUnit : translationUnits_) - translationUnit.setDirtyIfProjectPartIsOutdated(); -} - -QVector<FileContainer> TranslationUnits::newerFileContainers(const QVector<FileContainer> &fileContainers) const -{ - QVector<FileContainer> newerContainers; - - auto translationUnitIsNewer = [this] (const FileContainer &fileContainer) { - try { - return translationUnit(fileContainer).documentRevision() != fileContainer.documentRevision(); - } catch (const TranslationUnitDoesNotExistException &) { - return true; - } - }; - - std::copy_if(fileContainers.cbegin(), - fileContainers.cend(), - std::back_inserter(newerContainers), - translationUnitIsNewer); - - return newerContainers; -} - -const ClangFileSystemWatcher *TranslationUnits::clangFileSystemWatcher() const -{ - return &fileSystemWatcher; -} - -TranslationUnit TranslationUnits::createTranslationUnit(const FileContainer &fileContainer) -{ - TranslationUnit::FileExistsCheck checkIfFileExists = fileContainer.hasUnsavedFileContent() ? TranslationUnit::DoNotCheckIfFileExists : TranslationUnit::CheckIfFileExists; - - translationUnits_.emplace_back(fileContainer.filePath(), - projectParts.project(fileContainer.projectPartId()), - fileContainer.fileArguments(), - *this, - checkIfFileExists); - - translationUnits_.back().setDocumentRevision(fileContainer.documentRevision()); - - return translationUnits_.back(); -} - -void TranslationUnits::updateTranslationUnit(const FileContainer &fileContainer) -{ - const auto translationUnits = findAllTranslationUnitWithFilePath(fileContainer.filePath()); - - for (auto translationUnit : translationUnits) - translationUnit.setDocumentRevision(fileContainer.documentRevision()); -} - -std::vector<TranslationUnit>::iterator TranslationUnits::findTranslationUnit(const FileContainer &fileContainer) -{ - return std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer); -} - -std::vector<TranslationUnit> TranslationUnits::findAllTranslationUnitWithFilePath(const Utf8String &filePath) -{ - const auto filePathCompare = [&filePath] (const TranslationUnit &translationUnit) { - return translationUnit.filePath() == filePath; - }; - - std::vector<TranslationUnit> translationUnits; - std::copy_if(translationUnits_.begin(), - translationUnits_.end(), - std::back_inserter(translationUnits), - filePathCompare); - - return translationUnits; -} - -std::vector<TranslationUnit>::const_iterator TranslationUnits::findTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const -{ - FileContainer fileContainer(filePath, projectPartId); - return std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer); -} - -bool TranslationUnits::hasTranslationUnit(const FileContainer &fileContainer) const -{ - auto findIterator = std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer); - - return findIterator != translationUnits_.end(); -} - -bool TranslationUnits::hasTranslationUnitWithFilePath(const Utf8String &filePath) const -{ - auto filePathCompare = [&filePath] (const TranslationUnit &translationUnit) { - return translationUnit.filePath() == filePath; - }; - - auto findIterator = std::find_if(translationUnits_.begin(), translationUnits_.end(), filePathCompare); - - return findIterator != translationUnits_.end(); -} - -void TranslationUnits::checkIfProjectPartExists(const Utf8String &projectFileName) const -{ - projectParts.project(projectFileName); -} - -void TranslationUnits::checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const -{ - Utf8StringVector notExistingProjectParts; - - for (const FileContainer &fileContainer : fileContainers) { - if (!projectParts.hasProjectPart(fileContainer.projectPartId())) - notExistingProjectParts.push_back(fileContainer.projectPartId()); - } - - if (!notExistingProjectParts.isEmpty()) - throw ProjectPartDoNotExistException(notExistingProjectParts); - -} - -void TranslationUnits::checkIfTranslationUnitsDoesNotExists(const QVector<FileContainer> &fileContainers) const -{ - for (const FileContainer &fileContainer : fileContainers) { - if (hasTranslationUnit(fileContainer)) - throw TranslationUnitAlreadyExistsException(fileContainer); - } -} - -void TranslationUnits::checkIfTranslationUnitsForFilePathsDoesExists(const QVector<FileContainer> &fileContainers) const -{ - for (const FileContainer &fileContainer : fileContainers) { - if (!hasTranslationUnitWithFilePath(fileContainer.filePath())) - throw TranslationUnitDoesNotExistException(fileContainer); - } -} - -void TranslationUnits::removeTranslationUnits(const QVector<FileContainer> &fileContainers) -{ - QVector<FileContainer> processedFileContainers = fileContainers; - - auto removeBeginIterator = std::remove_if(translationUnits_.begin(), translationUnits_.end(), [&processedFileContainers] (const TranslationUnit &translationUnit) { - return removeFromFileContainer(processedFileContainers, translationUnit); - }); - - translationUnits_.erase(removeBeginIterator, translationUnits_.end()); - - if (!processedFileContainers.isEmpty()) - throw TranslationUnitDoesNotExistException(processedFileContainers.first()); -} - -} // namespace ClangBackEnd |