From 14b27183cedc537ad7c0f14dea93df8c6fd9bde7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 7 Sep 2016 10:42:12 +0200 Subject: [PATCH] Clang: Rename TranslationUnit(s) to Document(s) The "TranslationUnit parts" moved already to TranslationUnitCore. Change-Id: I2bea7847e2b3e84fbfacc3d2dc43f180873349ac Reviewed-by: David Schulz --- .../ipcsource/clangbackendclangipc-source.pri | 8 +- .../ipcsource/clangcodemodelserver.cpp | 76 ++-- .../ipcsource/clangcodemodelserver.h | 13 +- .../ipcsource/clangcompletecodejob.cpp | 4 +- .../ipcsource/clangcompletecodejob.h | 4 +- .../clangcreateinitialdocumentpreamblejob.cpp | 8 +- .../clangcreateinitialdocumentpreamblejob.h | 4 +- ...gtranslationunit.cpp => clangdocument.cpp} | 140 +++---- ...clangtranslationunit.h => clangdocument.h} | 34 +- .../clangbackend/ipcsource/clangdocuments.cpp | 311 ++++++++++++++ .../{translationunits.h => clangdocuments.h} | 44 +- .../ipcsource/clangfilesystemwatcher.cpp | 8 +- .../ipcsource/clangfilesystemwatcher.h | 6 +- .../ipcsource/clangjobcontext.cpp | 17 +- .../clangbackend/ipcsource/clangjobcontext.h | 10 +- .../clangbackend/ipcsource/clangjobqueue.cpp | 36 +- .../clangbackend/ipcsource/clangjobqueue.h | 6 +- .../clangbackend/ipcsource/clangjobs.cpp | 8 +- src/tools/clangbackend/ipcsource/clangjobs.h | 6 +- .../clangrequestdocumentannotationsjob.cpp | 6 +- .../clangrequestdocumentannotationsjob.h | 4 +- .../clangupdatedocumentannotationsjob.cpp | 10 +- .../clangupdatedocumentannotationsjob.h | 4 +- .../clangbackend/ipcsource/codecompleter.cpp | 2 +- .../ipcsource/skippedsourceranges.h | 2 +- .../clangbackend/ipcsource/sourcelocation.cpp | 2 +- .../clangbackend/ipcsource/sourcelocation.h | 2 +- .../ipcsource/translationunits.cpp | 311 -------------- tests/unit/unittest/clangasyncjobtest.cpp | 12 +- tests/unit/unittest/clangasyncjobtest.h | 8 +- .../unittest/clangcodecompleteresultstest.cpp | 38 +- .../unittest/clangcompletecodejobtest.cpp | 2 +- ...ngcreateinitialdocumentpreamblejobtest.cpp | 4 +- tests/unit/unittest/clangdocumentstest.cpp | 354 ++++++++++++++++ tests/unit/unittest/clangdocumenttest.cpp | 391 ++++++++++++++++++ tests/unit/unittest/clangipcservertest.cpp | 44 +- tests/unit/unittest/clangjobqueuetest.cpp | 46 +-- tests/unit/unittest/clangjobstest.cpp | 18 +- ...clangrequestdocumentannotationsjobtest.cpp | 2 +- .../clangupdatedocumentannotationsjobtest.cpp | 12 +- .../unittest/codecompletionsextractortest.cpp | 130 +++--- tests/unit/unittest/codecompletiontest.cpp | 60 +-- tests/unit/unittest/cursortest.cpp | 22 +- tests/unit/unittest/diagnosticsettest.cpp | 62 +-- tests/unit/unittest/diagnostictest.cpp | 30 +- tests/unit/unittest/fixittest.cpp | 20 +- .../highlightingmarksreportertest.cpp | 20 +- tests/unit/unittest/highlightingmarkstest.cpp | 25 +- .../unit/unittest/skippedsourcerangestest.cpp | 27 +- tests/unit/unittest/sourcelocationtest.cpp | 30 +- tests/unit/unittest/sourcerangetest.cpp | 30 +- tests/unit/unittest/translationunitstest.cpp | 354 ---------------- tests/unit/unittest/translationunittest.cpp | 391 ------------------ tests/unit/unittest/unittest.pro | 4 +- 54 files changed, 1608 insertions(+), 1614 deletions(-) rename src/tools/clangbackend/ipcsource/{clangtranslationunit.cpp => clangdocument.cpp} (62%) rename src/tools/clangbackend/ipcsource/{clangtranslationunit.h => clangdocument.h} (78%) create mode 100644 src/tools/clangbackend/ipcsource/clangdocuments.cpp rename src/tools/clangbackend/ipcsource/{translationunits.h => clangdocuments.h} (55%) delete mode 100644 src/tools/clangbackend/ipcsource/translationunits.cpp create mode 100644 tests/unit/unittest/clangdocumentstest.cpp create mode 100644 tests/unit/unittest/clangdocumenttest.cpp delete mode 100644 tests/unit/unittest/translationunitstest.cpp delete mode 100644 tests/unit/unittest/translationunittest.cpp diff --git a/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri b/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri index f47655a6ea6..7994e63d359 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 5f1161717ac..ed30fafb55e 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 #include @@ -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 &translationUnits) +void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector &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 82c64b560df..8fb481eebc1 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 &translationUnits); + void processInitialJobsForDocuments(const std::vector &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_; QTimer updateDocumentAnnotationsTimer; diff --git a/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp b/src/tools/clangbackend/ipcsource/clangcompletecodejob.cpp index d85c93190c0..bf33e469b70 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 d3ee9dbc6b8..30c0bb8e3f9 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 @@ -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 77ee9815186..a882ec53bc7 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 023a34c8f33..21fc875982b 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 similarity index 62% rename from src/tools/clangbackend/ipcsource/clangtranslationunit.cpp rename to src/tools/clangbackend/ipcsource/clangdocument.cpp index 8907a285bdc..6cce9bc9b74 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(filePath, - projectPart, - fileArguments, - translationUnits)) +Document::Document(const Utf8String &filePath, + const ProjectPart &projectPart, + const Utf8StringVector &fileArguments, + Documents &documents, + FileExistsCheck fileExistsCheck) + : d(std::make_shared(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 TranslationUnit::dependedFilePaths() const +const QSet Document::dependedFilePaths() const { checkIfNull(); checkIfFileExists(); @@ -353,30 +353,30 @@ const QSet 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 similarity index 78% rename from src/tools/clangbackend/ipcsource/clangtranslationunit.h rename to src/tools/clangbackend/ipcsource/clangdocument.h index e3ec05fa87d..f727424e3ee 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 d; + mutable std::shared_ptr 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 00000000000..1903760b237 --- /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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +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 Documents::create(const QVector &fileContainers) +{ + checkIfDocumentsDoNotExist(fileContainers); + + std::vector createdTranslationUnits; + + for (const FileContainer &fileContainer : fileContainers) + createdTranslationUnits.push_back(createDocument(fileContainer)); + + return createdTranslationUnits; +} + +void Documents::update(const QVector &fileContainers) +{ + checkIfDocumentsForFilePathsExist(fileContainers); + + for (const FileContainer &fileContainer : fileContainers) { + updateDocument(fileContainer); + updateDocumentsWithChangedDependency(fileContainer.filePath()); + } +} + +static bool removeFromFileContainer(QVector &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 &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 &Documents::documents() const +{ + return documents_; +} + +UnsavedFiles Documents::unsavedFiles() const +{ + return unsavedFiles_; +} + +void Documents::addWatchedFiles(QSet &filePaths) +{ + fileSystemWatcher.addFiles(filePaths); +} + +void Documents::updateDocumentsWithChangedDependency(const Utf8String &filePath) +{ + for (auto &document : documents_) + document.setDirtyIfDependencyIsMet(filePath); +} + +void Documents::updateDocumentsWithChangedDependencies(const QVector &fileContainers) +{ + for (const FileContainer &fileContainer : fileContainers) + updateDocumentsWithChangedDependency(fileContainer.filePath()); +} + +void Documents::setDocumentsDirtyIfProjectPartChanged() +{ + for (auto &document : documents_) + document.setDirtyIfProjectPartIsOutdated(); +} + +QVector Documents::newerFileContainers(const QVector &fileContainers) const +{ + QVector 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::iterator Documents::findDocument(const FileContainer &fileContainer) +{ + return std::find(documents_.begin(), documents_.end(), fileContainer); +} + +std::vector Documents::findAllDocumentsWithFilePath(const Utf8String &filePath) +{ + const auto filePathCompare = [&filePath] (const Document &document) { + return document.filePath() == filePath; + }; + + std::vector documents; + std::copy_if(documents_.begin(), + documents_.end(), + std::back_inserter(documents), + filePathCompare); + + return documents; +} + +std::vector::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 &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 &fileContainers) const +{ + for (const FileContainer &fileContainer : fileContainers) { + if (hasDocument(fileContainer)) + throw TranslationUnitAlreadyExistsException(fileContainer); + } +} + +void Documents::checkIfDocumentsForFilePathsExist(const QVector &fileContainers) const +{ + for (const FileContainer &fileContainer : fileContainers) { + if (!hasDocumentWithFilePath(fileContainer.filePath())) + throw TranslationUnitDoesNotExistException(fileContainer); + } +} + +void Documents::removeDocuments(const QVector &fileContainers) +{ + QVector 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 similarity index 55% rename from src/tools/clangbackend/ipcsource/translationunits.h rename to src/tools/clangbackend/ipcsource/clangdocuments.h index 5607ebb6653..3af689145bd 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 @@ -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 create(const QVector &fileContainers); + std::vector create(const QVector &fileContainers); void update(const QVector &fileContainers); void remove(const QVector &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 &translationUnits() const; + const std::vector &documents() const; UnsavedFiles unsavedFiles() const; void addWatchedFiles(QSet &filePaths); - void updateTranslationUnitsWithChangedDependency(const Utf8String &filePath); - void updateTranslationUnitsWithChangedDependencies(const QVector &fileContainers); - void setTranslationUnitsDirtyIfProjectPartChanged(); + void updateDocumentsWithChangedDependency(const Utf8String &filePath); + void updateDocumentsWithChangedDependencies(const QVector &fileContainers); + void setDocumentsDirtyIfProjectPartChanged(); QVector newerFileContainers(const QVector &fileContainers) const; const ClangFileSystemWatcher *clangFileSystemWatcher() const; private: - TranslationUnit createTranslationUnit(const FileContainer &fileContainer); - void updateTranslationUnit(const FileContainer &fileContainer); - std::vector::iterator findTranslationUnit(const FileContainer &fileContainer); - std::vector findAllTranslationUnitWithFilePath(const Utf8String &filePath); - std::vector::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::iterator findDocument(const FileContainer &fileContainer); + std::vector findAllDocumentsWithFilePath(const Utf8String &filePath); + std::vector::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 &fileContainers) const; - void checkIfTranslationUnitsDoesNotExists(const QVector &fileContainers) const; - void checkIfTranslationUnitsForFilePathsDoesExists(const QVector &fileContainers) const; + void checkIfDocumentsDoNotExist(const QVector &fileContainers) const; + void checkIfDocumentsForFilePathsExist(const QVector &fileContainers) const; - void removeTranslationUnits(const QVector &fileContainers); + void removeDocuments(const QVector &fileContainers); private: ClangFileSystemWatcher fileSystemWatcher; - std::vector translationUnits_; + std::vector documents_; ProjectParts &projectParts; UnsavedFiles &unsavedFiles_; }; diff --git a/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp b/src/tools/clangbackend/ipcsource/clangfilesystemwatcher.cpp index df333a84edb..10b586b8824 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 @@ -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 &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 4d6be96a21c..8d14be153ec 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 &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 9c9c520fce1..f09235ca329 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 6e124c609e8..629d8320bd3 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 6a3ae96015f..1beb1cdace6 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 fe715024732..1be38ceaf07 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 54465f15278..536e43fb893 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 30e2fef7d81..94a507e3ef6 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; 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 ce9106d5cbb..b745c4fe865 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 f44c50b1902..04bdd7cfc3a 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 #include @@ -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 2e61c50b92d..0c62be4f9e6 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 643df075712..c2ca0d13aa5 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 @@ -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 db396ffab3b..7756001bcbe 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 ddbf3e62b57..a2c6c6a374b 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 992599785d5..5d54600c3c5 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 diff --git a/src/tools/clangbackend/ipcsource/sourcelocation.h b/src/tools/clangbackend/ipcsource/sourcelocation.h index 7fc7205ba21..6c2776c2be9 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 5fde27b8b90..00000000000 --- 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -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 TranslationUnits::create(const QVector &fileContainers) -{ - checkIfTranslationUnitsDoesNotExists(fileContainers); - - std::vector createdTranslationUnits; - - for (const FileContainer &fileContainer : fileContainers) - createdTranslationUnits.push_back(createTranslationUnit(fileContainer)); - - return createdTranslationUnits; -} - -void TranslationUnits::update(const QVector &fileContainers) -{ - checkIfTranslationUnitsForFilePathsDoesExists(fileContainers); - - for (const FileContainer &fileContainer : fileContainers) { - updateTranslationUnit(fileContainer); - updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); - } -} - -static bool removeFromFileContainer(QVector &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 &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 &TranslationUnits::translationUnits() const -{ - return translationUnits_; -} - -UnsavedFiles TranslationUnits::unsavedFiles() const -{ - return unsavedFiles_; -} - -void TranslationUnits::addWatchedFiles(QSet &filePaths) -{ - fileSystemWatcher.addFiles(filePaths); -} - -void TranslationUnits::updateTranslationUnitsWithChangedDependency(const Utf8String &filePath) -{ - for (auto &translationUnit : translationUnits_) - translationUnit.setDirtyIfDependencyIsMet(filePath); -} - -void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const QVector &fileContainers) -{ - for (const FileContainer &fileContainer : fileContainers) - updateTranslationUnitsWithChangedDependency(fileContainer.filePath()); -} - -void TranslationUnits::setTranslationUnitsDirtyIfProjectPartChanged() -{ - for (auto &translationUnit : translationUnits_) - translationUnit.setDirtyIfProjectPartIsOutdated(); -} - -QVector TranslationUnits::newerFileContainers(const QVector &fileContainers) const -{ - QVector 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::iterator TranslationUnits::findTranslationUnit(const FileContainer &fileContainer) -{ - return std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer); -} - -std::vector TranslationUnits::findAllTranslationUnitWithFilePath(const Utf8String &filePath) -{ - const auto filePathCompare = [&filePath] (const TranslationUnit &translationUnit) { - return translationUnit.filePath() == filePath; - }; - - std::vector translationUnits; - std::copy_if(translationUnits_.begin(), - translationUnits_.end(), - std::back_inserter(translationUnits), - filePathCompare); - - return translationUnits; -} - -std::vector::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 &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 &fileContainers) const -{ - for (const FileContainer &fileContainer : fileContainers) { - if (hasTranslationUnit(fileContainer)) - throw TranslationUnitAlreadyExistsException(fileContainer); - } -} - -void TranslationUnits::checkIfTranslationUnitsForFilePathsDoesExists(const QVector &fileContainers) const -{ - for (const FileContainer &fileContainer : fileContainers) { - if (!hasTranslationUnitWithFilePath(fileContainer.filePath())) - throw TranslationUnitDoesNotExistException(fileContainer); - } -} - -void TranslationUnits::removeTranslationUnits(const QVector &fileContainers) -{ - QVector 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 diff --git a/tests/unit/unittest/clangasyncjobtest.cpp b/tests/unit/unittest/clangasyncjobtest.cpp index beffc7e7801..8033d6eca15 100644 --- a/tests/unit/unittest/clangasyncjobtest.cpp +++ b/tests/unit/unittest/clangasyncjobtest.cpp @@ -36,13 +36,13 @@ void ClangAsyncJobTest::BaseSetUp(ClangBackEnd::JobRequest::Type jobRequestType, projects.createOrUpdate({ProjectPartContainer(projectPartId)}); const QVector fileContainer{FileContainer(filePath, projectPartId)}; - translationUnit = translationUnits.create(fileContainer).front(); - translationUnits.setVisibleInEditors({filePath}); - translationUnits.setUsedByCurrentEditor(filePath); + document = documents.create(fileContainer).front(); + documents.setVisibleInEditors({filePath}); + documents.setUsedByCurrentEditor(filePath); jobRequest = createJobRequest(filePath, jobRequestType); - jobContext = JobContext(jobRequest, &translationUnits, &unsavedFiles, &dummyIpcClient); - jobContextWithMockClient = JobContext(jobRequest, &translationUnits, &unsavedFiles, &mockIpcClient); + jobContext = JobContext(jobRequest, &documents, &unsavedFiles, &dummyIpcClient); + jobContextWithMockClient = JobContext(jobRequest, &documents, &unsavedFiles, &mockIpcClient); asyncJob.setFinishedHandler([](IAsyncJob *){}); } @@ -55,7 +55,7 @@ JobRequest ClangAsyncJobTest::createJobRequest(const Utf8String &filePath, jobRequest.filePath = filePath; jobRequest.projectPartId = projectPartId; jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = translationUnit.documentRevision(); + jobRequest.documentRevision = document.documentRevision(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); return jobRequest; diff --git a/tests/unit/unittest/clangasyncjobtest.h b/tests/unit/unittest/clangasyncjobtest.h index 58f1131452f..249278ec343 100644 --- a/tests/unit/unittest/clangasyncjobtest.h +++ b/tests/unit/unittest/clangasyncjobtest.h @@ -29,10 +29,10 @@ #include "mockclangcodemodelclient.h" #include "clangiasyncjob.h" +#include #include -#include #include -#include +#include #include #include @@ -55,8 +55,8 @@ protected: protected: ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ClangBackEnd::TranslationUnit translationUnit; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + ClangBackEnd::Document document; MockClangCodeModelClient mockIpcClient; DummyIpcClient dummyIpcClient; diff --git a/tests/unit/unittest/clangcodecompleteresultstest.cpp b/tests/unit/unittest/clangcodecompleteresultstest.cpp index d1563c7116c..a809ae2c9db 100644 --- a/tests/unit/unittest/clangcodecompleteresultstest.cpp +++ b/tests/unit/unittest/clangcodecompleteresultstest.cpp @@ -24,13 +24,13 @@ ****************************************************************************/ #include +#include #include #include #include #include -#include #include -#include +#include #include #include @@ -45,7 +45,7 @@ namespace { using ClangBackEnd::ClangCodeCompleteResults; using ClangBackEnd::FilePath; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::ProjectPart; @@ -62,15 +62,15 @@ TEST(ClangCodeCompleteResults, GetData) ProjectPart projectPart(Utf8StringLiteral("projectPartId")); ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), - projectPart, - Utf8StringVector(), - translationUnits); - Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); - translationUnit.parse(); + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), + projectPart, + Utf8StringVector(), + documents); + Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath()); + document.parse(); CXCodeCompleteResults *cxCodeCompleteResults = - clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), + clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(), nativeFilePath.constData(), 49, 1, 0, 0, completionOptions()); @@ -94,15 +94,15 @@ TEST(ClangCodeCompleteResults, MoveClangCodeCompleteResults) ProjectPart projectPart(Utf8StringLiteral("projectPartId")); ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), - projectPart, - Utf8StringVector(), - translationUnits); - Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); - translationUnit.parse(); + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), + projectPart, + Utf8StringVector(), + documents); + Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath()); + document.parse(); CXCodeCompleteResults *cxCodeCompleteResults = - clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), + clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(), nativeFilePath.constData(), 49, 1, 0, 0, completionOptions()); diff --git a/tests/unit/unittest/clangcompletecodejobtest.cpp b/tests/unit/unittest/clangcompletecodejobtest.cpp index 19ab06553a0..5f4b6f9be35 100644 --- a/tests/unit/unittest/clangcompletecodejobtest.cpp +++ b/tests/unit/unittest/clangcompletecodejobtest.cpp @@ -77,7 +77,7 @@ TEST_F(CompleteCodeJob, DontSendCompletionsIfDocumentWasClosed) EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(0); job.runAsync(); - translationUnits.remove({FileContainer{filePath, projectPartId}}); + documents.remove({FileContainer{filePath, projectPartId}}); ASSERT_TRUE(waitUntilJobFinished(job)); } diff --git a/tests/unit/unittest/clangcreateinitialdocumentpreamblejobtest.cpp b/tests/unit/unittest/clangcreateinitialdocumentpreamblejobtest.cpp index d084dd7d359..8a2a260c29c 100644 --- a/tests/unit/unittest/clangcreateinitialdocumentpreamblejobtest.cpp +++ b/tests/unit/unittest/clangcreateinitialdocumentpreamblejobtest.cpp @@ -49,8 +49,8 @@ TEST_F(CreateInitialDocumentPreambleJob, PrepareAsyncRun) TEST_F(CreateInitialDocumentPreambleJob, RunAsync) { - translationUnit.parse(); - translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); + document.parse(); + document.setDirtyIfDependencyIsMet(document.filePath()); job.setContext(jobContext); job.prepareAsyncRun(); diff --git a/tests/unit/unittest/clangdocumentstest.cpp b/tests/unit/unittest/clangdocumentstest.cpp new file mode 100644 index 00000000000..59f405e0349 --- /dev/null +++ b/tests/unit/unittest/clangdocumentstest.cpp @@ -0,0 +1,354 @@ +/**************************************************************************** +** +** 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include "gtest-qt-printing.h" + +using ClangBackEnd::Document; +using ClangBackEnd::UnsavedFiles; +using ClangBackEnd::ProjectPart; +using ClangBackEnd::ProjectPartContainer; + +using testing::IsNull; +using testing::NotNull; +using testing::Gt; +using testing::Not; +using testing::Contains; + +namespace { + +using ::testing::PrintToString; + +MATCHER_P3(IsDocument, filePath, projectPartId, documentRevision, + std::string(negation ? "isn't" : "is") + + " document with file path "+ PrintToString(filePath) + + " and project " + PrintToString(projectPartId) + + " and document revision " + PrintToString(documentRevision) + ) +{ + return arg.filePath() == filePath + && arg.projectPartId() == projectPartId + && arg.documentRevision() == documentRevision; +} + +class Documents : public ::testing::Test +{ +protected: + void SetUp() override; + +protected: + ClangBackEnd::ProjectParts projects; + ClangBackEnd::UnsavedFiles unsavedFiles; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + const Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); + const Utf8String headerPath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"); + const Utf8String nonExistingFilePath = Utf8StringLiteral("foo.cpp"); + const Utf8String projectPartId = Utf8StringLiteral("projectPartId"); + const Utf8String otherProjectPartId = Utf8StringLiteral("otherProjectPartId"); + const Utf8String nonExistingProjectPartId = Utf8StringLiteral("nonExistingProjectPartId"); + const ClangBackEnd::FileContainer fileContainer{filePath, projectPartId}; + const ClangBackEnd::FileContainer headerContainer{headerPath, projectPartId}; +}; + +TEST_F(Documents, ThrowForGettingWithWrongFilePath) +{ + ASSERT_THROW(documents.document(nonExistingFilePath, projectPartId), + ClangBackEnd::TranslationUnitDoesNotExistException); + +} + +TEST_F(Documents, ThrowForGettingWithWrongProjectPartFilePath) +{ + ASSERT_THROW(documents.document(filePath, nonExistingProjectPartId), + ClangBackEnd::ProjectPartDoNotExistException); + +} + +TEST_F(Documents, ThrowForAddingNonExistingFile) +{ + ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId); + + ASSERT_THROW(documents.create({fileContainer}), + ClangBackEnd::TranslationUnitFileNotExitsException); +} + +TEST_F(Documents, DoNotThrowForAddingNonExistingFileWithUnsavedContent) +{ + ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId, Utf8String(), true); + + ASSERT_NO_THROW(documents.create({fileContainer})); +} + +TEST_F(Documents, Add) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + + documents.create({fileContainer}); + + ASSERT_THAT(documents.document(filePath, projectPartId), + IsDocument(filePath, projectPartId, 74u)); +} + +TEST_F(Documents, AddAndTestCreatedTranslationUnit) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + + auto createdDocuments = documents.create({fileContainer}); + + ASSERT_THAT(createdDocuments.front(), + IsDocument(filePath, projectPartId, 74u)); +} + +TEST_F(Documents, ThrowForCreatingAnExistingDocument) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + documents.create({fileContainer}); + + ASSERT_THROW(documents.create({fileContainer}), + ClangBackEnd::TranslationUnitAlreadyExistsException); +} + +TEST_F(Documents, ThrowForUpdatingANonExistingDocument) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ASSERT_THROW(documents.update({fileContainer}), + ClangBackEnd::TranslationUnitDoesNotExistException); +} + +TEST_F(Documents, UpdateSingle) +{ + ClangBackEnd::FileContainer createFileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer updateFileContainer(filePath, Utf8String(), Utf8StringVector(), 75u); + documents.create({createFileContainer}); + + documents.update({updateFileContainer}); + + ASSERT_THAT(documents.document(filePath, projectPartId), + IsDocument(filePath, projectPartId, 75u)); +} + +TEST_F(Documents, UpdateMultiple) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer fileContainerWithOtherProject(filePath, otherProjectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer updatedFileContainer(filePath, Utf8String(), Utf8StringVector(), 75u); + documents.create({fileContainer, fileContainerWithOtherProject}); + + documents.update({updatedFileContainer}); + + ASSERT_THAT(documents.document(filePath, projectPartId), + IsDocument(filePath, projectPartId, 75u)); + ASSERT_THAT(documents.document(filePath, otherProjectPartId), + IsDocument(filePath, otherProjectPartId, 75u)); +} + +TEST_F(Documents, UpdateUnsavedFileAndCheckForReparse) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); + documents.create({fileContainer, headerContainer}); + Document document = documents.document(filePath, projectPartId); + document.parse(); + + documents.update({headerContainerWithUnsavedContent}); + + ASSERT_TRUE(documents.document(filePath, projectPartId).isNeedingReparse()); +} + +TEST_F(Documents, RemoveFileAndCheckForReparse) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); + documents.create({fileContainer, headerContainer}); + Document document = documents.document(filePath, projectPartId); + document.parse(); + + documents.remove({headerContainerWithUnsavedContent}); + + ASSERT_TRUE(documents.document(filePath, projectPartId).isNeedingReparse()); +} + +TEST_F(Documents, DontGetNewerFileContainerIfRevisionIsTheSame) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + documents.create({fileContainer}); + + auto newerFileContainers = documents.newerFileContainers({fileContainer}); + + ASSERT_THAT(newerFileContainers.size(), 0); +} + +TEST_F(Documents, GetNewerFileContainerIfRevisionIsDifferent) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); + ClangBackEnd::FileContainer newerContainer(filePath, projectPartId, Utf8StringVector(), 75u); + documents.create({fileContainer}); + + auto newerFileContainers = documents.newerFileContainers({newerContainer}); + + ASSERT_THAT(newerFileContainers.size(), 1); +} + +TEST_F(Documents, ThrowForRemovingWithWrongFilePath) +{ + ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId); + + ASSERT_THROW(documents.remove({fileContainer}), + ClangBackEnd::TranslationUnitDoesNotExistException); +} + +TEST_F(Documents, ThrowForRemovingWithWrongProjectPartFilePath) +{ + ClangBackEnd::FileContainer fileContainer(filePath, nonExistingProjectPartId); + + ASSERT_THROW(documents.remove({fileContainer}), + ClangBackEnd::ProjectPartDoNotExistException); +} + +TEST_F(Documents, Remove) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId); + documents.create({fileContainer}); + + documents.remove({fileContainer}); + + ASSERT_THROW(documents.document(filePath, projectPartId), + ClangBackEnd::TranslationUnitDoesNotExistException); +} + +TEST_F(Documents, RemoveAllValidIfExceptionIsThrown) +{ + ClangBackEnd::FileContainer fileContainer(filePath, projectPartId); + documents.create({fileContainer}); + + ASSERT_THROW(documents.remove({ClangBackEnd::FileContainer(Utf8StringLiteral("dontextist.pro"), projectPartId), fileContainer}), + ClangBackEnd::TranslationUnitDoesNotExistException); + + ASSERT_THAT(documents.documents(), + Not(Contains(Document(filePath, + projects.project(projectPartId), + Utf8StringVector(), + documents)))); +} + +TEST_F(Documents, HasDocument) +{ + documents.create({{filePath, projectPartId}}); + + ASSERT_TRUE(documents.hasDocument(filePath, projectPartId)); +} + +TEST_F(Documents, HasNotDocument) +{ + ASSERT_FALSE(documents.hasDocument(filePath, projectPartId)); +} + +TEST_F(Documents, isUsedByCurrentEditor) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + + documents.setUsedByCurrentEditor(filePath); + + ASSERT_TRUE(document.isUsedByCurrentEditor()); +} + +TEST_F(Documents, IsNotCurrentEditor) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + + documents.setUsedByCurrentEditor(headerPath); + + ASSERT_FALSE(document.isUsedByCurrentEditor()); +} + +TEST_F(Documents, IsNotCurrentEditorAfterBeingCurrent) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + documents.setUsedByCurrentEditor(filePath); + + documents.setUsedByCurrentEditor(headerPath); + + ASSERT_FALSE(document.isUsedByCurrentEditor()); +} + +TEST_F(Documents, IsVisibleEditor) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + + documents.setVisibleInEditors({filePath}); + + ASSERT_TRUE(document.isVisibleInEditor()); +} + +TEST_F(Documents, IsNotVisibleEditor) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + + documents.setVisibleInEditors({headerPath}); + + ASSERT_FALSE(document.isVisibleInEditor()); +} + +TEST_F(Documents, IsNotVisibleEditorAfterBeingVisible) +{ + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + documents.setVisibleInEditors({filePath}); + + documents.setVisibleInEditors({headerPath}); + + ASSERT_FALSE(document.isVisibleInEditor()); +} + +void Documents::SetUp() +{ + projects.createOrUpdate({ProjectPartContainer(projectPartId)}); + projects.createOrUpdate({ProjectPartContainer(otherProjectPartId)}); +} + +} diff --git a/tests/unit/unittest/clangdocumenttest.cpp b/tests/unit/unittest/clangdocumenttest.cpp new file mode 100644 index 00000000000..6925c69ee66 --- /dev/null +++ b/tests/unit/unittest/clangdocumenttest.cpp @@ -0,0 +1,391 @@ +/**************************************************************************** +** +** 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include "gtest-qt-printing.h" + +#include + +#include +#include + +using ClangBackEnd::FileContainer; +using ClangBackEnd::FilePath; +using ClangBackEnd::Document; +using ClangBackEnd::UnsavedFiles; +using ClangBackEnd::ProjectPart; +using ClangBackEnd::ProjectPartContainer; +using ClangBackEnd::Documents; +using ClangBackEnd::TranslationUnitUpdateResult; + +using testing::IsNull; +using testing::NotNull; +using testing::Eq; +using testing::Gt; +using testing::Contains; +using testing::EndsWith; +using testing::AllOf; + +namespace { + +class Document : public ::testing::Test +{ +protected: + void SetUp() override; + ::Document createDocumentAndDeleteFile(); + QByteArray readContentFromDocumentFile() const; + +protected: + ClangBackEnd::ProjectParts projects; + Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; + ProjectPart projectPart; + Utf8String documentFilePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); + ClangBackEnd::UnsavedFiles unsavedFiles; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + ::Document document; +}; + +TEST_F(Document, DefaultDocumentIsInvalid) +{ + ::Document document; + + ASSERT_TRUE(document.isNull()); +} + +TEST_F(Document, DefaultDocumentIsNotIntact) +{ + ::Document document; + + ASSERT_FALSE(document.isIntact()); +} + +TEST_F(Document, ThrowExceptionForNonExistingFilePath) +{ + ASSERT_THROW(::Document(Utf8StringLiteral("file.cpp"), projectPart, Utf8StringVector(), documents), + ClangBackEnd::TranslationUnitFileNotExitsException); +} + +TEST_F(Document, ThrowNoExceptionForNonExistingFilePathIfDoNotCheckIfFileExistsIsSet) +{ + ASSERT_NO_THROW(::Document(Utf8StringLiteral("file.cpp"), projectPart, Utf8StringVector(), documents, ::Document::DoNotCheckIfFileExists)); +} + +TEST_F(Document, DocumentIsValid) +{ + ASSERT_FALSE(document.isNull()); +} + + +TEST_F(Document, ThrowExceptionForGettingIndexForInvalidUnit) +{ + ::Document document; + + ASSERT_THROW(document.translationUnitCore().cxIndex(), ClangBackEnd::TranslationUnitIsNullException); +} + +TEST_F(Document, ThrowExceptionForGettingCxTranslationUnitForInvalidUnit) +{ + ::Document document; + + ASSERT_THROW(document.translationUnitCore().cxIndex(), ClangBackEnd::TranslationUnitIsNullException); +} + +TEST_F(Document, CxTranslationUnitGetterIsNonNullForParsedUnit) +{ + document.parse(); + + ASSERT_THAT(document.translationUnitCore().cxIndex(), NotNull()); +} + +TEST_F(Document, ThrowExceptionIfGettingFilePathForNullUnit) +{ + ::Document document; + + ASSERT_THROW(document.filePath(), ClangBackEnd::TranslationUnitIsNullException); +} + +TEST_F(Document, ResettedDocumentIsNull) +{ + document.reset(); + + ASSERT_TRUE(document.isNull()); +} + +TEST_F(Document, LastCommandLineArgumentIsFilePath) +{ + const Utf8String nativeFilePath = FilePath::toNativeSeparators(documentFilePath); + const auto arguments = document.createUpdater().commandLineArguments(); + + ASSERT_THAT(arguments.at(arguments.count() - 1), Eq(nativeFilePath)); +} + +TEST_F(Document, TimeStampForProjectPartChangeIsUpdatedAsNewCxTranslationUnitIsGenerated) +{ + auto lastChangeTimePoint = document.lastProjectPartChangeTimePoint(); + std::this_thread::sleep_for(std::chrono::steady_clock::duration(1)); + + document.parse(); + + ASSERT_THAT(document.lastProjectPartChangeTimePoint(), Gt(lastChangeTimePoint)); +} + +TEST_F(Document, TimeStampForProjectPartChangeIsUpdatedAsProjectPartIsCleared) +{ + ProjectPart projectPart = document.projectPart(); + document.parse(); + auto lastChangeTimePoint = document.lastProjectPartChangeTimePoint(); + std::this_thread::sleep_for(std::chrono::steady_clock::duration(1)); + + projectPart.clear(); + document.parse(); + + ASSERT_THAT(document.lastProjectPartChangeTimePoint(), Gt(lastChangeTimePoint)); +} + +TEST_F(Document, DocumentRevisionInFileContainerGetter) +{ + document.setDocumentRevision(74); + + ASSERT_THAT(document.fileContainer().documentRevision(), 74); +} + +TEST_F(Document, DependedFilePaths) +{ + document.parse(); + + ASSERT_THAT(document.dependedFilePaths(), + AllOf(Contains(documentFilePath), + Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")))); +} + +TEST_F(Document, DeletedFileShouldNotNeedReparsing) +{ + auto document = createDocumentAndDeleteFile(); + + document.setDirtyIfDependencyIsMet(document.filePath()); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsNoReparseAfterCreation) +{ + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsReparseAfterChangeOfMainFile) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(documentFilePath); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +TEST_F(Document, NoNeedForReparsingForIndependendFile) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h")); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsReparsingForDependendFile) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsNoReparsingAfterReparsing) +{ + document.parse(); + document.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); + + document.reparse(); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, IsIntactAfterParsing) +{ + document.parse(); + + ASSERT_TRUE(document.isIntact()); +} + +TEST_F(Document, IsNotIntactForDeletedFile) +{ + auto document = createDocumentAndDeleteFile(); + + ASSERT_FALSE(document.isIntact()); +} + +TEST_F(Document, DoesNotNeedReparseAfterParse) +{ + document.parse(); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsReparseAfterMainFileChanged) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(documentFilePath); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +TEST_F(Document, NeedsReparseAfterIncludedFileChanged) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +TEST_F(Document, DoesNotNeedReparseAfterNotIncludedFileChanged) +{ + document.parse(); + + document.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h")); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, DoesNotNeedReparseAfterReparse) +{ + document.parse(); + document.setDirtyIfDependencyIsMet(documentFilePath); + + document.reparse(); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, SetDirtyIfProjectPartIsOutdated) +{ + projects.createOrUpdate({ProjectPartContainer(projectPartId)}); + document.parse(); + projects.createOrUpdate({ProjectPartContainer(projectPartId, {Utf8StringLiteral("-DNEW")})}); + + document.setDirtyIfProjectPartIsOutdated(); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +TEST_F(Document, SetNotDirtyIfProjectPartIsNotOutdated) +{ + document.parse(); + + document.setDirtyIfProjectPartIsOutdated(); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, IncorporateUpdaterResultResetsDirtyness) +{ + document.setDirtyIfDependencyIsMet(document.filePath()); + TranslationUnitUpdateResult result; + result.reparsed = true; + result.needsToBeReparsedChangeTimePoint = document.isNeededReparseChangeTimePoint(); + + document.incorporateUpdaterResult(result); + + ASSERT_FALSE(document.isNeedingReparse()); +} + +TEST_F(Document, IncorporateUpdaterResultDoesNotResetDirtynessIfItWasChanged) +{ + TranslationUnitUpdateResult result; + result.reparsed = true; + result.needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now(); + document.setDirtyIfDependencyIsMet(document.filePath()); + + document.incorporateUpdaterResult(result); + + ASSERT_TRUE(document.isNeedingReparse()); +} + +void Document::SetUp() +{ + projects.createOrUpdate({ProjectPartContainer(projectPartId)}); + projectPart = *projects.findProjectPart(projectPartId); + + const QVector fileContainer{FileContainer(documentFilePath, projectPartId)}; + const auto createdDocuments = documents.create(fileContainer); + document = createdDocuments.front(); +} + +::Document Document::createDocumentAndDeleteFile() +{ + QTemporaryFile temporaryFile; + EXPECT_TRUE(temporaryFile.open()); + EXPECT_TRUE(temporaryFile.write(readContentFromDocumentFile())); + ::Document document(temporaryFile.fileName(), + projectPart, + Utf8StringVector(), + documents); + + return document; +} + +QByteArray Document::readContentFromDocumentFile() const +{ + QFile contentFile(documentFilePath); + EXPECT_TRUE(contentFile.open(QIODevice::ReadOnly)); + + return contentFile.readAll(); +} + +} + diff --git a/tests/unit/unittest/clangipcservertest.cpp b/tests/unit/unittest/clangipcservertest.cpp index 84ca73c0a66..789f1379834 100644 --- a/tests/unit/unittest/clangipcservertest.cpp +++ b/tests/unit/unittest/clangipcservertest.cpp @@ -58,29 +58,29 @@ namespace { using namespace ClangBackEnd; -MATCHER_P5(HasDirtyTranslationUnit, +MATCHER_P5(HasDirtyDocument, filePath, projectPartId, documentRevision, isNeedingReparse, hasNewDiagnostics, std::string(negation ? "isn't" : "is") - + " translation unit with file path "+ PrintToString(filePath) + + " document with file path "+ PrintToString(filePath) + " and project " + PrintToString(projectPartId) + " and document revision " + PrintToString(documentRevision) + " and isNeedingReparse = " + PrintToString(isNeedingReparse) + " and hasNewDiagnostics = " + PrintToString(hasNewDiagnostics) ) { - auto &&translationUnits = arg.translationUnitsForTestOnly(); + auto &&documents = arg.documentsForTestOnly(); try { - auto translationUnit = translationUnits.translationUnit(filePath, projectPartId); + auto document = documents.document(filePath, projectPartId); - if (translationUnit.documentRevision() == documentRevision) { - if (translationUnit.isNeedingReparse() && !isNeedingReparse) { + if (document.documentRevision() == documentRevision) { + if (document.isNeedingReparse() && !isNeedingReparse) { *result_listener << "isNeedingReparse is true"; return false; - } else if (!translationUnit.isNeedingReparse() && isNeedingReparse) { + } else if (!document.isNeedingReparse() && isNeedingReparse) { *result_listener << "isNeedingReparse is false"; return false; } @@ -88,7 +88,7 @@ MATCHER_P5(HasDirtyTranslationUnit, return true; } - *result_listener << "revision number is " << PrintToString(translationUnit.documentRevision()); + *result_listener << "revision number is " << PrintToString(document.documentRevision()); return false; } catch (...) { @@ -156,7 +156,7 @@ protected: protected: MockClangCodeModelClient mockClangCodeModelClient; ClangBackEnd::ClangCodeModelServer clangServer; - const ClangBackEnd::TranslationUnits &translationUnits = clangServer.translationUnitsForTestOnly(); + const ClangBackEnd::Documents &documents = clangServer.documentsForTestOnly(); const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro"); const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"); @@ -344,35 +344,35 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterCreationIsNotDirty) { registerProjectAndFile(filePathA, 1); - ASSERT_THAT(clangServer, HasDirtyTranslationUnit(filePathA, projectPartId, 0U, false, false)); + ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 0U, false, false)); } TEST_F(ClangClangCodeModelServer, SetCurrentAndVisibleEditor) { registerProjectAndFilesAndWaitForFinished(); - auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId); - auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId); + auto functionDocument = documents.document(filePathA, projectPartId); + auto variableDocument = documents.document(filePathB, projectPartId); updateVisibilty(filePathB, filePathA); - ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor()); - ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor()); - ASSERT_TRUE(functionTranslationUnit.isVisibleInEditor()); + ASSERT_TRUE(variableDocument.isUsedByCurrentEditor()); + ASSERT_TRUE(variableDocument.isVisibleInEditor()); + ASSERT_TRUE(functionDocument.isVisibleInEditor()); } TEST_F(ClangClangCodeModelServer, IsNotCurrentCurrentAndVisibleEditorAnymore) { registerProjectAndFilesAndWaitForFinished(); - auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId); - auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId); + auto functionDocument = documents.document(filePathA, projectPartId); + auto variableDocument = documents.document(filePathB, projectPartId); updateVisibilty(filePathB, filePathA); updateVisibilty(filePathB, Utf8String()); - ASSERT_FALSE(functionTranslationUnit.isUsedByCurrentEditor()); - ASSERT_FALSE(functionTranslationUnit.isVisibleInEditor()); - ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor()); - ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor()); + ASSERT_FALSE(functionDocument.isUsedByCurrentEditor()); + ASSERT_FALSE(functionDocument.isVisibleInEditor()); + ASSERT_TRUE(variableDocument.isUsedByCurrentEditor()); + ASSERT_TRUE(variableDocument.isVisibleInEditor()); } TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse) @@ -380,7 +380,7 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse) registerProjectAndFileAndWaitForFinished(filePathA, 2); updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1), 1U); - ASSERT_THAT(clangServer, HasDirtyTranslationUnit(filePathA, projectPartId, 1U, true, true)); + ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 1U, true, true)); } void ClangClangCodeModelServer::SetUp() diff --git a/tests/unit/unittest/clangjobqueuetest.cpp b/tests/unit/unittest/clangjobqueuetest.cpp index be5d32ff349..255f6a1a812 100644 --- a/tests/unit/unittest/clangjobqueuetest.cpp +++ b/tests/unit/unittest/clangjobqueuetest.cpp @@ -25,12 +25,12 @@ #include "testutils.h" +#include +#include #include -#include #include #include #include -#include #include #include @@ -75,14 +75,14 @@ protected: protected: ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ClangBackEnd::TranslationUnit translationUnit; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + ClangBackEnd::Document document; Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); Utf8String filePath2 = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp"); Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; - ClangBackEnd::JobQueue jobQueue{translationUnits, projects}; + ClangBackEnd::JobQueue jobQueue{documents, projects}; }; TEST_F(JobQueue, AddJob) @@ -200,7 +200,7 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverNotCurrent) resetVisibilityAndCurrentEditor(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); - translationUnits.setUsedByCurrentEditor(filePath2); + documents.setUsedByCurrentEditor(filePath2); jobQueue.prioritizeRequests(); @@ -212,7 +212,7 @@ TEST_F(JobQueue, PrioritizeVisibleDocumentsOverNotVisible) resetVisibilityAndCurrentEditor(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); - translationUnits.setVisibleInEditors({filePath2}); + documents.setVisibleInEditors({filePath2}); jobQueue.prioritizeRequests(); @@ -224,8 +224,8 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverVisible) resetVisibilityAndCurrentEditor(); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); - translationUnits.setVisibleInEditors({filePath1, filePath2}); - translationUnits.setUsedByCurrentEditor(filePath2); + documents.setVisibleInEditors({filePath1, filePath2}); + documents.setUsedByCurrentEditor(filePath2); jobQueue.prioritizeRequests(); @@ -236,8 +236,8 @@ TEST_F(JobQueue, RunNothingForNotCurrentOrVisibleDocument) { jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - translationUnits.setVisibleInEditors({}); - translationUnits.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath")); + documents.setVisibleInEditors({}); + documents.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath")); const JobRequests jobsToRun = jobQueue.processQueue(); @@ -312,7 +312,7 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByDocumentClose) TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument) { jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); - translationUnit.setHasParseOrReparseFailed(true); + document.setHasParseOrReparseFailed(true); const JobRequests jobsToStart = jobQueue.processQueue(); @@ -375,15 +375,15 @@ void JobQueue::SetUp() const QVector fileContainer{FileContainer(filePath1, projectPartId), FileContainer(filePath2, projectPartId)}; - translationUnit = translationUnits.create(fileContainer).front(); - translationUnits.setVisibleInEditors({filePath1}); - translationUnits.setUsedByCurrentEditor(filePath1); + document = documents.create(fileContainer).front(); + documents.setVisibleInEditors({filePath1}); + documents.setUsedByCurrentEditor(filePath1); } void JobQueue::resetVisibilityAndCurrentEditor() { - translationUnits.setVisibleInEditors({}); - translationUnits.setUsedByCurrentEditor(Utf8String()); + documents.setVisibleInEditors({}); + documents.setUsedByCurrentEditor(Utf8String()); } Utf8String JobQueue::createTranslationUnitForDeletedFile() @@ -394,9 +394,9 @@ Utf8String JobQueue::createTranslationUnitForDeletedFile() ClangBackEnd::FileContainer fileContainer(temporaryFilePath, projectPartId, Utf8String(), true); - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - translationUnit.setIsUsedByCurrentEditor(true); + documents.create({fileContainer}); + auto document = documents.document(fileContainer); + document.setIsUsedByCurrentEditor(true); return temporaryFilePath; } @@ -410,7 +410,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath, jobRequest.filePath = filePath; jobRequest.projectPartId = projectPartId; jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = translationUnit.documentRevision(); + jobRequest.documentRevision = document.documentRevision(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); return jobRequest; @@ -418,7 +418,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath, void JobQueue::updateDocumentRevision() { - translationUnits.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)}); + documents.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)}); } void JobQueue::updateUnsavedFiles() @@ -438,7 +438,7 @@ void JobQueue::removeProject() void JobQueue::removeDocument() { - translationUnits.remove({FileContainer(filePath1, projectPartId)}); + documents.remove({FileContainer(filePath1, projectPartId)}); } } // anonymous diff --git a/tests/unit/unittest/clangjobstest.cpp b/tests/unit/unittest/clangjobstest.cpp index 9a5442f8a22..461700972d5 100644 --- a/tests/unit/unittest/clangjobstest.cpp +++ b/tests/unit/unittest/clangjobstest.cpp @@ -26,12 +26,12 @@ #include "testutils.h" #include "dummyclangipcclient.h" +#include #include -#include #include #include #include -#include +#include #include #include @@ -68,14 +68,14 @@ protected: protected: ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ClangBackEnd::TranslationUnit translationUnit; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + ClangBackEnd::Document document; DummyIpcClient dummyClientInterface; Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; - ClangBackEnd::Jobs jobs{translationUnits, unsavedFiles, projects, dummyClientInterface}; + ClangBackEnd::Jobs jobs{documents, unsavedFiles, projects, dummyClientInterface}; }; TEST_F(Jobs, ProcessEmptyQueue) @@ -122,9 +122,9 @@ void Jobs::SetUp() projects.createOrUpdate({ProjectPartContainer(projectPartId)}); const QVector fileContainer{FileContainer(filePath1, projectPartId)}; - translationUnit = translationUnits.create(fileContainer).front(); - translationUnits.setVisibleInEditors({filePath1}); - translationUnits.setUsedByCurrentEditor(filePath1); + document = documents.create(fileContainer).front(); + documents.setVisibleInEditors({filePath1}); + documents.setUsedByCurrentEditor(filePath1); } void Jobs::TearDown() @@ -157,7 +157,7 @@ JobRequest Jobs::createJobRequest(const Utf8String &filePath, jobRequest.filePath = filePath; jobRequest.projectPartId = projectPartId; jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); - jobRequest.documentRevision = translationUnit.documentRevision(); + jobRequest.documentRevision = document.documentRevision(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); return jobRequest; diff --git a/tests/unit/unittest/clangrequestdocumentannotationsjobtest.cpp b/tests/unit/unittest/clangrequestdocumentannotationsjobtest.cpp index 37a9939465f..e2f4b3c3f39 100644 --- a/tests/unit/unittest/clangrequestdocumentannotationsjobtest.cpp +++ b/tests/unit/unittest/clangrequestdocumentannotationsjobtest.cpp @@ -77,7 +77,7 @@ TEST_F(RequestDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed) EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); job.runAsync(); - translationUnits.remove({FileContainer{filePath, projectPartId}}); + documents.remove({FileContainer{filePath, projectPartId}}); ASSERT_TRUE(waitUntilJobFinished(job)); } diff --git a/tests/unit/unittest/clangupdatedocumentannotationsjobtest.cpp b/tests/unit/unittest/clangupdatedocumentannotationsjobtest.cpp index 76d5e853db4..ec37d336730 100644 --- a/tests/unit/unittest/clangupdatedocumentannotationsjobtest.cpp +++ b/tests/unit/unittest/clangupdatedocumentannotationsjobtest.cpp @@ -78,7 +78,7 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed) EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); job.runAsync(); - translationUnits.remove({FileContainer{filePath, projectPartId}}); + documents.remove({FileContainer{filePath, projectPartId}}); ASSERT_TRUE(waitUntilJobFinished(job)); } @@ -90,23 +90,23 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentRevisionChange EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); job.runAsync(); - translationUnits.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)}); + documents.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)}); ASSERT_TRUE(waitUntilJobFinished(job)); } TEST_F(UpdateDocumentAnnotationsJob, UpdatesTranslationUnit) { - const time_point timePointBefore = translationUnit.lastProjectPartChangeTimePoint(); - const QSet dependendOnFilesBefore = translationUnit.dependedFilePaths(); + const time_point timePointBefore = document.lastProjectPartChangeTimePoint(); + const QSet dependendOnFilesBefore = document.dependedFilePaths(); job.setContext(jobContext); job.prepareAsyncRun(); job.runAsync(); ASSERT_TRUE(waitUntilJobFinished(job)); - ASSERT_THAT(timePointBefore, Not(translationUnit.lastProjectPartChangeTimePoint())); - ASSERT_THAT(dependendOnFilesBefore, Not(translationUnit.dependedFilePaths())); + ASSERT_THAT(timePointBefore, Not(document.lastProjectPartChangeTimePoint())); + ASSERT_THAT(dependendOnFilesBefore, Not(document.dependedFilePaths())); } } // anonymous diff --git a/tests/unit/unittest/codecompletionsextractortest.cpp b/tests/unit/unittest/codecompletionsextractortest.cpp index 20a720e1b02..22b86bf19d8 100644 --- a/tests/unit/unittest/codecompletionsextractortest.cpp +++ b/tests/unit/unittest/codecompletionsextractortest.cpp @@ -24,15 +24,15 @@ ****************************************************************************/ #include +#include #include #include #include #include #include -#include #include #include -#include +#include #include #include @@ -48,7 +48,7 @@ using ClangBackEnd::CodeCompletionsExtractor; using ClangBackEnd::ClangCodeCompleteResults; using ClangBackEnd::FilePath; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; using ClangBackEnd::CodeCompletion; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFilesShallowArguments; @@ -145,7 +145,7 @@ const ClangBackEnd::FileContainer unsavedDataFileContainer(const char *filePath, class CodeCompletionsExtractor : public ::testing::Test { protected: - ClangCodeCompleteResults getResults(const TranslationUnit &translationUnit, + ClangCodeCompleteResults getResults(const Document &document, uint line, uint column = 1, bool needsReparse = false); @@ -154,19 +154,19 @@ protected: ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit functionTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit variableTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit classTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit namespaceTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit enumerationTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit constructorTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), translationUnits}; - TranslationUnit briefCommentTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), translationUnits}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document functionDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents}; + Document variableDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), documents}; + Document classDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), documents}; + Document namespaceDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), documents}; + Document enumerationDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), documents}; + Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), documents}; + Document briefCommentDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), documents}; }; TEST_F(CodeCompletionsExtractor, Function) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -177,7 +177,7 @@ TEST_F(CodeCompletionsExtractor, Function) TEST_F(CodeCompletionsExtractor, TemplateFunction) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -188,7 +188,7 @@ TEST_F(CodeCompletionsExtractor, TemplateFunction) TEST_F(CodeCompletionsExtractor, Variable) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 4)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -200,7 +200,7 @@ TEST_F(CodeCompletionsExtractor, Variable) TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 25, 19)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 25, 19)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -212,7 +212,7 @@ TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter) TEST_F(CodeCompletionsExtractor, VariableReference) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 12)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 12)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -223,7 +223,7 @@ TEST_F(CodeCompletionsExtractor, VariableReference) TEST_F(CodeCompletionsExtractor, Parameter) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 4)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -234,7 +234,7 @@ TEST_F(CodeCompletionsExtractor, Parameter) TEST_F(CodeCompletionsExtractor, Field) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -245,7 +245,7 @@ TEST_F(CodeCompletionsExtractor, Field) TEST_F(CodeCompletionsExtractor, Class) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -256,7 +256,7 @@ TEST_F(CodeCompletionsExtractor, Class) TEST_F(CodeCompletionsExtractor, Struct) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -267,7 +267,7 @@ TEST_F(CodeCompletionsExtractor, Struct) TEST_F(CodeCompletionsExtractor, Union) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -278,7 +278,7 @@ TEST_F(CodeCompletionsExtractor, Union) TEST_F(CodeCompletionsExtractor, Typedef) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -289,7 +289,7 @@ TEST_F(CodeCompletionsExtractor, Typedef) TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -300,7 +300,7 @@ TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias) TEST_F(CodeCompletionsExtractor, TemplateTypeParameter) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -311,7 +311,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTypeParameter) TEST_F(CodeCompletionsExtractor, TemplateClass) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -322,7 +322,7 @@ TEST_F(CodeCompletionsExtractor, TemplateClass) TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -333,7 +333,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter) TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -344,7 +344,7 @@ TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization) TEST_F(CodeCompletionsExtractor, Namespace) { - ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -355,7 +355,7 @@ TEST_F(CodeCompletionsExtractor, Namespace) TEST_F(CodeCompletionsExtractor, NamespaceAlias) { - ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -366,7 +366,7 @@ TEST_F(CodeCompletionsExtractor, NamespaceAlias) TEST_F(CodeCompletionsExtractor, Enumeration) { - ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -377,7 +377,7 @@ TEST_F(CodeCompletionsExtractor, Enumeration) TEST_F(CodeCompletionsExtractor, Enumerator) { - ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -388,7 +388,7 @@ TEST_F(CodeCompletionsExtractor, Enumerator) TEST_F(CodeCompletionsExtractor, DISABLED_Constructor) { - ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -399,7 +399,7 @@ TEST_F(CodeCompletionsExtractor, DISABLED_Constructor) TEST_F(CodeCompletionsExtractor, Destructor) { - ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -410,7 +410,7 @@ TEST_F(CodeCompletionsExtractor, Destructor) TEST_F(CodeCompletionsExtractor, Method) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -422,7 +422,7 @@ TEST_F(CodeCompletionsExtractor, Method) TEST_F(CodeCompletionsExtractor, MethodWithParameters) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -434,7 +434,7 @@ TEST_F(CodeCompletionsExtractor, MethodWithParameters) TEST_F(CodeCompletionsExtractor, Slot) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -445,7 +445,7 @@ TEST_F(CodeCompletionsExtractor, Slot) TEST_F(CodeCompletionsExtractor, Signal) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -456,7 +456,7 @@ TEST_F(CodeCompletionsExtractor, Signal) TEST_F(CodeCompletionsExtractor, MacroDefinition) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -467,7 +467,7 @@ TEST_F(CodeCompletionsExtractor, MacroDefinition) TEST_F(CodeCompletionsExtractor, FunctionMacro) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -478,7 +478,7 @@ TEST_F(CodeCompletionsExtractor, FunctionMacro) TEST_F(CodeCompletionsExtractor, IntKeyword) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -489,7 +489,7 @@ TEST_F(CodeCompletionsExtractor, IntKeyword) TEST_F(CodeCompletionsExtractor, SwitchKeyword) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -500,7 +500,7 @@ TEST_F(CodeCompletionsExtractor, SwitchKeyword) TEST_F(CodeCompletionsExtractor, ClassKeyword) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -511,7 +511,7 @@ TEST_F(CodeCompletionsExtractor, ClassKeyword) TEST_F(CodeCompletionsExtractor, DeprecatedFunction) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -522,7 +522,7 @@ TEST_F(CodeCompletionsExtractor, DeprecatedFunction) TEST_F(CodeCompletionsExtractor, NotAccessibleFunction) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -533,7 +533,7 @@ TEST_F(CodeCompletionsExtractor, NotAccessibleFunction) TEST_F(CodeCompletionsExtractor, NotAvailableFunction) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -544,10 +544,10 @@ TEST_F(CodeCompletionsExtractor, NotAvailableFunction) TEST_F(CodeCompletionsExtractor, UnsavedFile) { - TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits); + Document document(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents); unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp", TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")}); - ClangCodeCompleteResults completeResults(getResults(translationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(document, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -558,13 +558,13 @@ TEST_F(CodeCompletionsExtractor, UnsavedFile) TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile) { - TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits); + Document document(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents); unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp", TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")}); - ClangCodeCompleteResults completeResults(getResults(translationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(document, 20)); unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp", TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")}); - completeResults = getResults(translationUnit, 20); + completeResults = getResults(document, 20); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -576,7 +576,7 @@ TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile) TEST_F(CodeCompletionsExtractor, ArgumentDefinition) { project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")}); - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -588,7 +588,7 @@ TEST_F(CodeCompletionsExtractor, ArgumentDefinition) TEST_F(CodeCompletionsExtractor, NoArgumentDefinition) { project.setArguments({Utf8StringLiteral("-std=gnu++14")}); - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 35)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -599,7 +599,7 @@ TEST_F(CodeCompletionsExtractor, NoArgumentDefinition) TEST_F(CodeCompletionsExtractor, CompletionChunksFunction) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -612,7 +612,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunction) TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks) { - ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(functionDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -630,7 +630,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks) TEST_F(CodeCompletionsExtractor, CompletionChunksField) { - ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(variableDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -641,7 +641,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksField) TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator) { - ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -652,7 +652,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator) TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration) { - ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -662,7 +662,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration) TEST_F(CodeCompletionsExtractor, CompletionChunksClass) { - ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); + ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -672,7 +672,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksClass) TEST_F(CodeCompletionsExtractor, BriefComment) { - ClangCodeCompleteResults completeResults(getResults(briefCommentTranslationUnit, 10, 1, + ClangCodeCompleteResults completeResults(getResults(briefCommentDocument, 10, 1, /*needsReparse=*/ true)); ::CodeCompletionsExtractor extractor(completeResults.data()); @@ -680,19 +680,19 @@ TEST_F(CodeCompletionsExtractor, BriefComment) ASSERT_THAT(extractor, HasBriefComment(Utf8StringLiteral("BriefComment"), Utf8StringLiteral("A brief comment"))); } -ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const TranslationUnit &translationUnit, +ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const Document &document, uint line, uint column, bool needsReparse) { - translationUnit.parse(); + document.parse(); if (needsReparse) - translationUnit.reparse(); + document.reparse(); - const Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); + const Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath()); UnsavedFilesShallowArguments unsaved = unsavedFiles.shallowArguments(); - return ClangCodeCompleteResults(clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), + return ClangCodeCompleteResults(clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(), nativeFilePath.constData(), line, column, diff --git a/tests/unit/unittest/codecompletiontest.cpp b/tests/unit/unittest/codecompletiontest.cpp index aafb1fb85d1..8d338523b1a 100644 --- a/tests/unit/unittest/codecompletiontest.cpp +++ b/tests/unit/unittest/codecompletiontest.cpp @@ -24,11 +24,11 @@ ****************************************************************************/ #include +#include #include #include #include -#include -#include +#include #include #include @@ -88,8 +88,8 @@ protected: projectPart.projectPartId()}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ClangBackEnd::TranslationUnit translationUnit; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + ClangBackEnd::Document document; QScopedPointer completer; ClangBackEnd::FileContainer unsavedMainFileContainer{mainFileContainer.filePath(), projectPart.projectPartId(), @@ -211,20 +211,20 @@ void CodeCompleter::SetUp() { EXPECT_TRUE(includeDirectory.isValid()); projects.createOrUpdate({projectPart}); - translationUnits.create({mainFileContainer}); - translationUnit = translationUnits.translationUnit(mainFileContainer); - completer.reset(new ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(), + documents.create({mainFileContainer}); + document = documents.document(mainFileContainer); + completer.reset(new ClangBackEnd::CodeCompleter(document.translationUnitCore(), unsavedFiles)); copyTargetHeaderToTemporaryIncludeDirecory(); - translationUnit.parse(); + document.parse(); } TEST_F(CodeCompleter, FunctionInUnsavedFile) { unsavedFiles.createOrUpdate({unsavedMainFileContainer}); - translationUnits.update({unsavedMainFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.update({unsavedMainFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); ASSERT_THAT(myCompleter.complete(27, 1), AllOf(Contains(IsCodeCompletion(Utf8StringLiteral("FunctionWithArguments"), @@ -242,8 +242,8 @@ TEST_F(CodeCompleter, FunctionInUnsavedFile) TEST_F(CodeCompleter, VariableInUnsavedFile) { unsavedFiles.createOrUpdate({unsavedMainFileContainer}); - translationUnits.update({unsavedMainFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.update({unsavedMainFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); ASSERT_THAT(myCompleter.complete(27, 1), Contains(IsCodeCompletion(Utf8StringLiteral("VariableInUnsavedFile"), @@ -253,8 +253,8 @@ TEST_F(CodeCompleter, VariableInUnsavedFile) TEST_F(CodeCompleter, GlobalVariableInUnsavedFile) { unsavedFiles.createOrUpdate({unsavedMainFileContainer}); - translationUnits.update({unsavedMainFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.update({unsavedMainFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); ASSERT_THAT(myCompleter.complete(27, 1), Contains(IsCodeCompletion(Utf8StringLiteral("GlobalVariableInUnsavedFile"), @@ -264,8 +264,8 @@ TEST_F(CodeCompleter, GlobalVariableInUnsavedFile) TEST_F(CodeCompleter, Macro) { unsavedFiles.createOrUpdate({unsavedMainFileContainer}); - translationUnits.update({unsavedMainFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.update({unsavedMainFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); ASSERT_THAT(myCompleter.complete(27, 1), Contains(IsCodeCompletion(Utf8StringLiteral("Macro"), @@ -289,8 +289,8 @@ TEST_F(CodeCompleter, FunctionInIncludedHeader) TEST_F(CodeCompleter, FunctionInUnsavedIncludedHeader) { unsavedFiles.createOrUpdate({unsavedTargetHeaderFileContainer}); - translationUnits.create({unsavedTargetHeaderFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.create({unsavedTargetHeaderFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); ASSERT_THAT(myCompleter.complete(27, 1), Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderUnsaved"), @@ -309,8 +309,8 @@ TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeader) TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile) // it's not that bad because we reparse anyway { unsavedFiles.createOrUpdate({unsavedMainFileContainer}); - translationUnits.update({unsavedMainFileContainer}); - ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); + documents.update({unsavedMainFileContainer}); + ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles); copyChangedTargetHeaderToTemporaryIncludeDirecory(); @@ -345,16 +345,16 @@ TEST_F(CodeCompleter, DotToArrowCompletionForPointer) ClangBackEnd::CompletionCorrection::DotToArrowCorrection); } -TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedTranslationUnit) +TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedDocument) { auto fileContainerBeforeTyping = dotArrowCorrectionForPointerFileContainerBeforeTyping; - translationUnits.create({fileContainerBeforeTyping}); + documents.create({fileContainerBeforeTyping}); unsavedFiles.createOrUpdate({fileContainerBeforeTyping}); - auto translationUnit = translationUnits.translationUnit(fileContainerBeforeTyping.filePath(), + auto document = documents.document(fileContainerBeforeTyping.filePath(), fileContainerBeforeTyping.projectPartId()); - translationUnit.parse(); + document.parse(); unsavedFiles.createOrUpdate({dotArrowCorrectionForPointerFileContainerAfterTyping}); - ClangBackEnd::CodeCompleter myCompleter(translationUnits.translationUnit(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(), + ClangBackEnd::CodeCompleter myCompleter(documents.document(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(), unsavedFiles); const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); @@ -443,13 +443,13 @@ TEST_F(CodeCompleter, NoDotArrowCorrectionForColonColon) ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter( const ClangBackEnd::FileContainer &fileContainer) { - translationUnits.create({fileContainer}); + documents.create({fileContainer}); unsavedFiles.createOrUpdate({fileContainer}); - translationUnit = translationUnits.translationUnit(fileContainer); - translationUnit.parse(); + document = documents.document(fileContainer); + document.parse(); - ClangBackEnd::TranslationUnit translationUnit = translationUnits.translationUnit(fileContainer); - return ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(), + ClangBackEnd::Document document = documents.document(fileContainer); + return ClangBackEnd::CodeCompleter(document.translationUnitCore(), unsavedFiles); } diff --git a/tests/unit/unittest/cursortest.cpp b/tests/unit/unittest/cursortest.cpp index 8f167348e30..cace1d41704 100644 --- a/tests/unit/unittest/cursortest.cpp +++ b/tests/unit/unittest/cursortest.cpp @@ -23,15 +23,15 @@ ** ****************************************************************************/ +#include +#include #include #include #include #include #include #include -#include #include -#include #include #include @@ -40,11 +40,11 @@ #include "gtest-qt-printing.h" using ClangBackEnd::Cursor; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::ProjectPart; -using ClangBackEnd::TranslationUnits; +using ClangBackEnd::Documents; using ClangBackEnd::ClangString; using ClangBackEnd::SourceRange; @@ -63,15 +63,15 @@ namespace { struct Data { ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/cursor.cpp")}; - TranslationUnit translationUnit{filePath, + Document document{filePath, ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}), {}, - translationUnits}; + documents}; TranslationUnitCore translationUnitCore{filePath, - translationUnit.translationUnitCore().cxIndex(), - translationUnit.translationUnitCore().cxTranslationUnit()}; + document.translationUnitCore().cxIndex(), + document.translationUnitCore().cxTranslationUnit()}; }; class Cursor : public ::testing::Test @@ -82,7 +82,7 @@ public: protected: static Data *d; - const TranslationUnit &translationUnit = d->translationUnit; + const Document &document = d->document; const TranslationUnitCore &translationUnitCore = d->translationUnitCore; }; @@ -808,7 +808,7 @@ Data *Cursor::d; void Cursor::SetUpTestCase() { d = new Data; - d->translationUnit.parse(); + d->document.parse(); } void Cursor::TearDownTestCase() diff --git a/tests/unit/unittest/diagnosticsettest.cpp b/tests/unit/unittest/diagnosticsettest.cpp index 946eb8b63ba..17e69325e89 100644 --- a/tests/unit/unittest/diagnosticsettest.cpp +++ b/tests/unit/unittest/diagnosticsettest.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include +#include #include #include #include @@ -32,9 +33,8 @@ #include #include #include -#include #include -#include +#include #include #include @@ -56,7 +56,7 @@ using ::ClangBackEnd::FixItContainer; using ::ClangBackEnd::ProjectPart; using ::ClangBackEnd::SourceLocation; using ::ClangBackEnd::SourceLocationContainer; -using ::ClangBackEnd::TranslationUnit; +using ::ClangBackEnd::Document; using ::ClangBackEnd::UnsavedFiles; namespace { @@ -69,15 +69,15 @@ protected: ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"), - projectPart, - Utf8StringVector(), - translationUnits}; - TranslationUnit translationUnitMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"), - projectPart, - Utf8StringVector(), - translationUnits}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"), + projectPart, + Utf8StringVector(), + documents}; + Document documentMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"), + projectPart, + Utf8StringVector(), + documents}; protected: enum ChildMode { WithChild, WithoutChild }; @@ -86,16 +86,16 @@ protected: TEST_F(DiagnosticSet, SetHasContent) { - translationUnit.parse(); - const auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + const auto set = document.translationUnitCore().diagnostics(); ASSERT_THAT(set.size(), 1); } TEST_F(DiagnosticSet, MoveConstructor) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); const auto set2 = std::move(set); @@ -105,8 +105,8 @@ TEST_F(DiagnosticSet, MoveConstructor) TEST_F(DiagnosticSet, MoveAssigment) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); auto set2 = std::move(set); set = std::move(set2); @@ -117,8 +117,8 @@ TEST_F(DiagnosticSet, MoveAssigment) TEST_F(DiagnosticSet, MoveSelfAssigment) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); set = std::move(set); @@ -127,24 +127,24 @@ TEST_F(DiagnosticSet, MoveSelfAssigment) TEST_F(DiagnosticSet, FirstElementEqualBegin) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); ASSERT_TRUE(set.front() == *set.begin()); } TEST_F(DiagnosticSet, BeginIsUnequalEnd) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); ASSERT_TRUE(set.begin() != set.end()); } TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd) { - translationUnit.parse(); - auto set = translationUnit.translationUnitCore().diagnostics(); + document.parse(); + auto set = document.translationUnitCore().diagnostics(); ASSERT_TRUE(++set.begin() == set.end()); } @@ -152,17 +152,17 @@ TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd) TEST_F(DiagnosticSet, ToDiagnosticContainersLetThroughByDefault) { const auto diagnosticContainerWithoutChild = expectedDiagnostic(WithChild); - translationUnitMainFile.parse(); + documentMainFile.parse(); - const auto diagnostics = translationUnitMainFile.translationUnitCore().diagnostics().toDiagnosticContainers(); + const auto diagnostics = documentMainFile.translationUnitCore().diagnostics().toDiagnosticContainers(); ASSERT_THAT(diagnostics, Contains(IsDiagnosticContainer(diagnosticContainerWithoutChild))); } TEST_F(DiagnosticSet, ToDiagnosticContainersFiltersOutTopLevelItem) { - translationUnitMainFile.parse(); - const ::DiagnosticSet diagnosticSetWithChildren{translationUnitMainFile.translationUnitCore().diagnostics()}; + documentMainFile.parse(); + const ::DiagnosticSet diagnosticSetWithChildren{documentMainFile.translationUnitCore().diagnostics()}; const auto acceptNoDiagnostics = [](const Diagnostic &) { return false; }; const auto diagnostics = diagnosticSetWithChildren.toDiagnosticContainers(acceptNoDiagnostics); @@ -192,7 +192,7 @@ DiagnosticContainer DiagnosticSet::expectedDiagnostic(DiagnosticSet::ChildMode c Utf8StringLiteral("Semantic Issue"), {Utf8String(), Utf8String()}, ClangBackEnd::DiagnosticSeverity::Error, - SourceLocationContainer(translationUnitMainFile.filePath(), 3, 6), + SourceLocationContainer(documentMainFile.filePath(), 3, 6), {}, {}, children diff --git a/tests/unit/unittest/diagnostictest.cpp b/tests/unit/unittest/diagnostictest.cpp index 885ad498634..c44859fae1e 100644 --- a/tests/unit/unittest/diagnostictest.cpp +++ b/tests/unit/unittest/diagnostictest.cpp @@ -28,9 +28,9 @@ #include #include #include -#include +#include +#include #include -#include #include #include #include @@ -51,13 +51,13 @@ using ::testing::PrintToString; using ClangBackEnd::DiagnosticSet; using ClangBackEnd::DiagnosticContainer; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; +using ClangBackEnd::Documents; using ClangBackEnd::ProjectPart; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::Diagnostic; using ClangBackEnd::SourceLocation; using ClangBackEnd::DiagnosticSeverity; -using ClangBackEnd::TranslationUnits; using ClangBackEnd::FixItContainer; using ClangBackEnd::SourceLocationContainer; @@ -81,8 +81,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset, } struct DiagnosticData { - DiagnosticData(TranslationUnit &translationUnit) - : diagnosticSet{translationUnit.translationUnitCore().diagnostics()} + DiagnosticData(Document &document) + : diagnosticSet{document.translationUnitCore().diagnostics()} , diagnostic{diagnosticSet.front()} { } @@ -94,18 +94,18 @@ struct DiagnosticData { struct Data { Data() { - translationUnit.parse(); - d.reset(new DiagnosticData(translationUnit)); + document.parse(); + d.reset(new DiagnosticData(document)); } ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"), - projectPart, - Utf8StringVector(), - translationUnits}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"), + projectPart, + Utf8StringVector(), + documents}; std::unique_ptr d; }; @@ -215,7 +215,7 @@ DiagnosticContainer Diagnostic::expectedDiagnostic(Diagnostic::ChildMode childMo Utf8StringLiteral("Semantic Issue"), {Utf8String(), Utf8String()}, ClangBackEnd::DiagnosticSeverity::Note, - SourceLocationContainer(d->translationUnit.filePath(), 5, 6), + SourceLocationContainer(d->document.filePath(), 5, 6), {}, {}, {} @@ -229,7 +229,7 @@ DiagnosticContainer Diagnostic::expectedDiagnostic(Diagnostic::ChildMode childMo Utf8StringLiteral("Semantic Issue"), {Utf8String(), Utf8String()}, ClangBackEnd::DiagnosticSeverity::Error, - SourceLocationContainer(d->translationUnit.filePath(), 7, 5), + SourceLocationContainer(d->document.filePath(), 7, 5), {}, {}, children diff --git a/tests/unit/unittest/fixittest.cpp b/tests/unit/unittest/fixittest.cpp index 1d5bf35a14a..3c4f1bd8ea4 100644 --- a/tests/unit/unittest/fixittest.cpp +++ b/tests/unit/unittest/fixittest.cpp @@ -27,9 +27,9 @@ #include #include #include -#include +#include +#include #include -#include #include #include #include @@ -43,7 +43,7 @@ #include "gtest-qt-printing.h" using ClangBackEnd::DiagnosticSet; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::ProjectPart; using ClangBackEnd::UnsavedFiles; @@ -88,19 +88,19 @@ struct Data { Data() { - translationUnit.parse(); + document.parse(); d.reset(new FixItData(translationUnitCore)); } ProjectPart projectPart{Utf8StringLiteral("projectPartId")}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"), - projectPart, - Utf8StringVector(), - translationUnits}; - TranslationUnitCore translationUnitCore{translationUnit.translationUnitCore()}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"), + projectPart, + Utf8StringVector(), + documents}; + TranslationUnitCore translationUnitCore{document.translationUnitCore()}; std::unique_ptr d; }; diff --git a/tests/unit/unittest/highlightingmarksreportertest.cpp b/tests/unit/unittest/highlightingmarksreportertest.cpp index ad82c5fd0ea..5fa3963e22b 100644 --- a/tests/unit/unittest/highlightingmarksreportertest.cpp +++ b/tests/unit/unittest/highlightingmarksreportertest.cpp @@ -24,14 +24,14 @@ ****************************************************************************/ #include +#include +#include #include -#include #include #include #include #include #include -#include #include #include @@ -43,11 +43,11 @@ using ClangBackEnd::Cursor; using ClangBackEnd::HighlightingMarks; using ClangBackEnd::HighlightingMarkContainer; using ClangBackEnd::HighlightingType; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; +using ClangBackEnd::Documents; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectParts; -using ClangBackEnd::TranslationUnits; using ClangBackEnd::ChunksReportedMonitor; namespace { @@ -55,12 +55,12 @@ namespace { struct Data { ProjectParts projects; UnsavedFiles unsavedFiles; - TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"), - ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++14")}), - {}, - translationUnits}; + Documents documents{projects, unsavedFiles}; + Document document{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"), + ProjectPart(Utf8StringLiteral("projectPartId"), + {Utf8StringLiteral("-std=c++14")}), + {}, + documents}; }; class HighlightingMarksReporter : public ::testing::Test diff --git a/tests/unit/unittest/highlightingmarkstest.cpp b/tests/unit/unittest/highlightingmarkstest.cpp index ba65cacbb9b..7f222e376a2 100644 --- a/tests/unit/unittest/highlightingmarkstest.cpp +++ b/tests/unit/unittest/highlightingmarkstest.cpp @@ -23,7 +23,8 @@ ** ****************************************************************************/ -#include +#include +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include @@ -49,11 +49,11 @@ using ClangBackEnd::HighlightingTypes; using ClangBackEnd::HighlightingMark; using ClangBackEnd::HighlightingMarks; using ClangBackEnd::HighlightingType; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; +using ClangBackEnd::Documents; using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::ProjectPart; -using ClangBackEnd::TranslationUnits; using ClangBackEnd::ClangString; using ClangBackEnd::SourceRange; @@ -101,20 +101,21 @@ MATCHER_P2(HasTwoTypes, firstType, secondType, struct Data { Data() { - translationUnit.parse(); + document.parse(); } ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp")}; - TranslationUnit translationUnit{filePath, - ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++14")}), - {}, - translationUnits}; + Document document{filePath, + ProjectPart(Utf8StringLiteral("projectPartId"), + {Utf8StringLiteral("-std=c++14")}), + {}, + documents}; TranslationUnitCore translationUnitCore{filePath, - translationUnit.translationUnitCore().cxIndex(), - translationUnit.translationUnitCore().cxTranslationUnit()}; + document.translationUnitCore().cxIndex(), + document.translationUnitCore().cxTranslationUnit()}; }; class HighlightingMarks : public ::testing::Test diff --git a/tests/unit/unittest/skippedsourcerangestest.cpp b/tests/unit/unittest/skippedsourcerangestest.cpp index d60525ce962..75e5ccdea76 100644 --- a/tests/unit/unittest/skippedsourcerangestest.cpp +++ b/tests/unit/unittest/skippedsourcerangestest.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include +#include +#include #include #include #include @@ -31,8 +33,6 @@ #include #include #include -#include -#include #include #include @@ -45,11 +45,11 @@ #include "gtest-qt-printing.h" using ClangBackEnd::Cursor; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; +using ClangBackEnd::Documents; using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::ProjectPart; -using ClangBackEnd::TranslationUnits; using ClangBackEnd::ClangString; using ClangBackEnd::SourceRange; using ClangBackEnd::SkippedSourceRanges; @@ -88,21 +88,22 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset, struct Data { Data() { - translationUnit.parse(); + document.parse(); } ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp"); - TranslationUnit translationUnit{filePath, - ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++11"),Utf8StringLiteral("-DBLAH")}), - {}, - translationUnits}; + Document document{filePath, + ProjectPart(Utf8StringLiteral("projectPartId"), + {Utf8StringLiteral("-std=c++11"), + Utf8StringLiteral("-DBLAH")}), + {}, + documents}; TranslationUnitCore translationUnitCore{filePath, - translationUnit.translationUnitCore().cxIndex(), - translationUnit.translationUnitCore().cxTranslationUnit()}; + document.translationUnitCore().cxIndex(), + document.translationUnitCore().cxTranslationUnit()}; }; class SkippedSourceRanges : public ::testing::Test diff --git a/tests/unit/unittest/sourcelocationtest.cpp b/tests/unit/unittest/sourcelocationtest.cpp index 584d9540893..4e3122a8e81 100644 --- a/tests/unit/unittest/sourcelocationtest.cpp +++ b/tests/unit/unittest/sourcelocationtest.cpp @@ -27,9 +27,9 @@ #include #include #include -#include +#include +#include #include -#include #include #include @@ -44,7 +44,7 @@ using ClangBackEnd::Diagnostic; using ClangBackEnd::DiagnosticSet; using ClangBackEnd::ProjectPart; using ClangBackEnd::SourceLocation; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; using ClangBackEnd::UnsavedFiles; using testing::EndsWith; @@ -53,8 +53,8 @@ using testing::Not; namespace { struct SourceLocationData { - SourceLocationData(TranslationUnit &translationUnit) - : diagnosticSet{translationUnit.translationUnitCore().diagnostics()} + SourceLocationData(Document &document) + : diagnosticSet{document.translationUnitCore().diagnostics()} , diagnostic{diagnosticSet.front()} , sourceLocation{diagnostic.location()} { @@ -68,18 +68,18 @@ struct SourceLocationData { struct Data { Data() { - translationUnit.parse(); - d.reset(new SourceLocationData(translationUnit)); + document.parse(); + d.reset(new SourceLocationData(document)); } ProjectPart projectPart{Utf8StringLiteral("projectPartId")}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"), - projectPart, - Utf8StringVector(), - translationUnits}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; + Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"), + projectPart, + Utf8StringVector(), + documents}; std::unique_ptr d; }; @@ -91,7 +91,7 @@ public: protected: static Data *d; - TranslationUnit &translationUnit = d->translationUnit; + Document &document = d->document; ::SourceLocation &sourceLocation = d->d->sourceLocation; }; @@ -117,12 +117,12 @@ TEST_F(SourceLocation, Offset) TEST_F(SourceLocation, Create) { - ASSERT_THAT(translationUnit.translationUnitCore().sourceLocationAt(4, 1), sourceLocation); + ASSERT_THAT(document.translationUnitCore().sourceLocationAt(4, 1), sourceLocation); } TEST_F(SourceLocation, NotEqual) { - ASSERT_THAT(translationUnit.translationUnitCore().sourceLocationAt(3, 1), Not(sourceLocation)); + ASSERT_THAT(document.translationUnitCore().sourceLocationAt(3, 1), Not(sourceLocation)); } Data *SourceLocation::d; diff --git a/tests/unit/unittest/sourcerangetest.cpp b/tests/unit/unittest/sourcerangetest.cpp index 6fc17e36a7e..2b870eb8fb1 100644 --- a/tests/unit/unittest/sourcerangetest.cpp +++ b/tests/unit/unittest/sourcerangetest.cpp @@ -27,8 +27,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -43,13 +43,13 @@ #include "gtest-qt-printing.h" using ClangBackEnd::DiagnosticSet; -using ClangBackEnd::TranslationUnit; +using ClangBackEnd::Document; +using ClangBackEnd::Documents; using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::ProjectPart; using ClangBackEnd::UnsavedFiles; using ClangBackEnd::Diagnostic; using ClangBackEnd::SourceRange; -using ClangBackEnd::TranslationUnits; using testing::PrintToString; using testing::IsEmpty; @@ -75,8 +75,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset, } struct SourceRangeData { - SourceRangeData(TranslationUnit &translationUnit) - : diagnosticSet{translationUnit.translationUnitCore().diagnostics()} + SourceRangeData(Document &document) + : diagnosticSet{document.translationUnitCore().diagnostics()} , diagnostic{diagnosticSet.front()} , diagnosticWithFilteredOutInvalidRange{diagnosticSet.at(1)} , sourceRange{diagnostic.ranges().front()} @@ -92,22 +92,22 @@ struct SourceRangeData { struct Data { Data() { - translationUnit.parse(); - d.reset(new SourceRangeData(translationUnit)); + document.parse(); + d.reset(new SourceRangeData(document)); } ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; + ClangBackEnd::Documents documents{projects, unsavedFiles}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_range.cpp")}; - TranslationUnit translationUnit{filePath, - projectPart, - Utf8StringVector(), - translationUnits}; + Document document{filePath, + projectPart, + Utf8StringVector(), + documents}; TranslationUnitCore translationUnitCore{filePath, - translationUnit.translationUnitCore().cxIndex(), - translationUnit.translationUnitCore().cxTranslationUnit()}; + document.translationUnitCore().cxIndex(), + document.translationUnitCore().cxTranslationUnit()}; std::unique_ptr d; }; diff --git a/tests/unit/unittest/translationunitstest.cpp b/tests/unit/unittest/translationunitstest.cpp deleted file mode 100644 index 476fd41a1d1..00000000000 --- a/tests/unit/unittest/translationunitstest.cpp +++ /dev/null @@ -1,354 +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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include "gtest-qt-printing.h" - -using ClangBackEnd::TranslationUnit; -using ClangBackEnd::UnsavedFiles; -using ClangBackEnd::ProjectPart; -using ClangBackEnd::ProjectPartContainer; - -using testing::IsNull; -using testing::NotNull; -using testing::Gt; -using testing::Not; -using testing::Contains; - -namespace { - -using ::testing::PrintToString; - -MATCHER_P3(IsTranslationUnit, filePath, projectPartId, documentRevision, - std::string(negation ? "isn't" : "is") - + " translation unit with file path "+ PrintToString(filePath) - + " and project " + PrintToString(projectPartId) - + " and document revision " + PrintToString(documentRevision) - ) -{ - return arg.filePath() == filePath - && arg.projectPartId() == projectPartId - && arg.documentRevision() == documentRevision; -} - -class TranslationUnits : public ::testing::Test -{ -protected: - void SetUp() override; - -protected: - ClangBackEnd::ProjectParts projects; - ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - const Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); - const Utf8String headerPath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.h"); - const Utf8String nonExistingFilePath = Utf8StringLiteral("foo.cpp"); - const Utf8String projectPartId = Utf8StringLiteral("projectPartId"); - const Utf8String otherProjectPartId = Utf8StringLiteral("otherProjectPartId"); - const Utf8String nonExistingProjectPartId = Utf8StringLiteral("nonExistingProjectPartId"); - const ClangBackEnd::FileContainer fileContainer{filePath, projectPartId}; - const ClangBackEnd::FileContainer headerContainer{headerPath, projectPartId}; -}; - -TEST_F(TranslationUnits, ThrowForGettingWithWrongFilePath) -{ - ASSERT_THROW(translationUnits.translationUnit(nonExistingFilePath, projectPartId), - ClangBackEnd::TranslationUnitDoesNotExistException); - -} - -TEST_F(TranslationUnits, ThrowForGettingWithWrongProjectPartFilePath) -{ - ASSERT_THROW(translationUnits.translationUnit(filePath, nonExistingProjectPartId), - ClangBackEnd::ProjectPartDoNotExistException); - -} - -TEST_F(TranslationUnits, ThrowForAddingNonExistingFile) -{ - ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId); - - ASSERT_THROW(translationUnits.create({fileContainer}), - ClangBackEnd::TranslationUnitFileNotExitsException); -} - -TEST_F(TranslationUnits, DoNotThrowForAddingNonExistingFileWithUnsavedContent) -{ - ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId, Utf8String(), true); - - ASSERT_NO_THROW(translationUnits.create({fileContainer})); -} - -TEST_F(TranslationUnits, Add) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - - translationUnits.create({fileContainer}); - - ASSERT_THAT(translationUnits.translationUnit(filePath, projectPartId), - IsTranslationUnit(filePath, projectPartId, 74u)); -} - -TEST_F(TranslationUnits, AddAndTestCreatedTranslationUnit) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - - auto createdTranslationUnits = translationUnits.create({fileContainer}); - - ASSERT_THAT(createdTranslationUnits.front(), - IsTranslationUnit(filePath, projectPartId, 74u)); -} - -TEST_F(TranslationUnits, ThrowForCreatingAnExistingTranslationUnit) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - translationUnits.create({fileContainer}); - - ASSERT_THROW(translationUnits.create({fileContainer}), - ClangBackEnd::TranslationUnitAlreadyExistsException); -} - -TEST_F(TranslationUnits, ThrowForUpdatingANonExistingTranslationUnit) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ASSERT_THROW(translationUnits.update({fileContainer}), - ClangBackEnd::TranslationUnitDoesNotExistException); -} - -TEST_F(TranslationUnits, UpdateSingle) -{ - ClangBackEnd::FileContainer createFileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer updateFileContainer(filePath, Utf8String(), Utf8StringVector(), 75u); - translationUnits.create({createFileContainer}); - - translationUnits.update({updateFileContainer}); - - ASSERT_THAT(translationUnits.translationUnit(filePath, projectPartId), - IsTranslationUnit(filePath, projectPartId, 75u)); -} - -TEST_F(TranslationUnits, UpdateMultiple) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer fileContainerWithOtherProject(filePath, otherProjectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer updatedFileContainer(filePath, Utf8String(), Utf8StringVector(), 75u); - translationUnits.create({fileContainer, fileContainerWithOtherProject}); - - translationUnits.update({updatedFileContainer}); - - ASSERT_THAT(translationUnits.translationUnit(filePath, projectPartId), - IsTranslationUnit(filePath, projectPartId, 75u)); - ASSERT_THAT(translationUnits.translationUnit(filePath, otherProjectPartId), - IsTranslationUnit(filePath, otherProjectPartId, 75u)); -} - -TEST_F(TranslationUnits, UpdateUnsavedFileAndCheckForReparse) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); - translationUnits.create({fileContainer, headerContainer}); - TranslationUnit translationUnit = translationUnits.translationUnit(filePath, projectPartId); - translationUnit.parse(); - - translationUnits.update({headerContainerWithUnsavedContent}); - - ASSERT_TRUE(translationUnits.translationUnit(filePath, projectPartId).isNeedingReparse()); -} - -TEST_F(TranslationUnits, RemoveFileAndCheckForReparse) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer headerContainer(headerPath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer headerContainerWithUnsavedContent(headerPath, projectPartId, Utf8String(), true, 75u); - translationUnits.create({fileContainer, headerContainer}); - TranslationUnit translationUnit = translationUnits.translationUnit(filePath, projectPartId); - translationUnit.parse(); - - translationUnits.remove({headerContainerWithUnsavedContent}); - - ASSERT_TRUE(translationUnits.translationUnit(filePath, projectPartId).isNeedingReparse()); -} - -TEST_F(TranslationUnits, DontGetNewerFileContainerIfRevisionIsTheSame) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - translationUnits.create({fileContainer}); - - auto newerFileContainers = translationUnits.newerFileContainers({fileContainer}); - - ASSERT_THAT(newerFileContainers.size(), 0); -} - -TEST_F(TranslationUnits, GetNewerFileContainerIfRevisionIsDifferent) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId, Utf8StringVector(), 74u); - ClangBackEnd::FileContainer newerContainer(filePath, projectPartId, Utf8StringVector(), 75u); - translationUnits.create({fileContainer}); - - auto newerFileContainers = translationUnits.newerFileContainers({newerContainer}); - - ASSERT_THAT(newerFileContainers.size(), 1); -} - -TEST_F(TranslationUnits, ThrowForRemovingWithWrongFilePath) -{ - ClangBackEnd::FileContainer fileContainer(nonExistingFilePath, projectPartId); - - ASSERT_THROW(translationUnits.remove({fileContainer}), - ClangBackEnd::TranslationUnitDoesNotExistException); -} - -TEST_F(TranslationUnits, ThrowForRemovingWithWrongProjectPartFilePath) -{ - ClangBackEnd::FileContainer fileContainer(filePath, nonExistingProjectPartId); - - ASSERT_THROW(translationUnits.remove({fileContainer}), - ClangBackEnd::ProjectPartDoNotExistException); -} - -TEST_F(TranslationUnits, Remove) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId); - translationUnits.create({fileContainer}); - - translationUnits.remove({fileContainer}); - - ASSERT_THROW(translationUnits.translationUnit(filePath, projectPartId), - ClangBackEnd::TranslationUnitDoesNotExistException); -} - -TEST_F(TranslationUnits, RemoveAllValidIfExceptionIsThrown) -{ - ClangBackEnd::FileContainer fileContainer(filePath, projectPartId); - translationUnits.create({fileContainer}); - - ASSERT_THROW(translationUnits.remove({ClangBackEnd::FileContainer(Utf8StringLiteral("dontextist.pro"), projectPartId), fileContainer}), - ClangBackEnd::TranslationUnitDoesNotExistException); - - ASSERT_THAT(translationUnits.translationUnits(), - Not(Contains(TranslationUnit(filePath, - projects.project(projectPartId), - Utf8StringVector(), - translationUnits)))); -} - -TEST_F(TranslationUnits, HasTranslationUnit) -{ - translationUnits.create({{filePath, projectPartId}}); - - ASSERT_TRUE(translationUnits.hasTranslationUnit(filePath, projectPartId)); -} - -TEST_F(TranslationUnits, HasNotTranslationUnit) -{ - ASSERT_FALSE(translationUnits.hasTranslationUnit(filePath, projectPartId)); -} - -TEST_F(TranslationUnits, isUsedByCurrentEditor) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - - translationUnits.setUsedByCurrentEditor(filePath); - - ASSERT_TRUE(translationUnit.isUsedByCurrentEditor()); -} - -TEST_F(TranslationUnits, IsNotCurrentEditor) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - - translationUnits.setUsedByCurrentEditor(headerPath); - - ASSERT_FALSE(translationUnit.isUsedByCurrentEditor()); -} - -TEST_F(TranslationUnits, IsNotCurrentEditorAfterBeingCurrent) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - translationUnits.setUsedByCurrentEditor(filePath); - - translationUnits.setUsedByCurrentEditor(headerPath); - - ASSERT_FALSE(translationUnit.isUsedByCurrentEditor()); -} - -TEST_F(TranslationUnits, IsVisibleEditor) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - - translationUnits.setVisibleInEditors({filePath}); - - ASSERT_TRUE(translationUnit.isVisibleInEditor()); -} - -TEST_F(TranslationUnits, IsNotVisibleEditor) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - - translationUnits.setVisibleInEditors({headerPath}); - - ASSERT_FALSE(translationUnit.isVisibleInEditor()); -} - -TEST_F(TranslationUnits, IsNotVisibleEditorAfterBeingVisible) -{ - translationUnits.create({fileContainer}); - auto translationUnit = translationUnits.translationUnit(fileContainer); - translationUnits.setVisibleInEditors({filePath}); - - translationUnits.setVisibleInEditors({headerPath}); - - ASSERT_FALSE(translationUnit.isVisibleInEditor()); -} - -void TranslationUnits::SetUp() -{ - projects.createOrUpdate({ProjectPartContainer(projectPartId)}); - projects.createOrUpdate({ProjectPartContainer(otherProjectPartId)}); -} - -} diff --git a/tests/unit/unittest/translationunittest.cpp b/tests/unit/unittest/translationunittest.cpp deleted file mode 100644 index fee7d6cd242..00000000000 --- a/tests/unit/unittest/translationunittest.cpp +++ /dev/null @@ -1,391 +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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include "gtest-qt-printing.h" - -#include - -#include -#include - -using ClangBackEnd::FileContainer; -using ClangBackEnd::FilePath; -using ClangBackEnd::TranslationUnit; -using ClangBackEnd::UnsavedFiles; -using ClangBackEnd::ProjectPart; -using ClangBackEnd::ProjectPartContainer; -using ClangBackEnd::TranslationUnits; -using ClangBackEnd::TranslationUnitUpdateResult; - -using testing::IsNull; -using testing::NotNull; -using testing::Eq; -using testing::Gt; -using testing::Contains; -using testing::EndsWith; -using testing::AllOf; - -namespace { - -class TranslationUnit : public ::testing::Test -{ -protected: - void SetUp() override; - ::TranslationUnit createTranslationUnitAndDeleteFile(); - QByteArray readContentFromTranslationUnitFile() const; - -protected: - ClangBackEnd::ProjectParts projects; - Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; - ProjectPart projectPart; - Utf8String translationUnitFilePath = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); - ClangBackEnd::UnsavedFiles unsavedFiles; - ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; - ::TranslationUnit translationUnit; -}; - -TEST_F(TranslationUnit, DefaultTranslationUnitIsInvalid) -{ - ::TranslationUnit translationUnit; - - ASSERT_TRUE(translationUnit.isNull()); -} - -TEST_F(TranslationUnit, DefaultTranslationUnitIsNotIntact) -{ - ::TranslationUnit translationUnit; - - ASSERT_FALSE(translationUnit.isIntact()); -} - -TEST_F(TranslationUnit, ThrowExceptionForNonExistingFilePath) -{ - ASSERT_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), projectPart, Utf8StringVector(), translationUnits), - ClangBackEnd::TranslationUnitFileNotExitsException); -} - -TEST_F(TranslationUnit, ThrowNoExceptionForNonExistingFilePathIfDoNotCheckIfFileExistsIsSet) -{ - ASSERT_NO_THROW(::TranslationUnit(Utf8StringLiteral("file.cpp"), projectPart, Utf8StringVector(), translationUnits, ::TranslationUnit::DoNotCheckIfFileExists)); -} - -TEST_F(TranslationUnit, TranslationUnitIsValid) -{ - ASSERT_FALSE(translationUnit.isNull()); -} - - -TEST_F(TranslationUnit, ThrowExceptionForGettingIndexForInvalidUnit) -{ - ::TranslationUnit translationUnit; - - ASSERT_THROW(translationUnit.translationUnitCore().cxIndex(), ClangBackEnd::TranslationUnitIsNullException); -} - -TEST_F(TranslationUnit, ThrowExceptionForGettingCxTranslationUnitForInvalidUnit) -{ - ::TranslationUnit translationUnit; - - ASSERT_THROW(translationUnit.translationUnitCore().cxIndex(), ClangBackEnd::TranslationUnitIsNullException); -} - -TEST_F(TranslationUnit, CxTranslationUnitGetterIsNonNullForParsedUnit) -{ - translationUnit.parse(); - - ASSERT_THAT(translationUnit.translationUnitCore().cxIndex(), NotNull()); -} - -TEST_F(TranslationUnit, ThrowExceptionIfGettingFilePathForNullUnit) -{ - ::TranslationUnit translationUnit; - - ASSERT_THROW(translationUnit.filePath(), ClangBackEnd::TranslationUnitIsNullException); -} - -TEST_F(TranslationUnit, ResetedTranslationUnitIsNull) -{ - translationUnit.reset(); - - ASSERT_TRUE(translationUnit.isNull()); -} - -TEST_F(TranslationUnit, LastCommandLineArgumentIsFilePath) -{ - const Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnitFilePath); - const auto arguments = translationUnit.createUpdater().commandLineArguments(); - - ASSERT_THAT(arguments.at(arguments.count() - 1), Eq(nativeFilePath)); -} - -TEST_F(TranslationUnit, TimeStampForProjectPartChangeIsUpdatedAsNewCxTranslationUnitIsGenerated) -{ - auto lastChangeTimePoint = translationUnit.lastProjectPartChangeTimePoint(); - std::this_thread::sleep_for(std::chrono::steady_clock::duration(1)); - - translationUnit.parse(); - - ASSERT_THAT(translationUnit.lastProjectPartChangeTimePoint(), Gt(lastChangeTimePoint)); -} - -TEST_F(TranslationUnit, TimeStampForProjectPartChangeIsUpdatedAsProjectPartIsCleared) -{ - ProjectPart projectPart = translationUnit.projectPart(); - translationUnit.parse(); - auto lastChangeTimePoint = translationUnit.lastProjectPartChangeTimePoint(); - std::this_thread::sleep_for(std::chrono::steady_clock::duration(1)); - - projectPart.clear(); - translationUnit.parse(); - - ASSERT_THAT(translationUnit.lastProjectPartChangeTimePoint(), Gt(lastChangeTimePoint)); -} - -TEST_F(TranslationUnit, DocumentRevisionInFileContainerGetter) -{ - translationUnit.setDocumentRevision(74); - - ASSERT_THAT(translationUnit.fileContainer().documentRevision(), 74); -} - -TEST_F(TranslationUnit, DependedFilePaths) -{ - translationUnit.parse(); - - ASSERT_THAT(translationUnit.dependedFilePaths(), - AllOf(Contains(translationUnitFilePath), - Contains(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")))); -} - -TEST_F(TranslationUnit, DeletedFileShouldNotNeedReparsing) -{ - auto translationUnit = createTranslationUnitAndDeleteFile(); - - translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsNoReparseAfterCreation) -{ - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsReparseAfterChangeOfMainFile) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NoNeedForReparsingForIndependendFile) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h")); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsReparsingForDependendFile) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsNoReparsingAfterReparsing) -{ - translationUnit.parse(); - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); - - translationUnit.reparse(); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, IsIntactAfterParsing) -{ - translationUnit.parse(); - - ASSERT_TRUE(translationUnit.isIntact()); -} - -TEST_F(TranslationUnit, IsNotIntactForDeletedFile) -{ - auto translationUnit = createTranslationUnitAndDeleteFile(); - - ASSERT_FALSE(translationUnit.isIntact()); -} - -TEST_F(TranslationUnit, DoesNotNeedReparseAfterParse) -{ - translationUnit.parse(); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsReparseAfterMainFileChanged) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, NeedsReparseAfterIncludedFileChanged) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/translationunits.h")); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, DoesNotNeedReparseAfterNotIncludedFileChanged) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfDependencyIsMet(Utf8StringLiteral(TESTDATA_DIR"/otherfiles.h")); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, DoesNotNeedReparseAfterReparse) -{ - translationUnit.parse(); - translationUnit.setDirtyIfDependencyIsMet(translationUnitFilePath); - - translationUnit.reparse(); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, SetDirtyIfProjectPartIsOutdated) -{ - projects.createOrUpdate({ProjectPartContainer(projectPartId)}); - translationUnit.parse(); - projects.createOrUpdate({ProjectPartContainer(projectPartId, {Utf8StringLiteral("-DNEW")})}); - - translationUnit.setDirtyIfProjectPartIsOutdated(); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, SetNotDirtyIfProjectPartIsNotOutdated) -{ - translationUnit.parse(); - - translationUnit.setDirtyIfProjectPartIsOutdated(); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, IncorporateUpdaterResultResetsDirtyness) -{ - translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); - TranslationUnitUpdateResult result; - result.reparsed = true; - result.needsToBeReparsedChangeTimePoint = translationUnit.isNeededReparseChangeTimePoint(); - - translationUnit.incorporateUpdaterResult(result); - - ASSERT_FALSE(translationUnit.isNeedingReparse()); -} - -TEST_F(TranslationUnit, IncorporateUpdaterResultDoesNotResetDirtynessIfItWasChanged) -{ - TranslationUnitUpdateResult result; - result.reparsed = true; - result.needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now(); - translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); - - translationUnit.incorporateUpdaterResult(result); - - ASSERT_TRUE(translationUnit.isNeedingReparse()); -} - -void TranslationUnit::SetUp() -{ - projects.createOrUpdate({ProjectPartContainer(projectPartId)}); - projectPart = *projects.findProjectPart(projectPartId); - - const QVector fileContainer{FileContainer(translationUnitFilePath, projectPartId)}; - const auto createdTranslationUnits = translationUnits.create(fileContainer); - translationUnit = createdTranslationUnits.front(); -} - -::TranslationUnit TranslationUnit::createTranslationUnitAndDeleteFile() -{ - QTemporaryFile temporaryFile; - EXPECT_TRUE(temporaryFile.open()); - EXPECT_TRUE(temporaryFile.write(readContentFromTranslationUnitFile())); - ::TranslationUnit translationUnit(temporaryFile.fileName(), - projectPart, - Utf8StringVector(), - translationUnits); - - return translationUnit; -} - -QByteArray TranslationUnit::readContentFromTranslationUnitFile() const -{ - QFile contentFile(translationUnitFilePath); - EXPECT_TRUE(contentFile.open(QIODevice::ReadOnly)); - - return contentFile.readAll(); -} - -} - diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro index 6d4f7fbbd9d..ea072b82815 100644 --- a/tests/unit/unittest/unittest.pro +++ b/tests/unit/unittest/unittest.pro @@ -62,8 +62,8 @@ SOURCES += \ sqlitestatementtest.cpp \ sqlitetabletest.cpp \ sqlstatementbuildertest.cpp \ - translationunitstest.cpp \ - translationunittest.cpp \ + clangdocumenttest.cpp \ + clangdocumentstest.cpp \ unsavedfilestest.cpp \ senddocumenttrackertest.cpp \ cursortest.cpp \