Clang: Rename TranslationUnit(s) to Document(s)

The "TranslationUnit parts" moved already to TranslationUnitCore.

Change-Id: I2bea7847e2b3e84fbfacc3d2dc43f180873349ac
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-09-07 10:42:12 +02:00
parent 6a2e11940f
commit 14b27183ce
54 changed files with 1608 additions and 1614 deletions

View File

@@ -10,7 +10,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \
$$PWD/unsavedfile.h \ $$PWD/unsavedfile.h \
$$PWD/unsavedfiles.h \ $$PWD/unsavedfiles.h \
$$PWD/projects.h \ $$PWD/projects.h \
$$PWD/translationunits.h \ $$PWD/clangdocuments.h \
$$PWD/translationunitparseerrorexception.h \ $$PWD/translationunitparseerrorexception.h \
$$PWD/translationunitreparseerrorexception.h \ $$PWD/translationunitreparseerrorexception.h \
$$PWD/projectpart.h \ $$PWD/projectpart.h \
@@ -29,7 +29,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \
$$PWD/commandlinearguments.h \ $$PWD/commandlinearguments.h \
$$PWD/cursor.h \ $$PWD/cursor.h \
$$PWD/skippedsourceranges.h \ $$PWD/skippedsourceranges.h \
$$PWD/clangtranslationunit.h \ $$PWD/clangdocument.h \
$$PWD/clangtranslationunitupdater.h \ $$PWD/clangtranslationunitupdater.h \
$$PWD/clangtype.h \ $$PWD/clangtype.h \
$$PWD/highlightingmark.h \ $$PWD/highlightingmark.h \
@@ -60,7 +60,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \
$$PWD/unsavedfile.cpp \ $$PWD/unsavedfile.cpp \
$$PWD/unsavedfiles.cpp \ $$PWD/unsavedfiles.cpp \
$$PWD/projects.cpp \ $$PWD/projects.cpp \
$$PWD/translationunits.cpp \ $$PWD/clangdocuments.cpp \
$$PWD/translationunitparseerrorexception.cpp \ $$PWD/translationunitparseerrorexception.cpp \
$$PWD/translationunitreparseerrorexception.cpp \ $$PWD/translationunitreparseerrorexception.cpp \
$$PWD/projectpart.cpp \ $$PWD/projectpart.cpp \
@@ -78,7 +78,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \
$$PWD/commandlinearguments.cpp \ $$PWD/commandlinearguments.cpp \
$$PWD/cursor.cpp \ $$PWD/cursor.cpp \
$$PWD/skippedsourceranges.cpp \ $$PWD/skippedsourceranges.cpp \
$$PWD/clangtranslationunit.cpp \ $$PWD/clangdocument.cpp \
$$PWD/clangtranslationunitupdater.cpp \ $$PWD/clangtranslationunitupdater.cpp \
$$PWD/clangtype.cpp \ $$PWD/clangtype.cpp \
$$PWD/highlightingmark.cpp \ $$PWD/highlightingmark.cpp \

View File

@@ -25,6 +25,7 @@
#include "clangcodemodelserver.h" #include "clangcodemodelserver.h"
#include "clangdocuments.h"
#include "clangfilesystemwatcher.h" #include "clangfilesystemwatcher.h"
#include "codecompleter.h" #include "codecompleter.h"
#include "diagnosticset.h" #include "diagnosticset.h"
@@ -35,7 +36,6 @@
#include "translationunitfilenotexitexception.h" #include "translationunitfilenotexitexception.h"
#include "translationunitisnullexception.h" #include "translationunitisnullexception.h"
#include "translationunitparseerrorexception.h" #include "translationunitparseerrorexception.h"
#include "translationunits.h"
#include <clangbackendipcdebugutils.h> #include <clangbackendipcdebugutils.h>
#include <cmbcodecompletedmessage.h> #include <cmbcodecompletedmessage.h>
@@ -85,7 +85,7 @@ int delayedDocumentAnnotationsTimerInterval()
} // anonymous } // anonymous
ClangCodeModelServer::ClangCodeModelServer() ClangCodeModelServer::ClangCodeModelServer()
: translationUnits(projects, unsavedFiles) : documents(projects, unsavedFiles)
, updateDocumentAnnotationsTimeOutInMs(delayedDocumentAnnotationsTimerInterval()) , updateDocumentAnnotationsTimeOutInMs(delayedDocumentAnnotationsTimerInterval())
{ {
updateDocumentAnnotationsTimer.setSingleShot(true); updateDocumentAnnotationsTimer.setSingleShot(true);
@@ -96,7 +96,7 @@ ClangCodeModelServer::ClangCodeModelServer()
processJobsForDirtyAndVisibleDocuments(); processJobsForDirtyAndVisibleDocuments();
}); });
QObject::connect(translationUnits.clangFileSystemWatcher(), QObject::connect(documents.clangFileSystemWatcher(),
&ClangFileSystemWatcher::fileChanged, &ClangFileSystemWatcher::fileChanged,
[this](const Utf8String &filePath) { [this](const Utf8String &filePath) {
ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(filePath); ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(filePath);
@@ -113,10 +113,10 @@ void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd:
TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor"); TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor");
try { try {
auto createdTranslationUnits = translationUnits.create(message.fileContainers()); auto createdTranslationUnits = documents.create(message.fileContainers());
unsavedFiles.createOrUpdate(message.fileContainers()); unsavedFiles.createOrUpdate(message.fileContainers());
translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath()); documents.setUsedByCurrentEditor(message.currentEditorFilePath());
translationUnits.setVisibleInEditors(message.visibleEditorFilePaths()); documents.setVisibleInEditors(message.visibleEditorFilePaths());
processInitialJobsForDocuments(createdTranslationUnits); processInitialJobsForDocuments(createdTranslationUnits);
} catch (const ProjectPartDoNotExistException &exception) { } catch (const ProjectPartDoNotExistException &exception) {
@@ -131,9 +131,9 @@ void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslati
TIME_SCOPE_DURATION("ClangCodeModelServer::updateTranslationUnitsForEditor"); TIME_SCOPE_DURATION("ClangCodeModelServer::updateTranslationUnitsForEditor");
try { try {
const auto newerFileContainers = translationUnits.newerFileContainers(message.fileContainers()); const auto newerFileContainers = documents.newerFileContainers(message.fileContainers());
if (newerFileContainers.size() > 0) { if (newerFileContainers.size() > 0) {
translationUnits.update(newerFileContainers); documents.update(newerFileContainers);
unsavedFiles.createOrUpdate(newerFileContainers); unsavedFiles.createOrUpdate(newerFileContainers);
updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs); updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs);
@@ -152,7 +152,7 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn
TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterTranslationUnitsForEditor"); TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterTranslationUnitsForEditor");
try { try {
translationUnits.remove(message.fileContainers()); documents.remove(message.fileContainers());
unsavedFiles.remove(message.fileContainers()); unsavedFiles.remove(message.fileContainers());
} catch (const TranslationUnitDoesNotExistException &exception) { } catch (const TranslationUnitDoesNotExistException &exception) {
client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer())); client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer()));
@@ -169,7 +169,7 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa
try { try {
projects.createOrUpdate(message.projectContainers()); projects.createOrUpdate(message.projectContainers());
translationUnits.setTranslationUnitsDirtyIfProjectPartChanged(); documents.setDocumentsDirtyIfProjectPartChanged();
processJobsForDirtyAndVisibleDocuments(); processJobsForDirtyAndVisibleDocuments();
} catch (const std::exception &exception) { } catch (const std::exception &exception) {
@@ -196,7 +196,7 @@ void ClangCodeModelServer::registerUnsavedFilesForEditor(const RegisterUnsavedFi
try { try {
unsavedFiles.createOrUpdate(message.fileContainers()); unsavedFiles.createOrUpdate(message.fileContainers());
translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers()); documents.updateDocumentsWithChangedDependencies(message.fileContainers());
updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs); updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs);
} catch (const ProjectPartDoNotExistException &exception) { } catch (const ProjectPartDoNotExistException &exception) {
@@ -212,7 +212,7 @@ void ClangCodeModelServer::unregisterUnsavedFilesForEditor(const UnregisterUnsav
try { try {
unsavedFiles.remove(message.fileContainers()); unsavedFiles.remove(message.fileContainers());
translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers()); documents.updateDocumentsWithChangedDependencies(message.fileContainers());
} catch (const TranslationUnitDoesNotExistException &exception) { } catch (const TranslationUnitDoesNotExistException &exception) {
client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer())); client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer()));
} catch (const ProjectPartDoNotExistException &exception) { } catch (const ProjectPartDoNotExistException &exception) {
@@ -227,10 +227,9 @@ void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage
TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode"); TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode");
try { try {
auto translationUnit = translationUnits.translationUnit(message.filePath(), auto document = documents.document(message.filePath(), message.projectPartId());
message.projectPartId());
JobRequest jobRequest = createJobRequest(translationUnit, JobRequest::Type::CompleteCode); JobRequest jobRequest = createJobRequest(document, JobRequest::Type::CompleteCode);
jobRequest.line = message.line(); jobRequest.line = message.line();
jobRequest.column = message.column(); jobRequest.column = message.column();
jobRequest.ticketNumber = message.ticketNumber(); jobRequest.ticketNumber = message.ticketNumber();
@@ -251,10 +250,10 @@ void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnot
TIME_SCOPE_DURATION("ClangCodeModelServer::requestDocumentAnnotations"); TIME_SCOPE_DURATION("ClangCodeModelServer::requestDocumentAnnotations");
try { try {
auto translationUnit = translationUnits.translationUnit(message.fileContainer().filePath(), auto document = documents.document(message.fileContainer().filePath(),
message.fileContainer().projectPartId()); message.fileContainer().projectPartId());
const JobRequest jobRequest = createJobRequest(translationUnit, const JobRequest jobRequest = createJobRequest(document,
JobRequest::Type::RequestDocumentAnnotations); JobRequest::Type::RequestDocumentAnnotations);
jobs().add(jobRequest); jobs().add(jobRequest);
@@ -273,22 +272,22 @@ void ClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTran
TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits"); TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits");
try { try {
translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath()); documents.setUsedByCurrentEditor(message.currentEditorFilePath());
translationUnits.setVisibleInEditors(message.visibleEditorFilePaths()); documents.setVisibleInEditors(message.visibleEditorFilePaths());
updateDocumentAnnotationsTimer.start(0); updateDocumentAnnotationsTimer.start(0);
} catch (const std::exception &exception) { } catch (const std::exception &exception) {
qWarning() << "Error in ClangCodeModelServer::updateVisibleTranslationUnits:" << exception.what(); 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) void ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath)
{ {
if (!translationUnits.hasTranslationUnitWithFilePath(filePath)) if (!documents.hasDocumentWithFilePath(filePath))
updateDocumentAnnotationsTimer.start(0); updateDocumentAnnotationsTimer.start(0);
} }
@@ -304,11 +303,9 @@ bool ClangCodeModelServer::isTimerRunningForTestOnly() const
void ClangCodeModelServer::addJobRequestsForDirtyAndVisibleDocuments() void ClangCodeModelServer::addJobRequestsForDirtyAndVisibleDocuments()
{ {
for (const auto &translationUnit : translationUnits.translationUnits()) { for (const auto &document : documents.documents()) {
if (translationUnit.isNeedingReparse() && translationUnit.isVisibleInEditor()) { if (document.isNeedingReparse() && document.isVisibleInEditor())
jobs().add(createJobRequest(translationUnit, jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations));
JobRequest::Type::UpdateDocumentAnnotations));
}
} }
} }
@@ -318,30 +315,27 @@ void ClangCodeModelServer::processJobsForDirtyAndVisibleDocuments()
jobs().process(); jobs().process();
} }
void ClangCodeModelServer::processInitialJobsForDocuments( void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector<Document> &documents)
const std::vector<TranslationUnit> &translationUnits)
{ {
for (const auto &translationUnit : translationUnits) { for (const auto &document : documents) {
jobs().add(createJobRequest(translationUnit, jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations));
JobRequest::Type::UpdateDocumentAnnotations)); jobs().add(createJobRequest(document, JobRequest::Type::CreateInitialDocumentPreamble));
jobs().add(createJobRequest(translationUnit,
JobRequest::Type::CreateInitialDocumentPreamble));
} }
jobs().process(); jobs().process();
} }
JobRequest ClangCodeModelServer::createJobRequest(const TranslationUnit &translationUnit, JobRequest ClangCodeModelServer::createJobRequest(const Document &document,
JobRequest::Type type) const JobRequest::Type type) const
{ {
JobRequest jobRequest; JobRequest jobRequest;
jobRequest.type = type; jobRequest.type = type;
jobRequest.requirements = JobRequest::requirementsForType(type); jobRequest.requirements = JobRequest::requirementsForType(type);
jobRequest.filePath = translationUnit.filePath(); jobRequest.filePath = document.filePath();
jobRequest.projectPartId = translationUnit.projectPartId(); jobRequest.projectPartId = document.projectPartId();
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
jobRequest.documentRevision = translationUnit.documentRevision(); jobRequest.documentRevision = document.documentRevision();
const ProjectPart &projectPart = projects.project(translationUnit.projectPartId()); const ProjectPart &projectPart = projects.project(document.projectPartId());
jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint(); jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint();
return jobRequest; return jobRequest;
@@ -358,7 +352,7 @@ Jobs &ClangCodeModelServer::jobs()
// Jobs needs a reference to the client, but the client is not known at // Jobs needs a reference to the client, but the client is not known at
// construction time of ClangCodeModelServer, so construct Jobs in a // construction time of ClangCodeModelServer, so construct Jobs in a
// lazy manner. // lazy manner.
jobs_.reset(new Jobs(translationUnits, unsavedFiles, projects, *client())); jobs_.reset(new Jobs(documents, unsavedFiles, projects, *client()));
} }
return *jobs_.data(); return *jobs_.data();

View File

@@ -29,8 +29,8 @@
#include "projectpart.h" #include "projectpart.h"
#include "projects.h" #include "projects.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include "translationunits.h" #include "clangdocuments.h"
#include "unsavedfiles.h" #include "unsavedfiles.h"
#include "clangjobs.h" #include "clangjobs.h"
@@ -59,7 +59,7 @@ public:
void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override;
public /*for tests*/: public /*for tests*/:
const TranslationUnits &translationUnitsForTestOnly() const; const Documents &documentsForTestOnly() const;
const Jobs &jobsForTestOnly(); const Jobs &jobsForTestOnly();
bool isTimerRunningForTestOnly() const; bool isTimerRunningForTestOnly() const;
void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value); void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value);
@@ -70,15 +70,14 @@ private:
void startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath); void startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath);
void addJobRequestsForDirtyAndVisibleDocuments(); void addJobRequestsForDirtyAndVisibleDocuments();
void processJobsForDirtyAndVisibleDocuments(); void processJobsForDirtyAndVisibleDocuments();
void processInitialJobsForDocuments(const std::vector<TranslationUnit> &translationUnits); void processInitialJobsForDocuments(const std::vector<Document> &documents);
JobRequest createJobRequest(const TranslationUnit &translationUnit, JobRequest createJobRequest(const Document &document, JobRequest::Type type) const;
JobRequest::Type type) const;
private: private:
ProjectParts projects; ProjectParts projects;
UnsavedFiles unsavedFiles; UnsavedFiles unsavedFiles;
TranslationUnits translationUnits; Documents documents;
QScopedPointer<Jobs> jobs_; QScopedPointer<Jobs> jobs_;
QTimer updateDocumentAnnotationsTimer; QTimer updateDocumentAnnotationsTimer;

View File

