TextEditor: optimize setting refactor markers

emitting requestBlockUpdate is not for free so limitting it to blocks
that have changed improve the performance notable for documents with a
lot of refactoring markers.

Change-Id: Ie288a367d1d1d6a9f4359e37ff8486a1dfe36752
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2023-06-09 13:15:20 +02:00
parent 590cdf4f61
commit c547c8615f
8 changed files with 48 additions and 24 deletions

View File

@@ -83,9 +83,7 @@ static void removeClangToolRefactorMarkers(TextEditor::TextEditorWidget *editor)
{ {
if (!editor) if (!editor)
return; return;
editor->setRefactorMarkers( editor->clearRefactorMarkers(Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID);
TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(),
Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID));
} }
void DocumentClangToolRunner::scheduleRun() void DocumentClangToolRunner::scheduleRun()
@@ -291,7 +289,7 @@ void DocumentClangToolRunner::onDone(const AnalyzeOutputData &output)
for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) { for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) {
if (TextEditor::TextEditorWidget *widget = editor->editorWidget()) { if (TextEditor::TextEditorWidget *widget = editor->editorWidget()) {
widget->setRefactorMarkers(markers + widget->refactorMarkers()); widget->setRefactorMarkers(markers, Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID);
if (!m_editorsWithMarkers.contains(widget)) if (!m_editorsWithMarkers.contains(widget))
m_editorsWithMarkers << widget; m_editorsWithMarkers << widget;
} }

View File

@@ -590,8 +590,7 @@ void CppEditorWidget::onCodeWarningsUpdated(unsigned revision,
setExtraSelections(TextEditorWidget::CodeWarningsSelection, setExtraSelections(TextEditorWidget::CodeWarningsSelection,
unselectLeadingWhitespace(selections)); unselectLeadingWhitespace(selections));
setRefactorMarkers(refactorMarkers + RefactorMarker::filterOutType( setRefactorMarkers(refactorMarkers, Constants::CPP_CLANG_FIXIT_AVAILABLE_MARKER_ID);
this->refactorMarkers(), Constants::CPP_CLANG_FIXIT_AVAILABLE_MARKER_ID));
} }
void CppEditorWidget::onIfdefedOutBlocksUpdated(unsigned revision, void CppEditorWidget::onIfdefedOutBlocksUpdated(unsigned revision,

View File

@@ -279,8 +279,7 @@ void FunctionDeclDefLink::hideMarker(CppEditorWidget *editor)
{ {
if (!hasMarker) if (!hasMarker)
return; return;
editor->setRefactorMarkers(RefactorMarker::filterOutType( editor->clearRefactorMarkers(Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
editor->refactorMarkers(), Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID));
hasMarker = false; hasMarker = false;
} }
@@ -289,8 +288,7 @@ void FunctionDeclDefLink::showMarker(CppEditorWidget *editor)
if (hasMarker) if (hasMarker)
return; return;
QList<RefactorMarker> markers = RefactorMarker::filterOutType( RefactorMarkers markers;
editor->refactorMarkers(), Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
RefactorMarker marker; RefactorMarker marker;
// show the marker at the end of the linked area, with a special case // show the marker at the end of the linked area, with a special case
@@ -321,7 +319,7 @@ void FunctionDeclDefLink::showMarker(CppEditorWidget *editor)
cppEditor->applyDeclDefLinkChanges(true); cppEditor->applyDeclDefLinkChanges(true);
}; };
markers += marker; markers += marker;
editor->setRefactorMarkers(markers); editor->setRefactorMarkers(markers, Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
hasMarker = true; hasMarker = true;
} }

View File

@@ -202,8 +202,7 @@ public:
for (Core::IEditor *editor : editors) { for (Core::IEditor *editor : editors) {
if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) { if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) {
TextEditorWidget *widget = textEditor->editorWidget(); TextEditorWidget *widget = textEditor->editorWidget();
widget->setRefactorMarkers( widget->clearRefactorMarkers(m_id);
RefactorMarker::filterOutType(widget->refactorMarkers(), m_id));
widget->removeHoverHandler(&m_hoverHandler); widget->removeHoverHandler(&m_hoverHandler);
} }
} }
@@ -910,8 +909,7 @@ void Client::deactivateDocument(TextEditor::TextDocument *document)
TextEditor::TextEditorWidget *widget = textEditor->editorWidget(); TextEditor::TextEditorWidget *widget = textEditor->editorWidget();
widget->removeHoverHandler(&d->m_hoverHandler); widget->removeHoverHandler(&d->m_hoverHandler);
widget->setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, {}); widget->setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, {});
widget->setRefactorMarkers( widget->clearRefactorMarkers(id());
TextEditor::RefactorMarker::filterOutType(widget->refactorMarkers(), id()));
updateEditorToolBar(editor); updateEditorToolBar(editor);
} }
} }
@@ -1158,7 +1156,7 @@ void Client::documentContentsChanged(TextEditor::TextDocument *document,
TextEditorWidget *widget = editor->editorWidget(); TextEditorWidget *widget = editor->editorWidget();
QTC_ASSERT(widget, continue); QTC_ASSERT(widget, continue);
delete d->m_documentHighlightsTimer.take(widget); delete d->m_documentHighlightsTimer.take(widget);
widget->setRefactorMarkers(RefactorMarker::filterOutType(widget->refactorMarkers(), id())); widget->clearRefactorMarkers(id());
} }
d->m_documentUpdateTimer.start(); d->m_documentUpdateTimer.start();
} }

