aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cppeditor/cppeditorwidget.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-06-17 11:18:35 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2020-06-23 11:01:12 +0000
commita204fa65c8133bdb3153ad1c8ebf0ca9c9a27cae (patch)
treee549215fe196df4fdd8129085e9287431eaab264 /src/plugins/cppeditor/cppeditorwidget.cpp
parente4402e229f78ae4a303b46051ced5af64dfc493f (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.cpp60
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