// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "utils_global.h" #include #include #include QT_BEGIN_NAMESPACE template class QMap; QT_END_NAMESPACE namespace Utils { class QTCREATOR_UTILS_EXPORT Diff { public: enum Command { Delete, Insert, Equal }; Command command = Equal; QString text; Diff() = default; Diff(Command com, const QString &txt = {}); bool operator==(const Diff &other) const; bool operator!=(const Diff &other) const; QString toString() const; static QString commandString(Command com); }; class QTCREATOR_UTILS_EXPORT Differ { public: enum DiffMode { CharMode, WordMode, LineMode }; 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); DiffMode diffMode() const; static QList merge(const QList &diffList); static QList cleanupSemantics(const QList &diffList); static QList cleanupSemanticsLossless(const QList &diffList); static void splitDiffList(const QList &diffList, QList *leftDiffList, QList *rightDiffList); static QList moveWhitespaceIntoEqualities(const QList &input); static void diffWithWhitespaceReduced(const QString &leftInput, const QString &rightInput, QList *leftOutput, QList *rightOutput); static void unifiedDiffWithWhitespaceReduced(const QString &leftInput, const QString &rightInput, QList *leftOutput, QList *rightOutput); static void ignoreWhitespaceBetweenEqualities(const QList &leftInput, const QList &rightInput, QList *leftOutput, QList *rightOutput); static void diffBetweenEqualities(const QList &leftInput, const QList &rightInput, QList *leftOutput, QList *rightOutput); private: QList preprocess1AndDiff(const QString &text1, const QString &text2); QList preprocess2AndDiff(const QString &text1, const QString &text2); QList diffMyers(const QString &text1, const QString &text2); QList diffMyersSplit(const QString &text1, int x, const QString &text2, int y); QList diffNonCharMode(const QString &text1, const QString &text2); QStringList encode(const QString &text1, const QString &text2, QString *encodedText1, QString *encodedText2); QString encode(const QString &text, QStringList *lines, QMap *lineToCode); int findSubtextEnd(const QString &text, int subTextStart); DiffMode m_diffMode = Differ::LineMode; DiffMode m_currentDiffMode = Differ::LineMode; std::optional> m_future; }; } // namespace Utils