From 0a4073ef90cb61400856ead7c137064096694b6a Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 10:47:45 +0100 Subject: [PATCH] TextEditor: Return hover handler priority by callback ...to get rid of the asynchronous code path. Change-Id: I56377510440631b0be712333b2a4018717c86389 Reviewed-by: David Schulz --- .../clangcodemodel/clanghoverhandler.cpp | 11 ++++--- .../clangcodemodel/clanghoverhandler.h | 8 ++--- .../clangqueryhoverhandler.cpp | 7 ++++- .../clangrefactoring/clangqueryhoverhandler.h | 4 ++- .../cppeditor/resourcepreviewhoverhandler.cpp | 7 ++++- .../cppeditor/resourcepreviewhoverhandler.h | 4 ++- src/plugins/cpptools/cpphoverhandler.cpp | 5 +++- src/plugins/cpptools/cpphoverhandler.h | 4 ++- .../profilehoverhandler.cpp | 7 ++++- .../qmakeprojectmanager/profilehoverhandler.h | 4 ++- src/plugins/qmljseditor/qmljshoverhandler.cpp | 5 +++- src/plugins/qmljseditor/qmljshoverhandler.h | 4 ++- src/plugins/texteditor/basehoverhandler.cpp | 30 +++---------------- src/plugins/texteditor/basehoverhandler.h | 14 ++++----- .../texteditor/colorpreviewhoverhandler.cpp | 7 ++++- .../texteditor/colorpreviewhoverhandler.h | 2 +- src/plugins/texteditor/texteditor.cpp | 6 ++-- 17 files changed, 69 insertions(+), 60 deletions(-) diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp index 6610b555c22..2281b5d304e 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.cpp +++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp @@ -102,17 +102,16 @@ static QFuture editorDocumentHandlesToolTipInfo( ClangHoverHandler::ClangHoverHandler() { - setIsAsyncHandler(true); } ClangHoverHandler::~ClangHoverHandler() { - cancelAsyncCheck(); + abort(); } -void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, - int pos, - BaseHoverHandler::ReportPriority report) +void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + BaseHoverHandler::ReportPriority report) { // Reset m_futureWatcher.reset(); @@ -143,7 +142,7 @@ void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, report(Priority_None); // Ops, something went wrong. } -void ClangHoverHandler::cancelAsyncCheck() +void ClangHoverHandler::abort() { if (m_futureWatcher) m_futureWatcher->cancel(); diff --git a/src/plugins/clangcodemodel/clanghoverhandler.h b/src/plugins/clangcodemodel/clanghoverhandler.h index 85b7999f94b..e6e262ecd01 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.h +++ b/src/plugins/clangcodemodel/clanghoverhandler.h @@ -40,14 +40,14 @@ public: ClangHoverHandler(); ~ClangHoverHandler() override; - void identifyMatchAsync(TextEditor::TextEditorWidget *editorWidget, - int pos, - ReportPriority report) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: - void cancelAsyncCheck() override; + void abort() override; void processToolTipInfo(const CppTools::ToolTipInfo &info); private: diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp index e8ce90c297c..11a29f1db1f 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp @@ -30,6 +30,7 @@ #include #include +#include namespace ClangRefactoring { @@ -38,8 +39,12 @@ ClangQueryHoverHandler::ClangQueryHoverHandler(ClangQueryHighlighter *highligher { } -void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) +void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + using Messages = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainers; using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers; diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.h b/src/plugins/clangrefactoring/clangqueryhoverhandler.h index 7a93bcbf5d3..a9dfc5fe229 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.h +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.h @@ -37,7 +37,9 @@ public: ClangQueryHoverHandler(ClangQueryHighlighter *highligher); protected: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) override; private: ClangQueryHighlighter *m_highligher; diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp index 47c691760d1..a657fcd6bc3 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -164,8 +165,12 @@ static QString findResourceInProject(const QString &resName) return QString(); } -void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.h b/src/plugins/cppeditor/resourcepreviewhoverhandler.h index 2ccb261c2a8..b0977099ecb 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.h +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.h @@ -35,7 +35,9 @@ namespace Internal { class ResourcePreviewHoverHandler : public TextEditor::BaseHoverHandler { private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp index 1ff41b7fdc3..3969065ff70 100644 --- a/src/plugins/cpptools/cpphoverhandler.cpp +++ b/src/plugins/cpptools/cpphoverhandler.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -67,8 +68,10 @@ QString CppHoverHandler::tooltipTextForHelpItem(const HelpItem &helpItem) return QString(); } -void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + QTextCursor tc(editorWidget->document()); tc.setPosition(pos); diff --git a/src/plugins/cpptools/cpphoverhandler.h b/src/plugins/cpptools/cpphoverhandler.h index edfa6901cf8..75d6475537e 100644 --- a/src/plugins/cpptools/cpphoverhandler.h +++ b/src/plugins/cpptools/cpphoverhandler.h @@ -37,7 +37,9 @@ public: static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; }; diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp index dfbee9bb665..2aa7fb94b36 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -44,8 +45,12 @@ ProFileHoverHandler::ProFileHoverHandler() { } -void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) +void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + m_docFragment.clear(); m_manualKind = UnknownManual; if (!editorWidget->extraSelectionTooltip(pos).isEmpty()) { diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.h b/src/plugins/qmakeprojectmanager/profilehoverhandler.h index cc9f91ef02b..bbcd74db7aa 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.h +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.h @@ -40,7 +40,9 @@ public: ProFileHoverHandler(); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void identifyQMakeKeyword(const QString &text, int pos); enum ManualKind { diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index a767d6713ba..7334ad7ecd1 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -201,8 +202,10 @@ bool QmlJSHoverHandler::setQmlTypeHelp(const ScopeChain &scopeChain, const Docum return true; } -void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + reset(); if (!m_modelManager) diff --git a/src/plugins/qmljseditor/qmljshoverhandler.h b/src/plugins/qmljseditor/qmljshoverhandler.h index fde05c7e4a6..682d713f39d 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.h +++ b/src/plugins/qmljseditor/qmljshoverhandler.h @@ -58,7 +58,9 @@ public: private: void reset(); - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; bool matchDiagnosticMessage(QmlJSEditorWidget *qmlEditor, int pos); diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 86d8eb0bbcd..10a532bcc11 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -26,6 +26,7 @@ #include "basehoverhandler.h" #include "texteditor.h" +#include #include #include @@ -34,11 +35,6 @@ namespace TextEditor { BaseHoverHandler::~BaseHoverHandler() {} -bool BaseHoverHandler::isAsyncHandler() const -{ - return m_isAsyncHandler; -} - void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate) { if (decorate) @@ -55,11 +51,6 @@ void BaseHoverHandler::checkPriority(TextEditorWidget *widget, process(widget, pos, report); } -void BaseHoverHandler::cancelAsyncCheck() -{ - QTC_CHECK(false && "BaseHoverHandler: Implement cancelCheck() in derived class!"); -} - int BaseHoverHandler::priority() const { if (m_priority >= 0) @@ -117,31 +108,18 @@ void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority m_priority = -1; m_lastHelpItemIdentified = HelpItem(); - if (m_isAsyncHandler) { - identifyMatchAsync(widget, pos, report); - } else { - identifyMatch(widget, pos); - report(priority()); - } + identifyMatch(widget, pos, report); } -void BaseHoverHandler::setIsAsyncHandler(bool isAsyncHandler) +void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { - m_isAsyncHandler = isAsyncHandler; -} + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); -void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) -{ QString tooltip = editorWidget->extraSelectionTooltip(pos); if (!tooltip.isEmpty()) setToolTip(tooltip); } -void BaseHoverHandler::identifyMatchAsync(TextEditorWidget *, int, BaseHoverHandler::ReportPriority) -{ - QTC_CHECK(false && "BaseHoverHandler: Implement identifyMatchAsync() in derived class!"); -} - void BaseHoverHandler::decorateToolTip() { if (Qt::mightBeRichText(toolTip())) diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index cdd8735264b..4c3638c4e49 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -43,14 +43,11 @@ class TEXTEDITOR_EXPORT BaseHoverHandler public: virtual ~BaseHoverHandler(); - bool isAsyncHandler() const; - void setIsAsyncHandler(bool isAsyncHandler); - QString contextHelpId(TextEditorWidget *widget, int pos); using ReportPriority = std::function; void checkPriority(TextEditorWidget *widget, int pos, ReportPriority report); - virtual void cancelAsyncCheck(); + virtual void abort() {} // Implement for asynchronous priority reporter void showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate = true); @@ -70,16 +67,17 @@ protected: void setLastHelpItemIdentified(const HelpItem &help); const HelpItem &lastHelpItemIdentified() const; - virtual void identifyMatch(TextEditorWidget *editorWidget, int pos); - virtual void identifyMatchAsync(TextEditorWidget *editorWidget, int pos, ReportPriority report); + // identifyMatch() is required to report a priority by using the "report" callback. + // It is recommended to use e.g. + // Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + // at the beginning of an implementation to ensure this in any case. + virtual void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report); virtual void decorateToolTip(); virtual void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point); private: void process(TextEditorWidget *widget, int pos, ReportPriority report); - bool m_isAsyncHandler = false; - QString m_toolTip; HelpItem m_lastHelpItemIdentified; int m_priority = -1; diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.cpp b/src/plugins/texteditor/colorpreviewhoverhandler.cpp index c6ca5947d00..6a6f4e20dd9 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.cpp +++ b/src/plugins/texteditor/colorpreviewhoverhandler.cpp @@ -27,6 +27,7 @@ #include "texteditor.h" #include +#include #include #include @@ -355,8 +356,12 @@ static QColor colorFromFuncAndArgs(const QString &func, const QStringList &args) return colorFromArgs(args, spec); } -void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.h b/src/plugins/texteditor/colorpreviewhoverhandler.h index 8677bf009a2..ee8db3f93f4 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.h +++ b/src/plugins/texteditor/colorpreviewhoverhandler.h @@ -39,7 +39,7 @@ class TextEditorWidget; class TEXTEDITOR_EXPORT ColorPreviewHoverHandler : public BaseHoverHandler { private: - void identifyMatch(TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) override; void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point) override; QColor m_colorTip; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 505c4325aec..ee7e0a9861e 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -314,10 +314,8 @@ public: } // Cancel currently running checks - for (BaseHoverHandler *handler : m_handlers) { - if (handler->isAsyncHandler()) - handler->cancelAsyncCheck(); - } + for (BaseHoverHandler *handler : m_handlers) + handler->abort(); // Update invocation data m_documentRevision = documentRevision;