TextEditor: Return hover handler priority by callback

...to get rid of the asynchronous code path.

Change-Id: I56377510440631b0be712333b2a4018717c86389
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-01-18 10:47:45 +01:00
parent 2d7f1d6c8c
commit 0a4073ef90
17 changed files with 69 additions and 60 deletions

View File

@@ -102,15 +102,14 @@ static QFuture<CppTools::ToolTipInfo> editorDocumentHandlesToolTipInfo(
ClangHoverHandler::ClangHoverHandler() ClangHoverHandler::ClangHoverHandler()
{ {
setIsAsyncHandler(true);
} }
ClangHoverHandler::~ClangHoverHandler() ClangHoverHandler::~ClangHoverHandler()
{ {
cancelAsyncCheck(); abort();
} }
void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget,
int pos, int pos,
BaseHoverHandler::ReportPriority report) BaseHoverHandler::ReportPriority report)
{ {
@@ -143,7 +142,7 @@ void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget,
report(Priority_None); // Ops, something went wrong. report(Priority_None); // Ops, something went wrong.
} }
void ClangHoverHandler::cancelAsyncCheck() void ClangHoverHandler::abort()
{ {
if (m_futureWatcher) if (m_futureWatcher)
m_futureWatcher->cancel(); m_futureWatcher->cancel();

View File

@@ -40,14 +40,14 @@ public:
ClangHoverHandler(); ClangHoverHandler();
~ClangHoverHandler() override; ~ClangHoverHandler() override;
void identifyMatchAsync(TextEditor::TextEditorWidget *editorWidget, void identifyMatch(TextEditor::TextEditorWidget *editorWidget,
int pos, int pos,
ReportPriority report) override; ReportPriority report) override;
void decorateToolTip() override; void decorateToolTip() override;
void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override;
private: private:
void cancelAsyncCheck() override; void abort() override;
void processToolTipInfo(const CppTools::ToolTipInfo &info); void processToolTipInfo(const CppTools::ToolTipInfo &info);
private: private:

View File

@@ -30,6 +30,7 @@
#include <dynamicastmatcherdiagnosticmessagecontainer.h> #include <dynamicastmatcherdiagnosticmessagecontainer.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/executeondestruction.h>
namespace ClangRefactoring { 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 Messages = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainers;
using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers; using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers;

View File

@@ -37,7 +37,9 @@ public:
ClangQueryHoverHandler(ClangQueryHighlighter *highligher); ClangQueryHoverHandler(ClangQueryHighlighter *highligher);
protected: protected:
void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) override; void identifyMatch(TextEditor::TextEditorWidget *editorWidget,
int position,
ReportPriority report) override;
private: private:
ClangQueryHighlighter *m_highligher; ClangQueryHighlighter *m_highligher;

View File

@@ -33,6 +33,7 @@
#include <projectexplorer/projecttree.h> #include <projectexplorer/projecttree.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/executeondestruction.h>
#include <QPoint> #include <QPoint>
#include <QTextBlock> #include <QTextBlock>
@@ -164,8 +165,12 @@ static QString findResourceInProject(const QString &resName)
return QString(); 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()) { if (editorWidget->extraSelectionTooltip(pos).isEmpty()) {
const QTextBlock tb = editorWidget->document()->findBlock(pos); const QTextBlock tb = editorWidget->document()->findBlock(pos);
const int tbpos = pos - tb.position(); const int tbpos = pos - tb.position();

View File

@@ -35,7 +35,9 @@ namespace Internal {
class ResourcePreviewHoverHandler : public TextEditor::BaseHoverHandler class ResourcePreviewHoverHandler : public TextEditor::BaseHoverHandler
{ {
private: 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; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override;
private: private:

View File

@@ -31,6 +31,7 @@
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/textutils.h> #include <utils/textutils.h>
#include <utils/executeondestruction.h>
#include <QTextCursor> #include <QTextCursor>
#include <QUrl> #include <QUrl>
@@ -67,8 +68,10 @@ QString CppHoverHandler::tooltipTextForHelpItem(const HelpItem &helpItem)
return QString(); 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()); QTextCursor tc(editorWidget->document());
tc.setPosition(pos); tc.setPosition(pos);

View File

@@ -37,7 +37,9 @@ public:
static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help); static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help);
private: private:
void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; void identifyMatch(TextEditor::TextEditorWidget *editorWidget,
int pos,
ReportPriority report) override;
void decorateToolTip() override; void decorateToolTip() override;
}; };

View File

@@ -30,6 +30,7 @@
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <utils/htmldocextractor.h> #include <utils/htmldocextractor.h>
#include <utils/executeondestruction.h>
#include <QTextBlock> #include <QTextBlock>
#include <QUrl> #include <QUrl>
@@ -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_docFragment.clear();
m_manualKind = UnknownManual; m_manualKind = UnknownManual;
if (!editorWidget->extraSelectionTooltip(pos).isEmpty()) { if (!editorWidget->extraSelectionTooltip(pos).isEmpty()) {

View File

@@ -40,7 +40,9 @@ public:
ProFileHoverHandler(); ProFileHoverHandler();
private: 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); void identifyQMakeKeyword(const QString &text, int pos);
enum ManualKind { enum ManualKind {

View File

@@ -45,6 +45,7 @@
#include <qmljs/qmljsqrcparser.h> #include <qmljs/qmljsqrcparser.h>
#include <texteditor/texteditor.h> #include <texteditor/texteditor.h>
#include <texteditor/helpitem.h> #include <texteditor/helpitem.h>
#include <utils/executeondestruction.h>
#include <utils/tooltip/tooltip.h> #include <utils/tooltip/tooltip.h>
#include <QDir> #include <QDir>
@@ -201,8 +202,10 @@ bool QmlJSHoverHandler::setQmlTypeHelp(const ScopeChain &scopeChain, const Docum
return true; 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(); reset();
if (!m_modelManager) if (!m_modelManager)

View File

@@ -58,7 +58,9 @@ public:
private: private:
void reset(); 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; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override;
bool matchDiagnosticMessage(QmlJSEditorWidget *qmlEditor, int pos); bool matchDiagnosticMessage(QmlJSEditorWidget *qmlEditor, int pos);

View File

@@ -26,6 +26,7 @@
#include "basehoverhandler.h" #include "basehoverhandler.h"
#include "texteditor.h" #include "texteditor.h"
#include <utils/executeondestruction.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/tooltip/tooltip.h> #include <utils/tooltip/tooltip.h>
@@ -34,11 +35,6 @@ namespace TextEditor {
BaseHoverHandler::~BaseHoverHandler() BaseHoverHandler::~BaseHoverHandler()
{} {}
bool BaseHoverHandler::isAsyncHandler() const
{
return m_isAsyncHandler;
}
void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate) void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate)
{ {
if (decorate) if (decorate)
@@ -55,11 +51,6 @@ void BaseHoverHandler::checkPriority(TextEditorWidget *widget,
process(widget, pos, report); process(widget, pos, report);
} }
void BaseHoverHandler::cancelAsyncCheck()
{
QTC_CHECK(false && "BaseHoverHandler: Implement cancelCheck() in derived class!");
}
int BaseHoverHandler::priority() const int BaseHoverHandler::priority() const
{ {
if (m_priority >= 0) if (m_priority >= 0)
@@ -117,31 +108,18 @@ void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority
m_priority = -1; m_priority = -1;
m_lastHelpItemIdentified = HelpItem(); m_lastHelpItemIdentified = HelpItem();
if (m_isAsyncHandler) { identifyMatch(widget, pos, report);
identifyMatchAsync(widget, pos, report);
} else {
identifyMatch(widget, pos);
report(priority());
}
} }
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); QString tooltip = editorWidget->extraSelectionTooltip(pos);
if (!tooltip.isEmpty()) if (!tooltip.isEmpty())
setToolTip(tooltip); setToolTip(tooltip);
} }
void BaseHoverHandler::identifyMatchAsync(TextEditorWidget *, int, BaseHoverHandler::ReportPriority)
{
QTC_CHECK(false && "BaseHoverHandler: Implement identifyMatchAsync() in derived class!");
}
void BaseHoverHandler::decorateToolTip() void BaseHoverHandler::decorateToolTip()
{ {
if (Qt::mightBeRichText(toolTip())) if (Qt::mightBeRichText(toolTip()))

View File

@@ -43,14 +43,11 @@ class TEXTEDITOR_EXPORT BaseHoverHandler
public: public:
virtual ~BaseHoverHandler(); virtual ~BaseHoverHandler();
bool isAsyncHandler() const;
void setIsAsyncHandler(bool isAsyncHandler);
QString contextHelpId(TextEditorWidget *widget, int pos); QString contextHelpId(TextEditorWidget *widget, int pos);
using ReportPriority = std::function<void(int priority)>; using ReportPriority = std::function<void(int priority)>;
void checkPriority(TextEditorWidget *widget, int pos, ReportPriority report); 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); void showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate = true);
@@ -70,16 +67,17 @@ protected:
void setLastHelpItemIdentified(const HelpItem &help); void setLastHelpItemIdentified(const HelpItem &help);
const HelpItem &lastHelpItemIdentified() const; const HelpItem &lastHelpItemIdentified() const;
virtual void identifyMatch(TextEditorWidget *editorWidget, int pos); // identifyMatch() is required to report a priority by using the "report" callback.
virtual void identifyMatchAsync(TextEditorWidget *editorWidget, int pos, ReportPriority report); // 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 decorateToolTip();
virtual void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point); virtual void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point);
private: private:
void process(TextEditorWidget *widget, int pos, ReportPriority report); void process(TextEditorWidget *widget, int pos, ReportPriority report);
bool m_isAsyncHandler = false;
QString m_toolTip; QString m_toolTip;
HelpItem m_lastHelpItemIdentified; HelpItem m_lastHelpItemIdentified;
int m_priority = -1; int m_priority = -1;

