diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-06-17 11:18:35 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-06-23 11:01:12 +0000 |
commit | a204fa65c8133bdb3153ad1c8ebf0ca9c9a27cae (patch) | |
tree | e549215fe196df4fdd8129085e9287431eaab264 /src/plugins/cppeditor/cppeditorwidget.cpp | |
parent | e4402e229f78ae4a303b46051ced5af64dfc493f (diff) |
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>
Diffstat (limited to 'src/plugins/cppeditor/cppeditorwidget.cpp')
-rw-r--r-- | src/plugins/cppeditor/cppeditorwidget.cpp | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index fb46661218..354638dca7 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -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 |