TextEditor: Move isAsynchronous() up to IAssistProvider

...from CompletionAssistProvider, so other providers can be executed
asynchronously, too.

Change-Id: I6ec06f6d76bc2937bc272450b4e8dffd81ee868e
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
Nikolai Kosjar
2013-09-17 13:25:39 +02:00
parent 243a34c7ee
commit f96246209d
9 changed files with 44 additions and 19 deletions

View File

@@ -46,6 +46,11 @@ using namespace CPlusPlus;
// ------------------------- // -------------------------
// CppQuickFixAssistProvider // CppQuickFixAssistProvider
// ------------------------- // -------------------------
bool CppQuickFixAssistProvider::isAsynchronous() const
{
return false;
}
bool CppQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const bool CppQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const
{ {
return editorId == CppEditor::Constants::CPPEDITOR_ID; return editorId == CppEditor::Constants::CPPEDITOR_ID;

View File

@@ -86,6 +86,7 @@ private:
class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider
{ {
public: public:
virtual bool isAsynchronous() const;
virtual bool supportsEditor(const Core::Id &editorId) const; virtual bool supportsEditor(const Core::Id &editorId) const;
virtual TextEditor::IAssistProcessor *createProcessor() const; virtual TextEditor::IAssistProcessor *createProcessor() const;

View File

@@ -96,6 +96,11 @@ QmlJSQuickFixAssistProvider::QmlJSQuickFixAssistProvider()
QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider() QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider()
{} {}
bool QmlJSQuickFixAssistProvider::isAsynchronous() const
{
return false;
}
bool QmlJSQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const bool QmlJSQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const
{ {
return editorId == Constants::C_QMLJSEDITOR_ID; return editorId == Constants::C_QMLJSEDITOR_ID;

View File

@@ -77,6 +77,7 @@ public:
QmlJSQuickFixAssistProvider(); QmlJSQuickFixAssistProvider();
virtual ~QmlJSQuickFixAssistProvider(); virtual ~QmlJSQuickFixAssistProvider();
virtual bool isAsynchronous() const;
virtual bool supportsEditor(const Core::Id &editorId) const; virtual bool supportsEditor(const Core::Id &editorId) const;
virtual TextEditor::IAssistProcessor *createProcessor() const; virtual TextEditor::IAssistProcessor *createProcessor() const;

View File

@@ -112,6 +112,11 @@ public:
} // namespace Internal } // namespace Internal
} // namespace TextEditor } // namespace TextEditor
bool ClipboardAssistProvider::isAsynchronous() const
{
return false;
}
bool ClipboardAssistProvider::supportsEditor(const Core::Id &/*editorId*/) const bool ClipboardAssistProvider::supportsEditor(const Core::Id &/*editorId*/) const
{ {
return true; return true;

View File

@@ -38,6 +38,7 @@ namespace Internal {
class ClipboardAssistProvider: public IAssistProvider class ClipboardAssistProvider: public IAssistProvider
{ {
public: public:
bool isAsynchronous() const;
virtual bool supportsEditor(const Core::Id &editorId) const; virtual bool supportsEditor(const Core::Id &editorId) const;
virtual IAssistProcessor *createProcessor() const; virtual IAssistProcessor *createProcessor() const;
}; };

View File

@@ -123,7 +123,7 @@ private:
CompletionAssistProvider *m_completionProvider; CompletionAssistProvider *m_completionProvider;
QList<QuickFixAssistProvider *> m_quickFixProviders; QList<QuickFixAssistProvider *> m_quickFixProviders;
Internal::ProcessorRunner *m_requestRunner; Internal::ProcessorRunner *m_requestRunner;
CompletionAssistProvider *m_requestProvider; IAssistProvider *m_requestProvider;
AssistKind m_assistKind; AssistKind m_assistKind;
IAssistProposalWidget *m_proposalWidget; IAssistProposalWidget *m_proposalWidget;
QScopedPointer<IAssistProposal> m_proposal; QScopedPointer<IAssistProposal> m_proposal;
@@ -258,22 +258,18 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
if (!assistInterface) if (!assistInterface)
return; return;
if (kind == Completion) { if (provider->isAsynchronous()) {
CompletionAssistProvider *completionProvider = m_requestProvider = provider;
static_cast<CompletionAssistProvider *>(provider); m_requestRunner = new ProcessorRunner;
if (completionProvider->isAsynchronous()) { connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed()));
m_requestProvider = completionProvider; connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest()));
m_requestRunner = new ProcessorRunner; connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished()));
connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); assistInterface->prepareForAsyncUse();
connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); m_requestRunner->setReason(reason);
connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished())); m_requestRunner->setProcessor(processor);
assistInterface->prepareForAsyncUse(); m_requestRunner->setAssistInterface(assistInterface);
m_requestRunner->setReason(reason); m_requestRunner->start();
m_requestRunner->setProcessor(processor); return;
m_requestRunner->setAssistInterface(assistInterface);
m_requestRunner->start();
return;
}
} }
if (IAssistProposal *newProposal = processor->perform(assistInterface)) if (IAssistProposal *newProposal = processor->perform(assistInterface))
@@ -502,12 +498,16 @@ bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e)
} else if (type == QEvent::KeyPress) { } else if (type == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e); QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
const QString &keyText = keyEvent->text(); const QString &keyText = keyEvent->text();
CompletionAssistProvider *completionProvider = 0;
if ((keyText.isEmpty() if ((keyText.isEmpty()
&& keyEvent->key() != Qt::LeftArrow && keyEvent->key() != Qt::LeftArrow
&& keyEvent->key() != Qt::RightArrow && keyEvent->key() != Qt::RightArrow
&& keyEvent->key() != Qt::Key_Shift) && keyEvent->key() != Qt::Key_Shift)
|| (!keyText.isEmpty() && || (!keyText.isEmpty()
!m_requestProvider->isContinuationChar(keyText.at(0)))) { && (((completionProvider = dynamic_cast<CompletionAssistProvider *>(m_requestProvider))
? !completionProvider->isContinuationChar(keyText.at(0))
: false)))) {
destroyContext(); destroyContext();
} else if (!keyText.isEmpty() && !m_receivedContentWhileWaiting) { } else if (!keyText.isEmpty() && !m_receivedContentWhileWaiting) {
m_receivedContentWhileWaiting = true; m_receivedContentWhileWaiting = true;

View File

@@ -49,6 +49,12 @@ using namespace TextEditor;
\sa IAssistProposal, IAssistProcessor \sa IAssistProposal, IAssistProcessor
*/ */
/*!
\fn bool TextEditor::IAssistProvider::isAsynchronous() const;
Returns whether this provider runs asynchronously.
*/
/*! /*!
\fn bool TextEditor::IAssistProvider::supportsEditor(const Core::Id &editorId) const \fn bool TextEditor::IAssistProvider::supportsEditor(const Core::Id &editorId) const

View File

@@ -46,6 +46,7 @@ class TEXTEDITOR_EXPORT IAssistProvider : public QObject
public: public:
IAssistProvider() {} IAssistProvider() {}
virtual bool isAsynchronous() const = 0;
virtual bool supportsEditor(const Core::Id &editorId) const = 0; virtual bool supportsEditor(const Core::Id &editorId) const = 0;
virtual IAssistProcessor *createProcessor() const = 0; virtual IAssistProcessor *createProcessor() const = 0;
}; };