forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user