From 2ddcc0c3862bcb114b93b2bd4de6922f6b9d1ef9 Mon Sep 17 00:00:00 2001 From: jkobus Date: Fri, 7 Jun 2013 15:23:12 +0200 Subject: [PATCH] Fix wrong diff output with span lines Task-number: QTCREATORBUG-9494 Change-Id: Ica26e1448b1997e102648be58128f1be00c4905e Reviewed-by: hjk Reviewed-by: Christian Stenger --- src/plugins/diffeditor/diffeditorplugin.cpp | 10 ++++++ src/plugins/diffeditor/diffeditorplugin.h | 4 +++ src/plugins/diffeditor/diffeditorwidget.cpp | 40 ++++++++++++++++++++- src/plugins/diffeditor/diffeditorwidget.h | 4 +++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 6ca9090f03d..a3a86b6d8f9 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -172,4 +172,14 @@ QString DiffEditorPlugin::getFileContents(const QString &fileName, QTextCodec *c } // namespace Internal } // namespace DiffEditor +#ifdef WITH_TESTS + +void DiffEditor::Internal::DiffEditorPlugin::testAssemblyRows() +{ + DiffEditorWidget widget; + widget.testAssemblyRows(); +} + +#endif // WITH_TESTS + Q_EXPORT_PLUGIN(DiffEditor::Internal::DiffEditorPlugin) diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 8c1303d7a46..12b4b5bd1c4 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -65,6 +65,10 @@ public: private slots: void diff(); +#ifdef WITH_TESTS + void testAssemblyRows(); +#endif // WITH_TESTS + private: QString getFileContents(const QString &fileName, QTextCodec *codec) const; diff --git a/src/plugins/diffeditor/diffeditorwidget.cpp b/src/plugins/diffeditor/diffeditorwidget.cpp index 4bce0b34662..97616375ea9 100644 --- a/src/plugins/diffeditor/diffeditorwidget.cpp +++ b/src/plugins/diffeditor/diffeditorwidget.cpp @@ -775,8 +775,10 @@ QList DiffEditorWidget::assemblyRows(const QStringList &lines, { QList data; + int previousSpanOffset = 0; int spanOffset = 0; int pos = 0; + bool usePreviousSpanOffsetForStartPosition = false; QMap::ConstIterator changedIt = changedPositions.constBegin(); QMap::ConstIterator changedEnd = changedPositions.constEnd(); const int lineCount = lines.count(); @@ -794,7 +796,17 @@ QList 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 + +void DiffEditor::DiffEditorWidget::testAssemblyRows() +{ + QStringList lines; + lines << QLatin1String("abcd efgh"); // line 0 + lines << QLatin1String("ijkl mnop"); // line 1 + + QMap lineSpans; + lineSpans[1] = 6; // before line 1 insert 6 span lines + + QMap changedPositions; + changedPositions[5] = 14; // changed text from position 5 to position 14, occupy 9 characters: "efgh\nijkl" + + QMap expectedChangedPositions; + expectedChangedPositions[5] = 20; // "efgh\n[\n\n\n\n\n\n]ijkl" - [\n] means inserted span + + QMap outputChangedPositions; + + assemblyRows(lines, lineSpans, changedPositions, &outputChangedPositions); + QVERIFY(outputChangedPositions == expectedChangedPositions); +} + +#endif // WITH_TESTS + #include "diffeditorwidget.moc" diff --git a/src/plugins/diffeditor/diffeditorwidget.h b/src/plugins/diffeditor/diffeditorwidget.h index 8e4973c7f64..28affe26c87 100644 --- a/src/plugins/diffeditor/diffeditorwidget.h +++ b/src/plugins/diffeditor/diffeditorwidget.h @@ -83,6 +83,10 @@ public: void setDiff(const QList &diffFileList, const QString &workingDirectory = QString()); QTextCodec *codec() const; +#ifdef WITH_TESTS + void testAssemblyRows(); +#endif // WITH_TESTS + public slots: void setContextLinesNumber(int lines); void setIgnoreWhitespaces(bool ignore);