@@ -61,9 +61,9 @@ bool CompleteCodeJob::prepareAsyncRun()
QTC_ASSERT(jobRequest.type == JobRequest::Type::CompleteCode, return false); QTC_ASSERT(jobRequest.type == JobRequest::Type::CompleteCode, return false);
try { 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 UnsavedFiles unsavedFiles = *context().unsavedFiles;
const quint32 line = jobRequest.line; const quint32 line = jobRequest.line;
const quint32 column = jobRequest.column; const quint32 column = jobRequest.column;

View File

@@ -26,7 +26,7 @@
#pragma once #pragma once
#include "clangasyncjob.h" #include "clangasyncjob.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include <clangbackendipc/codecompletion.h> #include <clangbackendipc/codecompletion.h>
@@ -47,7 +47,7 @@ public:
void finalizeAsyncRun() override; void finalizeAsyncRun() override;
private: private:
TranslationUnit m_pinnedTranslationUnit; Document m_pinnedDocument;
}; };
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -49,11 +49,11 @@ bool CreateInitialDocumentPreambleJob::prepareAsyncRun()
QTC_ASSERT(jobRequest.type == JobRequest::Type::CreateInitialDocumentPreamble, return false); QTC_ASSERT(jobRequest.type == JobRequest::Type::CreateInitialDocumentPreamble, return false);
try { try {
m_pinnedTranslationUnit = context().translationUnitForJobRequest(); m_pinnedDocument = context().documentForJobRequest();
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); m_pinnedFileContainer = m_pinnedDocument.fileContainer();
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput(); const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput();
setRunner([translationUnitCore, updateInput]() { setRunner([translationUnitCore, updateInput]() {
return runAsyncHelper(translationUnitCore, updateInput); return runAsyncHelper(translationUnitCore, updateInput);
}); });

View File

@@ -26,7 +26,7 @@
#pragma once #pragma once
#include "clangasyncjob.h" #include "clangasyncjob.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
namespace ClangBackEnd { namespace ClangBackEnd {
@@ -37,7 +37,7 @@ public:
void finalizeAsyncRun() override; void finalizeAsyncRun() override;
private: private:
TranslationUnit m_pinnedTranslationUnit; Document m_pinnedDocument;
FileContainer m_pinnedFileContainer; FileContainer m_pinnedFileContainer;
}; };

View File

@@ -23,8 +23,9 @@
** **
****************************************************************************/ ****************************************************************************/
#include "clangtranslationunit.h" #include "clangdocument.h"
#include "clangdocuments.h"
#include "clangstring.h" #include "clangstring.h"
#include "clangunsavedfilesshallowarguments.h" #include "clangunsavedfilesshallowarguments.h"
#include "codecompleter.h" #include "codecompleter.h"
@@ -35,7 +36,6 @@
#include "translationunitreparseerrorexception.h" #include "translationunitreparseerrorexception.h"
#include "clangtranslationunitcore.h" #include "clangtranslationunitcore.h"
#include "clangtranslationunitupdater.h" #include "clangtranslationunitupdater.h"
#include "translationunits.h"
#include "unsavedfiles.h" #include "unsavedfiles.h"
#include "unsavedfile.h" #include "unsavedfile.h"
@@ -49,17 +49,17 @@
namespace ClangBackEnd { namespace ClangBackEnd {
class TranslationUnitData class DocumentData
{ {
public: public:
TranslationUnitData(const Utf8String &filePath, DocumentData(const Utf8String &filePath,
const ProjectPart &projectPart, const ProjectPart &projectPart,
const Utf8StringVector &fileArguments, const Utf8StringVector &fileArguments,
TranslationUnits &translationUnits); Documents &documents);
~TranslationUnitData(); ~DocumentData();
public: public:
TranslationUnits &translationUnits; Documents &documents;
const Utf8String filePath; const Utf8String filePath;
const Utf8StringVector fileArguments; const Utf8StringVector fileArguments;
@@ -80,11 +80,11 @@ public:
bool isVisibleInEditor = false; bool isVisibleInEditor = false;
}; };
TranslationUnitData::TranslationUnitData(const Utf8String &filePath, DocumentData::DocumentData(const Utf8String &filePath,
const ProjectPart &projectPart, const ProjectPart &projectPart,
const Utf8StringVector &fileArguments, const Utf8StringVector &fileArguments,
TranslationUnits &translationUnits) Documents &documents)
: translationUnits(translationUnits), : documents(documents),
filePath(filePath), filePath(filePath),
fileArguments(fileArguments), fileArguments(fileArguments),
projectPart(projectPart), projectPart(projectPart),
@@ -94,74 +94,74 @@ TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
dependedFilePaths.insert(filePath); dependedFilePaths.insert(filePath);
} }
TranslationUnitData::~TranslationUnitData() DocumentData::~DocumentData()
{ {
clang_disposeTranslationUnit(translationUnit); clang_disposeTranslationUnit(translationUnit);
clang_disposeIndex(index); clang_disposeIndex(index);
} }
TranslationUnit::TranslationUnit(const Utf8String &filePath, Document::Document(const Utf8String &filePath,
const ProjectPart &projectPart, const ProjectPart &projectPart,
const Utf8StringVector &fileArguments, const Utf8StringVector &fileArguments,
TranslationUnits &translationUnits, Documents &documents,
FileExistsCheck fileExistsCheck) FileExistsCheck fileExistsCheck)
: d(std::make_shared<TranslationUnitData>(filePath, : d(std::make_shared<DocumentData>(filePath,
projectPart, projectPart,
fileArguments, fileArguments,
translationUnits)) documents))
{ {
if (fileExistsCheck == CheckIfFileExists) if (fileExistsCheck == CheckIfFileExists)
checkIfFileExists(); checkIfFileExists();
} }
TranslationUnit::~TranslationUnit() = default; Document::~Document() = default;
TranslationUnit::TranslationUnit(const TranslationUnit &) = default; Document::Document(const Document &) = default;
TranslationUnit &TranslationUnit::operator=(const TranslationUnit &) = default; Document &Document::operator=(const Document &) = default;
TranslationUnit::TranslationUnit(TranslationUnit &&other) Document::Document(Document &&other)
: d(std::move(other.d)) : d(std::move(other.d))
{ {
} }
TranslationUnit &TranslationUnit::operator=(TranslationUnit &&other) Document &Document::operator=(Document &&other)
{ {
d = std::move(other.d); d = std::move(other.d);
return *this; return *this;
} }
void TranslationUnit::reset() void Document::reset()
{ {
d.reset(); d.reset();
} }
bool TranslationUnit::isNull() const bool Document::isNull() const
{ {
return !d; return !d;
} }
bool TranslationUnit::isIntact() const bool Document::isIntact() const
{ {
return !isNull() return !isNull()
&& fileExists() && fileExists()
&& !d->hasParseOrReparseFailed; && !d->hasParseOrReparseFailed;
} }
Utf8String TranslationUnit::filePath() const Utf8String Document::filePath() const
{ {
checkIfNull(); checkIfNull();
return d->filePath; return d->filePath;
} }
Utf8StringVector TranslationUnit::fileArguments() const Utf8StringVector Document::fileArguments() const
{ {
checkIfNull(); checkIfNull();
return d->fileArguments; return d->fileArguments;
} }
FileContainer TranslationUnit::fileContainer() const FileContainer Document::fileContainer() const
{ {
checkIfNull(); checkIfNull();
@@ -172,103 +172,103 @@ FileContainer TranslationUnit::fileContainer() const
d->documentRevision); d->documentRevision);
} }
Utf8String TranslationUnit::projectPartId() const Utf8String Document::projectPartId() const
{ {
checkIfNull(); checkIfNull();
return d->projectPart.projectPartId(); return d->projectPart.projectPartId();
} }
const ProjectPart &TranslationUnit::projectPart() const const ProjectPart &Document::projectPart() const
{ {
checkIfNull(); checkIfNull();
return d->projectPart; return d->projectPart;
} }
const time_point TranslationUnit::lastProjectPartChangeTimePoint() const const time_point Document::lastProjectPartChangeTimePoint() const
{ {
checkIfNull(); checkIfNull();
return d->lastProjectPartChangeTimePoint; return d->lastProjectPartChangeTimePoint;
} }
bool TranslationUnit::isProjectPartOutdated() const bool Document::isProjectPartOutdated() const
{ {
checkIfNull(); checkIfNull();
return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint; return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint;
} }
uint TranslationUnit::documentRevision() const uint Document::documentRevision() const
{ {
checkIfNull(); checkIfNull();
return d->documentRevision; return d->documentRevision;
} }
void TranslationUnit::setDocumentRevision(uint revision) void Document::setDocumentRevision(uint revision)
{ {
checkIfNull(); checkIfNull();
d->documentRevision = revision; d->documentRevision = revision;
} }
bool TranslationUnit::isUsedByCurrentEditor() const bool Document::isUsedByCurrentEditor() const
{ {
checkIfNull(); checkIfNull();
return d->isUsedByCurrentEditor; return d->isUsedByCurrentEditor;
} }
void TranslationUnit::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor) void Document::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor)
{ {
checkIfNull(); checkIfNull();
d->isUsedByCurrentEditor = isUsedByCurrentEditor; d->isUsedByCurrentEditor = isUsedByCurrentEditor;
} }
bool TranslationUnit::isVisibleInEditor() const bool Document::isVisibleInEditor() const
{ {
checkIfNull(); checkIfNull();
return d->isVisibleInEditor; return d->isVisibleInEditor;
} }
void TranslationUnit::setIsVisibleInEditor(bool isVisibleInEditor) void Document::setIsVisibleInEditor(bool isVisibleInEditor)
{ {
checkIfNull(); checkIfNull();
d->isVisibleInEditor = isVisibleInEditor; d->isVisibleInEditor = isVisibleInEditor;
} }
time_point TranslationUnit::isNeededReparseChangeTimePoint() const time_point Document::isNeededReparseChangeTimePoint() const
{ {
checkIfNull(); checkIfNull();
return d->needsToBeReparsedChangeTimePoint; return d->needsToBeReparsedChangeTimePoint;
} }
bool TranslationUnit::isNeedingReparse() const bool Document::isNeedingReparse() const
{ {
checkIfNull(); checkIfNull();
return d->needsToBeReparsed; return d->needsToBeReparsed;
} }
void TranslationUnit::setDirtyIfProjectPartIsOutdated() void Document::setDirtyIfProjectPartIsOutdated()
{ {
if (isProjectPartOutdated()) if (isProjectPartOutdated())
setDirty(); setDirty();
} }
void TranslationUnit::setDirtyIfDependencyIsMet(const Utf8String &filePath) void Document::setDirtyIfDependencyIsMet(const Utf8String &filePath)
{ {
if (d->dependedFilePaths.contains(filePath) && isMainFileAndExistsOrIsOtherFile(filePath)) if (d->dependedFilePaths.contains(filePath) && isMainFileAndExistsOrIsOtherFile(filePath))
setDirty(); setDirty();
} }
TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const TranslationUnitUpdateInput Document::createUpdateInput() const
{ {
TranslationUnitUpdateInput updateInput; TranslationUnitUpdateInput updateInput;
updateInput.parseNeeded = isProjectPartOutdated(); updateInput.parseNeeded = isProjectPartOutdated();
@@ -276,14 +276,14 @@ TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const
updateInput.needsToBeReparsedChangeTimePoint = d->needsToBeReparsedChangeTimePoint; updateInput.needsToBeReparsedChangeTimePoint = d->needsToBeReparsedChangeTimePoint;
updateInput.filePath = filePath(); updateInput.filePath = filePath();
updateInput.fileArguments = fileArguments(); updateInput.fileArguments = fileArguments();
updateInput.unsavedFiles = d->translationUnits.unsavedFiles(); updateInput.unsavedFiles = d->documents.unsavedFiles();
updateInput.projectId = projectPart().projectPartId(); updateInput.projectId = projectPart().projectPartId();
updateInput.projectArguments = projectPart().arguments(); updateInput.projectArguments = projectPart().arguments();
return updateInput; return updateInput;
} }
TranslationUnitUpdater TranslationUnit::createUpdater() const TranslationUnitUpdater Document::createUpdater() const
{ {
const TranslationUnitUpdateInput updateInput = createUpdateInput(); const TranslationUnitUpdateInput updateInput = createUpdateInput();
TranslationUnitUpdater updater(d->index, d->translationUnit, updateInput); TranslationUnitUpdater updater(d->index, d->translationUnit, updateInput);
@@ -291,12 +291,12 @@ TranslationUnitUpdater TranslationUnit::createUpdater() const
return updater; return updater;
} }
void TranslationUnit::setHasParseOrReparseFailed(bool hasFailed) void Document::setHasParseOrReparseFailed(bool hasFailed)
{ {
d->hasParseOrReparseFailed = hasFailed; d->hasParseOrReparseFailed = hasFailed;
} }
void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const void Document::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const
{ {
d->hasParseOrReparseFailed = result.hasParseOrReparseFailed; d->hasParseOrReparseFailed = result.hasParseOrReparseFailed;
if (d->hasParseOrReparseFailed) { if (d->hasParseOrReparseFailed) {
@@ -310,7 +310,7 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult
if (result.parseTimePointIsSet || result.reparsed) if (result.parseTimePointIsSet || result.reparsed)
d->dependedFilePaths = result.dependedOnFilePaths; d->dependedFilePaths = result.dependedOnFilePaths;
d->translationUnits.addWatchedFiles(d->dependedFilePaths); d->documents.addWatchedFiles(d->dependedFilePaths);
if (result.reparsed if (result.reparsed
&& result.needsToBeReparsedChangeTimePoint == d->needsToBeReparsedChangeTimePoint) { && result.needsToBeReparsedChangeTimePoint == d->needsToBeReparsedChangeTimePoint) {
@@ -318,14 +318,14 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult
} }
} }
TranslationUnitCore TranslationUnit::translationUnitCore() const TranslationUnitCore Document::translationUnitCore() const
{ {
checkIfNull(); checkIfNull();
return TranslationUnitCore(d->filePath, d->index, d->translationUnit); return TranslationUnitCore(d->filePath, d->index, d->translationUnit);
} }
void TranslationUnit::parse() const void Document::parse() const
{ {
checkIfNull(); checkIfNull();
@@ -335,7 +335,7 @@ void TranslationUnit::parse() const
incorporateUpdaterResult(result); incorporateUpdaterResult(result);
} }
void TranslationUnit::reparse() const void Document::reparse() const
{ {
checkIfNull(); checkIfNull();
@@ -345,7 +345,7 @@ void TranslationUnit::reparse() const
incorporateUpdaterResult(result); incorporateUpdaterResult(result);
} }
const QSet<Utf8String> TranslationUnit::dependedFilePaths() const const QSet<Utf8String> Document::dependedFilePaths() const
{ {
checkIfNull(); checkIfNull();
checkIfFileExists(); checkIfFileExists();
@@ -353,30 +353,30 @@ const QSet<Utf8String> TranslationUnit::dependedFilePaths() const
return d->dependedFilePaths; return d->dependedFilePaths;
} }
void TranslationUnit::setDirty() void Document::setDirty()
{ {
d->needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now(); d->needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now();
d->needsToBeReparsed = true; d->needsToBeReparsed = true;
} }
void TranslationUnit::checkIfNull() const void Document::checkIfNull() const
{ {
if (isNull()) if (isNull())
throw TranslationUnitIsNullException(); throw TranslationUnitIsNullException();
} }
void TranslationUnit::checkIfFileExists() const void Document::checkIfFileExists() const
{ {
if (!fileExists()) if (!fileExists())
throw TranslationUnitFileNotExitsException(d->filePath); throw TranslationUnitFileNotExitsException(d->filePath);
} }
bool TranslationUnit::fileExists() const bool Document::fileExists() const
{ {
return QFileInfo::exists(d->filePath.toString()); return QFileInfo::exists(d->filePath.toString());
} }
bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const bool Document::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const
{ {
if (filePath == d->filePath) if (filePath == d->filePath)
return QFileInfo::exists(d->filePath); return QFileInfo::exists(d->filePath);
@@ -384,17 +384,17 @@ bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePat
return true; 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(); 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(" *os << "Document("
<< translationUnit.filePath().constData() << ", " << document.filePath().constData() << ", "
<< translationUnit.projectPartId().constData() << ", " << document.projectPartId().constData() << ", "
<< translationUnit.documentRevision() << ")"; << document.documentRevision() << ")";
} }
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -44,15 +44,15 @@ class Utf8String;
namespace ClangBackEnd { namespace ClangBackEnd {
class TranslationUnitCore; class TranslationUnitCore;
class TranslationUnitData; class DocumentData;
class TranslationUnitUpdateResult; class TranslationUnitUpdateResult;
class ProjectPart; class ProjectPart;
class FileContainer; class FileContainer;
class TranslationUnits; class Documents;
using time_point = std::chrono::steady_clock::time_point; using time_point = std::chrono::steady_clock::time_point;
class TranslationUnit class Document
{ {
public: public:
enum FileExistsCheck { enum FileExistsCheck {
@@ -60,19 +60,19 @@ public:
DoNotCheckIfFileExists DoNotCheckIfFileExists
}; };
TranslationUnit() = default; Document() = default;
TranslationUnit(const Utf8String &filePath, Document(const Utf8String &filePath,
const ProjectPart &projectPart, const ProjectPart &projectPart,
const Utf8StringVector &fileArguments, const Utf8StringVector &fileArguments,
TranslationUnits &translationUnits, Documents &documents,
FileExistsCheck fileExistsCheck = CheckIfFileExists); FileExistsCheck fileExistsCheck = CheckIfFileExists);
~TranslationUnit(); ~Document();
TranslationUnit(const TranslationUnit &cxTranslationUnit); Document(const Document &cxTranslationUnit);
TranslationUnit &operator=(const TranslationUnit &cxTranslationUnit); Document &operator=(const Document &cxTranslationUnit);
TranslationUnit(TranslationUnit &&cxTranslationUnit); Document(Document &&cxTranslationUnit);
TranslationUnit &operator=(TranslationUnit &&cxTranslationUnit); Document &operator=(Document &&cxTranslationUnit);
void reset(); void reset();
@@ -124,9 +124,9 @@ private:
bool isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const; bool isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const;
private: private:
mutable std::shared_ptr<TranslationUnitData> d; mutable std::shared_ptr<DocumentData> d;
}; };
bool operator==(const TranslationUnit &first, const TranslationUnit &second); bool operator==(const Document &first, const Document &second);
void PrintTo(const TranslationUnit &translationUnit, ::std::ostream *os); void PrintTo(const Document &document, ::std::ostream *os);
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -0,0 +1,311 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "clangdocuments.h"
#include <diagnosticset.h>
#include <documentannotationschangedmessage.h>
#include <highlightingmarks.h>
#include <projectpartsdonotexistexception.h>
#include <projects.h>
#include <skippedsourceranges.h>
#include <translationunitalreadyexistsexception.h>
#include <translationunitdoesnotexistexception.h>
#include <unsavedfiles.h>
#include <QDebug>
#include <algorithm>
namespace ClangBackEnd {
bool operator==(const FileContainer &fileContainer, const Document &document)
{
return fileContainer.filePath() == document.filePath() && fileContainer.projectPartId() == document.projectPartId();
}
bool operator==(const Document &document, const FileContainer &fileContainer)
{
return fileContainer == document;
}
Documents::Documents(ProjectParts &projects, UnsavedFiles &unsavedFiles)
: fileSystemWatcher(*this),
projectParts(projects),
unsavedFiles_(unsavedFiles)
{
}
std::vector<Document> Documents::create(const QVector<FileContainer> &fileContainers)
{
checkIfDocumentsDoNotExist(fileContainers);
std::vector<Document> createdTranslationUnits;
for (const FileContainer &fileContainer : fileContainers)
createdTranslationUnits.push_back(createDocument(fileContainer));
return createdTranslationUnits;
}
void Documents::update(const QVector<FileContainer> &fileContainers)
{
checkIfDocumentsForFilePathsExist(fileContainers);
for (const FileContainer &fileContainer : fileContainers) {
updateDocument(fileContainer);
updateDocumentsWithChangedDependency(fileContainer.filePath());
}
}
static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const Document &document)
{
auto position = std::remove(fileContainers.begin(), fileContainers.end(), document);
bool entryIsRemoved = position != fileContainers.end();
fileContainers.erase(position, fileContainers.end());
return entryIsRemoved;
}
void Documents::remove(const QVector<FileContainer> &fileContainers)
{
checkIfProjectPartsExists(fileContainers);
removeDocuments(fileContainers);
updateDocumentsWithChangedDependencies(fileContainers);
}
void Documents::setUsedByCurrentEditor(const Utf8String &filePath)
{
for (Document &document : documents_)
document.setIsUsedByCurrentEditor(document.filePath() == filePath);
}
void Documents::setVisibleInEditors(const Utf8StringVector &filePaths)
{
for (Document &document : documents_)
document.setIsVisibleInEditor(filePaths.contains(document.filePath()));
}
const Document &Documents::document(const Utf8String &filePath, const Utf8String &projectPartId) const
{
checkIfProjectPartExists(projectPartId);
auto findIterator = findDocument(filePath, projectPartId);
if (findIterator == documents_.end())
throw TranslationUnitDoesNotExistException(FileContainer(filePath, projectPartId));
return *findIterator;
}
const Document &Documents::document(const FileContainer &fileContainer) const
{
return document(fileContainer.filePath(), fileContainer.projectPartId());
}
bool Documents::hasDocument(const Utf8String &filePath,
const Utf8String &projectPartId) const
{
return hasDocument(FileContainer(filePath, projectPartId));
}
const std::vector<Document> &Documents::documents() const
{
return documents_;
}
UnsavedFiles Documents::unsavedFiles() const
{
return unsavedFiles_;
}
void Documents::addWatchedFiles(QSet<Utf8String> &filePaths)
{
fileSystemWatcher.addFiles(filePaths);
}
void Documents::updateDocumentsWithChangedDependency(const Utf8String &filePath)
{
for (auto &document : documents_)
document.setDirtyIfDependencyIsMet(filePath);
}
void Documents::updateDocumentsWithChangedDependencies(const QVector<FileContainer> &fileContainers)
{
for (const FileContainer &fileContainer : fileContainers)
updateDocumentsWithChangedDependency(fileContainer.filePath());
}
void Documents::setDocumentsDirtyIfProjectPartChanged()
{
for (auto &document : documents_)
document.setDirtyIfProjectPartIsOutdated();
}
QVector<FileContainer> Documents::newerFileContainers(const QVector<FileContainer> &fileContainers) const
{
QVector<FileContainer> newerContainers;
auto translationUnitIsNewer = [this] (const FileContainer &fileContainer) {
try {
return document(fileContainer).documentRevision() != fileContainer.documentRevision();
} catch (const TranslationUnitDoesNotExistException &) {
return true;
}
};
std::copy_if(fileContainers.cbegin(),
fileContainers.cend(),
std::back_inserter(newerContainers),
translationUnitIsNewer);
return newerContainers;
}
const ClangFileSystemWatcher *Documents::clangFileSystemWatcher() const
{
return &fileSystemWatcher;
}
Document Documents::createDocument(const FileContainer &fileContainer)
{
Document::FileExistsCheck checkIfFileExists = fileContainer.hasUnsavedFileContent() ? Document::DoNotCheckIfFileExists : Document::CheckIfFileExists;
documents_.emplace_back(fileContainer.filePath(),
projectParts.project(fileContainer.projectPartId()),
fileContainer.fileArguments(),
*this,
checkIfFileExists);
documents_.back().setDocumentRevision(fileContainer.documentRevision());
return documents_.back();
}
void Documents::updateDocument(const FileContainer &fileContainer)
{
const auto documents = findAllDocumentsWithFilePath(fileContainer.filePath());
for (auto document : documents)
document.setDocumentRevision(fileContainer.documentRevision());
}
std::vector<Document>::iterator Documents::findDocument(const FileContainer &fileContainer)
{
return std::find(documents_.begin(), documents_.end(), fileContainer);
}
std::vector<Document> Documents::findAllDocumentsWithFilePath(const Utf8String &filePath)
{
const auto filePathCompare = [&filePath] (const Document &document) {
return document.filePath() == filePath;
};
std::vector<Document> documents;
std::copy_if(documents_.begin(),
documents_.end(),
std::back_inserter(documents),
filePathCompare);
return documents;
}
std::vector<Document>::const_iterator Documents::findDocument(const Utf8String &filePath, const Utf8String &projectPartId) const
{
FileContainer fileContainer(filePath, projectPartId);
return std::find(documents_.begin(), documents_.end(), fileContainer);
}
bool Documents::hasDocument(const FileContainer &fileContainer) const
{
auto findIterator = std::find(documents_.begin(), documents_.end(), fileContainer);
return findIterator != documents_.end();
}
bool Documents::hasDocumentWithFilePath(const Utf8String &filePath) const
{
auto filePathCompare = [&filePath] (const Document &document) {
return document.filePath() == filePath;
};
auto findIterator = std::find_if(documents_.begin(), documents_.end(), filePathCompare);
return findIterator != documents_.end();
}
void Documents::checkIfProjectPartExists(const Utf8String &projectFileName) const
{
projectParts.project(projectFileName);
}
void Documents::checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const
{
Utf8StringVector notExistingProjectParts;
for (const FileContainer &fileContainer : fileContainers) {
if (!projectParts.hasProjectPart(fileContainer.projectPartId()))
notExistingProjectParts.push_back(fileContainer.projectPartId());
}
if (!notExistingProjectParts.isEmpty())
throw ProjectPartDoNotExistException(notExistingProjectParts);
}
void Documents::checkIfDocumentsDoNotExist(const QVector<FileContainer> &fileContainers) const
{
for (const FileContainer &fileContainer : fileContainers) {
if (hasDocument(fileContainer))
throw TranslationUnitAlreadyExistsException(fileContainer);
}
}
void Documents::checkIfDocumentsForFilePathsExist(const QVector<FileContainer> &fileContainers) const
{
for (const FileContainer &fileContainer : fileContainers) {
if (!hasDocumentWithFilePath(fileContainer.filePath()))
throw TranslationUnitDoesNotExistException(fileContainer);
}
}
void Documents::removeDocuments(const QVector<FileContainer> &fileContainers)
{
QVector<FileContainer> processedFileContainers = fileContainers;
auto removeBeginIterator = std::remove_if(documents_.begin(), documents_.end(), [&processedFileContainers] (const Document &document) {
return removeFromFileContainer(processedFileContainers, document);
});
documents_.erase(removeBeginIterator, documents_.end());
if (!processedFileContainers.isEmpty())
throw TranslationUnitDoesNotExistException(processedFileContainers.first());
}
} // namespace ClangBackEnd

View File

@@ -25,8 +25,8 @@
#pragma once #pragma once
#include "clangdocument.h"
#include "clangfilesystemwatcher.h" #include "clangfilesystemwatcher.h"
#include "clangtranslationunit.h"
#include <filecontainer.h> #include <filecontainer.h>
@@ -39,54 +39,54 @@ namespace ClangBackEnd {
class ProjectParts; class ProjectParts;
class UnsavedFiles; class UnsavedFiles;
class TranslationUnits class Documents
{ {
public: public:
TranslationUnits(ProjectParts &projectParts, UnsavedFiles &unsavedFiles); Documents(ProjectParts &projectParts, UnsavedFiles &unsavedFiles);
std::vector<TranslationUnit> create(const QVector<FileContainer> &fileContainers); std::vector<Document> create(const QVector<FileContainer> &fileContainers);
void update(const QVector<FileContainer> &fileContainers); void update(const QVector<FileContainer> &fileContainers);
void remove(const QVector<FileContainer> &fileContainers); void remove(const QVector<FileContainer> &fileContainers);
void setUsedByCurrentEditor(const Utf8String &filePath); void setUsedByCurrentEditor(const Utf8String &filePath);
void setVisibleInEditors(const Utf8StringVector &filePaths); void setVisibleInEditors(const Utf8StringVector &filePaths);
const TranslationUnit &translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; const Document &document(const Utf8String &filePath, const Utf8String &projectPartId) const;
const TranslationUnit &translationUnit(const FileContainer &fileContainer) const; const Document &document(const FileContainer &fileContainer) const;
bool hasTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; bool hasDocument(const Utf8String &filePath, const Utf8String &projectPartId) const;
bool hasTranslationUnitWithFilePath(const Utf8String &filePath) const; bool hasDocumentWithFilePath(const Utf8String &filePath) const;
const std::vector<TranslationUnit> &translationUnits() const; const std::vector<Document> &documents() const;
UnsavedFiles unsavedFiles() const; UnsavedFiles unsavedFiles() const;
void addWatchedFiles(QSet<Utf8String> &filePaths); void addWatchedFiles(QSet<Utf8String> &filePaths);
void updateTranslationUnitsWithChangedDependency(const Utf8String &filePath); void updateDocumentsWithChangedDependency(const Utf8String &filePath);
void updateTranslationUnitsWithChangedDependencies(const QVector<FileContainer> &fileContainers); void updateDocumentsWithChangedDependencies(const QVector<FileContainer> &fileContainers);
void setTranslationUnitsDirtyIfProjectPartChanged(); void setDocumentsDirtyIfProjectPartChanged();
QVector<FileContainer> newerFileContainers(const QVector<FileContainer> &fileContainers) const; QVector<FileContainer> newerFileContainers(const QVector<FileContainer> &fileContainers) const;
const ClangFileSystemWatcher *clangFileSystemWatcher() const; const ClangFileSystemWatcher *clangFileSystemWatcher() const;
private: private:
TranslationUnit createTranslationUnit(const FileContainer &fileContainer); Document createDocument(const FileContainer &fileContainer);
void updateTranslationUnit(const FileContainer &fileContainer); void updateDocument(const FileContainer &fileContainer);
std::vector<TranslationUnit>::iterator findTranslationUnit(const FileContainer &fileContainer); std::vector<Document>::iterator findDocument(const FileContainer &fileContainer);
std::vector<TranslationUnit> findAllTranslationUnitWithFilePath(const Utf8String &filePath); std::vector<Document> findAllDocumentsWithFilePath(const Utf8String &filePath);
std::vector<TranslationUnit>::const_iterator findTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const; std::vector<Document>::const_iterator findDocument(const Utf8String &filePath, const Utf8String &projectPartId) const;
bool hasTranslationUnit(const FileContainer &fileContainer) const; bool hasDocument(const FileContainer &fileContainer) const;
void checkIfProjectPartExists(const Utf8String &projectFileName) const; void checkIfProjectPartExists(const Utf8String &projectFileName) const;
void checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const; void checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const;
void checkIfTranslationUnitsDoesNotExists(const QVector<FileContainer> &fileContainers) const; void checkIfDocumentsDoNotExist(const QVector<FileContainer> &fileContainers) const;
void checkIfTranslationUnitsForFilePathsDoesExists(const QVector<FileContainer> &fileContainers) const; void checkIfDocumentsForFilePathsExist(const QVector<FileContainer> &fileContainers) const;
void removeTranslationUnits(const QVector<FileContainer> &fileContainers); void removeDocuments(const QVector<FileContainer> &fileContainers);
private: private:
ClangFileSystemWatcher fileSystemWatcher; ClangFileSystemWatcher fileSystemWatcher;
std::vector<TranslationUnit> translationUnits_; std::vector<Document> documents_;
ProjectParts &projectParts; ProjectParts &projectParts;
UnsavedFiles &unsavedFiles_; UnsavedFiles &unsavedFiles_;
}; };

View File

@@ -25,7 +25,7 @@
#include "clangfilesystemwatcher.h" #include "clangfilesystemwatcher.h"
#include "translationunits.h" #include "clangdocuments.h"
#include <utf8stringvector.h> #include <utf8stringvector.h>
@@ -64,8 +64,8 @@ QStringList filterExistingFiles(QStringList &&filePaths)
} }
} }
ClangFileSystemWatcher::ClangFileSystemWatcher(TranslationUnits &translationUnits) ClangFileSystemWatcher::ClangFileSystemWatcher(Documents &documents)
: translationUnits(translationUnits) : documents(documents)
{ {
connect(&watcher, connect(&watcher,
&QFileSystemWatcher::fileChanged, &QFileSystemWatcher::fileChanged,
@@ -83,7 +83,7 @@ void ClangFileSystemWatcher::addFiles(const QSet<Utf8String> &filePaths)
void ClangFileSystemWatcher::updateTranslationUnitsWithChangedDependencies(const QString &filePath) void ClangFileSystemWatcher::updateTranslationUnitsWithChangedDependencies(const QString &filePath)
{ {
translationUnits.updateTranslationUnitsWithChangedDependency(filePath); documents.updateDocumentsWithChangedDependency(filePath);
emit fileChanged(filePath); emit fileChanged(filePath);
} }

View File

@@ -32,14 +32,14 @@ class Utf8String;
namespace ClangBackEnd { namespace ClangBackEnd {
class TranslationUnits; class Documents;
class ClangFileSystemWatcher : public QObject class ClangFileSystemWatcher : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
ClangFileSystemWatcher(TranslationUnits &translationUnits); ClangFileSystemWatcher(Documents &documents);
void addFiles(const QSet<Utf8String> &filePaths); void addFiles(const QSet<Utf8String> &filePaths);
@@ -51,7 +51,7 @@ private:
private: private:
QFileSystemWatcher watcher; QFileSystemWatcher watcher;
TranslationUnits &translationUnits; Documents &documents;
}; };
} // namespace ClangBackEnd } // namespace ClangBackEnd

View File

@@ -25,24 +25,24 @@
#include "clangiasyncjob.h" #include "clangiasyncjob.h"
#include "translationunits.h" #include "clangdocuments.h"
namespace ClangBackEnd { namespace ClangBackEnd {
JobContext::JobContext(const JobRequest &jobRequest, JobContext::JobContext(const JobRequest &jobRequest,
TranslationUnits *translationUnits, Documents *documents,
UnsavedFiles *unsavedFiles, UnsavedFiles *unsavedFiles,
ClangCodeModelClientInterface *clientInterface) ClangCodeModelClientInterface *clientInterface)
: jobRequest(jobRequest) : jobRequest(jobRequest)
, translationUnits(translationUnits) , documents(documents)
, unsavedFiles(unsavedFiles) , unsavedFiles(unsavedFiles)
, client(clientInterface) , 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 bool JobContext::isOutdated() const
@@ -53,7 +53,7 @@ bool JobContext::isOutdated() const
bool JobContext::isDocumentOpen() const bool JobContext::isDocumentOpen() const
{ {
const bool hasTranslationUnit const bool hasTranslationUnit
= translationUnits->hasTranslationUnit(jobRequest.filePath, jobRequest.projectPartId); = documents->hasDocument(jobRequest.filePath, jobRequest.projectPartId);
if (!hasTranslationUnit) if (!hasTranslationUnit)
qCDebug(jobsLog) << "Document already closed for results of" << jobRequest; qCDebug(jobsLog) << "Document already closed for results of" << jobRequest;
@@ -63,9 +63,8 @@ bool JobContext::isDocumentOpen() const
bool JobContext::documentRevisionChanged() const bool JobContext::documentRevisionChanged() const
{ {
const TranslationUnit &translationUnit const Document &document = documents->document(jobRequest.filePath, jobRequest.projectPartId);
= translationUnits->translationUnit(jobRequest.filePath, jobRequest.projectPartId); const bool revisionChanged = document.documentRevision() != jobRequest.documentRevision;
const bool revisionChanged = translationUnit.documentRevision() != jobRequest.documentRevision;
if (revisionChanged) if (revisionChanged)
qCDebug(jobsLog) << "Document revision changed for results of" << jobRequest; qCDebug(jobsLog) << "Document revision changed for results of" << jobRequest;

View File

@@ -30,8 +30,8 @@
namespace ClangBackEnd { namespace ClangBackEnd {
class ClangCodeModelClientInterface; class ClangCodeModelClientInterface;
class TranslationUnit; class Document;
class TranslationUnits; class Documents;
class UnsavedFiles; class UnsavedFiles;
class JobContext class JobContext
@@ -39,11 +39,11 @@ class JobContext
public: public:
JobContext() = default; JobContext() = default;
JobContext(const JobRequest &jobRequest, JobContext(const JobRequest &jobRequest,
TranslationUnits *translationUnits, Documents *documents,
UnsavedFiles *unsavedFiles, UnsavedFiles *unsavedFiles,
ClangCodeModelClientInterface *client); ClangCodeModelClientInterface *client);
TranslationUnit translationUnitForJobRequest() const; Document documentForJobRequest() const;
bool isOutdated() const; bool isOutdated() const;
bool isDocumentOpen() const; bool isDocumentOpen() const;
@@ -51,7 +51,7 @@ public:
public: public:
JobRequest jobRequest; JobRequest jobRequest;
TranslationUnits *translationUnits = nullptr; Documents *documents = nullptr;
UnsavedFiles *unsavedFiles = nullptr; UnsavedFiles *unsavedFiles = nullptr;
ClangCodeModelClientInterface *client = nullptr; ClangCodeModelClientInterface *client = nullptr;
}; };

View File

@@ -25,8 +25,8 @@
#include "clangiasyncjob.h" #include "clangiasyncjob.h"
#include "clangjobqueue.h" #include "clangjobqueue.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include "translationunits.h" #include "clangdocuments.h"
#include "projects.h" #include "projects.h"
#include "unsavedfiles.h" #include "unsavedfiles.h"
@@ -34,8 +34,8 @@
namespace ClangBackEnd { namespace ClangBackEnd {
JobQueue::JobQueue(TranslationUnits &translationUnits, ProjectParts &projectParts) JobQueue::JobQueue(Documents &documents, ProjectParts &projectParts)
: m_translationUnits(translationUnits) : m_documents(documents)
, m_projectParts(projectParts) , m_projectParts(projectParts)
{ {
} }
@@ -81,7 +81,7 @@ void JobQueue::removeOutDatedRequests()
bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
{ {
const JobRequest::Requirements requirements = jobRequest.requirements; const JobRequest::Requirements requirements = jobRequest.requirements;
const UnsavedFiles unsavedFiles = m_translationUnits.unsavedFiles(); const UnsavedFiles unsavedFiles = m_documents.unsavedFiles();
if (requirements.testFlag(JobRequest::CurrentUnsavedFiles)) { if (requirements.testFlag(JobRequest::CurrentUnsavedFiles)) {
if (jobRequest.unsavedFilesChangeTimePoint != unsavedFiles.lastChangeTimePoint()) { if (jobRequest.unsavedFilesChangeTimePoint != unsavedFiles.lastChangeTimePoint()) {
@@ -93,7 +93,7 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
bool projectCheckedAndItExists = false; bool projectCheckedAndItExists = false;
if (requirements.testFlag(JobRequest::DocumentValid)) { 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; qCDebug(jobsLog) << "Removing due to already closed document:" << jobRequest;
return true; return true;
} }
@@ -104,15 +104,15 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
} }
projectCheckedAndItExists = true; projectCheckedAndItExists = true;
const TranslationUnit translationUnit const Document document
= m_translationUnits.translationUnit(jobRequest.filePath, jobRequest.projectPartId); = m_documents.document(jobRequest.filePath, jobRequest.projectPartId);
if (!translationUnit.isIntact()) { if (!document.isIntact()) {
qCDebug(jobsLog) << "Removing due to not intact translation unit:" << jobRequest; qCDebug(jobsLog) << "Removing due to not intact translation unit:" << jobRequest;
return true; return true;
} }
if (requirements.testFlag(JobRequest::CurrentDocumentRevision)) { if (requirements.testFlag(JobRequest::CurrentDocumentRevision)) {
if (translationUnit.documentRevision() != jobRequest.documentRevision) { if (document.documentRevision() != jobRequest.documentRevision) {
qCDebug(jobsLog) << "Removing due to changed document revision:" << jobRequest; qCDebug(jobsLog) << "Removing due to changed document revision:" << jobRequest;
return true; return true;
} }
@@ -135,14 +135,14 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
return false; return false;
} }
static int priority(const TranslationUnit &translationUnit) static int priority(const Document &document)
{ {
int thePriority = 0; int thePriority = 0;
if (translationUnit.isUsedByCurrentEditor()) if (document.isUsedByCurrentEditor())
thePriority += 1000; thePriority += 1000;
if (translationUnit.isVisibleInEditor()) if (document.isVisibleInEditor())
thePriority += 100; thePriority += 100;
return thePriority; return thePriority;
@@ -152,8 +152,8 @@ void JobQueue::prioritizeRequests()
{ {
const auto lessThan = [this] (const JobRequest &r1, const JobRequest &r2) { 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. // 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 Document &t1 = m_documents.document(r1.filePath, r1.projectPartId);
const TranslationUnit &t2 = m_translationUnits.translationUnit(r2.filePath, r2.projectPartId); const Document &t2 = m_documents.document(r2.filePath, r2.projectPartId);
return priority(t1) > priority(t2); return priority(t1) > priority(t2);
}; };
@@ -171,12 +171,12 @@ JobRequests JobQueue::takeJobRequestsToRunNow()
const JobRequest &jobRequest = i.next(); const JobRequest &jobRequest = i.next();
try { try {
const TranslationUnit &translationUnit const Document &document
= m_translationUnits.translationUnit(jobRequest.filePath, = m_documents.document(jobRequest.filePath,
jobRequest.projectPartId); jobRequest.projectPartId);
const DocumentId documentId = DocumentId(jobRequest.filePath, jobRequest.projectPartId); const DocumentId documentId = DocumentId(jobRequest.filePath, jobRequest.projectPartId);
if (!translationUnit.isUsedByCurrentEditor() && !translationUnit.isVisibleInEditor()) if (!document.isUsedByCurrentEditor() && !document.isVisibleInEditor())
continue; continue;
if (documentsScheduledForThisRun.contains(documentId)) if (documentsScheduledForThisRun.contains(documentId))

View File

@@ -32,12 +32,12 @@
namespace ClangBackEnd { namespace ClangBackEnd {
class ProjectParts; class ProjectParts;
class TranslationUnits; class Documents;
class JobQueue class JobQueue
{ {
public: public:
JobQueue(TranslationUnits &translationUnits, ProjectParts &projects); JobQueue(Documents &documents, ProjectParts &projects);
void add(const JobRequest &job); void add(const JobRequest &job);
@@ -59,7 +59,7 @@ private:
bool isJobRequestOutDated(const JobRequest &jobRequest) const; bool isJobRequestOutDated(const JobRequest &jobRequest) const;
private: private:
TranslationUnits &m_translationUnits; Documents &m_documents;
ProjectParts &m_projectParts; ProjectParts &m_projectParts;
IsJobRunningHandler m_isJobRunningHandler; IsJobRunningHandler m_isJobRunningHandler;

View File

@@ -36,15 +36,15 @@
namespace ClangBackEnd { namespace ClangBackEnd {
Jobs::Jobs(TranslationUnits &translationUnits, Jobs::Jobs(Documents &documents,
UnsavedFiles &unsavedFiles, UnsavedFiles &unsavedFiles,
ProjectParts &projectParts, ProjectParts &projectParts,
ClangCodeModelClientInterface &client) ClangCodeModelClientInterface &client)
: m_translationUnits(translationUnits) : m_documents(documents)
, m_unsavedFiles(unsavedFiles) , m_unsavedFiles(unsavedFiles)
, m_projectParts(projectParts) , m_projectParts(projectParts)
, m_client(client) , m_client(client)
, m_queue(translationUnits, projectParts) , m_queue(documents, projectParts)
{ {
m_queue.setIsJobRunningHandler([this](const Utf8String &filePath, m_queue.setIsJobRunningHandler([this](const Utf8String &filePath,
const Utf8String &projectPartId) { const Utf8String &projectPartId) {
@@ -89,7 +89,7 @@ JobRequests Jobs::runJobs(const JobRequests &jobsRequests)
bool Jobs::runJob(const JobRequest &jobRequest) bool Jobs::runJob(const JobRequest &jobRequest)
{ {
if (IAsyncJob *asyncJob = IAsyncJob::create(jobRequest.type)) { 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); asyncJob->setContext(context);
if (asyncJob->prepareAsyncRun()) { if (asyncJob->prepareAsyncRun()) {

View File

@@ -34,9 +34,9 @@
namespace ClangBackEnd { namespace ClangBackEnd {
class ClangCodeModelClientInterface; class ClangCodeModelClientInterface;
class Documents;
class IAsyncJob; class IAsyncJob;
class ProjectParts; class ProjectParts;
class TranslationUnits;
class UnsavedFiles; class UnsavedFiles;
class Jobs class Jobs
@@ -49,7 +49,7 @@ public:
using RunningJobs = QHash<IAsyncJob *, RunningJob>; using RunningJobs = QHash<IAsyncJob *, RunningJob>;
public: public:
Jobs(TranslationUnits &translationUnits, Jobs(Documents &documents,
UnsavedFiles &unsavedFiles, UnsavedFiles &unsavedFiles,
ProjectParts &projects, ProjectParts &projects,
ClangCodeModelClientInterface &client); ClangCodeModelClientInterface &client);
@@ -70,7 +70,7 @@ private:
void onJobFinished(IAsyncJob *asyncJob); void onJobFinished(IAsyncJob *asyncJob);
private: private:
TranslationUnits &m_translationUnits; Documents &m_documents;
UnsavedFiles &m_unsavedFiles; UnsavedFiles &m_unsavedFiles;
ProjectParts &m_projectParts; ProjectParts &m_projectParts;
ClangCodeModelClientInterface &m_client; ClangCodeModelClientInterface &m_client;

View File

@@ -57,10 +57,10 @@ bool RequestDocumentAnnotationsJob::prepareAsyncRun()
QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestDocumentAnnotations, return false); QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestDocumentAnnotations, return false);
try { try {
m_pinnedTranslationUnit = context().translationUnitForJobRequest(); m_pinnedDocument = context().documentForJobRequest();
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); m_pinnedFileContainer = m_pinnedDocument.fileContainer();
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
setRunner([translationUnitCore]() { setRunner([translationUnitCore]() {
return runAsyncHelper(translationUnitCore); return runAsyncHelper(translationUnitCore);
}); });

View File

@@ -26,7 +26,7 @@
#pragma once #pragma once
#include "clangasyncjob.h" #include "clangasyncjob.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include <clangbackendipc/diagnosticcontainer.h> #include <clangbackendipc/diagnosticcontainer.h>
#include <clangbackendipc/highlightingmarkcontainer.h> #include <clangbackendipc/highlightingmarkcontainer.h>
@@ -53,7 +53,7 @@ private:
void sendAnnotations(const AsyncResult &result); void sendAnnotations(const AsyncResult &result);
private: private:
TranslationUnit m_pinnedTranslationUnit; Document m_pinnedDocument;
FileContainer m_pinnedFileContainer; FileContainer m_pinnedFileContainer;
}; };

View File

@@ -63,11 +63,11 @@ bool UpdateDocumentAnnotationsJob::prepareAsyncRun()
QTC_ASSERT(jobRequest.type == JobRequest::Type::UpdateDocumentAnnotations, return false); QTC_ASSERT(jobRequest.type == JobRequest::Type::UpdateDocumentAnnotations, return false);
try { try {
m_pinnedTranslationUnit = context().translationUnitForJobRequest(); m_pinnedDocument = context().documentForJobRequest();
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer(); m_pinnedFileContainer = m_pinnedDocument.fileContainer();
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore(); const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput(); const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput();
setRunner([translationUnitCore, updateInput]() { setRunner([translationUnitCore, updateInput]() {
return runAsyncHelper(translationUnitCore, updateInput); return runAsyncHelper(translationUnitCore, updateInput);
}); });
@@ -92,7 +92,7 @@ void UpdateDocumentAnnotationsJob::finalizeAsyncRun()
void UpdateDocumentAnnotationsJob::incorporateUpdaterResult(const AsyncResult &result) void UpdateDocumentAnnotationsJob::incorporateUpdaterResult(const AsyncResult &result)
{ {
m_pinnedTranslationUnit.incorporateUpdaterResult(result.updateResult); m_pinnedDocument.incorporateUpdaterResult(result.updateResult);
} }
void UpdateDocumentAnnotationsJob::sendAnnotations(const AsyncResult &result) void UpdateDocumentAnnotationsJob::sendAnnotations(const AsyncResult &result)

View File

@@ -26,7 +26,7 @@
#pragma once #pragma once
#include "clangasyncjob.h" #include "clangasyncjob.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include "clangtranslationunitupdater.h" #include "clangtranslationunitupdater.h"
#include <clangbackendipc/diagnosticcontainer.h> #include <clangbackendipc/diagnosticcontainer.h>
@@ -57,7 +57,7 @@ private:
void sendAnnotations(const AsyncResult &result); void sendAnnotations(const AsyncResult &result);
private: private:
TranslationUnit m_pinnedTranslationUnit; Document m_pinnedDocument;
FileContainer m_pinnedFileContainer; FileContainer m_pinnedFileContainer;
}; };

View File

@@ -34,7 +34,7 @@
#include "sourcelocation.h" #include "sourcelocation.h"
#include "unsavedfile.h" #include "unsavedfile.h"
#include "unsavedfiles.h" #include "unsavedfiles.h"
#include "clangtranslationunit.h" #include "clangdocument.h"
#include "sourcerange.h" #include "sourcerange.h"
#include "clangunsavedfilesshallowarguments.h" #include "clangunsavedfilesshallowarguments.h"
#include "clangtranslationunitupdater.h" #include "clangtranslationunitupdater.h"

View File

@@ -34,7 +34,7 @@ class SourceRangeContainer;
class SkippedSourceRanges class SkippedSourceRanges
{ {
public: public:
SkippedSourceRanges(CXTranslationUnit TranslationUnit, const char *filePath); SkippedSourceRanges(CXTranslationUnit Document, const char *filePath);
~SkippedSourceRanges(); ~SkippedSourceRanges();
SkippedSourceRanges(const SkippedSourceRanges &) = delete; SkippedSourceRanges(const SkippedSourceRanges &) = delete;

View File

@@ -25,9 +25,9 @@
#include "sourcelocation.h" #include "sourcelocation.h"
#include "clangdocument.h"
#include "clangfilepath.h" #include "clangfilepath.h"
#include "clangstring.h" #include "clangstring.h"
#include "clangtranslationunit.h"
#include <utf8string.h> #include <utf8string.h>

View File

@@ -32,7 +32,7 @@
namespace ClangBackEnd { namespace ClangBackEnd {
class SourceLocationContainer; class SourceLocationContainer;
class TranslationUnit; class Document;
class SourceLocation class SourceLocation
{ {

View File

@@ -1,311 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "translationunits.h"
#include <diagnosticset.h>
#include <documentannotationschangedmessage.h>
#include <highlightingmarks.h>
#include <projectpartsdonotexistexception.h>
#include <projects.h>
#include <skippedsourceranges.h>
#include <translationunitalreadyexistsexception.h>
#include <translationunitdoesnotexistexception.h>
#include <unsavedfiles.h>
#include <QDebug>
#include <algorithm>
namespace ClangBackEnd {
bool operator==(const FileContainer &fileContainer, const TranslationUnit &translationUnit)
{
return fileContainer.filePath() == translationUnit.filePath() && fileContainer.projectPartId() == translationUnit.projectPartId();
}
bool operator==(const TranslationUnit &translationUnit, const FileContainer &fileContainer)
{
return fileContainer == translationUnit;
}
TranslationUnits::TranslationUnits(ProjectParts &projects, UnsavedFiles &unsavedFiles)
: fileSystemWatcher(*this),
projectParts(projects),
unsavedFiles_(unsavedFiles)
{
}
std::vector<TranslationUnit> TranslationUnits::create(const QVector<FileContainer> &fileContainers)
{
checkIfTranslationUnitsDoesNotExists(fileContainers);
std::vector<TranslationUnit> createdTranslationUnits;
for (const FileContainer &fileContainer : fileContainers)
createdTranslationUnits.push_back(createTranslationUnit(fileContainer));
return createdTranslationUnits;
}
void TranslationUnits::update(const QVector<FileContainer> &fileContainers)
{
checkIfTranslationUnitsForFilePathsDoesExists(fileContainers);
for (const FileContainer &fileContainer : fileContainers) {
updateTranslationUnit(fileContainer);
updateTranslationUnitsWithChangedDependency(fileContainer.filePath());
}
}
static bool removeFromFileContainer(QVector<FileContainer> &fileContainers, const TranslationUnit &translationUnit)
{
auto position = std::remove(fileContainers.begin(), fileContainers.end(), translationUnit);
bool entryIsRemoved = position != fileContainers.end();
fileContainers.erase(position, fileContainers.end());
return entryIsRemoved;
}
void TranslationUnits::remove(const QVector<FileContainer> &fileContainers)
{
checkIfProjectPartsExists(fileContainers);
removeTranslationUnits(fileContainers);
updateTranslationUnitsWithChangedDependencies(fileContainers);
}
void TranslationUnits::setUsedByCurrentEditor(const Utf8String &filePath)
{
for (TranslationUnit &translationUnit : translationUnits_)
translationUnit.setIsUsedByCurrentEditor(translationUnit.filePath() == filePath);
}
void TranslationUnits::setVisibleInEditors(const Utf8StringVector &filePaths)
{
for (TranslationUnit &translationUnit : translationUnits_)
translationUnit.setIsVisibleInEditor(filePaths.contains(translationUnit.filePath()));
}
const TranslationUnit &TranslationUnits::translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const
{
checkIfProjectPartExists(projectPartId);
auto findIterator = findTranslationUnit(filePath, projectPartId);
if (findIterator == translationUnits_.end())
throw TranslationUnitDoesNotExistException(FileContainer(filePath, projectPartId));
return *findIterator;
}
const TranslationUnit &TranslationUnits::translationUnit(const FileContainer &fileContainer) const
{
return translationUnit(fileContainer.filePath(), fileContainer.projectPartId());
}
bool TranslationUnits::hasTranslationUnit(const Utf8String &filePath,
const Utf8String &projectPartId) const
{
return hasTranslationUnit(FileContainer(filePath, projectPartId));
}
const std::vector<TranslationUnit> &TranslationUnits::translationUnits() const
{
return translationUnits_;
}
UnsavedFiles TranslationUnits::unsavedFiles() const
{
return unsavedFiles_;
}
void TranslationUnits::addWatchedFiles(QSet<Utf8String> &filePaths)
{
fileSystemWatcher.addFiles(filePaths);
}
void TranslationUnits::updateTranslationUnitsWithChangedDependency(const Utf8String &filePath)
{
for (auto &translationUnit : translationUnits_)
translationUnit.setDirtyIfDependencyIsMet(filePath);
}
void TranslationUnits::updateTranslationUnitsWithChangedDependencies(const QVector<FileContainer> &fileContainers)
{
for (const FileContainer &fileContainer : fileContainers)
updateTranslationUnitsWithChangedDependency(fileContainer.filePath());
}
void TranslationUnits::setTranslationUnitsDirtyIfProjectPartChanged()
{
for (auto &translationUnit : translationUnits_)
translationUnit.setDirtyIfProjectPartIsOutdated();
}
QVector<FileContainer> TranslationUnits::newerFileContainers(const QVector<FileContainer> &fileContainers) const
{
QVector<FileContainer> newerContainers;
auto translationUnitIsNewer = [this] (const FileContainer &fileContainer) {
try {
return translationUnit(fileContainer).documentRevision() != fileContainer.documentRevision();
} catch (const TranslationUnitDoesNotExistException &) {
return true;
}
};
std::copy_if(fileContainers.cbegin(),
fileContainers.cend(),
std::back_inserter(newerContainers),
translationUnitIsNewer);
return newerContainers;
}
const ClangFileSystemWatcher *TranslationUnits::clangFileSystemWatcher() const
{
return &fileSystemWatcher;
}
TranslationUnit TranslationUnits::createTranslationUnit(const FileContainer &fileContainer)
{
TranslationUnit::FileExistsCheck checkIfFileExists = fileContainer.hasUnsavedFileContent() ? TranslationUnit::DoNotCheckIfFileExists : TranslationUnit::CheckIfFileExists;
translationUnits_.emplace_back(fileContainer.filePath(),
projectParts.project(fileContainer.projectPartId()),
fileContainer.fileArguments(),
*this,
checkIfFileExists);
translationUnits_.back().setDocumentRevision(fileContainer.documentRevision());
return translationUnits_.back();
}
void TranslationUnits::updateTranslationUnit(const FileContainer &fileContainer)
{
const auto translationUnits = findAllTranslationUnitWithFilePath(fileContainer.filePath());
for (auto translationUnit : translationUnits)
translationUnit.setDocumentRevision(fileContainer.documentRevision());
}
std::vector<TranslationUnit>::iterator TranslationUnits::findTranslationUnit(const FileContainer &fileContainer)
{
return std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer);
}
std::vector<TranslationUnit> TranslationUnits::findAllTranslationUnitWithFilePath(const Utf8String &filePath)
{
const auto filePathCompare = [&filePath] (const TranslationUnit &translationUnit) {
return translationUnit.filePath() == filePath;
};
std::vector<TranslationUnit> translationUnits;
std::copy_if(translationUnits_.begin(),
translationUnits_.end(),
std::back_inserter(translationUnits),
filePathCompare);
return translationUnits;
}
std::vector<TranslationUnit>::const_iterator TranslationUnits::findTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const
{
FileContainer fileContainer(filePath, projectPartId);
return std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer);
}
bool TranslationUnits::hasTranslationUnit(const FileContainer &fileContainer) const
{
auto findIterator = std::find(translationUnits_.begin(), translationUnits_.end(), fileContainer);
return findIterator != translationUnits_.end();
}
bool TranslationUnits::hasTranslationUnitWithFilePath(const Utf8String &filePath) const
{
auto filePathCompare = [&filePath] (const TranslationUnit &translationUnit) {
return translationUnit.filePath() == filePath;
};
auto findIterator = std::find_if(translationUnits_.begin(), translationUnits_.end(), filePathCompare);
return findIterator != translationUnits_.end();
}
void TranslationUnits::checkIfProjectPartExists(const Utf8String &projectFileName) const
{
projectParts.project(projectFileName);
}
void TranslationUnits::checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const
{
Utf8StringVector notExistingProjectParts;
for (const FileContainer &fileContainer : fileContainers) {
if (!projectParts.hasProjectPart(fileContainer.projectPartId()))
notExistingProjectParts.push_back(fileContainer.projectPartId());
}
if (!notExistingProjectParts.isEmpty())
throw ProjectPartDoNotExistException(notExistingProjectParts);
}
void TranslationUnits::checkIfTranslationUnitsDoesNotExists(const QVector<FileContainer> &fileContainers) const
{
for (const FileContainer &fileContainer : fileContainers) {
if (hasTranslationUnit(fileContainer))
throw TranslationUnitAlreadyExistsException(fileContainer);
}
}
void TranslationUnits::checkIfTranslationUnitsForFilePathsDoesExists(const QVector<FileContainer> &fileContainers) const
{
for (const FileContainer &fileContainer : fileContainers) {
if (!hasTranslationUnitWithFilePath(fileContainer.filePath()))
throw TranslationUnitDoesNotExistException(fileContainer);
}
}
void TranslationUnits::removeTranslationUnits(const QVector<FileContainer> &fileContainers)
{
QVector<FileContainer> processedFileContainers = fileContainers;
auto removeBeginIterator = std::remove_if(translationUnits_.begin(), translationUnits_.end(), [&processedFileContainers] (const TranslationUnit &translationUnit) {
return removeFromFileContainer(processedFileContainers, translationUnit);
});
translationUnits_.erase(removeBeginIterator, translationUnits_.end());
if (!processedFileContainers.isEmpty())
throw TranslationUnitDoesNotExistException(processedFileContainers.first());
}
} // namespace ClangBackEnd

View File

@@ -36,13 +36,13 @@ void ClangAsyncJobTest::BaseSetUp(ClangBackEnd::JobRequest::Type jobRequestType,
projects.createOrUpdate({ProjectPartContainer(projectPartId)}); projects.createOrUpdate({ProjectPartContainer(projectPartId)});
const QVector<FileContainer> fileContainer{FileContainer(filePath, projectPartId)}; const QVector<FileContainer> fileContainer{FileContainer(filePath, projectPartId)};
translationUnit = translationUnits.create(fileContainer).front(); document = documents.create(fileContainer).front();
translationUnits.setVisibleInEditors({filePath}); documents.setVisibleInEditors({filePath});
translationUnits.setUsedByCurrentEditor(filePath); documents.setUsedByCurrentEditor(filePath);
jobRequest = createJobRequest(filePath, jobRequestType); jobRequest = createJobRequest(filePath, jobRequestType);
jobContext = JobContext(jobRequest, &translationUnits, &unsavedFiles, &dummyIpcClient); jobContext = JobContext(jobRequest, &documents, &unsavedFiles, &dummyIpcClient);
jobContextWithMockClient = JobContext(jobRequest, &translationUnits, &unsavedFiles, &mockIpcClient); jobContextWithMockClient = JobContext(jobRequest, &documents, &unsavedFiles, &mockIpcClient);
asyncJob.setFinishedHandler([](IAsyncJob *){}); asyncJob.setFinishedHandler([](IAsyncJob *){});
} }
@@ -55,7 +55,7 @@ JobRequest ClangAsyncJobTest::createJobRequest(const Utf8String &filePath,
jobRequest.filePath = filePath; jobRequest.filePath = filePath;
jobRequest.projectPartId = projectPartId; jobRequest.projectPartId = projectPartId;
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
jobRequest.documentRevision = translationUnit.documentRevision(); jobRequest.documentRevision = document.documentRevision();
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
return jobRequest; return jobRequest;

View File

@@ -29,10 +29,10 @@
#include "mockclangcodemodelclient.h" #include "mockclangcodemodelclient.h"
#include "clangiasyncjob.h" #include "clangiasyncjob.h"
#include <clangdocument.h>
#include <clangjobrequest.h> #include <clangjobrequest.h>
#include <clangtranslationunit.h>
#include <projects.h> #include <projects.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
@@ -55,8 +55,8 @@ protected:
protected: protected:
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::TranslationUnit translationUnit; ClangBackEnd::Document document;
MockClangCodeModelClient mockIpcClient; MockClangCodeModelClient mockIpcClient;
DummyIpcClient dummyIpcClient; DummyIpcClient dummyIpcClient;

View File

@@ -24,13 +24,13 @@
****************************************************************************/ ****************************************************************************/
#include <clangcodecompleteresults.h> #include <clangcodecompleteresults.h>
#include <clangdocument.h>
#include <clangfilepath.h> #include <clangfilepath.h>
#include <clangtranslationunitupdater.h> #include <clangtranslationunitupdater.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <clangtranslationunit.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <utf8string.h> #include <utf8string.h>
@@ -45,7 +45,7 @@ namespace {
using ClangBackEnd::ClangCodeCompleteResults; using ClangBackEnd::ClangCodeCompleteResults;
using ClangBackEnd::FilePath; using ClangBackEnd::FilePath;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
@@ -62,15 +62,15 @@ TEST(ClangCodeCompleteResults, GetData)
ProjectPart projectPart(Utf8StringLiteral("projectPartId")); ProjectPart projectPart(Utf8StringLiteral("projectPartId"));
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits); documents);
Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
translationUnit.parse(); document.parse();
CXCodeCompleteResults *cxCodeCompleteResults = CXCodeCompleteResults *cxCodeCompleteResults =
clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
nativeFilePath.constData(), nativeFilePath.constData(),
49, 1, 0, 0, 49, 1, 0, 0,
completionOptions()); completionOptions());
@@ -94,15 +94,15 @@ TEST(ClangCodeCompleteResults, MoveClangCodeCompleteResults)
ProjectPart projectPart(Utf8StringLiteral("projectPartId")); ProjectPart projectPart(Utf8StringLiteral("projectPartId"));
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"), Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits); documents);
Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
translationUnit.parse(); document.parse();
CXCodeCompleteResults *cxCodeCompleteResults = CXCodeCompleteResults *cxCodeCompleteResults =
clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
nativeFilePath.constData(), nativeFilePath.constData(),
49, 1, 0, 0, 49, 1, 0, 0,
completionOptions()); completionOptions());

View File

@@ -77,7 +77,7 @@ TEST_F(CompleteCodeJob, DontSendCompletionsIfDocumentWasClosed)
EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(0); EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(0);
job.runAsync(); job.runAsync();
translationUnits.remove({FileContainer{filePath, projectPartId}}); documents.remove({FileContainer{filePath, projectPartId}});
ASSERT_TRUE(waitUntilJobFinished(job)); ASSERT_TRUE(waitUntilJobFinished(job));
} }

View File

@@ -49,8 +49,8 @@ TEST_F(CreateInitialDocumentPreambleJob, PrepareAsyncRun)
TEST_F(CreateInitialDocumentPreambleJob, RunAsync) TEST_F(CreateInitialDocumentPreambleJob, RunAsync)
{ {
translationUnit.parse(); document.parse();
translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath()); document.setDirtyIfDependencyIsMet(document.filePath());
job.setContext(jobContext); job.setContext(jobContext);
job.prepareAsyncRun(); job.prepareAsyncRun();

View File

@@ -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 <projectpart.h>
#include <projectpartsdonotexistexception.h>
#include <projects.h>
#include <translationunitdoesnotexistexception.h>
#include <translationunitalreadyexistsexception.h>
#include <translationunitfilenotexitexception.h>
#include <clangdocument.h>
#include <translationunitisnullexception.h>
#include <clangdocuments.h>
#include <unsavedfiles.h>
#include <utf8string.h>
#include <clang-c/Index.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <gtest/gtest.h>
#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)});
}
}

View File

@@ -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 <clangfilepath.h>
#include <clangtranslationunitupdater.h>
#include <commandlinearguments.h>
#include <diagnosticset.h>
#include <highlightingmarks.h>
#include <filecontainer.h>
#include <projectpart.h>
#include <projectpartcontainer.h>
#include <projects.h>
#include <translationunitdoesnotexistexception.h>
#include <translationunitfilenotexitexception.h>
#include <clangdocument.h>
#include <clangtranslationunitcore.h>
#include <translationunitisnullexception.h>
#include <translationunitparseerrorexception.h>
#include <clangdocuments.h>
#include <unsavedfiles.h>
#include <utf8string.h>
#include <clang-c/Index.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <gtest/gtest.h>
#include "gtest-qt-printing.h"
#include <QTemporaryFile>
#include <chrono>
#include <thread>
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{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();
}
}

View File

@@ -58,29 +58,29 @@ namespace {
using namespace ClangBackEnd; using namespace ClangBackEnd;
MATCHER_P5(HasDirtyTranslationUnit, MATCHER_P5(HasDirtyDocument,
filePath, filePath,
projectPartId, projectPartId,
documentRevision, documentRevision,
isNeedingReparse, isNeedingReparse,
hasNewDiagnostics, hasNewDiagnostics,
std::string(negation ? "isn't" : "is") std::string(negation ? "isn't" : "is")
+ " translation unit with file path "+ PrintToString(filePath) + " document with file path "+ PrintToString(filePath)
+ " and project " + PrintToString(projectPartId) + " and project " + PrintToString(projectPartId)
+ " and document revision " + PrintToString(documentRevision) + " and document revision " + PrintToString(documentRevision)
+ " and isNeedingReparse = " + PrintToString(isNeedingReparse) + " and isNeedingReparse = " + PrintToString(isNeedingReparse)
+ " and hasNewDiagnostics = " + PrintToString(hasNewDiagnostics) + " and hasNewDiagnostics = " + PrintToString(hasNewDiagnostics)
) )
{ {
auto &&translationUnits = arg.translationUnitsForTestOnly(); auto &&documents = arg.documentsForTestOnly();
try { try {
auto translationUnit = translationUnits.translationUnit(filePath, projectPartId); auto document = documents.document(filePath, projectPartId);
if (translationUnit.documentRevision() == documentRevision) { if (document.documentRevision() == documentRevision) {
if (translationUnit.isNeedingReparse() && !isNeedingReparse) { if (document.isNeedingReparse() && !isNeedingReparse) {
*result_listener << "isNeedingReparse is true"; *result_listener << "isNeedingReparse is true";
return false; return false;
} else if (!translationUnit.isNeedingReparse() && isNeedingReparse) { } else if (!document.isNeedingReparse() && isNeedingReparse) {
*result_listener << "isNeedingReparse is false"; *result_listener << "isNeedingReparse is false";
return false; return false;
} }
@@ -88,7 +88,7 @@ MATCHER_P5(HasDirtyTranslationUnit,
return true; return true;
} }
*result_listener << "revision number is " << PrintToString(translationUnit.documentRevision()); *result_listener << "revision number is " << PrintToString(document.documentRevision());
return false; return false;
} catch (...) { } catch (...) {
@@ -156,7 +156,7 @@ protected:
protected: protected:
MockClangCodeModelClient mockClangCodeModelClient; MockClangCodeModelClient mockClangCodeModelClient;
ClangBackEnd::ClangCodeModelServer clangServer; ClangBackEnd::ClangCodeModelServer clangServer;
const ClangBackEnd::TranslationUnits &translationUnits = clangServer.translationUnitsForTestOnly(); const ClangBackEnd::Documents &documents = clangServer.documentsForTestOnly();
const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro"); const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro");
const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"); const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp");
@@ -344,35 +344,35 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterCreationIsNotDirty)
{ {
registerProjectAndFile(filePathA, 1); 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) TEST_F(ClangClangCodeModelServer, SetCurrentAndVisibleEditor)
{ {
registerProjectAndFilesAndWaitForFinished(); registerProjectAndFilesAndWaitForFinished();
auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId); auto functionDocument = documents.document(filePathA, projectPartId);
auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId); auto variableDocument = documents.document(filePathB, projectPartId);
updateVisibilty(filePathB, filePathA); updateVisibilty(filePathB, filePathA);
ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor()); ASSERT_TRUE(variableDocument.isUsedByCurrentEditor());
ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor()); ASSERT_TRUE(variableDocument.isVisibleInEditor());
ASSERT_TRUE(functionTranslationUnit.isVisibleInEditor()); ASSERT_TRUE(functionDocument.isVisibleInEditor());
} }
TEST_F(ClangClangCodeModelServer, IsNotCurrentCurrentAndVisibleEditorAnymore) TEST_F(ClangClangCodeModelServer, IsNotCurrentCurrentAndVisibleEditorAnymore)
{ {
registerProjectAndFilesAndWaitForFinished(); registerProjectAndFilesAndWaitForFinished();
auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId); auto functionDocument = documents.document(filePathA, projectPartId);
auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId); auto variableDocument = documents.document(filePathB, projectPartId);
updateVisibilty(filePathB, filePathA); updateVisibilty(filePathB, filePathA);
updateVisibilty(filePathB, Utf8String()); updateVisibilty(filePathB, Utf8String());
ASSERT_FALSE(functionTranslationUnit.isUsedByCurrentEditor()); ASSERT_FALSE(functionDocument.isUsedByCurrentEditor());
ASSERT_FALSE(functionTranslationUnit.isVisibleInEditor()); ASSERT_FALSE(functionDocument.isVisibleInEditor());
ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor()); ASSERT_TRUE(variableDocument.isUsedByCurrentEditor());
ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor()); ASSERT_TRUE(variableDocument.isVisibleInEditor());
} }
TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse) TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse)
@@ -380,7 +380,7 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse)
registerProjectAndFileAndWaitForFinished(filePathA, 2); registerProjectAndFileAndWaitForFinished(filePathA, 2);
updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1), 1U); 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() void ClangClangCodeModelServer::SetUp()

View File

@@ -25,12 +25,12 @@
#include "testutils.h" #include "testutils.h"
#include <clangdocument.h>
#include <clangdocuments.h>
#include <clangjobs.h> #include <clangjobs.h>
#include <clangtranslationunit.h>
#include <filecontainer.h> #include <filecontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <clang-c/Index.h> #include <clang-c/Index.h>
@@ -75,14 +75,14 @@ protected:
protected: protected:
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::TranslationUnit translationUnit; ClangBackEnd::Document document;
Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp");
Utf8String filePath2 = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp"); Utf8String filePath2 = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp");
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
ClangBackEnd::JobQueue jobQueue{translationUnits, projects}; ClangBackEnd::JobQueue jobQueue{documents, projects};
}; };
TEST_F(JobQueue, AddJob) TEST_F(JobQueue, AddJob)
@@ -200,7 +200,7 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverNotCurrent)
resetVisibilityAndCurrentEditor(); resetVisibilityAndCurrentEditor();
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
translationUnits.setUsedByCurrentEditor(filePath2); documents.setUsedByCurrentEditor(filePath2);
jobQueue.prioritizeRequests(); jobQueue.prioritizeRequests();
@@ -212,7 +212,7 @@ TEST_F(JobQueue, PrioritizeVisibleDocumentsOverNotVisible)
resetVisibilityAndCurrentEditor(); resetVisibilityAndCurrentEditor();
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
translationUnits.setVisibleInEditors({filePath2}); documents.setVisibleInEditors({filePath2});
jobQueue.prioritizeRequests(); jobQueue.prioritizeRequests();
@@ -224,8 +224,8 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverVisible)
resetVisibilityAndCurrentEditor(); resetVisibilityAndCurrentEditor();
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
translationUnits.setVisibleInEditors({filePath1, filePath2}); documents.setVisibleInEditors({filePath1, filePath2});
translationUnits.setUsedByCurrentEditor(filePath2); documents.setUsedByCurrentEditor(filePath2);
jobQueue.prioritizeRequests(); jobQueue.prioritizeRequests();
@@ -236,8 +236,8 @@ TEST_F(JobQueue, RunNothingForNotCurrentOrVisibleDocument)
{ {
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
translationUnits.setVisibleInEditors({}); documents.setVisibleInEditors({});
translationUnits.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath")); documents.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath"));
const JobRequests jobsToRun = jobQueue.processQueue(); const JobRequests jobsToRun = jobQueue.processQueue();
@@ -312,7 +312,7 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByDocumentClose)
TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument) TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument)
{ {
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations)); jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
translationUnit.setHasParseOrReparseFailed(true); document.setHasParseOrReparseFailed(true);
const JobRequests jobsToStart = jobQueue.processQueue(); const JobRequests jobsToStart = jobQueue.processQueue();
@@ -375,15 +375,15 @@ void JobQueue::SetUp()
const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId), const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId),
FileContainer(filePath2, projectPartId)}; FileContainer(filePath2, projectPartId)};
translationUnit = translationUnits.create(fileContainer).front(); document = documents.create(fileContainer).front();
translationUnits.setVisibleInEditors({filePath1}); documents.setVisibleInEditors({filePath1});
translationUnits.setUsedByCurrentEditor(filePath1); documents.setUsedByCurrentEditor(filePath1);
} }
void JobQueue::resetVisibilityAndCurrentEditor() void JobQueue::resetVisibilityAndCurrentEditor()
{ {
translationUnits.setVisibleInEditors({}); documents.setVisibleInEditors({});
translationUnits.setUsedByCurrentEditor(Utf8String()); documents.setUsedByCurrentEditor(Utf8String());
} }
Utf8String JobQueue::createTranslationUnitForDeletedFile() Utf8String JobQueue::createTranslationUnitForDeletedFile()
@@ -394,9 +394,9 @@ Utf8String JobQueue::createTranslationUnitForDeletedFile()
ClangBackEnd::FileContainer fileContainer(temporaryFilePath, ClangBackEnd::FileContainer fileContainer(temporaryFilePath,
projectPartId, Utf8String(), true); projectPartId, Utf8String(), true);
translationUnits.create({fileContainer}); documents.create({fileContainer});
auto translationUnit = translationUnits.translationUnit(fileContainer); auto document = documents.document(fileContainer);
translationUnit.setIsUsedByCurrentEditor(true); document.setIsUsedByCurrentEditor(true);
return temporaryFilePath; return temporaryFilePath;
} }
@@ -410,7 +410,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath,
jobRequest.filePath = filePath; jobRequest.filePath = filePath;
jobRequest.projectPartId = projectPartId; jobRequest.projectPartId = projectPartId;
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
jobRequest.documentRevision = translationUnit.documentRevision(); jobRequest.documentRevision = document.documentRevision();
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
return jobRequest; return jobRequest;
@@ -418,7 +418,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath,
void JobQueue::updateDocumentRevision() void JobQueue::updateDocumentRevision()
{ {
translationUnits.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)}); documents.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)});
} }
void JobQueue::updateUnsavedFiles() void JobQueue::updateUnsavedFiles()
@@ -438,7 +438,7 @@ void JobQueue::removeProject()
void JobQueue::removeDocument() void JobQueue::removeDocument()
{ {
translationUnits.remove({FileContainer(filePath1, projectPartId)}); documents.remove({FileContainer(filePath1, projectPartId)});
} }
} // anonymous } // anonymous