View File

@@ -27,6 +27,7 @@
#include "texteditor.h" #include "texteditor.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <utils/executeondestruction.h>
#include <utils/tooltip/tooltip.h> #include <utils/tooltip/tooltip.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -355,8 +356,12 @@ static QColor colorFromFuncAndArgs(const QString &func, const QStringList &args)
return colorFromArgs(args, spec); 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()) { if (editorWidget->extraSelectionTooltip(pos).isEmpty()) {
const QTextBlock tb = editorWidget->document()->findBlock(pos); const QTextBlock tb = editorWidget->document()->findBlock(pos);
const int tbpos = pos - tb.position(); const int tbpos = pos - tb.position();

View File

@@ -39,7 +39,7 @@ class TextEditorWidget;
class TEXTEDITOR_EXPORT ColorPreviewHoverHandler : public BaseHoverHandler class TEXTEDITOR_EXPORT ColorPreviewHoverHandler : public BaseHoverHandler
{ {
private: 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; void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point) override;
QColor m_colorTip; QColor m_colorTip;

View File

@@ -314,10 +314,8 @@ public:
} }
// Cancel currently running checks // Cancel currently running checks
for (BaseHoverHandler *handler : m_handlers) { for (BaseHoverHandler *handler : m_handlers)
if (handler->isAsyncHandler()) handler->abort();
handler->cancelAsyncCheck();
}
// Update invocation data // Update invocation data
m_documentRevision = documentRevision; m_documentRevision = documentRevision;