View File

@@ -200,7 +200,7 @@ void updateCodeActionRefactoringMarker(Client *client,
const RefactorMarkers markers = markersAtBlock.values(); const RefactorMarkers markers = markersAtBlock.values();
for (BaseTextEditor *editor : editors) { for (BaseTextEditor *editor : editors) {
if (TextEditorWidget *editorWidget = editor->editorWidget()) if (TextEditorWidget *editorWidget = editor->editorWidget())
editorWidget->setRefactorMarkers(markers + editorWidget->refactorMarkers()); editorWidget->setRefactorMarkers(markers, client->id());
} }
} }

View File

@@ -311,8 +311,7 @@ void QmlJSEditorWidget::updateContextPane()
if (m_contextPane->isAvailable(this, info.document, newNode) && if (m_contextPane->isAvailable(this, info.document, newNode) &&
!m_contextPane->widget()->isVisible()) { !m_contextPane->widget()->isVisible()) {
QList<RefactorMarker> markers RefactorMarkers markers;
= RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID);
if (UiObjectMember *m = newNode->uiObjectMemberCast()) { if (UiObjectMember *m = newNode->uiObjectMemberCast()) {
const int start = qualifiedTypeNameId(m)->identifierToken.begin(); const int start = qualifiedTypeNameId(m)->identifierToken.begin();
for (UiQualifiedId *q = qualifiedTypeNameId(m); q; q = q->next) { for (UiQualifiedId *q = qualifiedTypeNameId(m); q; q = q->next) {
@@ -333,10 +332,9 @@ void QmlJSEditorWidget::updateContextPane()
} }
} }
} }
setRefactorMarkers(markers); setRefactorMarkers(markers, QT_QUICK_TOOLBAR_MARKER_ID);
} else if (oldNode != newNode) { } else if (oldNode != newNode) {
setRefactorMarkers( clearRefactorMarkers(QT_QUICK_TOOLBAR_MARKER_ID);
RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID));
} }
m_oldCursorPosition = position(); m_oldCursorPosition = position();
@@ -877,8 +875,7 @@ void QmlJSEditorWidget::showContextPane()
&scopeChain, &scopeChain,
newNode, false, true); newNode, false, true);
m_oldCursorPosition = position(); m_oldCursorPosition = position();
setRefactorMarkers( clearRefactorMarkers(QT_QUICK_TOOLBAR_MARKER_ID);
RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID));
} }
} }

View File

@@ -8572,6 +8572,38 @@ void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &markers)
emit requestBlockUpdate(marker.cursor.block()); emit requestBlockUpdate(marker.cursor.block());
} }
void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &newMarkers, const Utils::Id &type)
{
RefactorMarkers markers = d->m_refactorOverlay->markers();
auto first = std::partition(markers.begin(),
markers.end(),
[type](const RefactorMarker &marker) {
return marker.type == type;
});
for (auto it = markers.begin(); it != first; ++it)
emit requestBlockUpdate(it->cursor.block());
markers.erase(markers.begin(), first);
markers.append(newMarkers);
d->m_refactorOverlay->setMarkers(markers);
for (const RefactorMarker &marker : newMarkers)
emit requestBlockUpdate(marker.cursor.block());
}
void TextEditorWidget::clearRefactorMarkers(const Utils::Id &type)
{
RefactorMarkers markers = d->m_refactorOverlay->markers();
for (auto it = markers.begin(); it != markers.end();) {
if (it->type == type) {
emit requestBlockUpdate(it->cursor.block());
it = markers.erase(it);
} else {
++it;
}
}
d->m_refactorOverlay->setMarkers(markers);
}
bool TextEditorWidget::inFindScope(const QTextCursor &cursor) const bool TextEditorWidget::inFindScope(const QTextCursor &cursor) const
{ {
return d->m_find->inScope(cursor); return d->m_find->inScope(cursor);

View File

@@ -310,6 +310,8 @@ public:
RefactorMarkers refactorMarkers() const; RefactorMarkers refactorMarkers() const;
void setRefactorMarkers(const RefactorMarkers &markers); void setRefactorMarkers(const RefactorMarkers &markers);
void setRefactorMarkers(const RefactorMarkers &markers, const Utils::Id &type);
void clearRefactorMarkers(const Utils::Id &type);
enum Side { Left, Right }; enum Side { Left, Right };
QAction *insertExtraToolBarWidget(Side side, QWidget *widget); QAction *insertExtraToolBarWidget(Side side, QWidget *widget);