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)
return;
editor->setRefactorMarkers(
TextEditor::RefactorMarker::filterOutType(editor->refactorMarkers(),
Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID));
editor->clearRefactorMarkers(Constants::CLANG_TOOL_FIXIT_AVAILABLE_MARKER_ID);
}
void DocumentClangToolRunner::scheduleRun()
@@ -291,7 +289,7 @@ void DocumentClangToolRunner::onDone(const AnalyzeOutputData &output)
for (auto editor : TextEditor::BaseTextEditor::textEditorsForDocument(doc)) {
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))
m_editorsWithMarkers << widget;
}

View File

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

View File

@@ -279,8 +279,7 @@ void FunctionDeclDefLink::hideMarker(CppEditorWidget *editor)
{
if (!hasMarker)
return;
editor->setRefactorMarkers(RefactorMarker::filterOutType(
editor->refactorMarkers(), Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID));
editor->clearRefactorMarkers(Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
hasMarker = false;
}
@@ -289,8 +288,7 @@ void FunctionDeclDefLink::showMarker(CppEditorWidget *editor)
if (hasMarker)
return;
QList<RefactorMarker> markers = RefactorMarker::filterOutType(
editor->refactorMarkers(), Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
RefactorMarkers markers;
RefactorMarker marker;
// 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);
};
markers += marker;
editor->setRefactorMarkers(markers);
editor->setRefactorMarkers(markers, Constants::CPP_FUNCTION_DECL_DEF_LINK_MARKER_ID);
hasMarker = true;
}

View File

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

View File

@@ -200,7 +200,7 @@ void updateCodeActionRefactoringMarker(Client *client,
const RefactorMarkers markers = markersAtBlock.values();
for (BaseTextEditor *editor : editors) {
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) &&
!m_contextPane->widget()->isVisible()) {
QList<RefactorMarker> markers
= RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID);
RefactorMarkers markers;
if (UiObjectMember *m = newNode->uiObjectMemberCast()) {
const int start = qualifiedTypeNameId(m)->identifierToken.begin();
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) {
setRefactorMarkers(
RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID));
clearRefactorMarkers(QT_QUICK_TOOLBAR_MARKER_ID);
}
m_oldCursorPosition = position();
@@ -877,8 +875,7 @@ void QmlJSEditorWidget::showContextPane()
&scopeChain,
newNode, false, true);
m_oldCursorPosition = position();
setRefactorMarkers(
RefactorMarker::filterOutType(refactorMarkers(), QT_QUICK_TOOLBAR_MARKER_ID));
clearRefactorMarkers(QT_QUICK_TOOLBAR_MARKER_ID);
}
}

View File

@@ -8572,6 +8572,38 @@ void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &markers)
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
{
return d->m_find->inScope(cursor);

View File

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