TextEditor: Reduce BaseHoverHandler::identifyMatch() calls

...because they are potentially expensive.

Change-Id: Iaa235ea1fa864a0a67f3ed10b7f89d23179c642b
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-06-29 16:35:48 +02:00
parent 0f7e69034e
commit 7a09bb4418
6 changed files with 70 additions and 23 deletions

View File

@@ -29,6 +29,7 @@
#include "cppeditordocument.h"
#include <cpptools/cpptoolsreuse.h>
#include <texteditor/convenience.h>
#include <QTextBlock>
#include <QTextCursor>
@@ -65,23 +66,6 @@ void CppUseSelectionsUpdater::abortSchedule()
m_timer.stop();
}
static QTextCursor cursorAtWordStart(const QTextCursor &textCursor)
{
const int originalPosition = textCursor.position();
QTextCursor cursor(textCursor);
cursor.movePosition(QTextCursor::StartOfWord);
const int wordStartPosition = cursor.position();
if (originalPosition == wordStartPosition) {
// Cursor is not on an identifier, check whether we are right after one.
const QChar c = textCursor.document()->characterAt(originalPosition - 1);
if (CppTools::isValidIdentifierChar(c))
cursor.movePosition(QTextCursor::PreviousWord);
}
return cursor;
}
void CppUseSelectionsUpdater::update(CallType callType)
{
auto *cppEditorWidget = qobject_cast<CppEditorWidget *>(m_editorWidget);
@@ -92,7 +76,7 @@ void CppUseSelectionsUpdater::update(CallType callType)
CppTools::CursorInfoParams params;
params.semanticInfo = cppEditorWidget->semanticInfo();
params.textCursor = cursorAtWordStart(cppEditorWidget->textCursor());
params.textCursor = TextEditor::Convenience::wordStartCursor(cppEditorWidget->textCursor());
if (callType == Asynchronous) {
if (isSameIdentifierAsBefore(params.textCursor))
@@ -150,8 +134,10 @@ void CppUseSelectionsUpdater::onFindUsesFinished()
return;
if (m_runnerRevision != m_editorWidget->document()->revision())
return;
if (m_runnerWordStartPosition != cursorAtWordStart(m_editorWidget->textCursor()).position())
if (m_runnerWordStartPosition
!= TextEditor::Convenience::wordStartCursor(m_editorWidget->textCursor()).position()) {
return;
}
processResults(m_runnerWatcher->result());