aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-02-21 13:00:06 +0100
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-02-23 08:40:54 +0000
commit66fe088ab80a3f0a679a916f9b4effe57fa35507 (patch)
tree905b3830b99a2ae93828c664fe075fd1e7f9ee0f
parent336ab17614e78d744ab08bcd07d7bba26a9954e3 (diff)
Clang: Do not call processEvents call in local renaming
Use QFutureWatcher and lambda instead. Task-number: QTCREATORBUG-19799 Change-Id: I00e9439d46609902cbfb02906280c0c96b8c884e Reviewed-by: Marco Bubke <marco.bubke@qt.io>
-rw-r--r--src/plugins/clangcodemodel/clangrefactoringengine.cpp40
-rw-r--r--src/plugins/clangcodemodel/clangrefactoringengine.h7
2 files changed, 26 insertions, 21 deletions
diff --git a/src/plugins/clangcodemodel/clangrefactoringengine.cpp b/src/plugins/clangcodemodel/clangrefactoringengine.cpp
index c9ddef546f..ff082e0a7a 100644
--- a/src/plugins/clangcodemodel/clangrefactoringengine.cpp
+++ b/src/plugins/clangcodemodel/clangrefactoringengine.cpp
@@ -47,32 +47,30 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
if (!processor)
return defaultCallback();
- QFuture<CppTools::CursorInfo> future = processor->requestLocalReferences(data.cursor());
- if (future.isCanceled())
+ QFuture<CppTools::CursorInfo> cursorFuture = processor->requestLocalReferences(data.cursor());
+ if (cursorFuture.isCanceled())
return defaultCallback();
- // QFuture::waitForFinished seems to block completely, not even
- // allowing to process events from QLocalSocket.
- while (!future.isFinished()) {
- if (future.isCanceled())
+ QObject::connect(&m_watcher, &FutureCursorWatcher::finished, [=]() {
+ const CppTools::CursorInfo info = m_watcher.result();
+ if (info.useRanges.empty())
return defaultCallback();
- QTC_ASSERT(startRevision == data.cursor().document()->revision(), return;);
- QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
- }
+ QTextCursor cursor = Utils::Text::wordStartCursor(data.cursor());
+ cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor,
+ info.useRanges.first().length);
+ const QString symbolName = cursor.selectedText();
+ ClangBackEnd::SourceLocationsContainer container;
+ for (auto& use : info.useRanges) {
+ container.insertSourceLocation(ClangBackEnd::FilePathId(),
+ use.line,
+ use.column,
+ use.length);
+ }
+ renameSymbolsCallback(symbolName, container, data.cursor().document()->revision());
+ });
- const CppTools::CursorInfo info = future.result();
- if (info.useRanges.empty())
- return defaultCallback();
-
- QTextCursor cursor = Utils::Text::wordStartCursor(data.cursor());
- cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor,
- info.useRanges.first().length);
- const QString symbolName = cursor.selectedText();
- ClangBackEnd::SourceLocationsContainer container;
- for (auto& use : info.useRanges)
- container.insertSourceLocation(ClangBackEnd::FilePathId(), use.line, use.column, use.length);
- renameSymbolsCallback(symbolName, container, data.cursor().document()->revision());
+ m_watcher.setFuture(cursorFuture);
}
}
diff --git a/src/plugins/clangcodemodel/clangrefactoringengine.h b/src/plugins/clangcodemodel/clangrefactoringengine.h
index 300ca4e72f..10ad96aa0d 100644
--- a/src/plugins/clangcodemodel/clangrefactoringengine.h
+++ b/src/plugins/clangcodemodel/clangrefactoringengine.h
@@ -26,6 +26,9 @@
#pragma once
#include <cpptools/refactoringengineinterface.h>
+#include <cpptools/cppcursorinfo.h>
+
+#include <QFutureWatcher>
namespace ClangBackEnd {
class RefactoringClientInterface;
@@ -49,6 +52,10 @@ public:
{
return Link();
}
+
+private:
+ using FutureCursorWatcher = QFutureWatcher<CppTools::CursorInfo>;
+ FutureCursorWatcher m_watcher;
};
} // namespace ClangRefactoring