View File

@@ -26,12 +26,12 @@
#include "testutils.h" #include "testutils.h"
#include "dummyclangipcclient.h" #include "dummyclangipcclient.h"
#include <clangdocument.h>
#include <clangjobs.h> #include <clangjobs.h>
#include <clangtranslationunit.h>
#include <filecontainer.h> #include <filecontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <clang-c/Index.h> #include <clang-c/Index.h>
@@ -68,14 +68,14 @@ protected:
protected: protected:
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::TranslationUnit translationUnit; ClangBackEnd::Document document;
DummyIpcClient dummyClientInterface; DummyIpcClient dummyClientInterface;
Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp"); Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp");
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")}; Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
ClangBackEnd::Jobs jobs{translationUnits, unsavedFiles, projects, dummyClientInterface}; ClangBackEnd::Jobs jobs{documents, unsavedFiles, projects, dummyClientInterface};
}; };
TEST_F(Jobs, ProcessEmptyQueue) TEST_F(Jobs, ProcessEmptyQueue)
@@ -122,9 +122,9 @@ void Jobs::SetUp()
projects.createOrUpdate({ProjectPartContainer(projectPartId)}); projects.createOrUpdate({ProjectPartContainer(projectPartId)});
const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId)}; const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId)};
translationUnit = translationUnits.create(fileContainer).front(); document = documents.create(fileContainer).front();
translationUnits.setVisibleInEditors({filePath1}); documents.setVisibleInEditors({filePath1});
translationUnits.setUsedByCurrentEditor(filePath1); documents.setUsedByCurrentEditor(filePath1);
} }
void Jobs::TearDown() void Jobs::TearDown()
@@ -157,7 +157,7 @@ JobRequest Jobs::createJobRequest(const Utf8String &filePath,
jobRequest.filePath = filePath; jobRequest.filePath = filePath;
jobRequest.projectPartId = projectPartId; jobRequest.projectPartId = projectPartId;
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint(); jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
jobRequest.documentRevision = translationUnit.documentRevision(); jobRequest.documentRevision = document.documentRevision();
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint(); jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
return jobRequest; return jobRequest;

View File

@@ -77,7 +77,7 @@ TEST_F(RequestDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed)
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
job.runAsync(); job.runAsync();
translationUnits.remove({FileContainer{filePath, projectPartId}}); documents.remove({FileContainer{filePath, projectPartId}});
ASSERT_TRUE(waitUntilJobFinished(job)); ASSERT_TRUE(waitUntilJobFinished(job));
} }

