diff options
9 files changed, 44 insertions, 19 deletions
diff --git a/src/plugins/cppeditor/cppquickfixassistant.cpp b/src/plugins/cppeditor/cppquickfixassistant.cpp index 2c6d7e3217..4ca8d0e0a6 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.cpp +++ b/src/plugins/cppeditor/cppquickfixassistant.cpp @@ -46,6 +46,11 @@ using namespace CPlusPlus; // ------------------------- // CppQuickFixAssistProvider // ------------------------- +bool CppQuickFixAssistProvider::isAsynchronous() const +{ + return false; +} + bool CppQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const { return editorId == CppEditor::Constants::CPPEDITOR_ID; diff --git a/src/plugins/cppeditor/cppquickfixassistant.h b/src/plugins/cppeditor/cppquickfixassistant.h index fbdea6d1de..cfc921d00d 100644 --- a/src/plugins/cppeditor/cppquickfixassistant.h +++ b/src/plugins/cppeditor/cppquickfixassistant.h @@ -86,6 +86,7 @@ private: class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider { public: + virtual bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual TextEditor::IAssistProcessor *createProcessor() const; diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.cpp b/src/plugins/qmljseditor/qmljsquickfixassist.cpp index fef38fadd4..29a1a86185 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.cpp +++ b/src/plugins/qmljseditor/qmljsquickfixassist.cpp @@ -96,6 +96,11 @@ QmlJSQuickFixAssistProvider::QmlJSQuickFixAssistProvider() QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider() {} +bool QmlJSQuickFixAssistProvider::isAsynchronous() const +{ + return false; +} + bool QmlJSQuickFixAssistProvider::supportsEditor(const Core::Id &editorId) const { return editorId == Constants::C_QMLJSEDITOR_ID; diff --git a/src/plugins/qmljseditor/qmljsquickfixassist.h b/src/plugins/qmljseditor/qmljsquickfixassist.h index 98a6fc8a85..af2e51d197 100644 --- a/src/plugins/qmljseditor/qmljsquickfixassist.h +++ b/src/plugins/qmljseditor/qmljsquickfixassist.h @@ -77,6 +77,7 @@ public: QmlJSQuickFixAssistProvider(); virtual ~QmlJSQuickFixAssistProvider(); + virtual bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual TextEditor::IAssistProcessor *createProcessor() const; diff --git a/src/plugins/texteditor/circularclipboardassist.cpp b/src/plugins/texteditor/circularclipboardassist.cpp index e742ae01a8..046f1b836d 100644 --- a/src/plugins/texteditor/circularclipboardassist.cpp +++ b/src/plugins/texteditor/circularclipboardassist.cpp @@ -112,6 +112,11 @@ public: } // namespace Internal } // namespace TextEditor +bool ClipboardAssistProvider::isAsynchronous() const +{ + return false; +} + bool ClipboardAssistProvider::supportsEditor(const Core::Id &/*editorId*/) const { return true; diff --git a/src/plugins/texteditor/circularclipboardassist.h b/src/plugins/texteditor/circularclipboardassist.h index ff495ff63c..307f9f4ce7 100644 --- a/src/plugins/texteditor/circularclipboardassist.h +++ b/src/plugins/texteditor/circularclipboardassist.h @@ -38,6 +38,7 @@ namespace Internal { class ClipboardAssistProvider: public IAssistProvider { public: + bool isAsynchronous() const; virtual bool supportsEditor(const Core::Id &editorId) const; virtual IAssistProcessor *createProcessor() const; }; diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp index 753c8e7945..36762e4e58 100644 --- a/src/plugins/texteditor/codeassist/codeassistant.cpp +++ b/src/plugins/texteditor/codeassist/codeassistant.cpp @@ -123,7 +123,7 @@ private: CompletionAssistProvider *m_completionProvider; QList<QuickFixAssistProvider *> m_quickFixProviders; Internal::ProcessorRunner *m_requestRunner; - CompletionAssistProvider *m_requestProvider; + IAssistProvider *m_requestProvider; AssistKind m_assistKind; IAssistProposalWidget *m_proposalWidget; QScopedPointer<IAssistProposal> m_proposal; @@ -258,22 +258,18 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason, if (!assistInterface) return; - if (kind == Completion) { - CompletionAssistProvider *completionProvider = - static_cast<CompletionAssistProvider *>(provider); - if (completionProvider->isAsynchronous()) { - m_requestProvider = completionProvider; - m_requestRunner = new ProcessorRunner; - connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); - connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); - connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished())); - assistInterface->prepareForAsyncUse(); - m_requestRunner->setReason(reason); - m_requestRunner->setProcessor(processor); - m_requestRunner->setAssistInterface(assistInterface); - m_requestRunner->start(); - return; - } + if (provider->isAsynchronous()) { + m_requestProvider = provider; + m_requestRunner = new ProcessorRunner; + connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed())); + connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest())); + connect(m_requestRunner, SIGNAL(finished()), this, SIGNAL(finished())); + assistInterface->prepareForAsyncUse(); + m_requestRunner->setReason(reason); + m_requestRunner->setProcessor(processor); + m_requestRunner->setAssistInterface(assistInterface); + m_requestRunner->start(); + return; } if (IAssistProposal *newProposal = processor->perform(assistInterface)) @@ -502,12 +498,16 @@ bool CodeAssistantPrivate::eventFilter(QObject *o, QEvent *e) } else if (type == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e); const QString &keyText = keyEvent->text(); + + CompletionAssistProvider *completionProvider = 0; if ((keyText.isEmpty() && keyEvent->key() != Qt::LeftArrow && keyEvent->key() != Qt::RightArrow && keyEvent->key() != Qt::Key_Shift) - || (!keyText.isEmpty() && - !m_requestProvider->isContinuationChar(keyText.at(0)))) { + || (!keyText.isEmpty() + && (((completionProvider = dynamic_cast<CompletionAssistProvider *>(m_requestProvider)) + ? !completionProvider->isContinuationChar(keyText.at(0)) + : false)))) { destroyContext(); } else if (!keyText.isEmpty() && !m_receivedContentWhileWaiting) { m_receivedContentWhileWaiting = true; diff --git a/src/plugins/texteditor/codeassist/iassistprovider.cpp b/src/plugins/texteditor/codeassist/iassistprovider.cpp index 2dac112c7f..935cda9bf6 100644 --- a/src/plugins/texteditor/codeassist/iassistprovider.cpp +++ b/src/plugins/texteditor/codeassist/iassistprovider.cpp @@ -50,6 +50,12 @@ using namespace TextEditor; */ /*! + \fn bool TextEditor::IAssistProvider::isAsynchronous() const; + + Returns whether this provider runs asynchronously. +*/ + +/*! \fn bool TextEditor::IAssistProvider::supportsEditor(const Core::Id &editorId) const Returns whether this provider supports the editor which has the \a editorId. diff --git a/src/plugins/texteditor/codeassist/iassistprovider.h b/src/plugins/texteditor/codeassist/iassistprovider.h index 761b64a46a..11a074273d 100644 --- a/src/plugins/texteditor/codeassist/iassistprovider.h +++ b/src/plugins/texteditor/codeassist/iassistprovider.h @@ -46,6 +46,7 @@ class TEXTEDITOR_EXPORT IAssistProvider : public QObject public: IAssistProvider() {} + virtual bool isAsynchronous() const = 0; virtual bool supportsEditor(const Core::Id &editorId) const = 0; virtual IAssistProcessor *createProcessor() const = 0; }; |