Refactor internal structures inside diff editor

Move "changed" property out of TextLineData into
RowData as "equal".

Change-Id: Id9cb87d099cecb61a2774e7a4fffcc162dece604
Reviewed-by: Jarek Kobus <jaroslaw.kobus@digia.com>
This commit is contained in:
jkobus
2014-02-27 12:22:47 +01:00
committed by Jarek Kobus
parent b8a1807542
commit 9f10e8daac

View File

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