UnifiedDiffEditor: Avoid code repetition

Change-Id: I2e361b29c3d35fe5128b6b5a4a90b6c4ee0de432
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2022-09-28 00:48:14 +02:00
parent 472d791fec
commit 15fd4a0754

View File

@@ -250,19 +250,15 @@ QString UnifiedDiffEditorWidget::lineNumber(int blockNumber) const
const bool rightLineExists = m_data.m_lineNumbers[RightSide].contains(blockNumber);
if (leftLineExists || rightLineExists) {
const QString leftLine = leftLineExists
? QString::number(m_data.m_lineNumbers[LeftSide].value(blockNumber).first)
auto addSideNumber = [&](DiffSide side, bool lineExists) {
const QString line = lineExists
? QString::number(m_data.m_lineNumbers[side].value(blockNumber).first)
: QString();
lineNumberString += QString(m_data.m_lineNumberDigits[LeftSide] - leftLine.count(),
' ') + leftLine;
lineNumberString += QString(m_data.m_lineNumberDigits[side] - line.count(), ' ') + line;
};
addSideNumber(LeftSide, leftLineExists);
lineNumberString += '|';
const QString rightLine = rightLineExists
? QString::number(m_data.m_lineNumbers[RightSide].value(blockNumber).first)
: QString();
lineNumberString += QString(m_data.m_lineNumberDigits[RightSide] - rightLine.count(),
' ') + rightLine;
addSideNumber(RightSide, rightLineExists);
}
return lineNumberString;
}
@@ -283,7 +279,7 @@ void UnifiedDiffData::setLineNumber(DiffSide side, int blockNumber, int lineNumb
void UnifiedDiffData::setFileInfo(int blockNumber, const DiffFileInfo &leftInfo,
const DiffFileInfo &rightInfo)
{
m_fileInfo[blockNumber] = qMakePair(leftInfo, rightInfo);
m_fileInfo[blockNumber] = {leftInfo, rightInfo};
}
void UnifiedDiffData::setChunkIndex(int startBlockNumber, int blockCount, int chunkIndex)
@@ -307,12 +303,11 @@ QString UnifiedDiffData::setChunk(const DiffEditorInput &input, const ChunkData
return {};
QString diffText;
int leftLineCount = 0;
int rightLineCount = 0;
int blockCount = 0;
int charCount = 0;
QList<TextLineData> leftBuffer, rightBuffer;
QList<int> leftRowsBuffer, rightRowsBuffer;
std::array<int, SideCount> lineCount{};
std::array<QList<TextLineData>, SideCount> buffer{};
std::array<QList<int>, SideCount> rowsBuffer{};
(*selections)[*blockNumber].append({input.m_chunkLineFormat});
@@ -327,130 +322,96 @@ QString UnifiedDiffData::setChunk(const DiffEditorInput &input, const ChunkData
}
}
for (int i = 0; i <= chunkData.rows.count(); i++) {
const RowData &rowData = i < chunkData.rows.count()
? chunkData.rows.at(i)
: RowData(TextLineData(TextLineData::Separator)); // dummy,
// ensure we process buffers to the end.
// rowData will be equal
if (rowData.equal && i != lastEqualRow) {
if (!leftBuffer.isEmpty()) {
for (int j = 0; j < leftBuffer.count(); j++) {
const TextLineData &lineData = leftBuffer.at(j);
auto processSideChunk = [&](DiffSide side, int chunkIndex) {
if (buffer[side].isEmpty())
return;
for (int j = 0; j < buffer[side].count(); j++) {
const TextLineData &lineData = buffer[side].at(j);
const QString line = DiffUtils::makePatchLine(
'-',
lineData.text,
lastChunk,
i == chunkData.rows.count() && j == leftBuffer.count() - 1);
chunkIndex == chunkData.rows.count() && j == buffer[side].count() - 1);
const int blockDelta = line.count('\n'); // no new line
// could have been added
for (int k = 0; k < blockDelta; k++)
(*selections)[*blockNumber + blockCount + 1 + k].append({input.m_lineFormat[LeftSide]});
(*selections)[*blockNumber + blockCount + 1 + k].append({input.m_lineFormat[side]});
for (auto it = lineData.changedPositions.cbegin(),
end = lineData.changedPositions.cend(); it != end; ++it) {
const int startPos = it.key() < 0 ? 1 : it.key() + 1;
const int endPos = it.value() < 0 ? it.value() : it.value() + 1;
(*selections)[*blockNumber + blockCount + 1].append(
{input.m_charFormat[LeftSide], startPos, endPos});
{input.m_charFormat[side], startPos, endPos});
}
if (!line.isEmpty()) {
setLineNumber(LeftSide,
setLineNumber(side,
*blockNumber + blockCount + 1,
chunkData.startingLineNumber[LeftSide] + leftLineCount + 1,
leftRowsBuffer.at(j));
chunkData.startingLineNumber[side] + lineCount[side] + 1,
rowsBuffer[side].at(j));
blockCount += blockDelta;
++leftLineCount;
++lineCount[side];
}
diffText += line;
charCount += line.count();
}
leftBuffer.clear();
leftRowsBuffer.clear();
buffer[side].clear();
rowsBuffer[side].clear();
};
auto processSideChunkEmpty = [&](DiffSide side, int chunkIndex) {
setLineNumber(side, *blockNumber + blockCount + 1,
chunkData.startingLineNumber[side] + lineCount[side] + 1, chunkIndex);
++lineCount[side];
};
auto processSideChunkDifferent = [&](DiffSide side, int chunkIndex, const RowData &rowData) {
if (rowData.line[side].textLineType == TextLineData::TextLine) {
buffer[side].append(rowData.line[side]);
rowsBuffer[side].append(chunkIndex);
}
if (!rightBuffer.isEmpty()) {
for (int j = 0; j < rightBuffer.count(); j++) {
const TextLineData &lineData = rightBuffer.at(j);
const QString line = DiffUtils::makePatchLine(
'+',
lineData.text,
lastChunk,
i == chunkData.rows.count() && j == rightBuffer.count() - 1);
};
const int blockDelta = line.count('\n'); // no new line
// could have been added
for (int i = 0; i <= chunkData.rows.count(); i++) {
const RowData &rowData = i < chunkData.rows.count()
? chunkData.rows.at(i)
// dummy, ensure we process buffers to the end. rowData will be equal
: RowData(TextLineData(TextLineData::Separator));
for (int k = 0; k < blockDelta; k++)
(*selections)[*blockNumber + blockCount + 1 + k].append({input.m_lineFormat[RightSide]});
for (auto it = lineData.changedPositions.cbegin(),
end = lineData.changedPositions.cend(); it != end; ++it) {
const int startPos = it.key() < 0 ? 1 : it.key() + 1;
const int endPos = it.value() < 0 ? it.value() : it.value() + 1;
(*selections)[*blockNumber + blockCount + 1].append(
{input.m_charFormat[RightSide], startPos, endPos});
}
if (!line.isEmpty()) {
setLineNumber(RightSide,
*blockNumber + blockCount + 1,
chunkData.startingLineNumber[RightSide] + rightLineCount + 1,
rightRowsBuffer.at(j));
blockCount += blockDelta;
++rightLineCount;
}
diffText += line;
charCount += line.count();
}
rightBuffer.clear();
rightRowsBuffer.clear();
}
if (rowData.equal && i != lastEqualRow) {
processSideChunk(LeftSide, i);
processSideChunk(RightSide, i);
if (i < chunkData.rows.count()) {
const QString line = DiffUtils::makePatchLine(' ',
rowData.line[RightSide].text,
lastChunk,
i == chunkData.rows.count() - 1);
if (!line.isEmpty()) {
setLineNumber(LeftSide, *blockNumber + blockCount + 1,
chunkData.startingLineNumber[LeftSide] + leftLineCount + 1, i);
setLineNumber(RightSide, *blockNumber + blockCount + 1,
chunkData.startingLineNumber[RightSide] + rightLineCount + 1, i);
processSideChunkEmpty(LeftSide, i);
processSideChunkEmpty(RightSide, i);
blockCount += line.count('\n');
++leftLineCount;
++rightLineCount;
}
diffText += line;
charCount += line.count();
}
} else {
if (rowData.line[LeftSide].textLineType == TextLineData::TextLine) {
leftBuffer.append(rowData.line[LeftSide]);
leftRowsBuffer.append(i);
}
if (rowData.line[RightSide].textLineType == TextLineData::TextLine) {
rightBuffer.append(rowData.line[RightSide]);
rightRowsBuffer.append(i);
}
processSideChunkDifferent(LeftSide, i, rowData);
processSideChunkDifferent(RightSide, i, rowData);
}
}
const QString chunkLine = "@@ -"
+ QString::number(chunkData.startingLineNumber[LeftSide] + 1)
+ ','
+ QString::number(leftLineCount)
+ QString::number(lineCount[LeftSide])
+ " +"
+ QString::number(chunkData.startingLineNumber[RightSide]+ 1)
+ ','
+ QString::number(rightLineCount)
+ QString::number(lineCount[RightSide])
+ " @@"
+ chunkData.contextInfo
+ '\n';