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)
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user