diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index f9ea7705c184cac29cbc0f86021f58e2a1341791..11c0bd3e8c880c0fecf4bb6e633163bd2ce8066b 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -73,22 +73,23 @@ public: Separator, Invalid }; - TextLineData() : textLineType(Invalid), changed(true) {} - TextLineData(const QString &txt) : textLineType(TextLine), text(txt), changed(true) {} - TextLineData(TextLineType t) : textLineType(t), changed(true) {} + TextLineData() : textLineType(Invalid) {} + TextLineData(const QString &txt) : textLineType(TextLine), text(txt) {} + TextLineData(TextLineType t) : textLineType(t) {} TextLineType textLineType; QString text; - bool changed; // true if anything was changed in this line (inserted or removed), taking whitespaces into account }; class RowData { public: + RowData() : equal(false) {} RowData(const TextLineData &l) - : leftLine(l), rightLine(l) {} + : leftLine(l), rightLine(l), equal(true) {} RowData(const TextLineData &l, const TextLineData &r) - : leftLine(l), rightLine(r) {} + : leftLine(l), rightLine(r), equal(false) {} TextLineData leftLine; TextLineData rightLine; + bool equal; }; class ChunkData { @@ -113,7 +114,6 @@ public: static QList<TextLineData> assemblyRows(const QStringList &lines, const QMap<int, int> &lineSpans, - const QMap<int, bool> &equalLines, const QMap<int, int> &changedPositions, QMap<int, int> *outputChangedPositions) { @@ -135,8 +135,6 @@ static QList<TextLineData> assemblyRows(const QStringList &lines, const int textLength = lines.at(i).count() + 1; pos += textLength; data.append(lines.at(i)); - if (equalLines.contains(i)) - data.last().changed = false; } while (changedIt != changedEnd) { if (changedIt.key() >= pos) @@ -229,9 +227,8 @@ static ChunkData calculateOriginalData(const QList<Diff> &leftDiffList, // <line number, span count> QMap<int, int> leftSpans; QMap<int, int> rightSpans; - // <line number, dummy> - QMap<int, bool> leftEqualLines; - QMap<int, bool> rightEqualLines; + // <left line number, right line number> + QMap<int, int> equalLines; int leftLineNumber = 0; int rightLineNumber = 0; @@ -310,16 +307,12 @@ static ChunkData calculateOriginalData(const QList<Diff> &leftDiffList, } // check if lines are equal - if (line < newLeftLines.count() - 1 || i == leftDiffList.count()) { - // left line is equal + if ((line < commonLineCount - 1) // before the last common line in equality + || (line == commonLineCount - 1 // or the last common line in equality + && i == leftDiffList.count() // and it's the last iteration + && j == rightDiffList.count())) { if (line > 0 || lastLineEqual) - leftEqualLines.insert(leftLineNumber, true); - } - - if (line < newRightLines.count() - 1 || j == rightDiffList.count()) { - // right line is equal - if (line > 0 || lastLineEqual) - rightEqualLines.insert(rightLineNumber, true); + equalLines.insert(leftLineNumber, rightLineNumber); } if (line > 0) @@ -334,12 +327,10 @@ static ChunkData calculateOriginalData(const QList<Diff> &leftDiffList, QList<TextLineData> leftData = assemblyRows(leftLines, leftSpans, - leftEqualLines, leftChangedPositions, &chunkData.changedLeftPositions); QList<TextLineData> rightData = assemblyRows(rightLines, rightSpans, - rightEqualLines, rightChangedPositions, &chunkData.changedRightPositions); @@ -350,8 +341,22 @@ static ChunkData calculateOriginalData(const QList<Diff> &leftDiffList, rightData.append(TextLineData(TextLineData::Separator)); const int visualLineCount = leftData.count(); - for (int i = 0; i < visualLineCount; i++) - chunkData.rows.append(RowData(leftData.at(i), rightData.at(i))); + int leftLine = -1; + int rightLine = -1; + for (int i = 0; i < visualLineCount; i++) { + const TextLineData &leftTextLine = leftData.at(i); + const TextLineData &rightTextLine = rightData.at(i); + RowData row(leftTextLine, rightTextLine); + + if (leftTextLine.textLineType == TextLineData::TextLine) + ++leftLine; + if (rightTextLine.textLineType == TextLineData::TextLine) + ++rightLine; + if (equalLines.value(leftLine, -1) == rightLine) + row.equal = true; + + chunkData.rows.append(row); + } return chunkData; } @@ -1194,13 +1199,13 @@ FileData SideBySideDiffEditorWidget::calculateContextData(const ChunkData &origi int i = 0; while (i < originalData.rows.count()) { const RowData &row = originalData.rows[i]; - if (!row.leftLine.changed && !row.rightLine.changed) { + if (row.equal) { // count how many equal int equalRowStart = i; i++; while (i < originalData.rows.count()) { const RowData originalRow = originalData.rows.at(i); - if (originalRow.leftLine.changed || originalRow.rightLine.changed) + if (!originalRow.equal) break; i++; } @@ -1509,7 +1514,7 @@ void SideBySideDiffEditorWidget::colorDiff(const QList<FileData> &fileDataList) leftPos += rowData.leftLine.text.count() + 1; // +1 for '\n' rightPos += rowData.rightLine.text.count() + 1; // +1 for '\n' - if (rowData.leftLine.changed) { + if (!rowData.equal) { if (rowData.leftLine.textLineType == TextLineData::TextLine) { leftLinePos[leftLastDiffBlockStartPos] = leftPos; leftLastSkippedBlockStartPos = leftPos; @@ -1517,12 +1522,6 @@ void SideBySideDiffEditorWidget::colorDiff(const QList<FileData> &fileDataList) leftSkippedPos[leftLastSkippedBlockStartPos] = leftPos; leftLastDiffBlockStartPos = leftPos; } - } else { - leftLastDiffBlockStartPos = leftPos; - leftLastSkippedBlockStartPos = leftPos; - } - - if (rowData.rightLine.changed) { if (rowData.rightLine.textLineType == TextLineData::TextLine) { rightLinePos[rightLastDiffBlockStartPos] = rightPos; rightLastSkippedBlockStartPos = rightPos; @@ -1531,6 +1530,8 @@ void SideBySideDiffEditorWidget::colorDiff(const QList<FileData> &fileDataList) rightLastDiffBlockStartPos = rightPos; } } else { + leftLastDiffBlockStartPos = leftPos; + leftLastSkippedBlockStartPos = leftPos; rightLastDiffBlockStartPos = rightPos; rightLastSkippedBlockStartPos = rightPos; } @@ -1616,8 +1617,7 @@ void SideBySideDiffEditorWidget::slotLeftJumpToOriginalFileRequested(int diffFil if (rowData.rightLine.textLineType == TextLineData::TextLine) rightLineNumber++; if (leftLineNumber == lineNumber) { - int colNr = !rowData.leftLine.changed && !rowData.rightLine.changed - ? columnNumber : 0; + int colNr = rowData.equal ? columnNumber : 0; jumpToOriginalFile(leftFileName, rightLineNumber, colNr); return; } @@ -1852,14 +1852,12 @@ void DiffEditor::SideBySideDiffEditorWidget::testAssemblyRows() QMap<int, int> changedPositions; changedPositions[5] = 14; // changed text from position 5 to position 14, occupy 9 characters: "efgh\nijkl" - QMap<int, bool> equalLines; // no equal lines - QMap<int, int> expectedChangedPositions; expectedChangedPositions[5] = 20; // "efgh\n[\n\n\n\n\n\n]ijkl" - [\n] means inserted span QMap<int, int> outputChangedPositions; - assemblyRows(lines, lineSpans, equalLines, changedPositions, &outputChangedPositions); + assemblyRows(lines, lineSpans, changedPositions, &outputChangedPositions); QVERIFY(outputChangedPositions == expectedChangedPositions); }