View File

@@ -78,7 +78,7 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed)
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
job.runAsync(); job.runAsync();
translationUnits.remove({FileContainer{filePath, projectPartId}}); documents.remove({FileContainer{filePath, projectPartId}});
ASSERT_TRUE(waitUntilJobFinished(job)); ASSERT_TRUE(waitUntilJobFinished(job));
} }
@@ -90,23 +90,23 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentRevisionChange
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0); EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
job.runAsync(); job.runAsync();
translationUnits.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)}); documents.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)});
ASSERT_TRUE(waitUntilJobFinished(job)); ASSERT_TRUE(waitUntilJobFinished(job));
} }
TEST_F(UpdateDocumentAnnotationsJob, UpdatesTranslationUnit) TEST_F(UpdateDocumentAnnotationsJob, UpdatesTranslationUnit)
{ {
const time_point timePointBefore = translationUnit.lastProjectPartChangeTimePoint(); const time_point timePointBefore = document.lastProjectPartChangeTimePoint();
const QSet<Utf8String> dependendOnFilesBefore = translationUnit.dependedFilePaths(); const QSet<Utf8String> dependendOnFilesBefore = document.dependedFilePaths();
job.setContext(jobContext); job.setContext(jobContext);
job.prepareAsyncRun(); job.prepareAsyncRun();
job.runAsync(); job.runAsync();
ASSERT_TRUE(waitUntilJobFinished(job)); ASSERT_TRUE(waitUntilJobFinished(job));
ASSERT_THAT(timePointBefore, Not(translationUnit.lastProjectPartChangeTimePoint())); ASSERT_THAT(timePointBefore, Not(document.lastProjectPartChangeTimePoint()));
ASSERT_THAT(dependendOnFilesBefore, Not(translationUnit.dependedFilePaths())); ASSERT_THAT(dependendOnFilesBefore, Not(document.dependedFilePaths()));
} }
} // anonymous } // anonymous

