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