forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user