View File

@@ -24,15 +24,15 @@
****************************************************************************/ ****************************************************************************/
#include <clangcodecompleteresults.h> #include <clangcodecompleteresults.h>
#include <clangdocument.h>
#include <clangfilepath.h> #include <clangfilepath.h>
#include <codecompletionsextractor.h> #include <codecompletionsextractor.h>
#include <filecontainer.h> #include <filecontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <clangtranslationunit.h>
#include <clangunsavedfilesshallowarguments.h> #include <clangunsavedfilesshallowarguments.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <utf8stringvector.h> #include <utf8stringvector.h>
@@ -48,7 +48,7 @@
using ClangBackEnd::CodeCompletionsExtractor; using ClangBackEnd::CodeCompletionsExtractor;
using ClangBackEnd::ClangCodeCompleteResults; using ClangBackEnd::ClangCodeCompleteResults;
using ClangBackEnd::FilePath; using ClangBackEnd::FilePath;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::CodeCompletion; using ClangBackEnd::CodeCompletion;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::UnsavedFilesShallowArguments; using ClangBackEnd::UnsavedFilesShallowArguments;
@@ -145,7 +145,7 @@ const ClangBackEnd::FileContainer unsavedDataFileContainer(const char *filePath,
class CodeCompletionsExtractor : public ::testing::Test class CodeCompletionsExtractor : public ::testing::Test
{ {
protected: protected:
ClangCodeCompleteResults getResults(const TranslationUnit &translationUnit, ClangCodeCompleteResults getResults(const Document &document,
uint line, uint line,
uint column = 1, uint column = 1,
bool needsReparse = false); bool needsReparse = false);
@@ -154,19 +154,19 @@ protected:
ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")}; ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit functionTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits}; Document functionDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents};
TranslationUnit variableTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), translationUnits}; Document variableDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), documents};
TranslationUnit classTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), translationUnits}; Document classDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), documents};
TranslationUnit namespaceTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), translationUnits}; Document namespaceDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), documents};
TranslationUnit enumerationTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), translationUnits}; Document enumerationDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), documents};
TranslationUnit constructorTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), translationUnits}; Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), documents};
TranslationUnit briefCommentTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), translationUnits}; Document briefCommentDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), documents};
}; };
TEST_F(CodeCompletionsExtractor, Function) TEST_F(CodeCompletionsExtractor, Function)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -177,7 +177,7 @@ TEST_F(CodeCompletionsExtractor, Function)
TEST_F(CodeCompletionsExtractor, TemplateFunction) TEST_F(CodeCompletionsExtractor, TemplateFunction)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -188,7 +188,7 @@ TEST_F(CodeCompletionsExtractor, TemplateFunction)
TEST_F(CodeCompletionsExtractor, Variable) TEST_F(CodeCompletionsExtractor, Variable)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 4));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -200,7 +200,7 @@ TEST_F(CodeCompletionsExtractor, Variable)
TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter) TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 25, 19)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 25, 19));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -212,7 +212,7 @@ TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter)
TEST_F(CodeCompletionsExtractor, VariableReference) TEST_F(CodeCompletionsExtractor, VariableReference)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 12)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 12));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -223,7 +223,7 @@ TEST_F(CodeCompletionsExtractor, VariableReference)
TEST_F(CodeCompletionsExtractor, Parameter) TEST_F(CodeCompletionsExtractor, Parameter)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 4));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -234,7 +234,7 @@ TEST_F(CodeCompletionsExtractor, Parameter)
TEST_F(CodeCompletionsExtractor, Field) TEST_F(CodeCompletionsExtractor, Field)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -245,7 +245,7 @@ TEST_F(CodeCompletionsExtractor, Field)
TEST_F(CodeCompletionsExtractor, Class) TEST_F(CodeCompletionsExtractor, Class)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -256,7 +256,7 @@ TEST_F(CodeCompletionsExtractor, Class)
TEST_F(CodeCompletionsExtractor, Struct) TEST_F(CodeCompletionsExtractor, Struct)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -267,7 +267,7 @@ TEST_F(CodeCompletionsExtractor, Struct)
TEST_F(CodeCompletionsExtractor, Union) TEST_F(CodeCompletionsExtractor, Union)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -278,7 +278,7 @@ TEST_F(CodeCompletionsExtractor, Union)
TEST_F(CodeCompletionsExtractor, Typedef) TEST_F(CodeCompletionsExtractor, Typedef)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -289,7 +289,7 @@ TEST_F(CodeCompletionsExtractor, Typedef)
TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias) TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -300,7 +300,7 @@ TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias)
TEST_F(CodeCompletionsExtractor, TemplateTypeParameter) TEST_F(CodeCompletionsExtractor, TemplateTypeParameter)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -311,7 +311,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTypeParameter)
TEST_F(CodeCompletionsExtractor, TemplateClass) TEST_F(CodeCompletionsExtractor, TemplateClass)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -322,7 +322,7 @@ TEST_F(CodeCompletionsExtractor, TemplateClass)
TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter) TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -333,7 +333,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter)
TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization) TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -344,7 +344,7 @@ TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization)
TEST_F(CodeCompletionsExtractor, Namespace) TEST_F(CodeCompletionsExtractor, Namespace)
{ {
ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -355,7 +355,7 @@ TEST_F(CodeCompletionsExtractor, Namespace)
TEST_F(CodeCompletionsExtractor, NamespaceAlias) TEST_F(CodeCompletionsExtractor, NamespaceAlias)
{ {
ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -366,7 +366,7 @@ TEST_F(CodeCompletionsExtractor, NamespaceAlias)
TEST_F(CodeCompletionsExtractor, Enumeration) TEST_F(CodeCompletionsExtractor, Enumeration)
{ {
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -377,7 +377,7 @@ TEST_F(CodeCompletionsExtractor, Enumeration)
TEST_F(CodeCompletionsExtractor, Enumerator) TEST_F(CodeCompletionsExtractor, Enumerator)
{ {
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -388,7 +388,7 @@ TEST_F(CodeCompletionsExtractor, Enumerator)
TEST_F(CodeCompletionsExtractor, DISABLED_Constructor) TEST_F(CodeCompletionsExtractor, DISABLED_Constructor)
{ {
ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -399,7 +399,7 @@ TEST_F(CodeCompletionsExtractor, DISABLED_Constructor)
TEST_F(CodeCompletionsExtractor, Destructor) TEST_F(CodeCompletionsExtractor, Destructor)
{ {
ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -410,7 +410,7 @@ TEST_F(CodeCompletionsExtractor, Destructor)
TEST_F(CodeCompletionsExtractor, Method) TEST_F(CodeCompletionsExtractor, Method)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -422,7 +422,7 @@ TEST_F(CodeCompletionsExtractor, Method)
TEST_F(CodeCompletionsExtractor, MethodWithParameters) TEST_F(CodeCompletionsExtractor, MethodWithParameters)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -434,7 +434,7 @@ TEST_F(CodeCompletionsExtractor, MethodWithParameters)
TEST_F(CodeCompletionsExtractor, Slot) TEST_F(CodeCompletionsExtractor, Slot)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -445,7 +445,7 @@ TEST_F(CodeCompletionsExtractor, Slot)
TEST_F(CodeCompletionsExtractor, Signal) TEST_F(CodeCompletionsExtractor, Signal)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -456,7 +456,7 @@ TEST_F(CodeCompletionsExtractor, Signal)
TEST_F(CodeCompletionsExtractor, MacroDefinition) TEST_F(CodeCompletionsExtractor, MacroDefinition)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -467,7 +467,7 @@ TEST_F(CodeCompletionsExtractor, MacroDefinition)
TEST_F(CodeCompletionsExtractor, FunctionMacro) TEST_F(CodeCompletionsExtractor, FunctionMacro)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -478,7 +478,7 @@ TEST_F(CodeCompletionsExtractor, FunctionMacro)
TEST_F(CodeCompletionsExtractor, IntKeyword) TEST_F(CodeCompletionsExtractor, IntKeyword)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -489,7 +489,7 @@ TEST_F(CodeCompletionsExtractor, IntKeyword)
TEST_F(CodeCompletionsExtractor, SwitchKeyword) TEST_F(CodeCompletionsExtractor, SwitchKeyword)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -500,7 +500,7 @@ TEST_F(CodeCompletionsExtractor, SwitchKeyword)
TEST_F(CodeCompletionsExtractor, ClassKeyword) TEST_F(CodeCompletionsExtractor, ClassKeyword)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -511,7 +511,7 @@ TEST_F(CodeCompletionsExtractor, ClassKeyword)
TEST_F(CodeCompletionsExtractor, DeprecatedFunction) TEST_F(CodeCompletionsExtractor, DeprecatedFunction)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -522,7 +522,7 @@ TEST_F(CodeCompletionsExtractor, DeprecatedFunction)
TEST_F(CodeCompletionsExtractor, NotAccessibleFunction) TEST_F(CodeCompletionsExtractor, NotAccessibleFunction)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -533,7 +533,7 @@ TEST_F(CodeCompletionsExtractor, NotAccessibleFunction)
TEST_F(CodeCompletionsExtractor, NotAvailableFunction) TEST_F(CodeCompletionsExtractor, NotAvailableFunction)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -544,10 +544,10 @@ TEST_F(CodeCompletionsExtractor, NotAvailableFunction)
TEST_F(CodeCompletionsExtractor, UnsavedFile) 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", unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")}); TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")});
ClangCodeCompleteResults completeResults(getResults(translationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(document, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -558,13 +558,13 @@ TEST_F(CodeCompletionsExtractor, UnsavedFile)
TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile) 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", unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved.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", unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")}); TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")});
completeResults = getResults(translationUnit, 20); completeResults = getResults(document, 20);
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -576,7 +576,7 @@ TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile)
TEST_F(CodeCompletionsExtractor, ArgumentDefinition) TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
{ {
project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")}); project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")});
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -588,7 +588,7 @@ TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
TEST_F(CodeCompletionsExtractor, NoArgumentDefinition) TEST_F(CodeCompletionsExtractor, NoArgumentDefinition)
{ {
project.setArguments({Utf8StringLiteral("-std=gnu++14")}); project.setArguments({Utf8StringLiteral("-std=gnu++14")});
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -599,7 +599,7 @@ TEST_F(CodeCompletionsExtractor, NoArgumentDefinition)
TEST_F(CodeCompletionsExtractor, CompletionChunksFunction) TEST_F(CodeCompletionsExtractor, CompletionChunksFunction)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -612,7 +612,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunction)
TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks) TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks)
{ {
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -630,7 +630,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks)
TEST_F(CodeCompletionsExtractor, CompletionChunksField) TEST_F(CodeCompletionsExtractor, CompletionChunksField)
{ {
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(variableDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -641,7 +641,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksField)
TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator) TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator)
{ {
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -652,7 +652,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator)
TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration) TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration)
{ {
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -662,7 +662,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration)
TEST_F(CodeCompletionsExtractor, CompletionChunksClass) TEST_F(CodeCompletionsExtractor, CompletionChunksClass)
{ {
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20)); ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -672,7 +672,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksClass)
TEST_F(CodeCompletionsExtractor, BriefComment) TEST_F(CodeCompletionsExtractor, BriefComment)
{ {
ClangCodeCompleteResults completeResults(getResults(briefCommentTranslationUnit, 10, 1, ClangCodeCompleteResults completeResults(getResults(briefCommentDocument, 10, 1,
/*needsReparse=*/ true)); /*needsReparse=*/ true));
::CodeCompletionsExtractor extractor(completeResults.data()); ::CodeCompletionsExtractor extractor(completeResults.data());
@@ -680,19 +680,19 @@ TEST_F(CodeCompletionsExtractor, BriefComment)
ASSERT_THAT(extractor, HasBriefComment(Utf8StringLiteral("BriefComment"), Utf8StringLiteral("A brief comment"))); 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 line,
uint column, uint column,
bool needsReparse) bool needsReparse)
{ {
translationUnit.parse(); document.parse();
if (needsReparse) if (needsReparse)
translationUnit.reparse(); document.reparse();
const Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath()); const Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
UnsavedFilesShallowArguments unsaved = unsavedFiles.shallowArguments(); UnsavedFilesShallowArguments unsaved = unsavedFiles.shallowArguments();
return ClangCodeCompleteResults(clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(), return ClangCodeCompleteResults(clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
nativeFilePath.constData(), nativeFilePath.constData(),
line, line,
column, column,

View File

@@ -24,11 +24,11 @@
****************************************************************************/ ****************************************************************************/
#include <codecompleter.h> #include <codecompleter.h>
#include <clangdocument.h>
#include <filecontainer.h> #include <filecontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <clangtranslationunit.h> #include <clangdocuments.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <utf8stringvector.h> #include <utf8stringvector.h>
@@ -88,8 +88,8 @@ protected:
projectPart.projectPartId()}; projectPart.projectPartId()};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
ClangBackEnd::TranslationUnit translationUnit; ClangBackEnd::Document document;
QScopedPointer<ClangBackEnd::CodeCompleter> completer; QScopedPointer<ClangBackEnd::CodeCompleter> completer;
ClangBackEnd::FileContainer unsavedMainFileContainer{mainFileContainer.filePath(), ClangBackEnd::FileContainer unsavedMainFileContainer{mainFileContainer.filePath(),
projectPart.projectPartId(), projectPart.projectPartId(),
@@ -211,20 +211,20 @@ void CodeCompleter::SetUp()
{ {
EXPECT_TRUE(includeDirectory.isValid()); EXPECT_TRUE(includeDirectory.isValid());
projects.createOrUpdate({projectPart}); projects.createOrUpdate({projectPart});
translationUnits.create({mainFileContainer}); documents.create({mainFileContainer});
translationUnit = translationUnits.translationUnit(mainFileContainer); document = documents.document(mainFileContainer);
completer.reset(new ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(), completer.reset(new ClangBackEnd::CodeCompleter(document.translationUnitCore(),
unsavedFiles)); unsavedFiles));
copyTargetHeaderToTemporaryIncludeDirecory(); copyTargetHeaderToTemporaryIncludeDirecory();
translationUnit.parse(); document.parse();
} }
TEST_F(CodeCompleter, FunctionInUnsavedFile) TEST_F(CodeCompleter, FunctionInUnsavedFile)
{ {
unsavedFiles.createOrUpdate({unsavedMainFileContainer}); unsavedFiles.createOrUpdate({unsavedMainFileContainer});
translationUnits.update({unsavedMainFileContainer}); documents.update({unsavedMainFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
ASSERT_THAT(myCompleter.complete(27, 1), ASSERT_THAT(myCompleter.complete(27, 1),
AllOf(Contains(IsCodeCompletion(Utf8StringLiteral("FunctionWithArguments"), AllOf(Contains(IsCodeCompletion(Utf8StringLiteral("FunctionWithArguments"),
@@ -242,8 +242,8 @@ TEST_F(CodeCompleter, FunctionInUnsavedFile)
TEST_F(CodeCompleter, VariableInUnsavedFile) TEST_F(CodeCompleter, VariableInUnsavedFile)
{ {
unsavedFiles.createOrUpdate({unsavedMainFileContainer}); unsavedFiles.createOrUpdate({unsavedMainFileContainer});
translationUnits.update({unsavedMainFileContainer}); documents.update({unsavedMainFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
ASSERT_THAT(myCompleter.complete(27, 1), ASSERT_THAT(myCompleter.complete(27, 1),
Contains(IsCodeCompletion(Utf8StringLiteral("VariableInUnsavedFile"), Contains(IsCodeCompletion(Utf8StringLiteral("VariableInUnsavedFile"),
@@ -253,8 +253,8 @@ TEST_F(CodeCompleter, VariableInUnsavedFile)
TEST_F(CodeCompleter, GlobalVariableInUnsavedFile) TEST_F(CodeCompleter, GlobalVariableInUnsavedFile)
{ {
unsavedFiles.createOrUpdate({unsavedMainFileContainer}); unsavedFiles.createOrUpdate({unsavedMainFileContainer});
translationUnits.update({unsavedMainFileContainer}); documents.update({unsavedMainFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
ASSERT_THAT(myCompleter.complete(27, 1), ASSERT_THAT(myCompleter.complete(27, 1),
Contains(IsCodeCompletion(Utf8StringLiteral("GlobalVariableInUnsavedFile"), Contains(IsCodeCompletion(Utf8StringLiteral("GlobalVariableInUnsavedFile"),
@@ -264,8 +264,8 @@ TEST_F(CodeCompleter, GlobalVariableInUnsavedFile)
TEST_F(CodeCompleter, Macro) TEST_F(CodeCompleter, Macro)
{ {
unsavedFiles.createOrUpdate({unsavedMainFileContainer}); unsavedFiles.createOrUpdate({unsavedMainFileContainer});
translationUnits.update({unsavedMainFileContainer}); documents.update({unsavedMainFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
ASSERT_THAT(myCompleter.complete(27, 1), ASSERT_THAT(myCompleter.complete(27, 1),
Contains(IsCodeCompletion(Utf8StringLiteral("Macro"), Contains(IsCodeCompletion(Utf8StringLiteral("Macro"),
@@ -289,8 +289,8 @@ TEST_F(CodeCompleter, FunctionInIncludedHeader)
TEST_F(CodeCompleter, FunctionInUnsavedIncludedHeader) TEST_F(CodeCompleter, FunctionInUnsavedIncludedHeader)
{ {
unsavedFiles.createOrUpdate({unsavedTargetHeaderFileContainer}); unsavedFiles.createOrUpdate({unsavedTargetHeaderFileContainer});
translationUnits.create({unsavedTargetHeaderFileContainer}); documents.create({unsavedTargetHeaderFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
ASSERT_THAT(myCompleter.complete(27, 1), ASSERT_THAT(myCompleter.complete(27, 1),
Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderUnsaved"), 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 TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile) // it's not that bad because we reparse anyway
{ {
unsavedFiles.createOrUpdate({unsavedMainFileContainer}); unsavedFiles.createOrUpdate({unsavedMainFileContainer});
translationUnits.update({unsavedMainFileContainer}); documents.update({unsavedMainFileContainer});
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles); ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
copyChangedTargetHeaderToTemporaryIncludeDirecory(); copyChangedTargetHeaderToTemporaryIncludeDirecory();
@@ -345,16 +345,16 @@ TEST_F(CodeCompleter, DotToArrowCompletionForPointer)
ClangBackEnd::CompletionCorrection::DotToArrowCorrection); ClangBackEnd::CompletionCorrection::DotToArrowCorrection);
} }
TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedTranslationUnit) TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedDocument)
{ {
auto fileContainerBeforeTyping = dotArrowCorrectionForPointerFileContainerBeforeTyping; auto fileContainerBeforeTyping = dotArrowCorrectionForPointerFileContainerBeforeTyping;
translationUnits.create({fileContainerBeforeTyping}); documents.create({fileContainerBeforeTyping});
unsavedFiles.createOrUpdate({fileContainerBeforeTyping}); unsavedFiles.createOrUpdate({fileContainerBeforeTyping});
auto translationUnit = translationUnits.translationUnit(fileContainerBeforeTyping.filePath(), auto document = documents.document(fileContainerBeforeTyping.filePath(),
fileContainerBeforeTyping.projectPartId()); fileContainerBeforeTyping.projectPartId());
translationUnit.parse(); document.parse();
unsavedFiles.createOrUpdate({dotArrowCorrectionForPointerFileContainerAfterTyping}); unsavedFiles.createOrUpdate({dotArrowCorrectionForPointerFileContainerAfterTyping});
ClangBackEnd::CodeCompleter myCompleter(translationUnits.translationUnit(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(), ClangBackEnd::CodeCompleter myCompleter(documents.document(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(),
unsavedFiles); unsavedFiles);
const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9); const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9);
@@ -443,13 +443,13 @@ TEST_F(CodeCompleter, NoDotArrowCorrectionForColonColon)
ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter( ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter(
const ClangBackEnd::FileContainer &fileContainer) const ClangBackEnd::FileContainer &fileContainer)
{ {
translationUnits.create({fileContainer}); documents.create({fileContainer});
unsavedFiles.createOrUpdate({fileContainer}); unsavedFiles.createOrUpdate({fileContainer});
translationUnit = translationUnits.translationUnit(fileContainer); document = documents.document(fileContainer);
translationUnit.parse(); document.parse();
ClangBackEnd::TranslationUnit translationUnit = translationUnits.translationUnit(fileContainer); ClangBackEnd::Document document = documents.document(fileContainer);
return ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(), return ClangBackEnd::CodeCompleter(document.translationUnitCore(),
unsavedFiles); unsavedFiles);
} }

View File

@@ -23,15 +23,15 @@
** **
****************************************************************************/ ****************************************************************************/
#include <clangdocument.h>
#include <clangdocuments.h>
#include <clangstring.h> #include <clangstring.h>
#include <cursor.h> #include <cursor.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <sourcelocation.h> #include <sourcelocation.h>
#include <sourcerange.h> #include <sourcerange.h>
#include <clangtranslationunit.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
@@ -40,11 +40,11 @@
#include "gtest-qt-printing.h" #include "gtest-qt-printing.h"
using ClangBackEnd::Cursor; using ClangBackEnd::Cursor;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::TranslationUnitCore;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::TranslationUnits; using ClangBackEnd::Documents;
using ClangBackEnd::ClangString; using ClangBackEnd::ClangString;
using ClangBackEnd::SourceRange; using ClangBackEnd::SourceRange;
@@ -63,15 +63,15 @@ namespace {
struct Data { struct Data {
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/cursor.cpp")}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/cursor.cpp")};
TranslationUnit translationUnit{filePath, Document document{filePath,
ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}), ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}),
{}, {},
translationUnits}; documents};
TranslationUnitCore translationUnitCore{filePath, TranslationUnitCore translationUnitCore{filePath,
translationUnit.translationUnitCore().cxIndex(), document.translationUnitCore().cxIndex(),
translationUnit.translationUnitCore().cxTranslationUnit()}; document.translationUnitCore().cxTranslationUnit()};
}; };
class Cursor : public ::testing::Test class Cursor : public ::testing::Test
@@ -82,7 +82,7 @@ public:
protected: protected:
static Data *d; static Data *d;
const TranslationUnit &translationUnit = d->translationUnit; const Document &document = d->document;
const TranslationUnitCore &translationUnitCore = d->translationUnitCore; const TranslationUnitCore &translationUnitCore = d->translationUnitCore;
}; };
@@ -808,7 +808,7 @@ Data *Cursor::d;
void Cursor::SetUpTestCase() void Cursor::SetUpTestCase()
{ {
d = new Data; d = new Data;
d->translationUnit.parse(); d->document.parse();
} }
void Cursor::TearDownTestCase() void Cursor::TearDownTestCase()

View File

@@ -24,6 +24,7 @@
****************************************************************************/ ****************************************************************************/
#include <clangbackendipc_global.h> #include <clangbackendipc_global.h>
#include <clangdocument.h>
#include <diagnosticcontainer.h> #include <diagnosticcontainer.h>
#include <diagnosticset.h> #include <diagnosticset.h>
#include <fixitcontainer.h> #include <fixitcontainer.h>
@@ -32,9 +33,8 @@
#include <sourcelocation.h> #include <sourcelocation.h>
#include <sourcelocationcontainer.h> #include <sourcelocationcontainer.h>
#include <sourcerangecontainer.h> #include <sourcerangecontainer.h>
#include <clangtranslationunit.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <clang-c/Index.h> #include <clang-c/Index.h>
@@ -56,7 +56,7 @@ using ::ClangBackEnd::FixItContainer;
using ::ClangBackEnd::ProjectPart; using ::ClangBackEnd::ProjectPart;
using ::ClangBackEnd::SourceLocation; using ::ClangBackEnd::SourceLocation;
using ::ClangBackEnd::SourceLocationContainer; using ::ClangBackEnd::SourceLocationContainer;
using ::ClangBackEnd::TranslationUnit; using ::ClangBackEnd::Document;
using ::ClangBackEnd::UnsavedFiles; using ::ClangBackEnd::UnsavedFiles;
namespace { namespace {
@@ -69,15 +69,15 @@ protected:
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"), Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
TranslationUnit translationUnitMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"), Document documentMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
protected: protected:
enum ChildMode { WithChild, WithoutChild }; enum ChildMode { WithChild, WithoutChild };
@@ -86,16 +86,16 @@ protected:
TEST_F(DiagnosticSet, SetHasContent) TEST_F(DiagnosticSet, SetHasContent)
{ {
translationUnit.parse(); document.parse();
const auto set = translationUnit.translationUnitCore().diagnostics(); const auto set = document.translationUnitCore().diagnostics();
ASSERT_THAT(set.size(), 1); ASSERT_THAT(set.size(), 1);
} }
TEST_F(DiagnosticSet, MoveConstructor) TEST_F(DiagnosticSet, MoveConstructor)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
const auto set2 = std::move(set); const auto set2 = std::move(set);
@@ -105,8 +105,8 @@ TEST_F(DiagnosticSet, MoveConstructor)
TEST_F(DiagnosticSet, MoveAssigment) TEST_F(DiagnosticSet, MoveAssigment)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
auto set2 = std::move(set); auto set2 = std::move(set);
set = std::move(set2); set = std::move(set2);
@@ -117,8 +117,8 @@ TEST_F(DiagnosticSet, MoveAssigment)
TEST_F(DiagnosticSet, MoveSelfAssigment) TEST_F(DiagnosticSet, MoveSelfAssigment)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
set = std::move(set); set = std::move(set);
@@ -127,24 +127,24 @@ TEST_F(DiagnosticSet, MoveSelfAssigment)
TEST_F(DiagnosticSet, FirstElementEqualBegin) TEST_F(DiagnosticSet, FirstElementEqualBegin)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
ASSERT_TRUE(set.front() == *set.begin()); ASSERT_TRUE(set.front() == *set.begin());
} }
TEST_F(DiagnosticSet, BeginIsUnequalEnd) TEST_F(DiagnosticSet, BeginIsUnequalEnd)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
ASSERT_TRUE(set.begin() != set.end()); ASSERT_TRUE(set.begin() != set.end());
} }
TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd) TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd)
{ {
translationUnit.parse(); document.parse();
auto set = translationUnit.translationUnitCore().diagnostics(); auto set = document.translationUnitCore().diagnostics();
ASSERT_TRUE(++set.begin() == set.end()); ASSERT_TRUE(++set.begin() == set.end());
} }
@@ -152,17 +152,17 @@ TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd)
TEST_F(DiagnosticSet, ToDiagnosticContainersLetThroughByDefault) TEST_F(DiagnosticSet, ToDiagnosticContainersLetThroughByDefault)
{ {
const auto diagnosticContainerWithoutChild = expectedDiagnostic(WithChild); 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))); ASSERT_THAT(diagnostics, Contains(IsDiagnosticContainer(diagnosticContainerWithoutChild)));
} }
TEST_F(DiagnosticSet, ToDiagnosticContainersFiltersOutTopLevelItem) TEST_F(DiagnosticSet, ToDiagnosticContainersFiltersOutTopLevelItem)
{ {
translationUnitMainFile.parse(); documentMainFile.parse();
const ::DiagnosticSet diagnosticSetWithChildren{translationUnitMainFile.translationUnitCore().diagnostics()}; const ::DiagnosticSet diagnosticSetWithChildren{documentMainFile.translationUnitCore().diagnostics()};
const auto acceptNoDiagnostics = [](const Diagnostic &) { return false; }; const auto acceptNoDiagnostics = [](const Diagnostic &) { return false; };
const auto diagnostics = diagnosticSetWithChildren.toDiagnosticContainers(acceptNoDiagnostics); const auto diagnostics = diagnosticSetWithChildren.toDiagnosticContainers(acceptNoDiagnostics);
@@ -192,7 +192,7 @@ DiagnosticContainer DiagnosticSet::expectedDiagnostic(DiagnosticSet::ChildMode c
Utf8StringLiteral("Semantic Issue"), Utf8StringLiteral("Semantic Issue"),
{Utf8String(), Utf8String()}, {Utf8String(), Utf8String()},
ClangBackEnd::DiagnosticSeverity::Error, ClangBackEnd::DiagnosticSeverity::Error,
SourceLocationContainer(translationUnitMainFile.filePath(), 3, 6), SourceLocationContainer(documentMainFile.filePath(), 3, 6),
{}, {},
{}, {},
children children

View File

@@ -28,9 +28,9 @@
#include <diagnosticset.h> #include <diagnosticset.h>
#include <fixitcontainer.h> #include <fixitcontainer.h>
#include <projectpart.h> #include <projectpart.h>
#include <clangtranslationunit.h> #include <clangdocument.h>
#include <clangdocuments.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h>
#include <projects.h> #include <projects.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <sourcelocation.h> #include <sourcelocation.h>
@@ -51,13 +51,13 @@ using ::testing::PrintToString;
using ClangBackEnd::DiagnosticSet; using ClangBackEnd::DiagnosticSet;
using ClangBackEnd::DiagnosticContainer; using ClangBackEnd::DiagnosticContainer;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::Documents;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::Diagnostic; using ClangBackEnd::Diagnostic;
using ClangBackEnd::SourceLocation; using ClangBackEnd::SourceLocation;
using ClangBackEnd::DiagnosticSeverity; using ClangBackEnd::DiagnosticSeverity;
using ClangBackEnd::TranslationUnits;
using ClangBackEnd::FixItContainer; using ClangBackEnd::FixItContainer;
using ClangBackEnd::SourceLocationContainer; using ClangBackEnd::SourceLocationContainer;
@@ -81,8 +81,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
} }
struct DiagnosticData { struct DiagnosticData {
DiagnosticData(TranslationUnit &translationUnit) DiagnosticData(Document &document)
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()} : diagnosticSet{document.translationUnitCore().diagnostics()}
, diagnostic{diagnosticSet.front()} , diagnostic{diagnosticSet.front()}
{ {
} }
@@ -94,18 +94,18 @@ struct DiagnosticData {
struct Data { struct Data {
Data() Data()
{ {
translationUnit.parse(); document.parse();
d.reset(new DiagnosticData(translationUnit)); d.reset(new DiagnosticData(document));
} }
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}}; ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"), Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
std::unique_ptr<DiagnosticData> d; std::unique_ptr<DiagnosticData> d;
}; };
@@ -215,7 +215,7 @@ DiagnosticContainer Diagnostic::expectedDiagnostic(Diagnostic::ChildMode childMo
Utf8StringLiteral("Semantic Issue"), Utf8StringLiteral("Semantic Issue"),
{Utf8String(), Utf8String()}, {Utf8String(), Utf8String()},
ClangBackEnd::DiagnosticSeverity::Note, 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"), Utf8StringLiteral("Semantic Issue"),
{Utf8String(), Utf8String()}, {Utf8String(), Utf8String()},
ClangBackEnd::DiagnosticSeverity::Error, ClangBackEnd::DiagnosticSeverity::Error,
SourceLocationContainer(d->translationUnit.filePath(), 7, 5), SourceLocationContainer(d->document.filePath(), 7, 5),
{}, {},
{}, {},
children children

View File

@@ -27,9 +27,9 @@
#include <diagnosticset.h> #include <diagnosticset.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <clangtranslationunit.h> #include <clangdocument.h>
#include <clangdocuments.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <sourcelocation.h> #include <sourcelocation.h>
#include <sourcerange.h> #include <sourcerange.h>
@@ -43,7 +43,7 @@
#include "gtest-qt-printing.h" #include "gtest-qt-printing.h"
using ClangBackEnd::DiagnosticSet; using ClangBackEnd::DiagnosticSet;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::TranslationUnitCore;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
@@ -88,19 +88,19 @@ struct Data
{ {
Data() Data()
{ {
translationUnit.parse(); document.parse();
d.reset(new FixItData(translationUnitCore)); d.reset(new FixItData(translationUnitCore));
} }
ProjectPart projectPart{Utf8StringLiteral("projectPartId")}; ProjectPart projectPart{Utf8StringLiteral("projectPartId")};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"), Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
TranslationUnitCore translationUnitCore{translationUnit.translationUnitCore()}; TranslationUnitCore translationUnitCore{document.translationUnitCore()};
std::unique_ptr<FixItData> d; std::unique_ptr<FixItData> d;
}; };

View File

@@ -24,14 +24,14 @@
****************************************************************************/ ****************************************************************************/
#include <chunksreportedmonitor.h> #include <chunksreportedmonitor.h>
#include <clangdocument.h>
#include <clangdocuments.h>
#include <cursor.h> #include <cursor.h>
#include <clangtranslationunit.h>
#include <highlightingmarkcontainer.h> #include <highlightingmarkcontainer.h>
#include <highlightingmarks.h> #include <highlightingmarks.h>
#include <clanghighlightingmarksreporter.h> #include <clanghighlightingmarksreporter.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
@@ -43,11 +43,11 @@ using ClangBackEnd::Cursor;
using ClangBackEnd::HighlightingMarks; using ClangBackEnd::HighlightingMarks;
using ClangBackEnd::HighlightingMarkContainer; using ClangBackEnd::HighlightingMarkContainer;
using ClangBackEnd::HighlightingType; using ClangBackEnd::HighlightingType;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::Documents;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::ProjectParts; using ClangBackEnd::ProjectParts;
using ClangBackEnd::TranslationUnits;
using ClangBackEnd::ChunksReportedMonitor; using ClangBackEnd::ChunksReportedMonitor;
namespace { namespace {
@@ -55,12 +55,12 @@ namespace {
struct Data { struct Data {
ProjectParts projects; ProjectParts projects;
UnsavedFiles unsavedFiles; UnsavedFiles unsavedFiles;
TranslationUnits translationUnits{projects, unsavedFiles}; Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"), Document document{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"),
ProjectPart(Utf8StringLiteral("projectPartId"), ProjectPart(Utf8StringLiteral("projectPartId"),
{Utf8StringLiteral("-std=c++14")}), {Utf8StringLiteral("-std=c++14")}),
{}, {},
translationUnits}; documents};
}; };
class HighlightingMarksReporter : public ::testing::Test class HighlightingMarksReporter : public ::testing::Test

View File

@@ -23,7 +23,8 @@
** **
****************************************************************************/ ****************************************************************************/
#include <clangtranslationunit.h> #include <clangdocument.h>
#include <clangdocuments.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <cursor.h> #include <cursor.h>
#include <clangbackendipc_global.h> #include <clangbackendipc_global.h>
@@ -34,7 +35,6 @@
#include <sourcerange.h> #include <sourcerange.h>
#include <highlightingmark.h> #include <highlightingmark.h>
#include <highlightingmarks.h> #include <highlightingmarks.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <clang-c/Index.h> #include <clang-c/Index.h>
@@ -49,11 +49,11 @@ using ClangBackEnd::HighlightingTypes;
using ClangBackEnd::HighlightingMark; using ClangBackEnd::HighlightingMark;
using ClangBackEnd::HighlightingMarks; using ClangBackEnd::HighlightingMarks;
using ClangBackEnd::HighlightingType; using ClangBackEnd::HighlightingType;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::Documents;
using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::TranslationUnitCore;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::TranslationUnits;
using ClangBackEnd::ClangString; using ClangBackEnd::ClangString;
using ClangBackEnd::SourceRange; using ClangBackEnd::SourceRange;
@@ -101,20 +101,21 @@ MATCHER_P2(HasTwoTypes, firstType, secondType,
struct Data { struct Data {
Data() Data()
{ {
translationUnit.parse(); document.parse();
} }
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp")}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp")};
TranslationUnit translationUnit{filePath, Document document{filePath,
ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++14")}), ProjectPart(Utf8StringLiteral("projectPartId"),
{}, {Utf8StringLiteral("-std=c++14")}),
translationUnits}; {},
documents};
TranslationUnitCore translationUnitCore{filePath, TranslationUnitCore translationUnitCore{filePath,
translationUnit.translationUnitCore().cxIndex(), document.translationUnitCore().cxIndex(),
translationUnit.translationUnitCore().cxTranslationUnit()}; document.translationUnitCore().cxTranslationUnit()};
}; };
class HighlightingMarks : public ::testing::Test class HighlightingMarks : public ::testing::Test

View File

@@ -24,6 +24,8 @@
****************************************************************************/ ****************************************************************************/
#include <cursor.h> #include <cursor.h>
#include <clangdocument.h>
#include <clangdocuments.h>
#include <clangstring.h> #include <clangstring.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <projectpart.h> #include <projectpart.h>
@@ -31,8 +33,6 @@
#include <skippedsourceranges.h> #include <skippedsourceranges.h>
#include <sourcelocation.h> #include <sourcelocation.h>
#include <sourcerange.h> #include <sourcerange.h>
#include <clangtranslationunit.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <sourcerangecontainer.h> #include <sourcerangecontainer.h>
@@ -45,11 +45,11 @@
#include "gtest-qt-printing.h" #include "gtest-qt-printing.h"
using ClangBackEnd::Cursor; using ClangBackEnd::Cursor;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::Documents;
using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::TranslationUnitCore;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::TranslationUnits;
using ClangBackEnd::ClangString; using ClangBackEnd::ClangString;
using ClangBackEnd::SourceRange; using ClangBackEnd::SourceRange;
using ClangBackEnd::SkippedSourceRanges; using ClangBackEnd::SkippedSourceRanges;
@@ -88,21 +88,22 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
struct Data { struct Data {
Data() Data()
{ {
translationUnit.parse(); document.parse();
} }
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp"); Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp");
TranslationUnit translationUnit{filePath, Document document{filePath,
ProjectPart(Utf8StringLiteral("projectPartId"), ProjectPart(Utf8StringLiteral("projectPartId"),
{Utf8StringLiteral("-std=c++11"),Utf8StringLiteral("-DBLAH")}), {Utf8StringLiteral("-std=c++11"),
{}, Utf8StringLiteral("-DBLAH")}),
translationUnits}; {},
documents};
TranslationUnitCore translationUnitCore{filePath, TranslationUnitCore translationUnitCore{filePath,
translationUnit.translationUnitCore().cxIndex(), document.translationUnitCore().cxIndex(),
translationUnit.translationUnitCore().cxTranslationUnit()}; document.translationUnitCore().cxTranslationUnit()};
}; };
class SkippedSourceRanges : public ::testing::Test class SkippedSourceRanges : public ::testing::Test

View File

@@ -27,9 +27,9 @@
#include <diagnosticset.h> #include <diagnosticset.h>
#include <projectpart.h> #include <projectpart.h>
#include <projects.h> #include <projects.h>
#include <clangtranslationunit.h> #include <clangdocument.h>
#include <clangdocuments.h>
#include <clangtranslationunitcore.h> #include <clangtranslationunitcore.h>
#include <translationunits.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <sourcelocation.h> #include <sourcelocation.h>
@@ -44,7 +44,7 @@ using ClangBackEnd::Diagnostic;
using ClangBackEnd::DiagnosticSet; using ClangBackEnd::DiagnosticSet;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::SourceLocation; using ClangBackEnd::SourceLocation;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using testing::EndsWith; using testing::EndsWith;
@@ -53,8 +53,8 @@ using testing::Not;
namespace { namespace {
struct SourceLocationData { struct SourceLocationData {
SourceLocationData(TranslationUnit &translationUnit) SourceLocationData(Document &document)
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()} : diagnosticSet{document.translationUnitCore().diagnostics()}
, diagnostic{diagnosticSet.front()} , diagnostic{diagnosticSet.front()}
, sourceLocation{diagnostic.location()} , sourceLocation{diagnostic.location()}
{ {
@@ -68,18 +68,18 @@ struct SourceLocationData {
struct Data { struct Data {
Data() Data()
{ {
translationUnit.parse(); document.parse();
d.reset(new SourceLocationData(translationUnit)); d.reset(new SourceLocationData(document));
} }
ProjectPart projectPart{Utf8StringLiteral("projectPartId")}; ProjectPart projectPart{Utf8StringLiteral("projectPartId")};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"), Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"),
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
std::unique_ptr<SourceLocationData> d; std::unique_ptr<SourceLocationData> d;
}; };
@@ -91,7 +91,7 @@ public:
protected: protected:
static Data *d; static Data *d;
TranslationUnit &translationUnit = d->translationUnit; Document &document = d->document;
::SourceLocation &sourceLocation = d->d->sourceLocation; ::SourceLocation &sourceLocation = d->d->sourceLocation;
}; };
@@ -117,12 +117,12 @@ TEST_F(SourceLocation, Offset)
TEST_F(SourceLocation, Create) TEST_F(SourceLocation, Create)
{ {
ASSERT_THAT(translationUnit.translationUnitCore().sourceLocationAt(4, 1), sourceLocation); ASSERT_THAT(document.translationUnitCore().sourceLocationAt(4, 1), sourceLocation);
} }
TEST_F(SourceLocation, NotEqual) 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; Data *SourceLocation::d;

View File

@@ -27,8 +27,8 @@
#include <diagnostic.h> #include <diagnostic.h>
#include <diagnosticset.h> #include <diagnosticset.h>
#include <projectpart.h> #include <projectpart.h>
#include <clangtranslationunit.h> #include <clangdocument.h>
#include <translationunits.h> #include <clangdocuments.h>
#include <projects.h> #include <projects.h>
#include <unsavedfiles.h> #include <unsavedfiles.h>
#include <sourcerange.h> #include <sourcerange.h>
@@ -43,13 +43,13 @@
#include "gtest-qt-printing.h" #include "gtest-qt-printing.h"
using ClangBackEnd::DiagnosticSet; using ClangBackEnd::DiagnosticSet;
using ClangBackEnd::TranslationUnit; using ClangBackEnd::Document;
using ClangBackEnd::Documents;
using ClangBackEnd::TranslationUnitCore; using ClangBackEnd::TranslationUnitCore;
using ClangBackEnd::ProjectPart; using ClangBackEnd::ProjectPart;
using ClangBackEnd::UnsavedFiles; using ClangBackEnd::UnsavedFiles;
using ClangBackEnd::Diagnostic; using ClangBackEnd::Diagnostic;
using ClangBackEnd::SourceRange; using ClangBackEnd::SourceRange;
using ClangBackEnd::TranslationUnits;
using testing::PrintToString; using testing::PrintToString;
using testing::IsEmpty; using testing::IsEmpty;
@@ -75,8 +75,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
} }
struct SourceRangeData { struct SourceRangeData {
SourceRangeData(TranslationUnit &translationUnit) SourceRangeData(Document &document)
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()} : diagnosticSet{document.translationUnitCore().diagnostics()}
, diagnostic{diagnosticSet.front()} , diagnostic{diagnosticSet.front()}
, diagnosticWithFilteredOutInvalidRange{diagnosticSet.at(1)} , diagnosticWithFilteredOutInvalidRange{diagnosticSet.at(1)}
, sourceRange{diagnostic.ranges().front()} , sourceRange{diagnostic.ranges().front()}
@@ -92,22 +92,22 @@ struct SourceRangeData {
struct Data { struct Data {
Data() Data()
{ {
translationUnit.parse(); document.parse();
d.reset(new SourceRangeData(translationUnit)); d.reset(new SourceRangeData(document));
} }
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}};
ClangBackEnd::ProjectParts projects; ClangBackEnd::ProjectParts projects;
ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::UnsavedFiles unsavedFiles;
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles}; ClangBackEnd::Documents documents{projects, unsavedFiles};
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_range.cpp")}; Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_range.cpp")};
TranslationUnit translationUnit{filePath, Document document{filePath,
projectPart, projectPart,
Utf8StringVector(), Utf8StringVector(),
translationUnits}; documents};
TranslationUnitCore translationUnitCore{filePath, TranslationUnitCore translationUnitCore{filePath,
translationUnit.translationUnitCore().cxIndex(), document.translationUnitCore().cxIndex(),
translationUnit.translationUnitCore().cxTranslationUnit()}; document.translationUnitCore().cxTranslationUnit()};
std::unique_ptr<SourceRangeData> d; std::unique_ptr<SourceRangeData> d;
}; };

View File

@@ -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 <projectpart.h>
#include <projectpartsdonotexistexception.h>
#include <projects.h>
#include <translationunitdoesnotexistexception.h>
#include <translationunitalreadyexistsexception.h>
#include <translationunitfilenotexitexception.h>
#include <clangtranslationunit.h>
#include <translationunitisnullexception.h>
#include <translationunits.h>
#include <unsavedfiles.h>
#include <utf8string.h>
#include <clang-c/Index.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <gtest/gtest.h>
#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)});
}
}

View File

@@ -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 <clangfilepath.h>
#include <clangtranslationunitupdater.h>
#include <commandlinearguments.h>
#include <diagnosticset.h>
#include <highlightingmarks.h>
#include <filecontainer.h>
#include <projectpart.h>
#include <projectpartcontainer.h>
#include <projects.h>
#include <translationunitdoesnotexistexception.h>
#include <translationunitfilenotexitexception.h>
#include <clangtranslationunit.h>
#include <clangtranslationunitcore.h>
#include <translationunitisnullexception.h>
#include <translationunitparseerrorexception.h>
#include <translationunits.h>
#include <unsavedfiles.h>
#include <utf8string.h>
#include <clang-c/Index.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <gtest/gtest.h>
#include "gtest-qt-printing.h"
#include <QTemporaryFile>
#include <chrono>
#include <thread>
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{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();
}
}

View File

@@ -62,8 +62,8 @@ SOURCES += \
sqlitestatementtest.cpp \ sqlitestatementtest.cpp \
sqlitetabletest.cpp \ sqlitetabletest.cpp \
sqlstatementbuildertest.cpp \ sqlstatementbuildertest.cpp \
translationunitstest.cpp \ clangdocumenttest.cpp \
translationunittest.cpp \ clangdocumentstest.cpp \
unsavedfilestest.cpp \ unsavedfilestest.cpp \
senddocumenttrackertest.cpp \ senddocumenttrackertest.cpp \
cursortest.cpp \ cursortest.cpp \