diff --git a/src/libs/utils/differ.cpp b/src/libs/utils/differ.cpp index b1c163bb5b4..9dc2ce8454e 100644 --- a/src/libs/utils/differ.cpp +++ b/src/libs/utils/differ.cpp @@ -936,7 +936,7 @@ QString Diff::toString() const /////////////// -Differ::Differ(const QFuture &future) +Differ::Differ(const std::optional> &future) : m_future(future) { } @@ -1073,7 +1073,7 @@ QList Differ::diffMyers(const QString &text1, const QString &text2) int kMinReverse = -D; int kMaxReverse = D; for (int d = 0; d <= D; d++) { - if (m_future.isCanceled()) { + if (m_future && m_future->isCanceled()) { delete [] forwardV; delete [] reverseV; return QList(); @@ -1192,7 +1192,7 @@ QList Differ::diffNonCharMode(const QString &text1, const QString &text2) QString lastInsert; QList newDiffList; for (int i = 0; i <= diffList.count(); i++) { - if (m_future.isCanceled()) { + if (m_future && m_future->isCanceled()) { m_currentDiffMode = diffMode; return {}; } diff --git a/src/libs/utils/differ.h b/src/libs/utils/differ.h index 09b79652225..dc6d74f30da 100644 --- a/src/libs/utils/differ.h +++ b/src/libs/utils/differ.h @@ -8,6 +8,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE template class QMap; @@ -42,7 +44,7 @@ public: WordMode, LineMode }; - Differ(const QFuture &future = {}); + Differ(const std::optional> &future = {}); QList diff(const QString &text1, const QString &text2); QList unifiedDiff(const QString &text1, const QString &text2); void setDiffMode(DiffMode mode); @@ -90,7 +92,7 @@ private: int subTextStart); DiffMode m_diffMode = Differ::LineMode; DiffMode m_currentDiffMode = Differ::LineMode; - QFuture m_future; + std::optional> m_future; }; } // namespace Utils diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index efea3530a43..afb75203037 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -557,7 +557,7 @@ static QList readLines(QStringView patch, bool lastChunk, bool *lastChu int noNewLineInDelete = -1; int noNewLineInInsert = -1; - const QVector lines = patch.split(newLine); + const QList lines = patch.split(newLine); int i; for (i = 0; i < lines.size(); i++) { QStringView line = lines.at(i); @@ -795,7 +795,7 @@ static QList readChunks(QStringView patch, bool *lastChunkAtTheEndOfF QList chunkDataList; int position = -1; - QVector startingPositions; // store starting positions of @@ + QList startingPositions; // store starting positions of @@ if (patch.startsWith(QStringLiteral("@@ -"))) startingPositions.append(position + 1); @@ -1199,7 +1199,7 @@ static void readGitPatch(QPromise> &promise, QStringView patch) { int position = -1; - QVector startingPositions; // store starting positions of git headers + QList startingPositions; // store starting positions of git headers if (patch.startsWith(QStringLiteral("diff --git "))) startingPositions.append(position + 1); @@ -1214,7 +1214,7 @@ static void readGitPatch(QPromise> &promise, QStringView patch) const QChar newLine('\n'); - QVector patches; + QList patches; const int count = startingPositions.size(); for (int i = 0; i < count; i++) { if (promise.isCanceled()) @@ -1239,10 +1239,12 @@ static void readGitPatch(QPromise> &promise, QStringView patch) patches.append(PatchInfo { remainingFileDiff, fileData }); } + if (patches.isEmpty()) + return; + promise.setProgressRange(0, patches.size()); QList fileDataList; - bool readOk = false; int i = 0; for (const auto &patchInfo : std::as_const(patches)) { if (promise.isCanceled()) @@ -1250,6 +1252,7 @@ static void readGitPatch(QPromise> &promise, QStringView patch) promise.setProgressValue(i++); FileData fileData = patchInfo.fileData; + bool readOk = false; if (!patchInfo.patch.isEmpty() || fileData.fileOperation == FileData::ChangeFile) fileData.chunks = readChunks(patchInfo.patch, &fileData.lastChunkAtTheEndOfFile, &readOk); else