diff options
author | Eike Ziller <eike.ziller@qt.io> | 2024-02-27 09:04:51 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2024-02-27 09:04:51 +0100 |
commit | a8414effd8ff6cd9c32c8466950ac3b9b9561524 (patch) | |
tree | 649402f4c740ca69eb8e90088b0ac1d16ae9ef78 /src/plugins/cppeditor | |
parent | 69a0f1654710ba9dc708c968c7312b48038774dd (diff) | |
parent | fdabbfcbcfe35bce731a2eff3fe13e2d6df238b9 (diff) |
Merge remote-tracking branch 'origin/13.0'
Change-Id: If752e3383b35873b696e8beca27d8838a4096c8a
Diffstat (limited to 'src/plugins/cppeditor')
-rw-r--r-- | src/plugins/cppeditor/builtincursorinfo.cpp | 42 | ||||
-rw-r--r-- | src/plugins/cppeditor/builtincursorinfo.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/builtineditordocumentprocessor.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppchecksymbols.cpp | 30 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppchecksymbols.h | 4 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppcodeformatter.cpp | 1 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppfunctiondecldeflink.cpp | 22 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppfunctiondecldeflink.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppindexingsupport.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cpplocalsymbols.cpp | 36 | ||||
-rw-r--r-- | src/plugins/cppeditor/cpplocalsymbols.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cpplocalsymbols_test.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppuseselectionsupdater.cpp | 14 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppuseselectionsupdater.h | 2 | ||||
-rw-r--r-- | src/plugins/cppeditor/semantichighlighter.cpp | 39 | ||||
-rw-r--r-- | src/plugins/cppeditor/semantichighlighter.h | 10 |
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 ¶ms); 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> ¯oUses) +CheckSymbols::Future CheckSymbols::go(Document::Ptr doc, + const QString &content, + const LookupContext &context, + const QList<CheckSymbols::Result> ¯oUses) { 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> ¯oUses) +CheckSymbols *CheckSymbols::create(Document::Ptr doc, + const QString &content, + const LookupContext &context, + const QList<CheckSymbols::Result> ¯oUses) { 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> ¯oUses) - : 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> ¯oUses) + : 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> ¯oUses); static CheckSymbols * create(CPlusPlus::Document::Ptr doc, + const QString &content, const CPlusPlus::LookupContext &context, const QList<Result> ¯oUses); @@ -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 |