forked from qt-creator/qt-creator
ClangFormat: remove identical prefix and suffix from replacement text
To reduce the changes done to the document iterate from the start and back of the replacement text and check whether the document already contains the proposed changes. This also fixes the misplaced snippet part in the if else snippet. Change-Id: I4519ed101cc03e7c49b3a9b775087361c3fd158d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -382,16 +382,37 @@ Utils::Text::Replacements utf16Replacements(const QTextDocument *doc,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
lineColUtf16.column = std::min(lineColUtf16.column, int(lineText.length()));
|
lineColUtf16.column = std::min(lineColUtf16.column, int(lineText.length()));
|
||||||
const int utf16Offset = Utils::Text::positionInText(doc,
|
int utf16Offset = Utils::Text::positionInText(doc,
|
||||||
lineColUtf16.line,
|
lineColUtf16.line,
|
||||||
lineColUtf16.column + 1);
|
lineColUtf16.column + 1);
|
||||||
const int utf16Length = QString::fromUtf8(
|
int utf16Length = QString::fromUtf8(
|
||||||
utf8Buffer.mid(static_cast<int>(replacement.getOffset()),
|
utf8Buffer.mid(static_cast<int>(replacement.getOffset()),
|
||||||
static_cast<int>(replacement.getLength())))
|
static_cast<int>(replacement.getLength())))
|
||||||
.size();
|
.size();
|
||||||
convertedReplacements.emplace_back(utf16Offset,
|
|
||||||
utf16Length,
|
QString replacementText = QString::fromStdString(replacement.getReplacementText().str());
|
||||||
QString::fromStdString(replacement.getReplacementText().str()));
|
auto sameCharAt = [&](int replacementOffset) {
|
||||||
|
if (replacementText.size() <= replacementOffset || replacementOffset < 0)
|
||||||
|
return false;
|
||||||
|
const QChar docChar = doc->characterAt(utf16Offset + replacementOffset);
|
||||||
|
const QChar replacementChar = replacementText.at(replacementOffset);
|
||||||
|
return docChar == replacementChar
|
||||||
|
|| (docChar == QChar::ParagraphSeparator && replacementChar == '\n');
|
||||||
|
};
|
||||||
|
// remove identical prefix from replacement text
|
||||||
|
while (sameCharAt(0)) {
|
||||||
|
++utf16Offset;
|
||||||
|
--utf16Length;
|
||||||
|
replacementText = replacementText.mid(1);
|
||||||
|
}
|
||||||
|
// remove identical suffix from replacement text
|
||||||
|
while (sameCharAt(utf16Length - 1)) {
|
||||||
|
--utf16Length;
|
||||||
|
replacementText.chop(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!replacementText.isEmpty() || utf16Length > 0)
|
||||||
|
convertedReplacements.emplace_back(utf16Offset, utf16Length, replacementText);
|
||||||
}
|
}
|
||||||
|
|
||||||
return convertedReplacements;
|
return convertedReplacements;
|
||||||
|
Reference in New Issue
Block a user