forked from qt-creator/qt-creator
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:
@@ -10,7 +10,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \
|
||||
$$PWD/unsavedfile.h \
|
||||
$$PWD/unsavedfiles.h \
|
||||
$$PWD/projects.h \
|
||||
$$PWD/translationunits.h \
|
||||
$$PWD/clangdocuments.h \
|
||||
$$PWD/translationunitparseerrorexception.h \
|
||||
$$PWD/translationunitreparseerrorexception.h \
|
||||
$$PWD/projectpart.h \
|
||||
@@ -29,7 +29,7 @@ HEADERS += $$PWD/clangcodemodelserver.h \
|
||||
$$PWD/commandlinearguments.h \
|
||||
$$PWD/cursor.h \
|
||||
$$PWD/skippedsourceranges.h \
|
||||
$$PWD/clangtranslationunit.h \
|
||||
$$PWD/clangdocument.h \
|
||||
$$PWD/clangtranslationunitupdater.h \
|
||||
$$PWD/clangtype.h \
|
||||
$$PWD/highlightingmark.h \
|
||||
@@ -60,7 +60,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \
|
||||
$$PWD/unsavedfile.cpp \
|
||||
$$PWD/unsavedfiles.cpp \
|
||||
$$PWD/projects.cpp \
|
||||
$$PWD/translationunits.cpp \
|
||||
$$PWD/clangdocuments.cpp \
|
||||
$$PWD/translationunitparseerrorexception.cpp \
|
||||
$$PWD/translationunitreparseerrorexception.cpp \
|
||||
$$PWD/projectpart.cpp \
|
||||
@@ -78,7 +78,7 @@ SOURCES += $$PWD/clangcodemodelserver.cpp \
|
||||
$$PWD/commandlinearguments.cpp \
|
||||
$$PWD/cursor.cpp \
|
||||
$$PWD/skippedsourceranges.cpp \
|
||||
$$PWD/clangtranslationunit.cpp \
|
||||
$$PWD/clangdocument.cpp \
|
||||
$$PWD/clangtranslationunitupdater.cpp \
|
||||
$$PWD/clangtype.cpp \
|
||||
$$PWD/highlightingmark.cpp \
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "clangcodemodelserver.h"
|
||||
|
||||
#include "clangdocuments.h"
|
||||
#include "clangfilesystemwatcher.h"
|
||||
#include "codecompleter.h"
|
||||
#include "diagnosticset.h"
|
||||
@@ -35,7 +36,6 @@
|
||||
#include "translationunitfilenotexitexception.h"
|
||||
#include "translationunitisnullexception.h"
|
||||
#include "translationunitparseerrorexception.h"
|
||||
#include "translationunits.h"
|
||||
|
||||
#include <clangbackendipcdebugutils.h>
|
||||
#include <cmbcodecompletedmessage.h>
|
||||
@@ -85,7 +85,7 @@ int delayedDocumentAnnotationsTimerInterval()
|
||||
} // anonymous
|
||||
|
||||
ClangCodeModelServer::ClangCodeModelServer()
|
||||
: translationUnits(projects, unsavedFiles)
|
||||
: documents(projects, unsavedFiles)
|
||||
, updateDocumentAnnotationsTimeOutInMs(delayedDocumentAnnotationsTimerInterval())
|
||||
{
|
||||
updateDocumentAnnotationsTimer.setSingleShot(true);
|
||||
@@ -96,7 +96,7 @@ ClangCodeModelServer::ClangCodeModelServer()
|
||||
processJobsForDirtyAndVisibleDocuments();
|
||||
});
|
||||
|
||||
QObject::connect(translationUnits.clangFileSystemWatcher(),
|
||||
QObject::connect(documents.clangFileSystemWatcher(),
|
||||
&ClangFileSystemWatcher::fileChanged,
|
||||
[this](const Utf8String &filePath) {
|
||||
ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(filePath);
|
||||
@@ -113,10 +113,10 @@ void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd:
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor");
|
||||
|
||||
try {
|
||||
auto createdTranslationUnits = translationUnits.create(message.fileContainers());
|
||||
auto createdTranslationUnits = documents.create(message.fileContainers());
|
||||
unsavedFiles.createOrUpdate(message.fileContainers());
|
||||
translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath());
|
||||
translationUnits.setVisibleInEditors(message.visibleEditorFilePaths());
|
||||
documents.setUsedByCurrentEditor(message.currentEditorFilePath());
|
||||
documents.setVisibleInEditors(message.visibleEditorFilePaths());
|
||||
|
||||
processInitialJobsForDocuments(createdTranslationUnits);
|
||||
} catch (const ProjectPartDoNotExistException &exception) {
|
||||
@@ -131,9 +131,9 @@ void ClangCodeModelServer::updateTranslationUnitsForEditor(const UpdateTranslati
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::updateTranslationUnitsForEditor");
|
||||
|
||||
try {
|
||||
const auto newerFileContainers = translationUnits.newerFileContainers(message.fileContainers());
|
||||
const auto newerFileContainers = documents.newerFileContainers(message.fileContainers());
|
||||
if (newerFileContainers.size() > 0) {
|
||||
translationUnits.update(newerFileContainers);
|
||||
documents.update(newerFileContainers);
|
||||
unsavedFiles.createOrUpdate(newerFileContainers);
|
||||
|
||||
updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs);
|
||||
@@ -152,7 +152,7 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::unregisterTranslationUnitsForEditor");
|
||||
|
||||
try {
|
||||
translationUnits.remove(message.fileContainers());
|
||||
documents.remove(message.fileContainers());
|
||||
unsavedFiles.remove(message.fileContainers());
|
||||
} catch (const TranslationUnitDoesNotExistException &exception) {
|
||||
client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer()));
|
||||
@@ -169,7 +169,7 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa
|
||||
|
||||
try {
|
||||
projects.createOrUpdate(message.projectContainers());
|
||||
translationUnits.setTranslationUnitsDirtyIfProjectPartChanged();
|
||||
documents.setDocumentsDirtyIfProjectPartChanged();
|
||||
|
||||
processJobsForDirtyAndVisibleDocuments();
|
||||
} catch (const std::exception &exception) {
|
||||
@@ -196,7 +196,7 @@ void ClangCodeModelServer::registerUnsavedFilesForEditor(const RegisterUnsavedFi
|
||||
|
||||
try {
|
||||
unsavedFiles.createOrUpdate(message.fileContainers());
|
||||
translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers());
|
||||
documents.updateDocumentsWithChangedDependencies(message.fileContainers());
|
||||
|
||||
updateDocumentAnnotationsTimer.start(updateDocumentAnnotationsTimeOutInMs);
|
||||
} catch (const ProjectPartDoNotExistException &exception) {
|
||||
@@ -212,7 +212,7 @@ void ClangCodeModelServer::unregisterUnsavedFilesForEditor(const UnregisterUnsav
|
||||
|
||||
try {
|
||||
unsavedFiles.remove(message.fileContainers());
|
||||
translationUnits.updateTranslationUnitsWithChangedDependencies(message.fileContainers());
|
||||
documents.updateDocumentsWithChangedDependencies(message.fileContainers());
|
||||
} catch (const TranslationUnitDoesNotExistException &exception) {
|
||||
client()->translationUnitDoesNotExist(TranslationUnitDoesNotExistMessage(exception.fileContainer()));
|
||||
} catch (const ProjectPartDoNotExistException &exception) {
|
||||
@@ -227,10 +227,9 @@ void ClangCodeModelServer::completeCode(const ClangBackEnd::CompleteCodeMessage
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::completeCode");
|
||||
|
||||
try {
|
||||
auto translationUnit = translationUnits.translationUnit(message.filePath(),
|
||||
message.projectPartId());
|
||||
auto document = documents.document(message.filePath(), message.projectPartId());
|
||||
|
||||
JobRequest jobRequest = createJobRequest(translationUnit, JobRequest::Type::CompleteCode);
|
||||
JobRequest jobRequest = createJobRequest(document, JobRequest::Type::CompleteCode);
|
||||
jobRequest.line = message.line();
|
||||
jobRequest.column = message.column();
|
||||
jobRequest.ticketNumber = message.ticketNumber();
|
||||
@@ -251,10 +250,10 @@ void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnot
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::requestDocumentAnnotations");
|
||||
|
||||
try {
|
||||
auto translationUnit = translationUnits.translationUnit(message.fileContainer().filePath(),
|
||||
message.fileContainer().projectPartId());
|
||||
auto document = documents.document(message.fileContainer().filePath(),
|
||||
message.fileContainer().projectPartId());
|
||||
|
||||
const JobRequest jobRequest = createJobRequest(translationUnit,
|
||||
const JobRequest jobRequest = createJobRequest(document,
|
||||
JobRequest::Type::RequestDocumentAnnotations);
|
||||
|
||||
jobs().add(jobRequest);
|
||||
@@ -273,22 +272,22 @@ void ClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTran
|
||||
TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits");
|
||||
|
||||
try {
|
||||
translationUnits.setUsedByCurrentEditor(message.currentEditorFilePath());
|
||||
translationUnits.setVisibleInEditors(message.visibleEditorFilePaths());
|
||||
documents.setUsedByCurrentEditor(message.currentEditorFilePath());
|
||||
documents.setVisibleInEditors(message.visibleEditorFilePaths());
|
||||
updateDocumentAnnotationsTimer.start(0);
|
||||
} catch (const std::exception &exception) {
|
||||
qWarning() << "Error in ClangCodeModelServer::updateVisibleTranslationUnits:" << exception.what();
|
||||
}
|
||||
}
|
||||
|
||||
const TranslationUnits &ClangCodeModelServer::translationUnitsForTestOnly() const
|
||||
const Documents &ClangCodeModelServer::documentsForTestOnly() const
|
||||
{
|
||||
return translationUnits;
|
||||
return documents;
|
||||
}
|
||||
|
||||
void ClangCodeModelServer::startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath)
|
||||
{
|
||||
if (!translationUnits.hasTranslationUnitWithFilePath(filePath))
|
||||
if (!documents.hasDocumentWithFilePath(filePath))
|
||||
updateDocumentAnnotationsTimer.start(0);
|
||||
}
|
||||
|
||||
@@ -304,11 +303,9 @@ bool ClangCodeModelServer::isTimerRunningForTestOnly() const
|
||||
|
||||
void ClangCodeModelServer::addJobRequestsForDirtyAndVisibleDocuments()
|
||||
{
|
||||
for (const auto &translationUnit : translationUnits.translationUnits()) {
|
||||
if (translationUnit.isNeedingReparse() && translationUnit.isVisibleInEditor()) {
|
||||
jobs().add(createJobRequest(translationUnit,
|
||||
JobRequest::Type::UpdateDocumentAnnotations));
|
||||
}
|
||||
for (const auto &document : documents.documents()) {
|
||||
if (document.isNeedingReparse() && document.isVisibleInEditor())
|
||||
jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,30 +315,27 @@ void ClangCodeModelServer::processJobsForDirtyAndVisibleDocuments()
|
||||
jobs().process();
|
||||
}
|
||||
|
||||
void ClangCodeModelServer::processInitialJobsForDocuments(
|
||||
const std::vector<TranslationUnit> &translationUnits)
|
||||
void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector<Document> &documents)
|
||||
{
|
||||
for (const auto &translationUnit : translationUnits) {
|
||||
jobs().add(createJobRequest(translationUnit,
|
||||
JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobs().add(createJobRequest(translationUnit,
|
||||
JobRequest::Type::CreateInitialDocumentPreamble));
|
||||
for (const auto &document : documents) {
|
||||
jobs().add(createJobRequest(document, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobs().add(createJobRequest(document, JobRequest::Type::CreateInitialDocumentPreamble));
|
||||
}
|
||||
|
||||
jobs().process();
|
||||
}
|
||||
|
||||
JobRequest ClangCodeModelServer::createJobRequest(const TranslationUnit &translationUnit,
|
||||
JobRequest ClangCodeModelServer::createJobRequest(const Document &document,
|
||||
JobRequest::Type type) const
|
||||
{
|
||||
JobRequest jobRequest;
|
||||
jobRequest.type = type;
|
||||
jobRequest.requirements = JobRequest::requirementsForType(type);
|
||||
jobRequest.filePath = translationUnit.filePath();
|
||||
jobRequest.projectPartId = translationUnit.projectPartId();
|
||||
jobRequest.filePath = document.filePath();
|
||||
jobRequest.projectPartId = document.projectPartId();
|
||||
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
|
||||
jobRequest.documentRevision = translationUnit.documentRevision();
|
||||
const ProjectPart &projectPart = projects.project(translationUnit.projectPartId());
|
||||
jobRequest.documentRevision = document.documentRevision();
|
||||
const ProjectPart &projectPart = projects.project(document.projectPartId());
|
||||
jobRequest.projectChangeTimePoint = projectPart.lastChangeTimePoint();
|
||||
|
||||
return jobRequest;
|
||||
@@ -358,7 +352,7 @@ Jobs &ClangCodeModelServer::jobs()
|
||||
// Jobs needs a reference to the client, but the client is not known at
|
||||
// construction time of ClangCodeModelServer, so construct Jobs in a
|
||||
// lazy manner.
|
||||
jobs_.reset(new Jobs(translationUnits, unsavedFiles, projects, *client()));
|
||||
jobs_.reset(new Jobs(documents, unsavedFiles, projects, *client()));
|
||||
}
|
||||
|
||||
return *jobs_.data();
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
|
||||
#include "projectpart.h"
|
||||
#include "projects.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "translationunits.h"
|
||||
#include "clangdocument.h"
|
||||
#include "clangdocuments.h"
|
||||
#include "unsavedfiles.h"
|
||||
#include "clangjobs.h"
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override;
|
||||
|
||||
public /*for tests*/:
|
||||
const TranslationUnits &translationUnitsForTestOnly() const;
|
||||
const Documents &documentsForTestOnly() const;
|
||||
const Jobs &jobsForTestOnly();
|
||||
bool isTimerRunningForTestOnly() const;
|
||||
void setUpdateDocumentAnnotationsTimeOutInMsForTestsOnly(int value);
|
||||
@@ -70,15 +70,14 @@ private:
|
||||
void startDocumentAnnotationsTimerIfFileIsNotATranslationUnit(const Utf8String &filePath);
|
||||
void addJobRequestsForDirtyAndVisibleDocuments();
|
||||
void processJobsForDirtyAndVisibleDocuments();
|
||||
void processInitialJobsForDocuments(const std::vector<TranslationUnit> &translationUnits);
|
||||
void processInitialJobsForDocuments(const std::vector<Document> &documents);
|
||||
|
||||
JobRequest createJobRequest(const TranslationUnit &translationUnit,
|
||||
JobRequest::Type type) const;
|
||||
JobRequest createJobRequest(const Document &document, JobRequest::Type type) const;
|
||||
|
||||
private:
|
||||
ProjectParts projects;
|
||||
UnsavedFiles unsavedFiles;
|
||||
TranslationUnits translationUnits;
|
||||
Documents documents;
|
||||
QScopedPointer<Jobs> jobs_;
|
||||
|
||||
QTimer updateDocumentAnnotationsTimer;
|
||||
|
||||
@@ -61,9 +61,9 @@ bool CompleteCodeJob::prepareAsyncRun()
|
||||
QTC_ASSERT(jobRequest.type == JobRequest::Type::CompleteCode, return false);
|
||||
|
||||
try {
|
||||
m_pinnedTranslationUnit = context().translationUnitForJobRequest();
|
||||
m_pinnedDocument = context().documentForJobRequest();
|
||||
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore();
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
|
||||
const UnsavedFiles unsavedFiles = *context().unsavedFiles;
|
||||
const quint32 line = jobRequest.line;
|
||||
const quint32 column = jobRequest.column;
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "clangasyncjob.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
|
||||
#include <clangbackendipc/codecompletion.h>
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
void finalizeAsyncRun() override;
|
||||
|
||||
private:
|
||||
TranslationUnit m_pinnedTranslationUnit;
|
||||
Document m_pinnedDocument;
|
||||
};
|
||||
|
||||
} // namespace ClangBackEnd
|
||||
|
||||
@@ -49,11 +49,11 @@ bool CreateInitialDocumentPreambleJob::prepareAsyncRun()
|
||||
QTC_ASSERT(jobRequest.type == JobRequest::Type::CreateInitialDocumentPreamble, return false);
|
||||
|
||||
try {
|
||||
m_pinnedTranslationUnit = context().translationUnitForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer();
|
||||
m_pinnedDocument = context().documentForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedDocument.fileContainer();
|
||||
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore();
|
||||
const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput();
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
|
||||
const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput();
|
||||
setRunner([translationUnitCore, updateInput]() {
|
||||
return runAsyncHelper(translationUnitCore, updateInput);
|
||||
});
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "clangasyncjob.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
void finalizeAsyncRun() override;
|
||||
|
||||
private:
|
||||
TranslationUnit m_pinnedTranslationUnit;
|
||||
Document m_pinnedDocument;
|
||||
FileContainer m_pinnedFileContainer;
|
||||
};
|
||||
|
||||
|
||||
@@ -23,8 +23,9 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
|
||||
#include "clangdocuments.h"
|
||||
#include "clangstring.h"
|
||||
#include "clangunsavedfilesshallowarguments.h"
|
||||
#include "codecompleter.h"
|
||||
@@ -35,7 +36,6 @@
|
||||
#include "translationunitreparseerrorexception.h"
|
||||
#include "clangtranslationunitcore.h"
|
||||
#include "clangtranslationunitupdater.h"
|
||||
#include "translationunits.h"
|
||||
#include "unsavedfiles.h"
|
||||
#include "unsavedfile.h"
|
||||
|
||||
@@ -49,17 +49,17 @@
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class TranslationUnitData
|
||||
class DocumentData
|
||||
{
|
||||
public:
|
||||
TranslationUnitData(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
TranslationUnits &translationUnits);
|
||||
~TranslationUnitData();
|
||||
DocumentData(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
Documents &documents);
|
||||
~DocumentData();
|
||||
|
||||
public:
|
||||
TranslationUnits &translationUnits;
|
||||
Documents &documents;
|
||||
|
||||
const Utf8String filePath;
|
||||
const Utf8StringVector fileArguments;
|
||||
@@ -80,11 +80,11 @@ public:
|
||||
bool isVisibleInEditor = false;
|
||||
};
|
||||
|
||||
TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
TranslationUnits &translationUnits)
|
||||
: translationUnits(translationUnits),
|
||||
DocumentData::DocumentData(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
Documents &documents)
|
||||
: documents(documents),
|
||||
filePath(filePath),
|
||||
fileArguments(fileArguments),
|
||||
projectPart(projectPart),
|
||||
@@ -94,74 +94,74 @@ TranslationUnitData::TranslationUnitData(const Utf8String &filePath,
|
||||
dependedFilePaths.insert(filePath);
|
||||
}
|
||||
|
||||
TranslationUnitData::~TranslationUnitData()
|
||||
DocumentData::~DocumentData()
|
||||
{
|
||||
clang_disposeTranslationUnit(translationUnit);
|
||||
clang_disposeIndex(index);
|
||||
}
|
||||
|
||||
TranslationUnit::TranslationUnit(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
TranslationUnits &translationUnits,
|
||||
FileExistsCheck fileExistsCheck)
|
||||
: d(std::make_shared<TranslationUnitData>(filePath,
|
||||
projectPart,
|
||||
fileArguments,
|
||||
translationUnits))
|
||||
Document::Document(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
Documents &documents,
|
||||
FileExistsCheck fileExistsCheck)
|
||||
: d(std::make_shared<DocumentData>(filePath,
|
||||
projectPart,
|
||||
fileArguments,
|
||||
documents))
|
||||
{
|
||||
if (fileExistsCheck == CheckIfFileExists)
|
||||
checkIfFileExists();
|
||||
}
|
||||
|
||||
TranslationUnit::~TranslationUnit() = default;
|
||||
TranslationUnit::TranslationUnit(const TranslationUnit &) = default;
|
||||
TranslationUnit &TranslationUnit::operator=(const TranslationUnit &) = default;
|
||||
Document::~Document() = default;
|
||||
Document::Document(const Document &) = default;
|
||||
Document &Document::operator=(const Document &) = default;
|
||||
|
||||
TranslationUnit::TranslationUnit(TranslationUnit &&other)
|
||||
Document::Document(Document &&other)
|
||||
: d(std::move(other.d))
|
||||
{
|
||||
}
|
||||
|
||||
TranslationUnit &TranslationUnit::operator=(TranslationUnit &&other)
|
||||
Document &Document::operator=(Document &&other)
|
||||
{
|
||||
d = std::move(other.d);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
void TranslationUnit::reset()
|
||||
void Document::reset()
|
||||
{
|
||||
d.reset();
|
||||
}
|
||||
|
||||
bool TranslationUnit::isNull() const
|
||||
bool Document::isNull() const
|
||||
{
|
||||
return !d;
|
||||
}
|
||||
|
||||
bool TranslationUnit::isIntact() const
|
||||
bool Document::isIntact() const
|
||||
{
|
||||
return !isNull()
|
||||
&& fileExists()
|
||||
&& !d->hasParseOrReparseFailed;
|
||||
}
|
||||
|
||||
Utf8String TranslationUnit::filePath() const
|
||||
Utf8String Document::filePath() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->filePath;
|
||||
}
|
||||
|
||||
Utf8StringVector TranslationUnit::fileArguments() const
|
||||
Utf8StringVector Document::fileArguments() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->fileArguments;
|
||||
}
|
||||
|
||||
FileContainer TranslationUnit::fileContainer() const
|
||||
FileContainer Document::fileContainer() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
@@ -172,103 +172,103 @@ FileContainer TranslationUnit::fileContainer() const
|
||||
d->documentRevision);
|
||||
}
|
||||
|
||||
Utf8String TranslationUnit::projectPartId() const
|
||||
Utf8String Document::projectPartId() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->projectPart.projectPartId();
|
||||
}
|
||||
|
||||
const ProjectPart &TranslationUnit::projectPart() const
|
||||
const ProjectPart &Document::projectPart() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->projectPart;
|
||||
}
|
||||
|
||||
const time_point TranslationUnit::lastProjectPartChangeTimePoint() const
|
||||
const time_point Document::lastProjectPartChangeTimePoint() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->lastProjectPartChangeTimePoint;
|
||||
}
|
||||
|
||||
bool TranslationUnit::isProjectPartOutdated() const
|
||||
bool Document::isProjectPartOutdated() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->projectPart.lastChangeTimePoint() >= d->lastProjectPartChangeTimePoint;
|
||||
}
|
||||
|
||||
uint TranslationUnit::documentRevision() const
|
||||
uint Document::documentRevision() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->documentRevision;
|
||||
}
|
||||
|
||||
void TranslationUnit::setDocumentRevision(uint revision)
|
||||
void Document::setDocumentRevision(uint revision)
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
d->documentRevision = revision;
|
||||
}
|
||||
|
||||
bool TranslationUnit::isUsedByCurrentEditor() const
|
||||
bool Document::isUsedByCurrentEditor() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->isUsedByCurrentEditor;
|
||||
}
|
||||
|
||||
void TranslationUnit::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor)
|
||||
void Document::setIsUsedByCurrentEditor(bool isUsedByCurrentEditor)
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
d->isUsedByCurrentEditor = isUsedByCurrentEditor;
|
||||
}
|
||||
|
||||
bool TranslationUnit::isVisibleInEditor() const
|
||||
bool Document::isVisibleInEditor() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->isVisibleInEditor;
|
||||
}
|
||||
|
||||
void TranslationUnit::setIsVisibleInEditor(bool isVisibleInEditor)
|
||||
void Document::setIsVisibleInEditor(bool isVisibleInEditor)
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
d->isVisibleInEditor = isVisibleInEditor;
|
||||
}
|
||||
|
||||
time_point TranslationUnit::isNeededReparseChangeTimePoint() const
|
||||
time_point Document::isNeededReparseChangeTimePoint() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->needsToBeReparsedChangeTimePoint;
|
||||
}
|
||||
|
||||
bool TranslationUnit::isNeedingReparse() const
|
||||
bool Document::isNeedingReparse() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return d->needsToBeReparsed;
|
||||
}
|
||||
|
||||
void TranslationUnit::setDirtyIfProjectPartIsOutdated()
|
||||
void Document::setDirtyIfProjectPartIsOutdated()
|
||||
{
|
||||
if (isProjectPartOutdated())
|
||||
setDirty();
|
||||
}
|
||||
|
||||
void TranslationUnit::setDirtyIfDependencyIsMet(const Utf8String &filePath)
|
||||
void Document::setDirtyIfDependencyIsMet(const Utf8String &filePath)
|
||||
{
|
||||
if (d->dependedFilePaths.contains(filePath) && isMainFileAndExistsOrIsOtherFile(filePath))
|
||||
setDirty();
|
||||
}
|
||||
|
||||
TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const
|
||||
TranslationUnitUpdateInput Document::createUpdateInput() const
|
||||
{
|
||||
TranslationUnitUpdateInput updateInput;
|
||||
updateInput.parseNeeded = isProjectPartOutdated();
|
||||
@@ -276,14 +276,14 @@ TranslationUnitUpdateInput TranslationUnit::createUpdateInput() const
|
||||
updateInput.needsToBeReparsedChangeTimePoint = d->needsToBeReparsedChangeTimePoint;
|
||||
updateInput.filePath = filePath();
|
||||
updateInput.fileArguments = fileArguments();
|
||||
updateInput.unsavedFiles = d->translationUnits.unsavedFiles();
|
||||
updateInput.unsavedFiles = d->documents.unsavedFiles();
|
||||
updateInput.projectId = projectPart().projectPartId();
|
||||
updateInput.projectArguments = projectPart().arguments();
|
||||
|
||||
return updateInput;
|
||||
}
|
||||
|
||||
TranslationUnitUpdater TranslationUnit::createUpdater() const
|
||||
TranslationUnitUpdater Document::createUpdater() const
|
||||
{
|
||||
const TranslationUnitUpdateInput updateInput = createUpdateInput();
|
||||
TranslationUnitUpdater updater(d->index, d->translationUnit, updateInput);
|
||||
@@ -291,12 +291,12 @@ TranslationUnitUpdater TranslationUnit::createUpdater() const
|
||||
return updater;
|
||||
}
|
||||
|
||||
void TranslationUnit::setHasParseOrReparseFailed(bool hasFailed)
|
||||
void Document::setHasParseOrReparseFailed(bool hasFailed)
|
||||
{
|
||||
d->hasParseOrReparseFailed = hasFailed;
|
||||
}
|
||||
|
||||
void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const
|
||||
void Document::incorporateUpdaterResult(const TranslationUnitUpdateResult &result) const
|
||||
{
|
||||
d->hasParseOrReparseFailed = result.hasParseOrReparseFailed;
|
||||
if (d->hasParseOrReparseFailed) {
|
||||
@@ -310,7 +310,7 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult
|
||||
if (result.parseTimePointIsSet || result.reparsed)
|
||||
d->dependedFilePaths = result.dependedOnFilePaths;
|
||||
|
||||
d->translationUnits.addWatchedFiles(d->dependedFilePaths);
|
||||
d->documents.addWatchedFiles(d->dependedFilePaths);
|
||||
|
||||
if (result.reparsed
|
||||
&& result.needsToBeReparsedChangeTimePoint == d->needsToBeReparsedChangeTimePoint) {
|
||||
@@ -318,14 +318,14 @@ void TranslationUnit::incorporateUpdaterResult(const TranslationUnitUpdateResult
|
||||
}
|
||||
}
|
||||
|
||||
TranslationUnitCore TranslationUnit::translationUnitCore() const
|
||||
TranslationUnitCore Document::translationUnitCore() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
return TranslationUnitCore(d->filePath, d->index, d->translationUnit);
|
||||
}
|
||||
|
||||
void TranslationUnit::parse() const
|
||||
void Document::parse() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
@@ -335,7 +335,7 @@ void TranslationUnit::parse() const
|
||||
incorporateUpdaterResult(result);
|
||||
}
|
||||
|
||||
void TranslationUnit::reparse() const
|
||||
void Document::reparse() const
|
||||
{
|
||||
checkIfNull();
|
||||
|
||||
@@ -345,7 +345,7 @@ void TranslationUnit::reparse() const
|
||||
incorporateUpdaterResult(result);
|
||||
}
|
||||
|
||||
const QSet<Utf8String> TranslationUnit::dependedFilePaths() const
|
||||
const QSet<Utf8String> Document::dependedFilePaths() const
|
||||
{
|
||||
checkIfNull();
|
||||
checkIfFileExists();
|
||||
@@ -353,30 +353,30 @@ const QSet<Utf8String> TranslationUnit::dependedFilePaths() const
|
||||
return d->dependedFilePaths;
|
||||
}
|
||||
|
||||
void TranslationUnit::setDirty()
|
||||
void Document::setDirty()
|
||||
{
|
||||
d->needsToBeReparsedChangeTimePoint = std::chrono::steady_clock::now();
|
||||
d->needsToBeReparsed = true;
|
||||
}
|
||||
|
||||
void TranslationUnit::checkIfNull() const
|
||||
void Document::checkIfNull() const
|
||||
{
|
||||
if (isNull())
|
||||
throw TranslationUnitIsNullException();
|
||||
}
|
||||
|
||||
void TranslationUnit::checkIfFileExists() const
|
||||
void Document::checkIfFileExists() const
|
||||
{
|
||||
if (!fileExists())
|
||||
throw TranslationUnitFileNotExitsException(d->filePath);
|
||||
}
|
||||
|
||||
bool TranslationUnit::fileExists() const
|
||||
bool Document::fileExists() const
|
||||
{
|
||||
return QFileInfo::exists(d->filePath.toString());
|
||||
}
|
||||
|
||||
bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const
|
||||
bool Document::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const
|
||||
{
|
||||
if (filePath == d->filePath)
|
||||
return QFileInfo::exists(d->filePath);
|
||||
@@ -384,17 +384,17 @@ bool TranslationUnit::isMainFileAndExistsOrIsOtherFile(const Utf8String &filePat
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator==(const TranslationUnit &first, const TranslationUnit &second)
|
||||
bool operator==(const Document &first, const Document &second)
|
||||
{
|
||||
return first.filePath() == second.filePath() && first.projectPartId() == second.projectPartId();
|
||||
}
|
||||
|
||||
void PrintTo(const TranslationUnit &translationUnit, ::std::ostream *os)
|
||||
void PrintTo(const Document &document, ::std::ostream *os)
|
||||
{
|
||||
*os << "TranslationUnit("
|
||||
<< translationUnit.filePath().constData() << ", "
|
||||
<< translationUnit.projectPartId().constData() << ", "
|
||||
<< translationUnit.documentRevision() << ")";
|
||||
*os << "Document("
|
||||
<< document.filePath().constData() << ", "
|
||||
<< document.projectPartId().constData() << ", "
|
||||
<< document.documentRevision() << ")";
|
||||
}
|
||||
|
||||
} // namespace ClangBackEnd
|
||||
@@ -44,15 +44,15 @@ class Utf8String;
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class TranslationUnitCore;
|
||||
class TranslationUnitData;
|
||||
class DocumentData;
|
||||
class TranslationUnitUpdateResult;
|
||||
class ProjectPart;
|
||||
class FileContainer;
|
||||
class TranslationUnits;
|
||||
class Documents;
|
||||
|
||||
using time_point = std::chrono::steady_clock::time_point;
|
||||
|
||||
class TranslationUnit
|
||||
class Document
|
||||
{
|
||||
public:
|
||||
enum FileExistsCheck {
|
||||
@@ -60,19 +60,19 @@ public:
|
||||
DoNotCheckIfFileExists
|
||||
};
|
||||
|
||||
TranslationUnit() = default;
|
||||
TranslationUnit(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
TranslationUnits &translationUnits,
|
||||
FileExistsCheck fileExistsCheck = CheckIfFileExists);
|
||||
~TranslationUnit();
|
||||
Document() = default;
|
||||
Document(const Utf8String &filePath,
|
||||
const ProjectPart &projectPart,
|
||||
const Utf8StringVector &fileArguments,
|
||||
Documents &documents,
|
||||
FileExistsCheck fileExistsCheck = CheckIfFileExists);
|
||||
~Document();
|
||||
|
||||
TranslationUnit(const TranslationUnit &cxTranslationUnit);
|
||||
TranslationUnit &operator=(const TranslationUnit &cxTranslationUnit);
|
||||
Document(const Document &cxTranslationUnit);
|
||||
Document &operator=(const Document &cxTranslationUnit);
|
||||
|
||||
TranslationUnit(TranslationUnit &&cxTranslationUnit);
|
||||
TranslationUnit &operator=(TranslationUnit &&cxTranslationUnit);
|
||||
Document(Document &&cxTranslationUnit);
|
||||
Document &operator=(Document &&cxTranslationUnit);
|
||||
|
||||
void reset();
|
||||
|
||||
@@ -124,9 +124,9 @@ private:
|
||||
bool isMainFileAndExistsOrIsOtherFile(const Utf8String &filePath) const;
|
||||
|
||||
private:
|
||||
mutable std::shared_ptr<TranslationUnitData> d;
|
||||
mutable std::shared_ptr<DocumentData> d;
|
||||
};
|
||||
|
||||
bool operator==(const TranslationUnit &first, const TranslationUnit &second);
|
||||
void PrintTo(const TranslationUnit &translationUnit, ::std::ostream *os);
|
||||
bool operator==(const Document &first, const Document &second);
|
||||
void PrintTo(const Document &document, ::std::ostream *os);
|
||||
} // namespace ClangBackEnd
|
||||
311
src/tools/clangbackend/ipcsource/clangdocuments.cpp
Normal file
311
src/tools/clangbackend/ipcsource/clangdocuments.cpp
Normal 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
|
||||
@@ -25,8 +25,8 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "clangdocument.h"
|
||||
#include "clangfilesystemwatcher.h"
|
||||
#include "clangtranslationunit.h"
|
||||
|
||||
#include <filecontainer.h>
|
||||
|
||||
@@ -39,54 +39,54 @@ namespace ClangBackEnd {
|
||||
class ProjectParts;
|
||||
class UnsavedFiles;
|
||||
|
||||
class TranslationUnits
|
||||
class Documents
|
||||
{
|
||||
public:
|
||||
TranslationUnits(ProjectParts &projectParts, UnsavedFiles &unsavedFiles);
|
||||
Documents(ProjectParts &projectParts, UnsavedFiles &unsavedFiles);
|
||||
|
||||
std::vector<TranslationUnit> create(const QVector<FileContainer> &fileContainers);
|
||||
std::vector<Document> create(const QVector<FileContainer> &fileContainers);
|
||||
void update(const QVector<FileContainer> &fileContainers);
|
||||
void remove(const QVector<FileContainer> &fileContainers);
|
||||
|
||||
void setUsedByCurrentEditor(const Utf8String &filePath);
|
||||
void setVisibleInEditors(const Utf8StringVector &filePaths);
|
||||
|
||||
const TranslationUnit &translationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
const TranslationUnit &translationUnit(const FileContainer &fileContainer) const;
|
||||
bool hasTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
bool hasTranslationUnitWithFilePath(const Utf8String &filePath) const;
|
||||
const Document &document(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
const Document &document(const FileContainer &fileContainer) const;
|
||||
bool hasDocument(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
bool hasDocumentWithFilePath(const Utf8String &filePath) const;
|
||||
|
||||
const std::vector<TranslationUnit> &translationUnits() const;
|
||||
const std::vector<Document> &documents() const;
|
||||
|
||||
UnsavedFiles unsavedFiles() const;
|
||||
|
||||
void addWatchedFiles(QSet<Utf8String> &filePaths);
|
||||
|
||||
void updateTranslationUnitsWithChangedDependency(const Utf8String &filePath);
|
||||
void updateTranslationUnitsWithChangedDependencies(const QVector<FileContainer> &fileContainers);
|
||||
void setTranslationUnitsDirtyIfProjectPartChanged();
|
||||
void updateDocumentsWithChangedDependency(const Utf8String &filePath);
|
||||
void updateDocumentsWithChangedDependencies(const QVector<FileContainer> &fileContainers);
|
||||
void setDocumentsDirtyIfProjectPartChanged();
|
||||
|
||||
QVector<FileContainer> newerFileContainers(const QVector<FileContainer> &fileContainers) const;
|
||||
|
||||
const ClangFileSystemWatcher *clangFileSystemWatcher() const;
|
||||
|
||||
private:
|
||||
TranslationUnit createTranslationUnit(const FileContainer &fileContainer);
|
||||
void updateTranslationUnit(const FileContainer &fileContainer);
|
||||
std::vector<TranslationUnit>::iterator findTranslationUnit(const FileContainer &fileContainer);
|
||||
std::vector<TranslationUnit> findAllTranslationUnitWithFilePath(const Utf8String &filePath);
|
||||
std::vector<TranslationUnit>::const_iterator findTranslationUnit(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
bool hasTranslationUnit(const FileContainer &fileContainer) const;
|
||||
Document createDocument(const FileContainer &fileContainer);
|
||||
void updateDocument(const FileContainer &fileContainer);
|
||||
std::vector<Document>::iterator findDocument(const FileContainer &fileContainer);
|
||||
std::vector<Document> findAllDocumentsWithFilePath(const Utf8String &filePath);
|
||||
std::vector<Document>::const_iterator findDocument(const Utf8String &filePath, const Utf8String &projectPartId) const;
|
||||
bool hasDocument(const FileContainer &fileContainer) const;
|
||||
void checkIfProjectPartExists(const Utf8String &projectFileName) const;
|
||||
void checkIfProjectPartsExists(const QVector<FileContainer> &fileContainers) const;
|
||||
void checkIfTranslationUnitsDoesNotExists(const QVector<FileContainer> &fileContainers) const;
|
||||
void checkIfTranslationUnitsForFilePathsDoesExists(const QVector<FileContainer> &fileContainers) const;
|
||||
void checkIfDocumentsDoNotExist(const QVector<FileContainer> &fileContainers) const;
|
||||
void checkIfDocumentsForFilePathsExist(const QVector<FileContainer> &fileContainers) const;
|
||||
|
||||
void removeTranslationUnits(const QVector<FileContainer> &fileContainers);
|
||||
void removeDocuments(const QVector<FileContainer> &fileContainers);
|
||||
|
||||
private:
|
||||
ClangFileSystemWatcher fileSystemWatcher;
|
||||
std::vector<TranslationUnit> translationUnits_;
|
||||
std::vector<Document> documents_;
|
||||
ProjectParts &projectParts;
|
||||
UnsavedFiles &unsavedFiles_;
|
||||
};
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
#include "clangfilesystemwatcher.h"
|
||||
|
||||
#include "translationunits.h"
|
||||
#include "clangdocuments.h"
|
||||
|
||||
#include <utf8stringvector.h>
|
||||
|
||||
@@ -64,8 +64,8 @@ QStringList filterExistingFiles(QStringList &&filePaths)
|
||||
}
|
||||
}
|
||||
|
||||
ClangFileSystemWatcher::ClangFileSystemWatcher(TranslationUnits &translationUnits)
|
||||
: translationUnits(translationUnits)
|
||||
ClangFileSystemWatcher::ClangFileSystemWatcher(Documents &documents)
|
||||
: documents(documents)
|
||||
{
|
||||
connect(&watcher,
|
||||
&QFileSystemWatcher::fileChanged,
|
||||
@@ -83,7 +83,7 @@ void ClangFileSystemWatcher::addFiles(const QSet<Utf8String> &filePaths)
|
||||
|
||||
void ClangFileSystemWatcher::updateTranslationUnitsWithChangedDependencies(const QString &filePath)
|
||||
{
|
||||
translationUnits.updateTranslationUnitsWithChangedDependency(filePath);
|
||||
documents.updateDocumentsWithChangedDependency(filePath);
|
||||
|
||||
emit fileChanged(filePath);
|
||||
}
|
||||
|
||||
@@ -32,14 +32,14 @@ class Utf8String;
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class TranslationUnits;
|
||||
class Documents;
|
||||
|
||||
class ClangFileSystemWatcher : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
ClangFileSystemWatcher(TranslationUnits &translationUnits);
|
||||
ClangFileSystemWatcher(Documents &documents);
|
||||
|
||||
void addFiles(const QSet<Utf8String> &filePaths);
|
||||
|
||||
@@ -51,7 +51,7 @@ private:
|
||||
|
||||
private:
|
||||
QFileSystemWatcher watcher;
|
||||
TranslationUnits &translationUnits;
|
||||
Documents &documents;
|
||||
};
|
||||
|
||||
} // namespace ClangBackEnd
|
||||
|
||||
@@ -25,24 +25,24 @@
|
||||
|
||||
#include "clangiasyncjob.h"
|
||||
|
||||
#include "translationunits.h"
|
||||
#include "clangdocuments.h"
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
JobContext::JobContext(const JobRequest &jobRequest,
|
||||
TranslationUnits *translationUnits,
|
||||
Documents *documents,
|
||||
UnsavedFiles *unsavedFiles,
|
||||
ClangCodeModelClientInterface *clientInterface)
|
||||
: jobRequest(jobRequest)
|
||||
, translationUnits(translationUnits)
|
||||
, documents(documents)
|
||||
, unsavedFiles(unsavedFiles)
|
||||
, client(clientInterface)
|
||||
{
|
||||
}
|
||||
|
||||
TranslationUnit JobContext::translationUnitForJobRequest() const
|
||||
Document JobContext::documentForJobRequest() const
|
||||
{
|
||||
return translationUnits->translationUnit(jobRequest.filePath, jobRequest.projectPartId);
|
||||
return documents->document(jobRequest.filePath, jobRequest.projectPartId);
|
||||
}
|
||||
|
||||
bool JobContext::isOutdated() const
|
||||
@@ -53,7 +53,7 @@ bool JobContext::isOutdated() const
|
||||
bool JobContext::isDocumentOpen() const
|
||||
{
|
||||
const bool hasTranslationUnit
|
||||
= translationUnits->hasTranslationUnit(jobRequest.filePath, jobRequest.projectPartId);
|
||||
= documents->hasDocument(jobRequest.filePath, jobRequest.projectPartId);
|
||||
|
||||
if (!hasTranslationUnit)
|
||||
qCDebug(jobsLog) << "Document already closed for results of" << jobRequest;
|
||||
@@ -63,9 +63,8 @@ bool JobContext::isDocumentOpen() const
|
||||
|
||||
bool JobContext::documentRevisionChanged() const
|
||||
{
|
||||
const TranslationUnit &translationUnit
|
||||
= translationUnits->translationUnit(jobRequest.filePath, jobRequest.projectPartId);
|
||||
const bool revisionChanged = translationUnit.documentRevision() != jobRequest.documentRevision;
|
||||
const Document &document = documents->document(jobRequest.filePath, jobRequest.projectPartId);
|
||||
const bool revisionChanged = document.documentRevision() != jobRequest.documentRevision;
|
||||
|
||||
if (revisionChanged)
|
||||
qCDebug(jobsLog) << "Document revision changed for results of" << jobRequest;
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class ClangCodeModelClientInterface;
|
||||
class TranslationUnit;
|
||||
class TranslationUnits;
|
||||
class Document;
|
||||
class Documents;
|
||||
class UnsavedFiles;
|
||||
|
||||
class JobContext
|
||||
@@ -39,11 +39,11 @@ class JobContext
|
||||
public:
|
||||
JobContext() = default;
|
||||
JobContext(const JobRequest &jobRequest,
|
||||
TranslationUnits *translationUnits,
|
||||
Documents *documents,
|
||||
UnsavedFiles *unsavedFiles,
|
||||
ClangCodeModelClientInterface *client);
|
||||
|
||||
TranslationUnit translationUnitForJobRequest() const;
|
||||
Document documentForJobRequest() const;
|
||||
|
||||
bool isOutdated() const;
|
||||
bool isDocumentOpen() const;
|
||||
@@ -51,7 +51,7 @@ public:
|
||||
|
||||
public:
|
||||
JobRequest jobRequest;
|
||||
TranslationUnits *translationUnits = nullptr;
|
||||
Documents *documents = nullptr;
|
||||
UnsavedFiles *unsavedFiles = nullptr;
|
||||
ClangCodeModelClientInterface *client = nullptr;
|
||||
};
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
|
||||
#include "clangiasyncjob.h"
|
||||
#include "clangjobqueue.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "translationunits.h"
|
||||
#include "clangdocument.h"
|
||||
#include "clangdocuments.h"
|
||||
#include "projects.h"
|
||||
#include "unsavedfiles.h"
|
||||
|
||||
@@ -34,8 +34,8 @@
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
JobQueue::JobQueue(TranslationUnits &translationUnits, ProjectParts &projectParts)
|
||||
: m_translationUnits(translationUnits)
|
||||
JobQueue::JobQueue(Documents &documents, ProjectParts &projectParts)
|
||||
: m_documents(documents)
|
||||
, m_projectParts(projectParts)
|
||||
{
|
||||
}
|
||||
@@ -81,7 +81,7 @@ void JobQueue::removeOutDatedRequests()
|
||||
bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
|
||||
{
|
||||
const JobRequest::Requirements requirements = jobRequest.requirements;
|
||||
const UnsavedFiles unsavedFiles = m_translationUnits.unsavedFiles();
|
||||
const UnsavedFiles unsavedFiles = m_documents.unsavedFiles();
|
||||
|
||||
if (requirements.testFlag(JobRequest::CurrentUnsavedFiles)) {
|
||||
if (jobRequest.unsavedFilesChangeTimePoint != unsavedFiles.lastChangeTimePoint()) {
|
||||
@@ -93,7 +93,7 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
|
||||
bool projectCheckedAndItExists = false;
|
||||
|
||||
if (requirements.testFlag(JobRequest::DocumentValid)) {
|
||||
if (!m_translationUnits.hasTranslationUnit(jobRequest.filePath, jobRequest.projectPartId)) {
|
||||
if (!m_documents.hasDocument(jobRequest.filePath, jobRequest.projectPartId)) {
|
||||
qCDebug(jobsLog) << "Removing due to already closed document:" << jobRequest;
|
||||
return true;
|
||||
}
|
||||
@@ -104,15 +104,15 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
|
||||
}
|
||||
projectCheckedAndItExists = true;
|
||||
|
||||
const TranslationUnit translationUnit
|
||||
= m_translationUnits.translationUnit(jobRequest.filePath, jobRequest.projectPartId);
|
||||
if (!translationUnit.isIntact()) {
|
||||
const Document document
|
||||
= m_documents.document(jobRequest.filePath, jobRequest.projectPartId);
|
||||
if (!document.isIntact()) {
|
||||
qCDebug(jobsLog) << "Removing due to not intact translation unit:" << jobRequest;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (requirements.testFlag(JobRequest::CurrentDocumentRevision)) {
|
||||
if (translationUnit.documentRevision() != jobRequest.documentRevision) {
|
||||
if (document.documentRevision() != jobRequest.documentRevision) {
|
||||
qCDebug(jobsLog) << "Removing due to changed document revision:" << jobRequest;
|
||||
return true;
|
||||
}
|
||||
@@ -135,14 +135,14 @@ bool JobQueue::isJobRequestOutDated(const JobRequest &jobRequest) const
|
||||
return false;
|
||||
}
|
||||
|
||||
static int priority(const TranslationUnit &translationUnit)
|
||||
static int priority(const Document &document)
|
||||
{
|
||||
int thePriority = 0;
|
||||
|
||||
if (translationUnit.isUsedByCurrentEditor())
|
||||
if (document.isUsedByCurrentEditor())
|
||||
thePriority += 1000;
|
||||
|
||||
if (translationUnit.isVisibleInEditor())
|
||||
if (document.isVisibleInEditor())
|
||||
thePriority += 100;
|
||||
|
||||
return thePriority;
|
||||
@@ -152,8 +152,8 @@ void JobQueue::prioritizeRequests()
|
||||
{
|
||||
const auto lessThan = [this] (const JobRequest &r1, const JobRequest &r2) {
|
||||
// TODO: Getting the TU is O(n) currently, so this might become expensive for large n.
|
||||
const TranslationUnit &t1 = m_translationUnits.translationUnit(r1.filePath, r1.projectPartId);
|
||||
const TranslationUnit &t2 = m_translationUnits.translationUnit(r2.filePath, r2.projectPartId);
|
||||
const Document &t1 = m_documents.document(r1.filePath, r1.projectPartId);
|
||||
const Document &t2 = m_documents.document(r2.filePath, r2.projectPartId);
|
||||
|
||||
return priority(t1) > priority(t2);
|
||||
};
|
||||
@@ -171,12 +171,12 @@ JobRequests JobQueue::takeJobRequestsToRunNow()
|
||||
const JobRequest &jobRequest = i.next();
|
||||
|
||||
try {
|
||||
const TranslationUnit &translationUnit
|
||||
= m_translationUnits.translationUnit(jobRequest.filePath,
|
||||
const Document &document
|
||||
= m_documents.document(jobRequest.filePath,
|
||||
jobRequest.projectPartId);
|
||||
const DocumentId documentId = DocumentId(jobRequest.filePath, jobRequest.projectPartId);
|
||||
|
||||
if (!translationUnit.isUsedByCurrentEditor() && !translationUnit.isVisibleInEditor())
|
||||
if (!document.isUsedByCurrentEditor() && !document.isVisibleInEditor())
|
||||
continue;
|
||||
|
||||
if (documentsScheduledForThisRun.contains(documentId))
|
||||
|
||||
@@ -32,12 +32,12 @@
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class ProjectParts;
|
||||
class TranslationUnits;
|
||||
class Documents;
|
||||
|
||||
class JobQueue
|
||||
{
|
||||
public:
|
||||
JobQueue(TranslationUnits &translationUnits, ProjectParts &projects);
|
||||
JobQueue(Documents &documents, ProjectParts &projects);
|
||||
|
||||
void add(const JobRequest &job);
|
||||
|
||||
@@ -59,7 +59,7 @@ private:
|
||||
bool isJobRequestOutDated(const JobRequest &jobRequest) const;
|
||||
|
||||
private:
|
||||
TranslationUnits &m_translationUnits;
|
||||
Documents &m_documents;
|
||||
ProjectParts &m_projectParts;
|
||||
|
||||
IsJobRunningHandler m_isJobRunningHandler;
|
||||
|
||||
@@ -36,15 +36,15 @@
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
Jobs::Jobs(TranslationUnits &translationUnits,
|
||||
Jobs::Jobs(Documents &documents,
|
||||
UnsavedFiles &unsavedFiles,
|
||||
ProjectParts &projectParts,
|
||||
ClangCodeModelClientInterface &client)
|
||||
: m_translationUnits(translationUnits)
|
||||
: m_documents(documents)
|
||||
, m_unsavedFiles(unsavedFiles)
|
||||
, m_projectParts(projectParts)
|
||||
, m_client(client)
|
||||
, m_queue(translationUnits, projectParts)
|
||||
, m_queue(documents, projectParts)
|
||||
{
|
||||
m_queue.setIsJobRunningHandler([this](const Utf8String &filePath,
|
||||
const Utf8String &projectPartId) {
|
||||
@@ -89,7 +89,7 @@ JobRequests Jobs::runJobs(const JobRequests &jobsRequests)
|
||||
bool Jobs::runJob(const JobRequest &jobRequest)
|
||||
{
|
||||
if (IAsyncJob *asyncJob = IAsyncJob::create(jobRequest.type)) {
|
||||
JobContext context(jobRequest, &m_translationUnits, &m_unsavedFiles, &m_client);
|
||||
JobContext context(jobRequest, &m_documents, &m_unsavedFiles, &m_client);
|
||||
asyncJob->setContext(context);
|
||||
|
||||
if (asyncJob->prepareAsyncRun()) {
|
||||
|
||||
@@ -34,9 +34,9 @@
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class ClangCodeModelClientInterface;
|
||||
class Documents;
|
||||
class IAsyncJob;
|
||||
class ProjectParts;
|
||||
class TranslationUnits;
|
||||
class UnsavedFiles;
|
||||
|
||||
class Jobs
|
||||
@@ -49,7 +49,7 @@ public:
|
||||
using RunningJobs = QHash<IAsyncJob *, RunningJob>;
|
||||
|
||||
public:
|
||||
Jobs(TranslationUnits &translationUnits,
|
||||
Jobs(Documents &documents,
|
||||
UnsavedFiles &unsavedFiles,
|
||||
ProjectParts &projects,
|
||||
ClangCodeModelClientInterface &client);
|
||||
@@ -70,7 +70,7 @@ private:
|
||||
void onJobFinished(IAsyncJob *asyncJob);
|
||||
|
||||
private:
|
||||
TranslationUnits &m_translationUnits;
|
||||
Documents &m_documents;
|
||||
UnsavedFiles &m_unsavedFiles;
|
||||
ProjectParts &m_projectParts;
|
||||
ClangCodeModelClientInterface &m_client;
|
||||
|
||||
@@ -57,10 +57,10 @@ bool RequestDocumentAnnotationsJob::prepareAsyncRun()
|
||||
QTC_ASSERT(jobRequest.type == JobRequest::Type::RequestDocumentAnnotations, return false);
|
||||
|
||||
try {
|
||||
m_pinnedTranslationUnit = context().translationUnitForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer();
|
||||
m_pinnedDocument = context().documentForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedDocument.fileContainer();
|
||||
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore();
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
|
||||
setRunner([translationUnitCore]() {
|
||||
return runAsyncHelper(translationUnitCore);
|
||||
});
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "clangasyncjob.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
|
||||
#include <clangbackendipc/diagnosticcontainer.h>
|
||||
#include <clangbackendipc/highlightingmarkcontainer.h>
|
||||
@@ -53,7 +53,7 @@ private:
|
||||
void sendAnnotations(const AsyncResult &result);
|
||||
|
||||
private:
|
||||
TranslationUnit m_pinnedTranslationUnit;
|
||||
Document m_pinnedDocument;
|
||||
FileContainer m_pinnedFileContainer;
|
||||
};
|
||||
|
||||
|
||||
@@ -63,11 +63,11 @@ bool UpdateDocumentAnnotationsJob::prepareAsyncRun()
|
||||
QTC_ASSERT(jobRequest.type == JobRequest::Type::UpdateDocumentAnnotations, return false);
|
||||
|
||||
try {
|
||||
m_pinnedTranslationUnit = context().translationUnitForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedTranslationUnit.fileContainer();
|
||||
m_pinnedDocument = context().documentForJobRequest();
|
||||
m_pinnedFileContainer = m_pinnedDocument.fileContainer();
|
||||
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedTranslationUnit.translationUnitCore();
|
||||
const TranslationUnitUpdateInput updateInput = m_pinnedTranslationUnit.createUpdateInput();
|
||||
const TranslationUnitCore translationUnitCore = m_pinnedDocument.translationUnitCore();
|
||||
const TranslationUnitUpdateInput updateInput = m_pinnedDocument.createUpdateInput();
|
||||
setRunner([translationUnitCore, updateInput]() {
|
||||
return runAsyncHelper(translationUnitCore, updateInput);
|
||||
});
|
||||
@@ -92,7 +92,7 @@ void UpdateDocumentAnnotationsJob::finalizeAsyncRun()
|
||||
|
||||
void UpdateDocumentAnnotationsJob::incorporateUpdaterResult(const AsyncResult &result)
|
||||
{
|
||||
m_pinnedTranslationUnit.incorporateUpdaterResult(result.updateResult);
|
||||
m_pinnedDocument.incorporateUpdaterResult(result.updateResult);
|
||||
}
|
||||
|
||||
void UpdateDocumentAnnotationsJob::sendAnnotations(const AsyncResult &result)
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "clangasyncjob.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
#include "clangtranslationunitupdater.h"
|
||||
|
||||
#include <clangbackendipc/diagnosticcontainer.h>
|
||||
@@ -57,7 +57,7 @@ private:
|
||||
void sendAnnotations(const AsyncResult &result);
|
||||
|
||||
private:
|
||||
TranslationUnit m_pinnedTranslationUnit;
|
||||
Document m_pinnedDocument;
|
||||
FileContainer m_pinnedFileContainer;
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "sourcelocation.h"
|
||||
#include "unsavedfile.h"
|
||||
#include "unsavedfiles.h"
|
||||
#include "clangtranslationunit.h"
|
||||
#include "clangdocument.h"
|
||||
#include "sourcerange.h"
|
||||
#include "clangunsavedfilesshallowarguments.h"
|
||||
#include "clangtranslationunitupdater.h"
|
||||
|
||||
@@ -34,7 +34,7 @@ class SourceRangeContainer;
|
||||
class SkippedSourceRanges
|
||||
{
|
||||
public:
|
||||
SkippedSourceRanges(CXTranslationUnit TranslationUnit, const char *filePath);
|
||||
SkippedSourceRanges(CXTranslationUnit Document, const char *filePath);
|
||||
~SkippedSourceRanges();
|
||||
|
||||
SkippedSourceRanges(const SkippedSourceRanges &) = delete;
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
|
||||
#include "sourcelocation.h"
|
||||
|
||||
#include "clangdocument.h"
|
||||
#include "clangfilepath.h"
|
||||
#include "clangstring.h"
|
||||
#include "clangtranslationunit.h"
|
||||
|
||||
#include <utf8string.h>
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
namespace ClangBackEnd {
|
||||
|
||||
class SourceLocationContainer;
|
||||
class TranslationUnit;
|
||||
class Document;
|
||||
|
||||
class SourceLocation
|
||||
{
|
||||
|
||||
@@ -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
|
||||
@@ -36,13 +36,13 @@ void ClangAsyncJobTest::BaseSetUp(ClangBackEnd::JobRequest::Type jobRequestType,
|
||||
projects.createOrUpdate({ProjectPartContainer(projectPartId)});
|
||||
|
||||
const QVector<FileContainer> fileContainer{FileContainer(filePath, projectPartId)};
|
||||
translationUnit = translationUnits.create(fileContainer).front();
|
||||
translationUnits.setVisibleInEditors({filePath});
|
||||
translationUnits.setUsedByCurrentEditor(filePath);
|
||||
document = documents.create(fileContainer).front();
|
||||
documents.setVisibleInEditors({filePath});
|
||||
documents.setUsedByCurrentEditor(filePath);
|
||||
|
||||
jobRequest = createJobRequest(filePath, jobRequestType);
|
||||
jobContext = JobContext(jobRequest, &translationUnits, &unsavedFiles, &dummyIpcClient);
|
||||
jobContextWithMockClient = JobContext(jobRequest, &translationUnits, &unsavedFiles, &mockIpcClient);
|
||||
jobContext = JobContext(jobRequest, &documents, &unsavedFiles, &dummyIpcClient);
|
||||
jobContextWithMockClient = JobContext(jobRequest, &documents, &unsavedFiles, &mockIpcClient);
|
||||
asyncJob.setFinishedHandler([](IAsyncJob *){});
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ JobRequest ClangAsyncJobTest::createJobRequest(const Utf8String &filePath,
|
||||
jobRequest.filePath = filePath;
|
||||
jobRequest.projectPartId = projectPartId;
|
||||
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
|
||||
jobRequest.documentRevision = translationUnit.documentRevision();
|
||||
jobRequest.documentRevision = document.documentRevision();
|
||||
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
|
||||
|
||||
return jobRequest;
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
#include "mockclangcodemodelclient.h"
|
||||
#include "clangiasyncjob.h"
|
||||
|
||||
#include <clangdocument.h>
|
||||
#include <clangjobrequest.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <projects.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@@ -55,8 +55,8 @@ protected:
|
||||
protected:
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::TranslationUnit translationUnit;
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
ClangBackEnd::Document document;
|
||||
|
||||
MockClangCodeModelClient mockIpcClient;
|
||||
DummyIpcClient dummyIpcClient;
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <clangcodecompleteresults.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangfilepath.h>
|
||||
#include <clangtranslationunitupdater.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <utf8string.h>
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace {
|
||||
|
||||
using ClangBackEnd::ClangCodeCompleteResults;
|
||||
using ClangBackEnd::FilePath;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
|
||||
@@ -62,15 +62,15 @@ TEST(ClangCodeCompleteResults, GetData)
|
||||
ProjectPart projectPart(Utf8StringLiteral("projectPartId"));
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits);
|
||||
Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath());
|
||||
translationUnit.parse();
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents);
|
||||
Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
|
||||
document.parse();
|
||||
CXCodeCompleteResults *cxCodeCompleteResults =
|
||||
clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(),
|
||||
clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
|
||||
nativeFilePath.constData(),
|
||||
49, 1, 0, 0,
|
||||
completionOptions());
|
||||
@@ -94,15 +94,15 @@ TEST(ClangCodeCompleteResults, MoveClangCodeCompleteResults)
|
||||
ProjectPart projectPart(Utf8StringLiteral("projectPartId"));
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits);
|
||||
Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath());
|
||||
translationUnit.parse();
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document(Utf8StringLiteral(TESTDATA_DIR"/complete_testfile_1.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents);
|
||||
Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
|
||||
document.parse();
|
||||
CXCodeCompleteResults *cxCodeCompleteResults =
|
||||
clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(),
|
||||
clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
|
||||
nativeFilePath.constData(),
|
||||
49, 1, 0, 0,
|
||||
completionOptions());
|
||||
|
||||
@@ -77,7 +77,7 @@ TEST_F(CompleteCodeJob, DontSendCompletionsIfDocumentWasClosed)
|
||||
EXPECT_CALL(mockIpcClient, codeCompleted(_)).Times(0);
|
||||
|
||||
job.runAsync();
|
||||
translationUnits.remove({FileContainer{filePath, projectPartId}});
|
||||
documents.remove({FileContainer{filePath, projectPartId}});
|
||||
|
||||
ASSERT_TRUE(waitUntilJobFinished(job));
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ TEST_F(CreateInitialDocumentPreambleJob, PrepareAsyncRun)
|
||||
|
||||
TEST_F(CreateInitialDocumentPreambleJob, RunAsync)
|
||||
{
|
||||
translationUnit.parse();
|
||||
translationUnit.setDirtyIfDependencyIsMet(translationUnit.filePath());
|
||||
document.parse();
|
||||
document.setDirtyIfDependencyIsMet(document.filePath());
|
||||
job.setContext(jobContext);
|
||||
job.prepareAsyncRun();
|
||||
|
||||
|
||||
354
tests/unit/unittest/clangdocumentstest.cpp
Normal file
354
tests/unit/unittest/clangdocumentstest.cpp
Normal 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)});
|
||||
}
|
||||
|
||||
}
|
||||
391
tests/unit/unittest/clangdocumenttest.cpp
Normal file
391
tests/unit/unittest/clangdocumenttest.cpp
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,29 +58,29 @@ namespace {
|
||||
|
||||
using namespace ClangBackEnd;
|
||||
|
||||
MATCHER_P5(HasDirtyTranslationUnit,
|
||||
MATCHER_P5(HasDirtyDocument,
|
||||
filePath,
|
||||
projectPartId,
|
||||
documentRevision,
|
||||
isNeedingReparse,
|
||||
hasNewDiagnostics,
|
||||
std::string(negation ? "isn't" : "is")
|
||||
+ " translation unit with file path "+ PrintToString(filePath)
|
||||
+ " document with file path "+ PrintToString(filePath)
|
||||
+ " and project " + PrintToString(projectPartId)
|
||||
+ " and document revision " + PrintToString(documentRevision)
|
||||
+ " and isNeedingReparse = " + PrintToString(isNeedingReparse)
|
||||
+ " and hasNewDiagnostics = " + PrintToString(hasNewDiagnostics)
|
||||
)
|
||||
{
|
||||
auto &&translationUnits = arg.translationUnitsForTestOnly();
|
||||
auto &&documents = arg.documentsForTestOnly();
|
||||
try {
|
||||
auto translationUnit = translationUnits.translationUnit(filePath, projectPartId);
|
||||
auto document = documents.document(filePath, projectPartId);
|
||||
|
||||
if (translationUnit.documentRevision() == documentRevision) {
|
||||
if (translationUnit.isNeedingReparse() && !isNeedingReparse) {
|
||||
if (document.documentRevision() == documentRevision) {
|
||||
if (document.isNeedingReparse() && !isNeedingReparse) {
|
||||
*result_listener << "isNeedingReparse is true";
|
||||
return false;
|
||||
} else if (!translationUnit.isNeedingReparse() && isNeedingReparse) {
|
||||
} else if (!document.isNeedingReparse() && isNeedingReparse) {
|
||||
*result_listener << "isNeedingReparse is false";
|
||||
return false;
|
||||
}
|
||||
@@ -88,7 +88,7 @@ MATCHER_P5(HasDirtyTranslationUnit,
|
||||
return true;
|
||||
}
|
||||
|
||||
*result_listener << "revision number is " << PrintToString(translationUnit.documentRevision());
|
||||
*result_listener << "revision number is " << PrintToString(document.documentRevision());
|
||||
return false;
|
||||
|
||||
} catch (...) {
|
||||
@@ -156,7 +156,7 @@ protected:
|
||||
protected:
|
||||
MockClangCodeModelClient mockClangCodeModelClient;
|
||||
ClangBackEnd::ClangCodeModelServer clangServer;
|
||||
const ClangBackEnd::TranslationUnits &translationUnits = clangServer.translationUnitsForTestOnly();
|
||||
const ClangBackEnd::Documents &documents = clangServer.documentsForTestOnly();
|
||||
const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro");
|
||||
|
||||
const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp");
|
||||
@@ -344,35 +344,35 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterCreationIsNotDirty)
|
||||
{
|
||||
registerProjectAndFile(filePathA, 1);
|
||||
|
||||
ASSERT_THAT(clangServer, HasDirtyTranslationUnit(filePathA, projectPartId, 0U, false, false));
|
||||
ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 0U, false, false));
|
||||
}
|
||||
|
||||
TEST_F(ClangClangCodeModelServer, SetCurrentAndVisibleEditor)
|
||||
{
|
||||
registerProjectAndFilesAndWaitForFinished();
|
||||
auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId);
|
||||
auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId);
|
||||
auto functionDocument = documents.document(filePathA, projectPartId);
|
||||
auto variableDocument = documents.document(filePathB, projectPartId);
|
||||
|
||||
updateVisibilty(filePathB, filePathA);
|
||||
|
||||
ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor());
|
||||
ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor());
|
||||
ASSERT_TRUE(functionTranslationUnit.isVisibleInEditor());
|
||||
ASSERT_TRUE(variableDocument.isUsedByCurrentEditor());
|
||||
ASSERT_TRUE(variableDocument.isVisibleInEditor());
|
||||
ASSERT_TRUE(functionDocument.isVisibleInEditor());
|
||||
}
|
||||
|
||||
TEST_F(ClangClangCodeModelServer, IsNotCurrentCurrentAndVisibleEditorAnymore)
|
||||
{
|
||||
registerProjectAndFilesAndWaitForFinished();
|
||||
auto functionTranslationUnit = translationUnits.translationUnit(filePathA, projectPartId);
|
||||
auto variableTranslationUnit = translationUnits.translationUnit(filePathB, projectPartId);
|
||||
auto functionDocument = documents.document(filePathA, projectPartId);
|
||||
auto variableDocument = documents.document(filePathB, projectPartId);
|
||||
updateVisibilty(filePathB, filePathA);
|
||||
|
||||
updateVisibilty(filePathB, Utf8String());
|
||||
|
||||
ASSERT_FALSE(functionTranslationUnit.isUsedByCurrentEditor());
|
||||
ASSERT_FALSE(functionTranslationUnit.isVisibleInEditor());
|
||||
ASSERT_TRUE(variableTranslationUnit.isUsedByCurrentEditor());
|
||||
ASSERT_TRUE(variableTranslationUnit.isVisibleInEditor());
|
||||
ASSERT_FALSE(functionDocument.isUsedByCurrentEditor());
|
||||
ASSERT_FALSE(functionDocument.isVisibleInEditor());
|
||||
ASSERT_TRUE(variableDocument.isUsedByCurrentEditor());
|
||||
ASSERT_TRUE(variableDocument.isVisibleInEditor());
|
||||
}
|
||||
|
||||
TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse)
|
||||
@@ -380,7 +380,7 @@ TEST_F(ClangClangCodeModelServer, TranslationUnitAfterUpdateNeedsReparse)
|
||||
registerProjectAndFileAndWaitForFinished(filePathA, 2);
|
||||
|
||||
updateUnsavedContent(filePathA, unsavedContent(filePathAUnsavedVersion1), 1U);
|
||||
ASSERT_THAT(clangServer, HasDirtyTranslationUnit(filePathA, projectPartId, 1U, true, true));
|
||||
ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 1U, true, true));
|
||||
}
|
||||
|
||||
void ClangClangCodeModelServer::SetUp()
|
||||
|
||||
@@ -25,12 +25,12 @@
|
||||
|
||||
#include "testutils.h"
|
||||
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangjobs.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <filecontainer.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
@@ -75,14 +75,14 @@ protected:
|
||||
protected:
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::TranslationUnit translationUnit;
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
ClangBackEnd::Document document;
|
||||
|
||||
Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp");
|
||||
Utf8String filePath2 = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp");
|
||||
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
|
||||
|
||||
ClangBackEnd::JobQueue jobQueue{translationUnits, projects};
|
||||
ClangBackEnd::JobQueue jobQueue{documents, projects};
|
||||
};
|
||||
|
||||
TEST_F(JobQueue, AddJob)
|
||||
@@ -200,7 +200,7 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverNotCurrent)
|
||||
resetVisibilityAndCurrentEditor();
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
translationUnits.setUsedByCurrentEditor(filePath2);
|
||||
documents.setUsedByCurrentEditor(filePath2);
|
||||
|
||||
jobQueue.prioritizeRequests();
|
||||
|
||||
@@ -212,7 +212,7 @@ TEST_F(JobQueue, PrioritizeVisibleDocumentsOverNotVisible)
|
||||
resetVisibilityAndCurrentEditor();
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
translationUnits.setVisibleInEditors({filePath2});
|
||||
documents.setVisibleInEditors({filePath2});
|
||||
|
||||
jobQueue.prioritizeRequests();
|
||||
|
||||
@@ -224,8 +224,8 @@ TEST_F(JobQueue, PrioritizeCurrentDocumentOverVisible)
|
||||
resetVisibilityAndCurrentEditor();
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobQueue.add(createJobRequest(filePath2, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
translationUnits.setVisibleInEditors({filePath1, filePath2});
|
||||
translationUnits.setUsedByCurrentEditor(filePath2);
|
||||
documents.setVisibleInEditors({filePath1, filePath2});
|
||||
documents.setUsedByCurrentEditor(filePath2);
|
||||
|
||||
jobQueue.prioritizeRequests();
|
||||
|
||||
@@ -236,8 +236,8 @@ TEST_F(JobQueue, RunNothingForNotCurrentOrVisibleDocument)
|
||||
{
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
translationUnits.setVisibleInEditors({});
|
||||
translationUnits.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath"));
|
||||
documents.setVisibleInEditors({});
|
||||
documents.setUsedByCurrentEditor(Utf8StringLiteral("aNonExistingFilePath"));
|
||||
|
||||
const JobRequests jobsToRun = jobQueue.processQueue();
|
||||
|
||||
@@ -312,7 +312,7 @@ TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByDocumentClose)
|
||||
TEST_F(JobQueue, RequestUpdateDocumentAnnotationsOutdatableByNotIntactDocument)
|
||||
{
|
||||
jobQueue.add(createJobRequest(filePath1, JobRequest::Type::UpdateDocumentAnnotations));
|
||||
translationUnit.setHasParseOrReparseFailed(true);
|
||||
document.setHasParseOrReparseFailed(true);
|
||||
|
||||
const JobRequests jobsToStart = jobQueue.processQueue();
|
||||
|
||||
@@ -375,15 +375,15 @@ void JobQueue::SetUp()
|
||||
|
||||
const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId),
|
||||
FileContainer(filePath2, projectPartId)};
|
||||
translationUnit = translationUnits.create(fileContainer).front();
|
||||
translationUnits.setVisibleInEditors({filePath1});
|
||||
translationUnits.setUsedByCurrentEditor(filePath1);
|
||||
document = documents.create(fileContainer).front();
|
||||
documents.setVisibleInEditors({filePath1});
|
||||
documents.setUsedByCurrentEditor(filePath1);
|
||||
}
|
||||
|
||||
void JobQueue::resetVisibilityAndCurrentEditor()
|
||||
{
|
||||
translationUnits.setVisibleInEditors({});
|
||||
translationUnits.setUsedByCurrentEditor(Utf8String());
|
||||
documents.setVisibleInEditors({});
|
||||
documents.setUsedByCurrentEditor(Utf8String());
|
||||
}
|
||||
|
||||
Utf8String JobQueue::createTranslationUnitForDeletedFile()
|
||||
@@ -394,9 +394,9 @@ Utf8String JobQueue::createTranslationUnitForDeletedFile()
|
||||
|
||||
ClangBackEnd::FileContainer fileContainer(temporaryFilePath,
|
||||
projectPartId, Utf8String(), true);
|
||||
translationUnits.create({fileContainer});
|
||||
auto translationUnit = translationUnits.translationUnit(fileContainer);
|
||||
translationUnit.setIsUsedByCurrentEditor(true);
|
||||
documents.create({fileContainer});
|
||||
auto document = documents.document(fileContainer);
|
||||
document.setIsUsedByCurrentEditor(true);
|
||||
|
||||
return temporaryFilePath;
|
||||
}
|
||||
@@ -410,7 +410,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath,
|
||||
jobRequest.filePath = filePath;
|
||||
jobRequest.projectPartId = projectPartId;
|
||||
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
|
||||
jobRequest.documentRevision = translationUnit.documentRevision();
|
||||
jobRequest.documentRevision = document.documentRevision();
|
||||
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
|
||||
|
||||
return jobRequest;
|
||||
@@ -418,7 +418,7 @@ JobRequest JobQueue::createJobRequest(const Utf8String &filePath,
|
||||
|
||||
void JobQueue::updateDocumentRevision()
|
||||
{
|
||||
translationUnits.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)});
|
||||
documents.update({FileContainer(filePath1, projectPartId, Utf8String(), true, 1)});
|
||||
}
|
||||
|
||||
void JobQueue::updateUnsavedFiles()
|
||||
@@ -438,7 +438,7 @@ void JobQueue::removeProject()
|
||||
|
||||
void JobQueue::removeDocument()
|
||||
{
|
||||
translationUnits.remove({FileContainer(filePath1, projectPartId)});
|
||||
documents.remove({FileContainer(filePath1, projectPartId)});
|
||||
}
|
||||
|
||||
} // anonymous
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
#include "testutils.h"
|
||||
#include "dummyclangipcclient.h"
|
||||
|
||||
#include <clangdocument.h>
|
||||
#include <clangjobs.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <filecontainer.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
@@ -68,14 +68,14 @@ protected:
|
||||
protected:
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::TranslationUnit translationUnit;
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
ClangBackEnd::Document document;
|
||||
DummyIpcClient dummyClientInterface;
|
||||
|
||||
Utf8String filePath1 = Utf8StringLiteral(TESTDATA_DIR"/translationunits.cpp");
|
||||
Utf8String projectPartId{Utf8StringLiteral("/path/to/projectfile")};
|
||||
|
||||
ClangBackEnd::Jobs jobs{translationUnits, unsavedFiles, projects, dummyClientInterface};
|
||||
ClangBackEnd::Jobs jobs{documents, unsavedFiles, projects, dummyClientInterface};
|
||||
};
|
||||
|
||||
TEST_F(Jobs, ProcessEmptyQueue)
|
||||
@@ -122,9 +122,9 @@ void Jobs::SetUp()
|
||||
projects.createOrUpdate({ProjectPartContainer(projectPartId)});
|
||||
|
||||
const QVector<FileContainer> fileContainer{FileContainer(filePath1, projectPartId)};
|
||||
translationUnit = translationUnits.create(fileContainer).front();
|
||||
translationUnits.setVisibleInEditors({filePath1});
|
||||
translationUnits.setUsedByCurrentEditor(filePath1);
|
||||
document = documents.create(fileContainer).front();
|
||||
documents.setVisibleInEditors({filePath1});
|
||||
documents.setUsedByCurrentEditor(filePath1);
|
||||
}
|
||||
|
||||
void Jobs::TearDown()
|
||||
@@ -157,7 +157,7 @@ JobRequest Jobs::createJobRequest(const Utf8String &filePath,
|
||||
jobRequest.filePath = filePath;
|
||||
jobRequest.projectPartId = projectPartId;
|
||||
jobRequest.unsavedFilesChangeTimePoint = unsavedFiles.lastChangeTimePoint();
|
||||
jobRequest.documentRevision = translationUnit.documentRevision();
|
||||
jobRequest.documentRevision = document.documentRevision();
|
||||
jobRequest.projectChangeTimePoint = projects.project(projectPartId).lastChangeTimePoint();
|
||||
|
||||
return jobRequest;
|
||||
|
||||
@@ -77,7 +77,7 @@ TEST_F(RequestDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed)
|
||||
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
|
||||
|
||||
job.runAsync();
|
||||
translationUnits.remove({FileContainer{filePath, projectPartId}});
|
||||
documents.remove({FileContainer{filePath, projectPartId}});
|
||||
|
||||
ASSERT_TRUE(waitUntilJobFinished(job));
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentWasClosed)
|
||||
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
|
||||
|
||||
job.runAsync();
|
||||
translationUnits.remove({FileContainer{filePath, projectPartId}});
|
||||
documents.remove({FileContainer{filePath, projectPartId}});
|
||||
|
||||
ASSERT_TRUE(waitUntilJobFinished(job));
|
||||
}
|
||||
@@ -90,23 +90,23 @@ TEST_F(UpdateDocumentAnnotationsJob, DontSendAnnotationsIfDocumentRevisionChange
|
||||
EXPECT_CALL(mockIpcClient, documentAnnotationsChanged(_)).Times(0);
|
||||
|
||||
job.runAsync();
|
||||
translationUnits.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)});
|
||||
documents.update({FileContainer(filePath, projectPartId, Utf8String(), true, 99)});
|
||||
|
||||
ASSERT_TRUE(waitUntilJobFinished(job));
|
||||
}
|
||||
|
||||
TEST_F(UpdateDocumentAnnotationsJob, UpdatesTranslationUnit)
|
||||
{
|
||||
const time_point timePointBefore = translationUnit.lastProjectPartChangeTimePoint();
|
||||
const QSet<Utf8String> dependendOnFilesBefore = translationUnit.dependedFilePaths();
|
||||
const time_point timePointBefore = document.lastProjectPartChangeTimePoint();
|
||||
const QSet<Utf8String> dependendOnFilesBefore = document.dependedFilePaths();
|
||||
job.setContext(jobContext);
|
||||
job.prepareAsyncRun();
|
||||
|
||||
job.runAsync();
|
||||
ASSERT_TRUE(waitUntilJobFinished(job));
|
||||
|
||||
ASSERT_THAT(timePointBefore, Not(translationUnit.lastProjectPartChangeTimePoint()));
|
||||
ASSERT_THAT(dependendOnFilesBefore, Not(translationUnit.dependedFilePaths()));
|
||||
ASSERT_THAT(timePointBefore, Not(document.lastProjectPartChangeTimePoint()));
|
||||
ASSERT_THAT(dependendOnFilesBefore, Not(document.dependedFilePaths()));
|
||||
}
|
||||
|
||||
} // anonymous
|
||||
|
||||
@@ -24,15 +24,15 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <clangcodecompleteresults.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangfilepath.h>
|
||||
#include <codecompletionsextractor.h>
|
||||
#include <filecontainer.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangunsavedfilesshallowarguments.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <utf8stringvector.h>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
using ClangBackEnd::CodeCompletionsExtractor;
|
||||
using ClangBackEnd::ClangCodeCompleteResults;
|
||||
using ClangBackEnd::FilePath;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::CodeCompletion;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::UnsavedFilesShallowArguments;
|
||||
@@ -145,7 +145,7 @@ const ClangBackEnd::FileContainer unsavedDataFileContainer(const char *filePath,
|
||||
class CodeCompletionsExtractor : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
ClangCodeCompleteResults getResults(const TranslationUnit &translationUnit,
|
||||
ClangCodeCompleteResults getResults(const Document &document,
|
||||
uint line,
|
||||
uint column = 1,
|
||||
bool needsReparse = false);
|
||||
@@ -154,19 +154,19 @@ protected:
|
||||
ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit functionTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit variableTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit classTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit namespaceTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit enumerationTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit constructorTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
TranslationUnit briefCommentTranslationUnit{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), translationUnits};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document functionDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents};
|
||||
Document variableDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_variable.cpp"), project, Utf8StringVector(), documents};
|
||||
Document classDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_class.cpp"), project, Utf8StringVector(), documents};
|
||||
Document namespaceDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_namespace.cpp"), project, Utf8StringVector(), documents};
|
||||
Document enumerationDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_enumeration.cpp"), project, Utf8StringVector(), documents};
|
||||
Document constructorDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_constructor.cpp"), project, Utf8StringVector(), documents};
|
||||
Document briefCommentDocument{Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_brief_comment.cpp"), project, Utf8StringVector(), documents};
|
||||
};
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Function)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -177,7 +177,7 @@ TEST_F(CodeCompletionsExtractor, Function)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, TemplateFunction)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -188,7 +188,7 @@ TEST_F(CodeCompletionsExtractor, TemplateFunction)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Variable)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 4));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -200,7 +200,7 @@ TEST_F(CodeCompletionsExtractor, Variable)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 25, 19));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 25, 19));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -212,7 +212,7 @@ TEST_F(CodeCompletionsExtractor, NonTypeTemplateParameter)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, VariableReference)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 12));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 12));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -223,7 +223,7 @@ TEST_F(CodeCompletionsExtractor, VariableReference)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Parameter)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 4));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 4));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -234,7 +234,7 @@ TEST_F(CodeCompletionsExtractor, Parameter)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Field)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -245,7 +245,7 @@ TEST_F(CodeCompletionsExtractor, Field)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Class)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -256,7 +256,7 @@ TEST_F(CodeCompletionsExtractor, Class)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Struct)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -267,7 +267,7 @@ TEST_F(CodeCompletionsExtractor, Struct)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Union)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -278,7 +278,7 @@ TEST_F(CodeCompletionsExtractor, Union)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Typedef)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -289,7 +289,7 @@ TEST_F(CodeCompletionsExtractor, Typedef)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -300,7 +300,7 @@ TEST_F(CodeCompletionsExtractor, UsingAsTypeAlias)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, TemplateTypeParameter)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -311,7 +311,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTypeParameter)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, TemplateClass)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -322,7 +322,7 @@ TEST_F(CodeCompletionsExtractor, TemplateClass)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -333,7 +333,7 @@ TEST_F(CodeCompletionsExtractor, TemplateTemplateParameter)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -344,7 +344,7 @@ TEST_F(CodeCompletionsExtractor, ClassTemplatePartialSpecialization)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Namespace)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -355,7 +355,7 @@ TEST_F(CodeCompletionsExtractor, Namespace)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, NamespaceAlias)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(namespaceTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(namespaceDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -366,7 +366,7 @@ TEST_F(CodeCompletionsExtractor, NamespaceAlias)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Enumeration)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -377,7 +377,7 @@ TEST_F(CodeCompletionsExtractor, Enumeration)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Enumerator)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -388,7 +388,7 @@ TEST_F(CodeCompletionsExtractor, Enumerator)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, DISABLED_Constructor)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -399,7 +399,7 @@ TEST_F(CodeCompletionsExtractor, DISABLED_Constructor)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Destructor)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(constructorTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(constructorDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -410,7 +410,7 @@ TEST_F(CodeCompletionsExtractor, Destructor)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Method)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -422,7 +422,7 @@ TEST_F(CodeCompletionsExtractor, Method)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, MethodWithParameters)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -434,7 +434,7 @@ TEST_F(CodeCompletionsExtractor, MethodWithParameters)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Slot)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -445,7 +445,7 @@ TEST_F(CodeCompletionsExtractor, Slot)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, Signal)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -456,7 +456,7 @@ TEST_F(CodeCompletionsExtractor, Signal)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, MacroDefinition)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -467,7 +467,7 @@ TEST_F(CodeCompletionsExtractor, MacroDefinition)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, FunctionMacro)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -478,7 +478,7 @@ TEST_F(CodeCompletionsExtractor, FunctionMacro)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, IntKeyword)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -489,7 +489,7 @@ TEST_F(CodeCompletionsExtractor, IntKeyword)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, SwitchKeyword)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -500,7 +500,7 @@ TEST_F(CodeCompletionsExtractor, SwitchKeyword)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, ClassKeyword)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -511,7 +511,7 @@ TEST_F(CodeCompletionsExtractor, ClassKeyword)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, DeprecatedFunction)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -522,7 +522,7 @@ TEST_F(CodeCompletionsExtractor, DeprecatedFunction)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, NotAccessibleFunction)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -533,7 +533,7 @@ TEST_F(CodeCompletionsExtractor, NotAccessibleFunction)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, NotAvailableFunction)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -544,10 +544,10 @@ TEST_F(CodeCompletionsExtractor, NotAvailableFunction)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, UnsavedFile)
|
||||
{
|
||||
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits);
|
||||
Document document(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents);
|
||||
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
|
||||
TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")});
|
||||
ClangCodeCompleteResults completeResults(getResults(translationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(document, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -558,13 +558,13 @@ TEST_F(CodeCompletionsExtractor, UnsavedFile)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile)
|
||||
{
|
||||
TranslationUnit translationUnit(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), translationUnits);
|
||||
Document document(Utf8String::fromUtf8(TESTDATA_DIR"/complete_extractor_function.cpp"), project, Utf8StringVector(), documents);
|
||||
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
|
||||
TESTDATA_DIR"/complete_extractor_function_unsaved.cpp")});
|
||||
ClangCodeCompleteResults completeResults(getResults(translationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(document, 20));
|
||||
unsavedFiles.createOrUpdate({unsavedDataFileContainer(TESTDATA_DIR"/complete_extractor_function.cpp",
|
||||
TESTDATA_DIR"/complete_extractor_function_unsaved_2.cpp")});
|
||||
completeResults = getResults(translationUnit, 20);
|
||||
completeResults = getResults(document, 20);
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -576,7 +576,7 @@ TEST_F(CodeCompletionsExtractor, ChangeUnsavedFile)
|
||||
TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
|
||||
{
|
||||
project.setArguments({Utf8StringLiteral("-DArgumentDefinition"), Utf8StringLiteral("-std=gnu++14")});
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -588,7 +588,7 @@ TEST_F(CodeCompletionsExtractor, ArgumentDefinition)
|
||||
TEST_F(CodeCompletionsExtractor, NoArgumentDefinition)
|
||||
{
|
||||
project.setArguments({Utf8StringLiteral("-std=gnu++14")});
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 35));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 35));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -599,7 +599,7 @@ TEST_F(CodeCompletionsExtractor, NoArgumentDefinition)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksFunction)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -612,7 +612,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunction)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(functionTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(functionDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -630,7 +630,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksFunctionWithOptionalChunks)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksField)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(variableTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(variableDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -641,7 +641,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksField)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -652,7 +652,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumerator)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(enumerationDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -662,7 +662,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksEnumeration)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, CompletionChunksClass)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(classTranslationUnit, 20));
|
||||
ClangCodeCompleteResults completeResults(getResults(classDocument, 20));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
|
||||
@@ -672,7 +672,7 @@ TEST_F(CodeCompletionsExtractor, CompletionChunksClass)
|
||||
|
||||
TEST_F(CodeCompletionsExtractor, BriefComment)
|
||||
{
|
||||
ClangCodeCompleteResults completeResults(getResults(briefCommentTranslationUnit, 10, 1,
|
||||
ClangCodeCompleteResults completeResults(getResults(briefCommentDocument, 10, 1,
|
||||
/*needsReparse=*/ true));
|
||||
|
||||
::CodeCompletionsExtractor extractor(completeResults.data());
|
||||
@@ -680,19 +680,19 @@ TEST_F(CodeCompletionsExtractor, BriefComment)
|
||||
ASSERT_THAT(extractor, HasBriefComment(Utf8StringLiteral("BriefComment"), Utf8StringLiteral("A brief comment")));
|
||||
}
|
||||
|
||||
ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const TranslationUnit &translationUnit,
|
||||
ClangCodeCompleteResults CodeCompletionsExtractor::getResults(const Document &document,
|
||||
uint line,
|
||||
uint column,
|
||||
bool needsReparse)
|
||||
{
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
if (needsReparse)
|
||||
translationUnit.reparse();
|
||||
document.reparse();
|
||||
|
||||
const Utf8String nativeFilePath = FilePath::toNativeSeparators(translationUnit.filePath());
|
||||
const Utf8String nativeFilePath = FilePath::toNativeSeparators(document.filePath());
|
||||
UnsavedFilesShallowArguments unsaved = unsavedFiles.shallowArguments();
|
||||
|
||||
return ClangCodeCompleteResults(clang_codeCompleteAt(translationUnit.translationUnitCore().cxTranslationUnit(),
|
||||
return ClangCodeCompleteResults(clang_codeCompleteAt(document.translationUnitCore().cxTranslationUnit(),
|
||||
nativeFilePath.constData(),
|
||||
line,
|
||||
column,
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <codecompleter.h>
|
||||
#include <clangdocument.h>
|
||||
#include <filecontainer.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <utf8stringvector.h>
|
||||
|
||||
@@ -88,8 +88,8 @@ protected:
|
||||
projectPart.projectPartId()};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::TranslationUnit translationUnit;
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
ClangBackEnd::Document document;
|
||||
QScopedPointer<ClangBackEnd::CodeCompleter> completer;
|
||||
ClangBackEnd::FileContainer unsavedMainFileContainer{mainFileContainer.filePath(),
|
||||
projectPart.projectPartId(),
|
||||
@@ -211,20 +211,20 @@ void CodeCompleter::SetUp()
|
||||
{
|
||||
EXPECT_TRUE(includeDirectory.isValid());
|
||||
projects.createOrUpdate({projectPart});
|
||||
translationUnits.create({mainFileContainer});
|
||||
translationUnit = translationUnits.translationUnit(mainFileContainer);
|
||||
completer.reset(new ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(),
|
||||
documents.create({mainFileContainer});
|
||||
document = documents.document(mainFileContainer);
|
||||
completer.reset(new ClangBackEnd::CodeCompleter(document.translationUnitCore(),
|
||||
unsavedFiles));
|
||||
|
||||
copyTargetHeaderToTemporaryIncludeDirecory();
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
}
|
||||
|
||||
TEST_F(CodeCompleter, FunctionInUnsavedFile)
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedMainFileContainer});
|
||||
translationUnits.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
ASSERT_THAT(myCompleter.complete(27, 1),
|
||||
AllOf(Contains(IsCodeCompletion(Utf8StringLiteral("FunctionWithArguments"),
|
||||
@@ -242,8 +242,8 @@ TEST_F(CodeCompleter, FunctionInUnsavedFile)
|
||||
TEST_F(CodeCompleter, VariableInUnsavedFile)
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedMainFileContainer});
|
||||
translationUnits.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
ASSERT_THAT(myCompleter.complete(27, 1),
|
||||
Contains(IsCodeCompletion(Utf8StringLiteral("VariableInUnsavedFile"),
|
||||
@@ -253,8 +253,8 @@ TEST_F(CodeCompleter, VariableInUnsavedFile)
|
||||
TEST_F(CodeCompleter, GlobalVariableInUnsavedFile)
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedMainFileContainer});
|
||||
translationUnits.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
ASSERT_THAT(myCompleter.complete(27, 1),
|
||||
Contains(IsCodeCompletion(Utf8StringLiteral("GlobalVariableInUnsavedFile"),
|
||||
@@ -264,8 +264,8 @@ TEST_F(CodeCompleter, GlobalVariableInUnsavedFile)
|
||||
TEST_F(CodeCompleter, Macro)
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedMainFileContainer});
|
||||
translationUnits.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
ASSERT_THAT(myCompleter.complete(27, 1),
|
||||
Contains(IsCodeCompletion(Utf8StringLiteral("Macro"),
|
||||
@@ -289,8 +289,8 @@ TEST_F(CodeCompleter, FunctionInIncludedHeader)
|
||||
TEST_F(CodeCompleter, FunctionInUnsavedIncludedHeader)
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedTargetHeaderFileContainer});
|
||||
translationUnits.create({unsavedTargetHeaderFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.create({unsavedTargetHeaderFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
ASSERT_THAT(myCompleter.complete(27, 1),
|
||||
Contains(IsCodeCompletion(Utf8StringLiteral("FunctionInIncludedHeaderUnsaved"),
|
||||
@@ -309,8 +309,8 @@ TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeader)
|
||||
TEST_F(CodeCompleter, DISABLED_FunctionInChangedIncludedHeaderWithUnsavedContentInMainFile) // it's not that bad because we reparse anyway
|
||||
{
|
||||
unsavedFiles.createOrUpdate({unsavedMainFileContainer});
|
||||
translationUnits.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnit.translationUnitCore(), unsavedFiles);
|
||||
documents.update({unsavedMainFileContainer});
|
||||
ClangBackEnd::CodeCompleter myCompleter(document.translationUnitCore(), unsavedFiles);
|
||||
|
||||
copyChangedTargetHeaderToTemporaryIncludeDirecory();
|
||||
|
||||
@@ -345,16 +345,16 @@ TEST_F(CodeCompleter, DotToArrowCompletionForPointer)
|
||||
ClangBackEnd::CompletionCorrection::DotToArrowCorrection);
|
||||
}
|
||||
|
||||
TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedTranslationUnit)
|
||||
TEST_F(CodeCompleter, DotToArrowCompletionForPointerInOutdatedDocument)
|
||||
{
|
||||
auto fileContainerBeforeTyping = dotArrowCorrectionForPointerFileContainerBeforeTyping;
|
||||
translationUnits.create({fileContainerBeforeTyping});
|
||||
documents.create({fileContainerBeforeTyping});
|
||||
unsavedFiles.createOrUpdate({fileContainerBeforeTyping});
|
||||
auto translationUnit = translationUnits.translationUnit(fileContainerBeforeTyping.filePath(),
|
||||
auto document = documents.document(fileContainerBeforeTyping.filePath(),
|
||||
fileContainerBeforeTyping.projectPartId());
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
unsavedFiles.createOrUpdate({dotArrowCorrectionForPointerFileContainerAfterTyping});
|
||||
ClangBackEnd::CodeCompleter myCompleter(translationUnits.translationUnit(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(),
|
||||
ClangBackEnd::CodeCompleter myCompleter(documents.document(dotArrowCorrectionForPointerFileContainerAfterTyping).translationUnitCore(),
|
||||
unsavedFiles);
|
||||
|
||||
const ClangBackEnd::CodeCompletions completions = myCompleter.complete(5, 9);
|
||||
@@ -443,13 +443,13 @@ TEST_F(CodeCompleter, NoDotArrowCorrectionForColonColon)
|
||||
ClangBackEnd::CodeCompleter CodeCompleter::setupCompleter(
|
||||
const ClangBackEnd::FileContainer &fileContainer)
|
||||
{
|
||||
translationUnits.create({fileContainer});
|
||||
documents.create({fileContainer});
|
||||
unsavedFiles.createOrUpdate({fileContainer});
|
||||
translationUnit = translationUnits.translationUnit(fileContainer);
|
||||
translationUnit.parse();
|
||||
document = documents.document(fileContainer);
|
||||
document.parse();
|
||||
|
||||
ClangBackEnd::TranslationUnit translationUnit = translationUnits.translationUnit(fileContainer);
|
||||
return ClangBackEnd::CodeCompleter(translationUnit.translationUnitCore(),
|
||||
ClangBackEnd::Document document = documents.document(fileContainer);
|
||||
return ClangBackEnd::CodeCompleter(document.translationUnitCore(),
|
||||
unsavedFiles);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,15 +23,15 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangstring.h>
|
||||
#include <cursor.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <sourcelocation.h>
|
||||
#include <sourcerange.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@@ -40,11 +40,11 @@
|
||||
#include "gtest-qt-printing.h"
|
||||
|
||||
using ClangBackEnd::Cursor;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::TranslationUnitCore;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::ClangString;
|
||||
using ClangBackEnd::SourceRange;
|
||||
|
||||
@@ -63,15 +63,15 @@ namespace {
|
||||
struct Data {
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/cursor.cpp")};
|
||||
TranslationUnit translationUnit{filePath,
|
||||
Document document{filePath,
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}),
|
||||
{},
|
||||
translationUnits};
|
||||
documents};
|
||||
TranslationUnitCore translationUnitCore{filePath,
|
||||
translationUnit.translationUnitCore().cxIndex(),
|
||||
translationUnit.translationUnitCore().cxTranslationUnit()};
|
||||
document.translationUnitCore().cxIndex(),
|
||||
document.translationUnitCore().cxTranslationUnit()};
|
||||
};
|
||||
|
||||
class Cursor : public ::testing::Test
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
|
||||
protected:
|
||||
static Data *d;
|
||||
const TranslationUnit &translationUnit = d->translationUnit;
|
||||
const Document &document = d->document;
|
||||
const TranslationUnitCore &translationUnitCore = d->translationUnitCore;
|
||||
};
|
||||
|
||||
@@ -808,7 +808,7 @@ Data *Cursor::d;
|
||||
void Cursor::SetUpTestCase()
|
||||
{
|
||||
d = new Data;
|
||||
d->translationUnit.parse();
|
||||
d->document.parse();
|
||||
}
|
||||
|
||||
void Cursor::TearDownTestCase()
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <clangbackendipc_global.h>
|
||||
#include <clangdocument.h>
|
||||
#include <diagnosticcontainer.h>
|
||||
#include <diagnosticset.h>
|
||||
#include <fixitcontainer.h>
|
||||
@@ -32,9 +33,8 @@
|
||||
#include <sourcelocation.h>
|
||||
#include <sourcelocationcontainer.h>
|
||||
#include <sourcerangecontainer.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
@@ -56,7 +56,7 @@ using ::ClangBackEnd::FixItContainer;
|
||||
using ::ClangBackEnd::ProjectPart;
|
||||
using ::ClangBackEnd::SourceLocation;
|
||||
using ::ClangBackEnd::SourceLocationContainer;
|
||||
using ::ClangBackEnd::TranslationUnit;
|
||||
using ::ClangBackEnd::Document;
|
||||
using ::ClangBackEnd::UnsavedFiles;
|
||||
|
||||
namespace {
|
||||
@@ -69,15 +69,15 @@ protected:
|
||||
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
TranslationUnit translationUnitMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
Document documentMainFile{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnosticset_mainfile.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
|
||||
protected:
|
||||
enum ChildMode { WithChild, WithoutChild };
|
||||
@@ -86,16 +86,16 @@ protected:
|
||||
|
||||
TEST_F(DiagnosticSet, SetHasContent)
|
||||
{
|
||||
translationUnit.parse();
|
||||
const auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
const auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
ASSERT_THAT(set.size(), 1);
|
||||
}
|
||||
|
||||
TEST_F(DiagnosticSet, MoveConstructor)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
const auto set2 = std::move(set);
|
||||
|
||||
@@ -105,8 +105,8 @@ TEST_F(DiagnosticSet, MoveConstructor)
|
||||
|
||||
TEST_F(DiagnosticSet, MoveAssigment)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
auto set2 = std::move(set);
|
||||
set = std::move(set2);
|
||||
@@ -117,8 +117,8 @@ TEST_F(DiagnosticSet, MoveAssigment)
|
||||
|
||||
TEST_F(DiagnosticSet, MoveSelfAssigment)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
set = std::move(set);
|
||||
|
||||
@@ -127,24 +127,24 @@ TEST_F(DiagnosticSet, MoveSelfAssigment)
|
||||
|
||||
TEST_F(DiagnosticSet, FirstElementEqualBegin)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
ASSERT_TRUE(set.front() == *set.begin());
|
||||
}
|
||||
|
||||
TEST_F(DiagnosticSet, BeginIsUnequalEnd)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
ASSERT_TRUE(set.begin() != set.end());
|
||||
}
|
||||
|
||||
TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd)
|
||||
{
|
||||
translationUnit.parse();
|
||||
auto set = translationUnit.translationUnitCore().diagnostics();
|
||||
document.parse();
|
||||
auto set = document.translationUnitCore().diagnostics();
|
||||
|
||||
ASSERT_TRUE(++set.begin() == set.end());
|
||||
}
|
||||
@@ -152,17 +152,17 @@ TEST_F(DiagnosticSet, BeginPlusOneIsEqualEnd)
|
||||
TEST_F(DiagnosticSet, ToDiagnosticContainersLetThroughByDefault)
|
||||
{
|
||||
const auto diagnosticContainerWithoutChild = expectedDiagnostic(WithChild);
|
||||
translationUnitMainFile.parse();
|
||||
documentMainFile.parse();
|
||||
|
||||
const auto diagnostics = translationUnitMainFile.translationUnitCore().diagnostics().toDiagnosticContainers();
|
||||
const auto diagnostics = documentMainFile.translationUnitCore().diagnostics().toDiagnosticContainers();
|
||||
|
||||
ASSERT_THAT(diagnostics, Contains(IsDiagnosticContainer(diagnosticContainerWithoutChild)));
|
||||
}
|
||||
|
||||
TEST_F(DiagnosticSet, ToDiagnosticContainersFiltersOutTopLevelItem)
|
||||
{
|
||||
translationUnitMainFile.parse();
|
||||
const ::DiagnosticSet diagnosticSetWithChildren{translationUnitMainFile.translationUnitCore().diagnostics()};
|
||||
documentMainFile.parse();
|
||||
const ::DiagnosticSet diagnosticSetWithChildren{documentMainFile.translationUnitCore().diagnostics()};
|
||||
const auto acceptNoDiagnostics = [](const Diagnostic &) { return false; };
|
||||
|
||||
const auto diagnostics = diagnosticSetWithChildren.toDiagnosticContainers(acceptNoDiagnostics);
|
||||
@@ -192,7 +192,7 @@ DiagnosticContainer DiagnosticSet::expectedDiagnostic(DiagnosticSet::ChildMode c
|
||||
Utf8StringLiteral("Semantic Issue"),
|
||||
{Utf8String(), Utf8String()},
|
||||
ClangBackEnd::DiagnosticSeverity::Error,
|
||||
SourceLocationContainer(translationUnitMainFile.filePath(), 3, 6),
|
||||
SourceLocationContainer(documentMainFile.filePath(), 3, 6),
|
||||
{},
|
||||
{},
|
||||
children
|
||||
|
||||
@@ -28,9 +28,9 @@
|
||||
#include <diagnosticset.h>
|
||||
#include <fixitcontainer.h>
|
||||
#include <projectpart.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <projects.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <sourcelocation.h>
|
||||
@@ -51,13 +51,13 @@ using ::testing::PrintToString;
|
||||
|
||||
using ClangBackEnd::DiagnosticSet;
|
||||
using ClangBackEnd::DiagnosticContainer;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::Diagnostic;
|
||||
using ClangBackEnd::SourceLocation;
|
||||
using ClangBackEnd::DiagnosticSeverity;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
using ClangBackEnd::FixItContainer;
|
||||
using ClangBackEnd::SourceLocationContainer;
|
||||
|
||||
@@ -81,8 +81,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
|
||||
}
|
||||
|
||||
struct DiagnosticData {
|
||||
DiagnosticData(TranslationUnit &translationUnit)
|
||||
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()}
|
||||
DiagnosticData(Document &document)
|
||||
: diagnosticSet{document.translationUnitCore().diagnostics()}
|
||||
, diagnostic{diagnosticSet.front()}
|
||||
{
|
||||
}
|
||||
@@ -94,18 +94,18 @@ struct DiagnosticData {
|
||||
struct Data {
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
d.reset(new DiagnosticData(translationUnit));
|
||||
document.parse();
|
||||
d.reset(new DiagnosticData(document));
|
||||
}
|
||||
|
||||
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_diagnostic.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
std::unique_ptr<DiagnosticData> d;
|
||||
};
|
||||
|
||||
@@ -215,7 +215,7 @@ DiagnosticContainer Diagnostic::expectedDiagnostic(Diagnostic::ChildMode childMo
|
||||
Utf8StringLiteral("Semantic Issue"),
|
||||
{Utf8String(), Utf8String()},
|
||||
ClangBackEnd::DiagnosticSeverity::Note,
|
||||
SourceLocationContainer(d->translationUnit.filePath(), 5, 6),
|
||||
SourceLocationContainer(d->document.filePath(), 5, 6),
|
||||
{},
|
||||
{},
|
||||
{}
|
||||
@@ -229,7 +229,7 @@ DiagnosticContainer Diagnostic::expectedDiagnostic(Diagnostic::ChildMode childMo
|
||||
Utf8StringLiteral("Semantic Issue"),
|
||||
{Utf8String(), Utf8String()},
|
||||
ClangBackEnd::DiagnosticSeverity::Error,
|
||||
SourceLocationContainer(d->translationUnit.filePath(), 7, 5),
|
||||
SourceLocationContainer(d->document.filePath(), 7, 5),
|
||||
{},
|
||||
{},
|
||||
children
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
#include <diagnosticset.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <sourcelocation.h>
|
||||
#include <sourcerange.h>
|
||||
@@ -43,7 +43,7 @@
|
||||
#include "gtest-qt-printing.h"
|
||||
|
||||
using ClangBackEnd::DiagnosticSet;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::TranslationUnitCore;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
@@ -88,19 +88,19 @@ struct Data
|
||||
{
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
d.reset(new FixItData(translationUnitCore));
|
||||
}
|
||||
|
||||
ProjectPart projectPart{Utf8StringLiteral("projectPartId")};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
TranslationUnitCore translationUnitCore{translationUnit.translationUnitCore()};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_semicolon_fixit.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
TranslationUnitCore translationUnitCore{document.translationUnitCore()};
|
||||
std::unique_ptr<FixItData> d;
|
||||
};
|
||||
|
||||
|
||||
@@ -24,14 +24,14 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <chunksreportedmonitor.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <cursor.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <highlightingmarkcontainer.h>
|
||||
#include <highlightingmarks.h>
|
||||
#include <clanghighlightingmarksreporter.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
@@ -43,11 +43,11 @@ using ClangBackEnd::Cursor;
|
||||
using ClangBackEnd::HighlightingMarks;
|
||||
using ClangBackEnd::HighlightingMarkContainer;
|
||||
using ClangBackEnd::HighlightingType;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::ProjectParts;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
using ClangBackEnd::ChunksReportedMonitor;
|
||||
|
||||
namespace {
|
||||
@@ -55,12 +55,12 @@ namespace {
|
||||
struct Data {
|
||||
ProjectParts projects;
|
||||
UnsavedFiles unsavedFiles;
|
||||
TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"),
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"),
|
||||
{Utf8StringLiteral("-std=c++14")}),
|
||||
{},
|
||||
translationUnits};
|
||||
Documents documents{projects, unsavedFiles};
|
||||
Document document{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"),
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"),
|
||||
{Utf8StringLiteral("-std=c++14")}),
|
||||
{},
|
||||
documents};
|
||||
};
|
||||
|
||||
class HighlightingMarksReporter : public ::testing::Test
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <cursor.h>
|
||||
#include <clangbackendipc_global.h>
|
||||
@@ -34,7 +35,6 @@
|
||||
#include <sourcerange.h>
|
||||
#include <highlightingmark.h>
|
||||
#include <highlightingmarks.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <clang-c/Index.h>
|
||||
@@ -49,11 +49,11 @@ using ClangBackEnd::HighlightingTypes;
|
||||
using ClangBackEnd::HighlightingMark;
|
||||
using ClangBackEnd::HighlightingMarks;
|
||||
using ClangBackEnd::HighlightingType;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::TranslationUnitCore;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
using ClangBackEnd::ClangString;
|
||||
using ClangBackEnd::SourceRange;
|
||||
|
||||
@@ -101,20 +101,21 @@ MATCHER_P2(HasTwoTypes, firstType, secondType,
|
||||
struct Data {
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
}
|
||||
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp")};
|
||||
TranslationUnit translationUnit{filePath,
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++14")}),
|
||||
{},
|
||||
translationUnits};
|
||||
Document document{filePath,
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"),
|
||||
{Utf8StringLiteral("-std=c++14")}),
|
||||
{},
|
||||
documents};
|
||||
TranslationUnitCore translationUnitCore{filePath,
|
||||
translationUnit.translationUnitCore().cxIndex(),
|
||||
translationUnit.translationUnitCore().cxTranslationUnit()};
|
||||
document.translationUnitCore().cxIndex(),
|
||||
document.translationUnitCore().cxTranslationUnit()};
|
||||
};
|
||||
|
||||
class HighlightingMarks : public ::testing::Test
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <cursor.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangstring.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <projectpart.h>
|
||||
@@ -31,8 +33,6 @@
|
||||
#include <skippedsourceranges.h>
|
||||
#include <sourcelocation.h>
|
||||
#include <sourcerange.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
|
||||
#include <sourcerangecontainer.h>
|
||||
@@ -45,11 +45,11 @@
|
||||
#include "gtest-qt-printing.h"
|
||||
|
||||
using ClangBackEnd::Cursor;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::TranslationUnitCore;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
using ClangBackEnd::ClangString;
|
||||
using ClangBackEnd::SourceRange;
|
||||
using ClangBackEnd::SkippedSourceRanges;
|
||||
@@ -88,21 +88,22 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
|
||||
struct Data {
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
document.parse();
|
||||
}
|
||||
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp");
|
||||
TranslationUnit translationUnit{filePath,
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"),
|
||||
{Utf8StringLiteral("-std=c++11"),Utf8StringLiteral("-DBLAH")}),
|
||||
{},
|
||||
translationUnits};
|
||||
Document document{filePath,
|
||||
ProjectPart(Utf8StringLiteral("projectPartId"),
|
||||
{Utf8StringLiteral("-std=c++11"),
|
||||
Utf8StringLiteral("-DBLAH")}),
|
||||
{},
|
||||
documents};
|
||||
TranslationUnitCore translationUnitCore{filePath,
|
||||
translationUnit.translationUnitCore().cxIndex(),
|
||||
translationUnit.translationUnitCore().cxTranslationUnit()};
|
||||
document.translationUnitCore().cxIndex(),
|
||||
document.translationUnitCore().cxTranslationUnit()};
|
||||
};
|
||||
|
||||
class SkippedSourceRanges : public ::testing::Test
|
||||
|
||||
@@ -27,9 +27,9 @@
|
||||
#include <diagnosticset.h>
|
||||
#include <projectpart.h>
|
||||
#include <projects.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <clangtranslationunitcore.h>
|
||||
#include <translationunits.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <sourcelocation.h>
|
||||
|
||||
@@ -44,7 +44,7 @@ using ClangBackEnd::Diagnostic;
|
||||
using ClangBackEnd::DiagnosticSet;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::SourceLocation;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
|
||||
using testing::EndsWith;
|
||||
@@ -53,8 +53,8 @@ using testing::Not;
|
||||
namespace {
|
||||
|
||||
struct SourceLocationData {
|
||||
SourceLocationData(TranslationUnit &translationUnit)
|
||||
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()}
|
||||
SourceLocationData(Document &document)
|
||||
: diagnosticSet{document.translationUnitCore().diagnostics()}
|
||||
, diagnostic{diagnosticSet.front()}
|
||||
, sourceLocation{diagnostic.location()}
|
||||
{
|
||||
@@ -68,18 +68,18 @@ struct SourceLocationData {
|
||||
struct Data {
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
d.reset(new SourceLocationData(translationUnit));
|
||||
document.parse();
|
||||
d.reset(new SourceLocationData(document));
|
||||
}
|
||||
|
||||
ProjectPart projectPart{Utf8StringLiteral("projectPartId")};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
TranslationUnit translationUnit{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Document document{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_location.cpp"),
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
std::unique_ptr<SourceLocationData> d;
|
||||
};
|
||||
|
||||
@@ -91,7 +91,7 @@ public:
|
||||
|
||||
protected:
|
||||
static Data *d;
|
||||
TranslationUnit &translationUnit = d->translationUnit;
|
||||
Document &document = d->document;
|
||||
::SourceLocation &sourceLocation = d->d->sourceLocation;
|
||||
};
|
||||
|
||||
@@ -117,12 +117,12 @@ TEST_F(SourceLocation, Offset)
|
||||
|
||||
TEST_F(SourceLocation, Create)
|
||||
{
|
||||
ASSERT_THAT(translationUnit.translationUnitCore().sourceLocationAt(4, 1), sourceLocation);
|
||||
ASSERT_THAT(document.translationUnitCore().sourceLocationAt(4, 1), sourceLocation);
|
||||
}
|
||||
|
||||
TEST_F(SourceLocation, NotEqual)
|
||||
{
|
||||
ASSERT_THAT(translationUnit.translationUnitCore().sourceLocationAt(3, 1), Not(sourceLocation));
|
||||
ASSERT_THAT(document.translationUnitCore().sourceLocationAt(3, 1), Not(sourceLocation));
|
||||
}
|
||||
|
||||
Data *SourceLocation::d;
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
#include <diagnostic.h>
|
||||
#include <diagnosticset.h>
|
||||
#include <projectpart.h>
|
||||
#include <clangtranslationunit.h>
|
||||
#include <translationunits.h>
|
||||
#include <clangdocument.h>
|
||||
#include <clangdocuments.h>
|
||||
#include <projects.h>
|
||||
#include <unsavedfiles.h>
|
||||
#include <sourcerange.h>
|
||||
@@ -43,13 +43,13 @@
|
||||
#include "gtest-qt-printing.h"
|
||||
|
||||
using ClangBackEnd::DiagnosticSet;
|
||||
using ClangBackEnd::TranslationUnit;
|
||||
using ClangBackEnd::Document;
|
||||
using ClangBackEnd::Documents;
|
||||
using ClangBackEnd::TranslationUnitCore;
|
||||
using ClangBackEnd::ProjectPart;
|
||||
using ClangBackEnd::UnsavedFiles;
|
||||
using ClangBackEnd::Diagnostic;
|
||||
using ClangBackEnd::SourceRange;
|
||||
using ClangBackEnd::TranslationUnits;
|
||||
|
||||
using testing::PrintToString;
|
||||
using testing::IsEmpty;
|
||||
@@ -75,8 +75,8 @@ MATCHER_P4(IsSourceLocation, filePath, line, column, offset,
|
||||
}
|
||||
|
||||
struct SourceRangeData {
|
||||
SourceRangeData(TranslationUnit &translationUnit)
|
||||
: diagnosticSet{translationUnit.translationUnitCore().diagnostics()}
|
||||
SourceRangeData(Document &document)
|
||||
: diagnosticSet{document.translationUnitCore().diagnostics()}
|
||||
, diagnostic{diagnosticSet.front()}
|
||||
, diagnosticWithFilteredOutInvalidRange{diagnosticSet.at(1)}
|
||||
, sourceRange{diagnostic.ranges().front()}
|
||||
@@ -92,22 +92,22 @@ struct SourceRangeData {
|
||||
struct Data {
|
||||
Data()
|
||||
{
|
||||
translationUnit.parse();
|
||||
d.reset(new SourceRangeData(translationUnit));
|
||||
document.parse();
|
||||
d.reset(new SourceRangeData(document));
|
||||
}
|
||||
|
||||
ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}};
|
||||
ClangBackEnd::ProjectParts projects;
|
||||
ClangBackEnd::UnsavedFiles unsavedFiles;
|
||||
ClangBackEnd::TranslationUnits translationUnits{projects, unsavedFiles};
|
||||
ClangBackEnd::Documents documents{projects, unsavedFiles};
|
||||
Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/diagnostic_source_range.cpp")};
|
||||
TranslationUnit translationUnit{filePath,
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
translationUnits};
|
||||
Document document{filePath,
|
||||
projectPart,
|
||||
Utf8StringVector(),
|
||||
documents};
|
||||
TranslationUnitCore translationUnitCore{filePath,
|
||||
translationUnit.translationUnitCore().cxIndex(),
|
||||
translationUnit.translationUnitCore().cxTranslationUnit()};
|
||||
document.translationUnitCore().cxIndex(),
|
||||
document.translationUnitCore().cxTranslationUnit()};
|
||||
|
||||
std::unique_ptr<SourceRangeData> d;
|
||||
};
|
||||
|
||||
@@ -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)});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,8 +62,8 @@ SOURCES += \
|
||||
sqlitestatementtest.cpp \
|
||||
sqlitetabletest.cpp \
|
||||
sqlstatementbuildertest.cpp \
|
||||
translationunitstest.cpp \
|
||||
translationunittest.cpp \
|
||||
clangdocumenttest.cpp \
|
||||
clangdocumentstest.cpp \
|
||||
unsavedfilestest.cpp \
|
||||
senddocumenttrackertest.cpp \
|
||||
cursortest.cpp \
|
||||
|
||||
Reference in New Issue
Block a user