CppEditor: Fix race condition for highlighting of local usages

Starting a renaming action involves looking up local usages. In this
case, a different code path than normal updates the editor's extra
selections, in order to make sure that the occurrence to be edited is
rendered in a special way. We must therefore prevent the normal handler
from taking action, as it would overwrite abovementioned special
selection.

Change-Id: Ia811b49b3023a0a366a43a69cc01e6b2b370acb5
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-01-14 16:13:29 +01:00
parent ab963bd4f1
commit 12c0aadc82
4 changed files with 15 additions and 5 deletions

View File

@@ -805,6 +805,11 @@ bool CppEditorWidget::isSemanticInfoValid() const
return isSemanticInfoValidExceptLocalUses() && d->m_lastSemanticInfo.localUsesUpdated; return isSemanticInfoValidExceptLocalUses() && d->m_lastSemanticInfo.localUsesUpdated;
} }
bool CppEditorWidget::isRenaming() const
{
return d->m_localRenaming.isActive();
}
SemanticInfo CppEditorWidget::semanticInfo() const SemanticInfo CppEditorWidget::semanticInfo() const
{ {
return d->m_lastSemanticInfo; return d->m_lastSemanticInfo;

View File

@@ -60,6 +60,7 @@ public:
bool isSemanticInfoValidExceptLocalUses() const; bool isSemanticInfoValidExceptLocalUses() const;
bool isSemanticInfoValid() const; bool isSemanticInfoValid() const;
bool isRenaming() const;
QSharedPointer<FunctionDeclDefLink> declDefLink() const; QSharedPointer<FunctionDeclDefLink> declDefLink() const;
void applyDeclDefLinkChanges(bool jumpToMatch); void applyDeclDefLinkChanges(bool jumpToMatch);

View File

@@ -41,7 +41,7 @@ enum { updateUseSelectionsInternalInMs = 500 };
namespace CppEditor { namespace CppEditor {
namespace Internal { namespace Internal {
CppUseSelectionsUpdater::CppUseSelectionsUpdater(TextEditor::TextEditorWidget *editorWidget) CppUseSelectionsUpdater::CppUseSelectionsUpdater(CppEditorWidget *editorWidget)
: m_editorWidget(editorWidget) : m_editorWidget(editorWidget)
{ {
m_timer.setSingleShot(true); m_timer.setSingleShot(true);
@@ -157,6 +157,10 @@ void CppUseSelectionsUpdater::onFindUsesFinished()
emit finished(CppTools::SemanticInfo::LocalUseMap(), false); emit finished(CppTools::SemanticInfo::LocalUseMap(), false);
return; return;
} }
if (m_editorWidget->isRenaming()) {
emit finished({}, false);
return;
}
processResults(m_runnerWatcher->result()); processResults(m_runnerWatcher->result());

View File

@@ -32,18 +32,18 @@
#include <QTextEdit> #include <QTextEdit>
#include <QTimer> #include <QTimer>
namespace TextEditor { class TextEditorWidget; }
namespace CppEditor { namespace CppEditor {
namespace Internal { namespace Internal {
class CppEditorWidget;
class CppUseSelectionsUpdater : public QObject class CppUseSelectionsUpdater : public QObject
{ {
Q_OBJECT Q_OBJECT
Q_DISABLE_COPY(CppUseSelectionsUpdater) Q_DISABLE_COPY(CppUseSelectionsUpdater)
public: public:
explicit CppUseSelectionsUpdater(TextEditor::TextEditorWidget *editorWidget); explicit CppUseSelectionsUpdater(CppEditorWidget *editorWidget);
~CppUseSelectionsUpdater() override; ~CppUseSelectionsUpdater() override;
void scheduleUpdate(); void scheduleUpdate();
@@ -73,7 +73,7 @@ private:
void updateUnusedSelections(const CursorInfo::Ranges &selections); void updateUnusedSelections(const CursorInfo::Ranges &selections);
private: private:
TextEditor::TextEditorWidget *m_editorWidget; CppEditorWidget * const m_editorWidget;
QTimer m_timer; QTimer m_timer;