CppEditor: Do not underline leading whitespace

... when visualizing the range of a code model warning.
Otherwise, warnings covering multiple lines can get too noisy.

Fixes: QTCREATORBUG-18659
Change-Id: Ieff7729d8069e791027f7bdde5fca13f4c7f7163
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2020-06-17 11:18:35 +02:00
parent e4402e229f
commit a204fa65c8
4 changed files with 130 additions and 1 deletions

View File

@@ -326,7 +326,8 @@ void CppEditorWidget::onCodeWarningsUpdated(unsigned revision,
if (revision != documentRevision())
return;
setExtraSelections(TextEditorWidget::CodeWarningsSelection, selections);
setExtraSelections(TextEditorWidget::CodeWarningsSelection,
unselectLeadingWhitespace(selections));
setRefactorMarkers(refactorMarkers + RefactorMarker::filterOutType(
this->refactorMarkers(), CppTools::Constants::CPP_CLANG_FIXIT_AVAILABLE_MARKER_ID));
}
@@ -1163,6 +1164,63 @@ void CppEditorWidget::invokeTextEditorWidgetAssist(TextEditor::AssistKind assist
invokeAssist(assistKind, provider);
}
const QList<QTextEdit::ExtraSelection> CppEditorWidget::unselectLeadingWhitespace(
const QList<QTextEdit::ExtraSelection> &selections)
{
QList<QTextEdit::ExtraSelection> filtered;
for (const QTextEdit::ExtraSelection &sel : selections) {
QList<QTextEdit::ExtraSelection> splitSelections;
int firstNonWhitespacePos = -1;
int lastNonWhitespacePos = -1;
bool split = false;
const QTextBlock firstBlock = sel.cursor.document()->findBlock(sel.cursor.selectionStart());
bool inIndentation = firstBlock.position() == sel.cursor.selectionStart();
const auto createSplitSelection = [&] {
QTextEdit::ExtraSelection newSelection;
newSelection.cursor = QTextCursor(sel.cursor.document());
newSelection.cursor.setPosition(firstNonWhitespacePos);
newSelection.cursor.setPosition(lastNonWhitespacePos + 1, QTextCursor::KeepAnchor);
newSelection.format = sel.format;
splitSelections << newSelection;
};
for (int i = sel.cursor.selectionStart(); i < sel.cursor.selectionEnd(); ++i) {
const QChar curChar = sel.cursor.document()->characterAt(i);
if (!curChar.isSpace()) {
if (firstNonWhitespacePos == -1)
firstNonWhitespacePos = i;
lastNonWhitespacePos = i;
}
if (!inIndentation) {
if (curChar == QChar::ParagraphSeparator)
inIndentation = true;
continue;
}
if (curChar == QChar::ParagraphSeparator)
continue;
if (curChar.isSpace()) {
if (firstNonWhitespacePos != -1) {
createSplitSelection();
firstNonWhitespacePos = -1;
lastNonWhitespacePos = -1;
}
split = true;
continue;
}
inIndentation = false;
}
if (!split) {
filtered << sel;
continue;
}
if (firstNonWhitespacePos != -1)
createSplitSelection();
filtered << splitSelections;
}
return filtered;
}
} // namespace Internal
} // namespace CppEditor