aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cppeditor
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2024-02-27 09:04:51 +0100
committerEike Ziller <eike.ziller@qt.io>2024-02-27 09:04:51 +0100
commita8414effd8ff6cd9c32c8466950ac3b9b9561524 (patch)
tree649402f4c740ca69eb8e90088b0ac1d16ae9ef78 /src/plugins/cppeditor
parent69a0f1654710ba9dc708c968c7312b48038774dd (diff)
parentfdabbfcbcfe35bce731a2eff3fe13e2d6df238b9 (diff)
Merge remote-tracking branch 'origin/13.0'
Diffstat (limited to 'src/plugins/cppeditor')
-rw-r--r--src/plugins/cppeditor/builtincursorinfo.cpp42
-rw-r--r--src/plugins/cppeditor/builtincursorinfo.h2
-rw-r--r--src/plugins/cppeditor/builtineditordocumentprocessor.cpp2
-rw-r--r--src/plugins/cppeditor/cppchecksymbols.cpp30
-rw-r--r--src/plugins/cppeditor/cppchecksymbols.h4
-rw-r--r--src/plugins/cppeditor/cppcodeformatter.cpp1
-rw-r--r--src/plugins/cppeditor/cppfunctiondecldeflink.cpp22
-rw-r--r--src/plugins/cppeditor/cppfunctiondecldeflink.h2
-rw-r--r--src/plugins/cppeditor/cppindexingsupport.cpp2
-rw-r--r--src/plugins/cppeditor/cpplocalsymbols.cpp36
-rw-r--r--src/plugins/cppeditor/cpplocalsymbols.h2
-rw-r--r--src/plugins/cppeditor/cpplocalsymbols_test.cpp2
-rw-r--r--src/plugins/cppeditor/cppuseselectionsupdater.cpp14
-rw-r--r--src/plugins/cppeditor/cppuseselectionsupdater.h2
-rw-r--r--src/plugins/cppeditor/semantichighlighter.cpp39
-rw-r--r--src/plugins/cppeditor/semantichighlighter.h10
16 files changed, 113 insertions, 99 deletions
diff --git a/src/plugins/cppeditor/builtincursorinfo.cpp b/src/plugins/cppeditor/builtincursorinfo.cpp
index 15e1e0f492..0bff4406e7 100644
--- a/src/plugins/cppeditor/builtincursorinfo.cpp
+++ b/src/plugins/cppeditor/builtincursorinfo.cpp
@@ -135,17 +135,28 @@ private:
class FindUses
{
public:
- static CursorInfo find(const Document::Ptr document, const Snapshot &snapshot,
- int line, int column, Scope *scope, const QString &expression)
+ static CursorInfo find(const Document::Ptr document,
+ const QString &content,
+ const Snapshot &snapshot,
+ int line,
+ int column,
+ Scope *scope,
+ const QString &expression)
{
- FindUses findUses(document, snapshot, line, column, scope, expression);
+ FindUses findUses(document, content, snapshot, line, column, scope, expression);
return findUses.doFind();
}
private:
- FindUses(const Document::Ptr document, const Snapshot &snapshot, int line, int column,
- Scope *scope, const QString &expression)
+ FindUses(const Document::Ptr document,
+ const QString &content,
+ const Snapshot &snapshot,
+ int line,
+ int column,
+ Scope *scope,
+ const QString &expression)
: m_document(document)
+ , m_content(content)
, m_line(line)
, m_column(column)
, m_scope(scope)
@@ -160,7 +171,7 @@ private:
// findLocalUses operates with 1-based line and 0-based column
const SemanticInfo::LocalUseMap localUses
- = BuiltinCursorInfo::findLocalUses(m_document, m_line, m_column - 1);
+ = BuiltinCursorInfo::findLocalUses(m_document, m_content, m_line, m_column - 1);
result.localUses = localUses;
splitLocalUses(localUses, &result.useRanges, &result.unusedVariablesRanges);
@@ -230,6 +241,8 @@ private:
// Shared
Document::Ptr m_document;
+ const QString m_content;
+
// For local use calculation
int m_line;
int m_column;
@@ -322,11 +335,20 @@ QFuture<CursorInfo> BuiltinCursorInfo::run(const CursorInfoParams &cursorInfoPar
QString expression;
Scope *scope = canonicalSymbol.getScopeAndExpression(textCursor, &expression);
- return Utils::asyncRun(&FindUses::find, document, snapshot, line, column + 1, scope, expression);
+ return Utils::asyncRun(&FindUses::find,
+ document,
+ textCursor.document()->toPlainText(),
+ snapshot,
+ line,
+ column + 1,
+ scope,
+ expression);
}
-SemanticInfo::LocalUseMap
-BuiltinCursorInfo::findLocalUses(const Document::Ptr &document, int line, int column)
+SemanticInfo::LocalUseMap BuiltinCursorInfo::findLocalUses(const Document::Ptr &document,
+ const QString &content,
+ int line,
+ int column)
{
if (!document || !document->translationUnit() || !document->translationUnit()->ast())
return SemanticInfo::LocalUseMap();
@@ -334,7 +356,7 @@ BuiltinCursorInfo::findLocalUses(const Document::Ptr &document, int line, int co
AST *ast = document->translationUnit()->ast();
FunctionDefinitionUnderCursor functionDefinitionUnderCursor(document->translationUnit());
DeclarationAST *declaration = functionDefinitionUnderCursor(ast, line, column);
- return Internal::LocalSymbols(document, declaration).uses;
+ return Internal::LocalSymbols(document, content, declaration).uses;
}
} // namespace CppEditor
diff --git a/src/plugins/cppeditor/builtincursorinfo.h b/src/plugins/cppeditor/builtincursorinfo.h
index 4258f4854c..731c66f4c1 100644
--- a/src/plugins/cppeditor/builtincursorinfo.h
+++ b/src/plugins/cppeditor/builtincursorinfo.h
@@ -18,7 +18,7 @@ public:
static QFuture<CursorInfo> run(const CursorInfoParams &params);
static SemanticInfo::LocalUseMap
- findLocalUses(const CPlusPlus::Document::Ptr &document, int line, int column);
+ findLocalUses(const CPlusPlus::Document::Ptr &document, const QString &content, int line, int column);
};
} // namespace CppEditor
diff --git a/src/plugins/cppeditor/builtineditordocumentprocessor.cpp b/src/plugins/cppeditor/builtineditordocumentprocessor.cpp
index 4d43546334..b934d1e7ae 100644
--- a/src/plugins/cppeditor/builtineditordocumentprocessor.cpp
+++ b/src/plugins/cppeditor/builtineditordocumentprocessor.cpp
@@ -126,7 +126,7 @@ CheckSymbols *createHighlighter(const CPlusPlus::Document::Ptr &doc,
}
LookupContext context(doc, snapshot);
- return CheckSymbols::create(doc, context, macroUses);
+ return CheckSymbols::create(doc, textDocument->toPlainText(), context, macroUses);
}
QList<TextEditor::BlockRange> toTextEditorBlocks(
diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp
index e9334b0db2..7fa1ed3f5b 100644
--- a/src/plugins/cppeditor/cppchecksymbols.cpp
+++ b/src/plugins/cppeditor/cppchecksymbols.cpp
@@ -270,28 +270,40 @@ static bool acceptName(NameAST *ast, unsigned *referenceToken)
&& !ast->asOperatorFunctionId();
}
-CheckSymbols::Future CheckSymbols::go(Document::Ptr doc, const LookupContext &context, const QList<CheckSymbols::Result> &macroUses)
+CheckSymbols::Future CheckSymbols::go(Document::Ptr doc,
+ const QString &content,
+ const LookupContext &context,
+ const QList<CheckSymbols::Result> &macroUses)
{
QTC_ASSERT(doc, return Future());
QTC_ASSERT(doc->translationUnit(), return Future());
QTC_ASSERT(doc->translationUnit()->ast(), return Future());
- return (new CheckSymbols(doc, context, macroUses))->start();
+ return (new CheckSymbols(doc, content, context, macroUses))->start();
}
-CheckSymbols * CheckSymbols::create(Document::Ptr doc, const LookupContext &context,
- const QList<CheckSymbols::Result> &macroUses)
+CheckSymbols *CheckSymbols::create(Document::Ptr doc,
+ const QString &content,
+ const LookupContext &context,
+ const QList<CheckSymbols::Result> &macroUses)
{
QTC_ASSERT(doc, return nullptr);
QTC_ASSERT(doc->translationUnit(), return nullptr);
QTC_ASSERT(doc->translationUnit()->ast(), return nullptr);
- return new CheckSymbols(doc, context, macroUses);
+ return new CheckSymbols(doc, content, context, macroUses);
}
-CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context, const QList<CheckSymbols::Result> &macroUses)
- : ASTVisitor(doc->translationUnit()), _doc(doc), _context(context)
- , _lineOfLastUsage(0), _macroUses(macroUses)
+CheckSymbols::CheckSymbols(Document::Ptr doc,
+ const QString &content,
+ const LookupContext &context,
+ const QList<CheckSymbols::Result> &macroUses)
+ : ASTVisitor(doc->translationUnit())
+ , _doc(doc)
+ , _content(content)
+ , _context(context)
+ , _lineOfLastUsage(0)
+ , _macroUses(macroUses)
{
int line = 0;
getTokenEndPosition(translationUnit()->ast()->lastToken(), &line, nullptr);
@@ -1114,7 +1126,7 @@ bool CheckSymbols::visit(FunctionDefinitionAST *ast)
accept(ast->ctor_initializer);
accept(ast->function_body);
- const Internal::LocalSymbols locals(_doc, ast);
+ const Internal::LocalSymbols locals(_doc, _content, ast);
for (const QList<Result> &uses : std::as_const(locals.uses)) {
for (const Result &u : uses)
addUse(u);
diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h
index f660da6dc9..38e04f989d 100644
--- a/src/plugins/cppeditor/cppchecksymbols.h
+++ b/src/plugins/cppeditor/cppchecksymbols.h
@@ -42,9 +42,11 @@ public:
}
static Future go(CPlusPlus::Document::Ptr doc,
+ const QString &content,
const CPlusPlus::LookupContext &context,
const QList<Result> &macroUses);
static CheckSymbols * create(CPlusPlus::Document::Ptr doc,
+ const QString &content,
const CPlusPlus::LookupContext &context,
const QList<Result> &macroUses);
@@ -79,6 +81,7 @@ protected:
};
CheckSymbols(CPlusPlus::Document::Ptr doc,
+ const QString &content,
const CPlusPlus::LookupContext &context,
const QList<Result> &otherUses);
@@ -168,6 +171,7 @@ private:
bool isConstructorDeclaration(CPlusPlus::Symbol *declaration);
CPlusPlus::Document::Ptr _doc;
+ const QString _content;
CPlusPlus::LookupContext _context;
CPlusPlus::TypeOfExpression typeOfExpression;
Utils::FilePath _filePath;
diff --git a/src/plugins/cppeditor/cppcodeformatter.cpp b/src/plugins/cppeditor/cppcodeformatter.cpp
index d09fa37d45..ca14d22a7c 100644
--- a/src/plugins/cppeditor/cppcodeformatter.cpp
+++ b/src/plugins/cppeditor/cppcodeformatter.cpp
@@ -151,6 +151,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
case T_OPERATOR: enter(operator_declaration); break;
case T_GREATER_GREATER: break;
case T_LBRACKET: break;
+ case T_NAMESPACE: leave(); enter(namespace_start); break;
default: tryExpression(true); break;
} break;
diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
index 4dc31087bc..e489045f35 100644
--- a/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
+++ b/src/plugins/cppeditor/cppfunctiondecldeflink.cpp
@@ -14,8 +14,6 @@
#include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h>
-#include <texteditor/refactoroverlay.h>
-#include <texteditor/texteditorconstants.h>
#include <cplusplus/ASTPath.h>
#include <cplusplus/CppRewriter.h>
@@ -23,7 +21,13 @@
#include <cplusplus/Overview.h>
#include <cplusplus/TypeOfExpression.h>
+#include <extensionsystem/pluginmanager.h>
+
+#include <texteditor/refactoroverlay.h>
+#include <texteditor/texteditorconstants.h>
+
#include <utils/async.h>
+#include <utils/futuresynchronizer.h>
#include <utils/proxyaction.h>
#include <utils/qtcassert.h>
#include <utils/textutils.h>
@@ -41,21 +45,20 @@ namespace Internal {
FunctionDeclDefLinkFinder::FunctionDeclDefLinkFinder(QObject *parent)
: QObject(parent)
-{
-}
+{}
void FunctionDeclDefLinkFinder::onFutureDone()
{
std::shared_ptr<FunctionDeclDefLink> link = m_watcher->result();
- m_watcher.reset();
+ m_watcher.release()->deleteLater();
if (link) {
link->linkSelection = m_scannedSelection;
link->nameSelection = m_nameSelection;
if (m_nameSelection.selectedText() != link->nameInitial)
link.reset();
}
- m_scannedSelection = QTextCursor();
- m_nameSelection = QTextCursor();
+ m_scannedSelection = {};
+ m_nameSelection = {};
if (link)
emit foundLink(link);
}
@@ -234,8 +237,9 @@ void FunctionDeclDefLinkFinder::startFindLinkAt(
// handle the rest in a thread
m_watcher.reset(new QFutureWatcher<std::shared_ptr<FunctionDeclDefLink> >());
- connect(m_watcher.data(), &QFutureWatcherBase::finished, this, &FunctionDeclDefLinkFinder::onFutureDone);
+ connect(m_watcher.get(), &QFutureWatcherBase::finished, this, &FunctionDeclDefLinkFinder::onFutureDone);
m_watcher->setFuture(Utils::asyncRun(findLinkHelper, result, refactoringChanges));
+ ExtensionSystem::PluginManager::futureSynchronizer()->addFuture(m_watcher->future());
}
bool FunctionDeclDefLink::isValid() const
@@ -890,7 +894,7 @@ ChangeSet FunctionDeclDefLink::changes(const Snapshot &snapshot, int targetOffse
// for function definitions, rename the local usages
FunctionDefinitionAST *targetDefinition = targetDeclaration->asFunctionDefinition();
if (targetDefinition && !renamedTargetParameters.isEmpty()) {
- const LocalSymbols localSymbols(targetFile->cppDocument(), targetDefinition);
+ const LocalSymbols localSymbols(targetFile->cppDocument(), {}, targetDefinition);
const int endOfArguments = targetFile->endOf(targetFunctionDeclarator->rparen_token);
for (auto it = renamedTargetParameters.cbegin(), end = renamedTargetParameters.cend();
diff --git a/src/plugins/cppeditor/cppfunctiondecldeflink.h b/src/plugins/cppeditor/cppfunctiondecldeflink.h
index 4ffce9bf91..8fe6219e33 100644
--- a/src/plugins/cppeditor/cppfunctiondecldeflink.h
+++ b/src/plugins/cppeditor/cppfunctiondecldeflink.h
@@ -36,7 +36,7 @@ private:
QTextCursor m_scannedSelection;
QTextCursor m_nameSelection;
- QScopedPointer<QFutureWatcher<std::shared_ptr<FunctionDeclDefLink>>> m_watcher;
+ std::unique_ptr<QFutureWatcher<std::shared_ptr<FunctionDeclDefLink>>> m_watcher;
};
class FunctionDeclDefLink
diff --git a/src/plugins/cppeditor/cppindexingsupport.cpp b/src/plugins/cppeditor/cppindexingsupport.cpp
index 21a5da4109..3a418a5b78 100644
--- a/src/plugins/cppeditor/cppindexingsupport.cpp
+++ b/src/plugins/cppeditor/cppindexingsupport.cpp
@@ -147,7 +147,7 @@ static void indexFindErrors(QPromise<void> &promise, const ParseParams params)
// Look up symbols
CPlusPlus::LookupContext context(document, parser.snapshot());
- CheckSymbols::go(document, context, QList<CheckSymbols::Result>()).waitForFinished();
+ CheckSymbols::go(document, {}, context, QList<CheckSymbols::Result>()).waitForFinished();
document->releaseSourceAndAST();
diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cppeditor/cpplocalsymbols.cpp
index 9983f9fba1..ec91dbe349 100644
--- a/src/plugins/cppeditor/cpplocalsymbols.cpp
+++ b/src/plugins/cppeditor/cpplocalsymbols.cpp
@@ -7,12 +7,12 @@
#include "cpptoolsreuse.h"
#include "semantichighlighter.h"
-#include <coreplugin/documentmanager.h>
#include <cplusplus/declarationcomments.h>
#include <cplusplus/Overview.h>
-#include <texteditor/textdocument.h>
#include <utils/textutils.h>
+#include <QTextDocument>
+
using namespace CPlusPlus;
namespace CppEditor::Internal {
@@ -22,8 +22,8 @@ namespace {
class FindLocalSymbols: protected ASTVisitor
{
public:
- explicit FindLocalSymbols(Document::Ptr doc)
- : ASTVisitor(doc->translationUnit()), _doc(doc)
+ explicit FindLocalSymbols(Document::Ptr doc, const QString &content)
+ : ASTVisitor(doc->translationUnit()), _doc(doc), _content(content)
{ }
// local and external uses.
@@ -49,35 +49,26 @@ public:
if (localUses.isEmpty())
return;
- // For tst_checkSymbols
- if (!Core::DocumentManager::instance())
- return;
-
// Look for parameter occurrences in function comments.
- const TextEditor::TextDocument * const editorDoc
- = TextEditor::TextDocument::textDocumentForFilePath(_doc->filePath());
- if (!editorDoc)
- return;
- QTextDocument * const textDoc = editorDoc->document();
- if (!textDoc)
+ if (_content.isEmpty())
return;
- const QString &content = textDoc->toPlainText();
- const QStringView docView(content);
+ QTextDocument textDoc(_content);
+ const QStringView docView(_content);
for (auto it = localUses.begin(); it != localUses.end(); ++it) {
Symbol * const symbol = it.key();
if (!symbol->asArgument())
continue;
- const QList<Token> commentTokens = commentsForDeclaration(symbol, ast, *textDoc, _doc);
+ const QList<Token> commentTokens = commentsForDeclaration(symbol, ast, textDoc, _doc);
if (commentTokens.isEmpty())
continue;
const QString symbolName = Overview().prettyName(symbol->name());
for (const Token &tok : commentTokens) {
- const int commentPos = translationUnit()->getTokenPositionInDocument(tok, textDoc);
+ const int commentPos = translationUnit()->getTokenPositionInDocument(tok, &textDoc);
const int commentEndPos = translationUnit()->getTokenEndPositionInDocument(
- tok, textDoc);
+ tok, &textDoc);
const QStringView commentView = docView.mid(commentPos, commentEndPos - commentPos);
const QList<Utils::Text::Range> ranges = symbolOccurrencesInText(
- *textDoc, commentView, commentPos, symbolName);
+ textDoc, commentView, commentPos, symbolName);
for (const Utils::Text::Range &range : ranges) {
it.value().append(HighlightingResult(range.begin.line, range.begin.column + 1,
symbolName.size(),
@@ -323,14 +314,15 @@ protected:
private:
QList<Scope *> _scopeStack;
Document::Ptr _doc;
+ const QString _content;
};
} // end of anonymous namespace
-LocalSymbols::LocalSymbols(Document::Ptr doc, DeclarationAST *ast)
+LocalSymbols::LocalSymbols(Document::Ptr doc, const QString &content, DeclarationAST *ast)
{
- FindLocalSymbols findLocalSymbols(doc);
+ FindLocalSymbols findLocalSymbols(doc, content);
findLocalSymbols(ast);
uses = findLocalSymbols.localUses;
}
diff --git a/src/plugins/cppeditor/cpplocalsymbols.h b/src/plugins/cppeditor/cpplocalsymbols.h
index 3c178f2f40..26cd185b72 100644
--- a/src/plugins/cppeditor/cpplocalsymbols.h
+++ b/src/plugins/cppeditor/cpplocalsymbols.h
@@ -12,7 +12,7 @@ class LocalSymbols
Q_DISABLE_COPY(LocalSymbols)
public:
- LocalSymbols(CPlusPlus::Document::Ptr doc, CPlusPlus::DeclarationAST *ast);
+ LocalSymbols(CPlusPlus::Document::Ptr doc, const QString &content, CPlusPlus::DeclarationAST *ast);
SemanticInfo::LocalUseMap uses;
};
diff --git a/src/plugins/cppeditor/cpplocalsymbols_test.cpp b/src/plugins/cppeditor/cpplocalsymbols_test.cpp
index 9605f24ffa..740fd8233c 100644
--- a/src/plugins/cppeditor/cpplocalsymbols_test.cpp
+++ b/src/plugins/cppeditor/cpplocalsymbols_test.cpp
@@ -160,7 +160,7 @@ void LocalSymbolsTest::test()
FindFirstFunctionDefinition find(document->translationUnit());
CPlusPlus::DeclarationAST *functionDefinition = find();
- LocalSymbols localSymbols(document, functionDefinition);
+ LocalSymbols localSymbols(document, QString::fromUtf8(source), functionDefinition);
const QList<Result> actualUses = Result::fromLocalUses(localSymbols.uses);
// for (const Result &result : actualUses)
diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.cpp b/src/plugins/cppeditor/cppuseselectionsupdater.cpp
index e03475ea80..67fb6d7a1b 100644
--- a/src/plugins/cppeditor/cppuseselectionsupdater.cpp
+++ b/src/plugins/cppeditor/cppuseselectionsupdater.cpp
@@ -3,18 +3,19 @@
#include "cppuseselectionsupdater.h"
-#include "cppeditorwidget.h"
#include "cppeditordocument.h"
+#include "cppeditorwidget.h"
#include "cppmodelmanager.h"
-#include "cpptoolsreuse.h"
+#include <extensionsystem/pluginmanager.h>
+
+#include <utils/futuresynchronizer.h>
+#include <utils/qtcassert.h>
#include <utils/textutils.h>
#include <QTextBlock>
#include <QTextCursor>
-#include <utils/qtcassert.h>
-
enum { updateUseSelectionsInternalInMs = 500 };
namespace CppEditor {
@@ -67,13 +68,14 @@ CppUseSelectionsUpdater::RunnerInfo CppUseSelectionsUpdater::update(CallType cal
m_runnerWatcher->cancel();
m_runnerWatcher.reset(new QFutureWatcher<CursorInfo>);
- connect(m_runnerWatcher.data(), &QFutureWatcherBase::finished,
+ connect(m_runnerWatcher.get(), &QFutureWatcherBase::finished,
this, &CppUseSelectionsUpdater::onFindUsesFinished);
m_runnerRevision = m_editorWidget->document()->revision();
m_runnerWordStartPosition = params.textCursor.position();
m_runnerWatcher->setFuture(cppEditorDocument->cursorInfo(params));
+ ExtensionSystem::PluginManager::futureSynchronizer()->addFuture(m_runnerWatcher->future());
return RunnerInfo::Started;
} else { // synchronous case
abortSchedule();
@@ -142,7 +144,7 @@ void CppUseSelectionsUpdater::onFindUsesFinished()
processResults(m_runnerWatcher->result());
- m_runnerWatcher.reset();
+ m_runnerWatcher.release()->deleteLater();
}
CppUseSelectionsUpdater::ExtraSelections
diff --git a/src/plugins/cppeditor/cppuseselectionsupdater.h b/src/plugins/cppeditor/cppuseselectionsupdater.h
index b303ce7c25..88205c8974 100644
--- a/src/plugins/cppeditor/cppuseselectionsupdater.h
+++ b/src/plugins/cppeditor/cppuseselectionsupdater.h
@@ -54,7 +54,7 @@ private:
QTimer m_timer;
- QScopedPointer<QFutureWatcher<CursorInfo>> m_runnerWatcher;
+ std::unique_ptr<QFutureWatcher<CursorInfo>> m_runnerWatcher;
int m_runnerRevision = -1;
int m_runnerWordStartPosition = -1;
bool m_updateSelections = true;
diff --git a/src/plugins/cppeditor/semantichighlighter.cpp b/src/plugins/cppeditor/semantichighlighter.cpp
index fe52bbdebd..d841ae19c4 100644
--- a/src/plugins/cppeditor/semantichighlighter.cpp
+++ b/src/plugins/cppeditor/semantichighlighter.cpp
@@ -36,14 +36,7 @@ SemanticHighlighter::SemanticHighlighter(TextDocument *baseTextDocument)
updateFormatMapFromFontSettings();
}
-SemanticHighlighter::~SemanticHighlighter()
-{
- if (m_watcher) {
- disconnectWatcher();
- m_watcher->cancel();
- m_watcher->waitForFinished();
- }
-}
+SemanticHighlighter::~SemanticHighlighter() = default;
void SemanticHighlighter::setHighlightingRunner(HighlightingRunner highlightingRunner)
{
@@ -56,18 +49,20 @@ void SemanticHighlighter::run()
qCDebug(log) << "SemanticHighlighter: run()";
- if (m_watcher) {
- disconnectWatcher();
+ if (m_watcher)
m_watcher->cancel();
- }
m_watcher.reset(new QFutureWatcher<HighlightingResult>);
- connectWatcher();
+ connect(m_watcher.get(), &QFutureWatcherBase::resultsReadyAt,
+ this, &SemanticHighlighter::onHighlighterResultAvailable);
+ connect(m_watcher.get(), &QFutureWatcherBase::finished,
+ this, &SemanticHighlighter::onHighlighterFinished);
m_revision = documentRevision();
m_seenBlocks.clear();
m_nextResultToHandle = m_resultCount = 0;
qCDebug(log) << "starting runner for document revision" << m_revision;
m_watcher->setFuture(m_highlightingRunner());
+ m_futureSynchronizer.addFuture(m_watcher->future());
}
Parentheses SemanticHighlighter::getClearedParentheses(const QTextBlock &block)
@@ -232,28 +227,10 @@ void SemanticHighlighter::onHighlighterFinished()
TextDocumentLayout::setParentheses(currentBlock, getClearedParentheses(currentBlock));
}
- m_watcher.reset();
+ m_watcher.release()->deleteLater();
qCDebug(log) << "onHighlighterFinished() took" << t.elapsed() << "ms";
}
-void SemanticHighlighter::connectWatcher()
-{
- using Watcher = QFutureWatcher<HighlightingResult>;
- connect(m_watcher.data(), &Watcher::resultsReadyAt,
- this, &SemanticHighlighter::onHighlighterResultAvailable);
- connect(m_watcher.data(), &Watcher::finished,
- this, &SemanticHighlighter::onHighlighterFinished);
-}
-
-void SemanticHighlighter::disconnectWatcher()
-{
- using Watcher = QFutureWatcher<HighlightingResult>;
- disconnect(m_watcher.data(), &Watcher::resultsReadyAt,
- this, &SemanticHighlighter::onHighlighterResultAvailable);
- disconnect(m_watcher.data(), &Watcher::finished,
- this, &SemanticHighlighter::onHighlighterFinished);
-}
-
unsigned SemanticHighlighter::documentRevision() const
{
return m_baseTextDocument->document()->revision();
diff --git a/src/plugins/cppeditor/semantichighlighter.h b/src/plugins/cppeditor/semantichighlighter.h
index ea49f289a0..f4fb25ddca 100644
--- a/src/plugins/cppeditor/semantichighlighter.h
+++ b/src/plugins/cppeditor/semantichighlighter.h
@@ -5,12 +5,14 @@
#include "cppeditor_global.h"
+#include <utils/futuresynchronizer.h>
+
#include <QFutureWatcher>
-#include <QScopedPointer>
#include <QTextCharFormat>
#include <QVector>
#include <functional>
+#include <memory>
#include <set>
namespace TextEditor {
@@ -70,9 +72,6 @@ private:
void handleHighlighterResults();
void onHighlighterFinished();
- void connectWatcher();
- void disconnectWatcher();
-
unsigned documentRevision() const;
QVector<TextEditor::Parenthesis> getClearedParentheses(const QTextBlock &block);
@@ -80,13 +79,14 @@ private:
TextEditor::TextDocument *m_baseTextDocument;
unsigned m_revision = 0;
- QScopedPointer<QFutureWatcher<TextEditor::HighlightingResult>> m_watcher;
QHash<int, QTextCharFormat> m_formatMap;
std::set<int> m_seenBlocks;
int m_nextResultToHandle = 0;
int m_resultCount = 0;
HighlightingRunner m_highlightingRunner;
+ Utils::FutureSynchronizer m_futureSynchronizer; // Keep before m_watcher.
+ std::unique_ptr<QFutureWatcher<TextEditor::HighlightingResult>> m_watcher;
};
} // namespace CppEditor