diff options
author | jkobus <jaroslaw.kobus@digia.com> | 2013-06-07 15:23:12 +0200 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2013-06-07 15:36:55 +0200 |
commit | 2ddcc0c3862bcb114b93b2bd4de6922f6b9d1ef9 (patch) | |
tree | 41f2cfb701bf3f3dc11145e04f05cd68e6834c3d /src/plugins/diffeditor/diffeditorwidget.cpp | |
parent | c8b478f0bdfd30a0dfb0cf4066930e7b676a7a62 (diff) | |
download | qt-creator-2ddcc0c3862bcb114b93b2bd4de6922f6b9d1ef9.tar.gz |
Fix wrong diff output with span lines
Task-number: QTCREATORBUG-9494
Change-Id: Ica26e1448b1997e102648be58128f1be00c4905e
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Christian Stenger <christian.stenger@digia.com>
Diffstat (limited to 'src/plugins/diffeditor/diffeditorwidget.cpp')
-rw-r--r-- | src/plugins/diffeditor/diffeditorwidget.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/plugins/diffeditor/diffeditorwidget.cpp b/src/plugins/diffeditor/diffeditorwidget.cpp index 4bce0b3466..97616375ea 100644 --- a/src/plugins/diffeditor/diffeditorwidget.cpp +++ b/src/plugins/diffeditor/diffeditorwidget.cpp @@ -775,8 +775,10 @@ QList<TextLineData> DiffEditorWidget::assemblyRows(const QStringList &lines, { QList<TextLineData> data; + int previousSpanOffset = 0; int spanOffset = 0; int pos = 0; + bool usePreviousSpanOffsetForStartPosition = false; QMap<int, int>::ConstIterator changedIt = changedPositions.constBegin(); QMap<int, int>::ConstIterator changedEnd = changedPositions.constEnd(); const int lineCount = lines.count(); @@ -794,7 +796,17 @@ QList<TextLineData> DiffEditorWidget::assemblyRows(const QStringList &lines, if (changedIt.key() >= pos) break; - const int startPos = changedIt.key() + spanOffset; + if (changedIt.value() >= pos) { + usePreviousSpanOffsetForStartPosition = true; + previousSpanOffset = spanOffset; + break; + } + + const int startSpanOffset = usePreviousSpanOffsetForStartPosition + ? previousSpanOffset : spanOffset; + usePreviousSpanOffsetForStartPosition = false; + + const int startPos = changedIt.key() + startSpanOffset; const int endPos = changedIt.value() + spanOffset; if (outputChangedPositions) outputChangedPositions->insert(startPos, endPos); @@ -1550,4 +1562,30 @@ void DiffEditorWidget::synchronizeFoldings(DiffViewEditorWidget *source, DiffVie } // namespace DiffEditor +#ifdef WITH_TESTS +#include <QTest> + +void DiffEditor::DiffEditorWidget::testAssemblyRows() +{ + QStringList lines; + lines << QLatin1String("abcd efgh"); // line 0 + lines << QLatin1String("ijkl mnop"); // line 1 + + QMap<int, int> lineSpans; + lineSpans[1] = 6; // before line 1 insert 6 span lines + + QMap<int, int> changedPositions; + changedPositions[5] = 14; // changed text from position 5 to position 14, occupy 9 characters: "efgh\nijkl" + + 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, changedPositions, &outputChangedPositions); + QVERIFY(outputChangedPositions == expectedChangedPositions); +} + +#endif // WITH_TESTS + #include "diffeditorwidget.moc" |