CodeAssist: Support only one quickfix assistant per editor class.

Currently we are just using the first that is found. Which could lead
to unexpected behavior. Adjust the API to make clear just one assistant
is supported per editor type.

Change-Id: I711e66b4c5c5f347118357a8bafa0ffc6d650f7e
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2016-03-16 13:04:05 +01:00
parent 16aeecea2c
commit 898968b101
20 changed files with 45 additions and 30 deletions

View File

@@ -26,7 +26,9 @@
#include "cppeditordocument.h" #include "cppeditordocument.h"
#include "cppeditorconstants.h" #include "cppeditorconstants.h"
#include "cppeditorplugin.h"
#include "cpphighlighter.h" #include "cpphighlighter.h"
#include "cppquickfixassistant.h"
#include <cpptools/baseeditordocumentparser.h> #include <cpptools/baseeditordocumentparser.h>
#include <cpptools/builtineditordocumentprocessor.h> #include <cpptools/builtineditordocumentprocessor.h>
@@ -121,6 +123,11 @@ TextEditor::CompletionAssistProvider *CppEditorDocument::completionAssistProvide
return m_completionAssistProvider; return m_completionAssistProvider;
} }
TextEditor::QuickFixAssistProvider *CppEditorDocument::quickFixAssistProvider() const
{
return CppEditorPlugin::instance()->quickFixProvider();
}
void CppEditorDocument::recalculateSemanticInfoDetached() void CppEditorDocument::recalculateSemanticInfoDetached()
{ {
CppTools::BaseEditorDocumentProcessor *p = processor(); CppTools::BaseEditorDocumentProcessor *p = processor();

View File

@@ -50,6 +50,7 @@ public:
bool isObjCEnabled() const; bool isObjCEnabled() const;
TextEditor::CompletionAssistProvider *completionAssistProvider() const override; TextEditor::CompletionAssistProvider *completionAssistProvider() const override;
TextEditor::QuickFixAssistProvider *quickFixAssistProvider() const override;
void recalculateSemanticInfoDetached(); void recalculateSemanticInfoDetached();
CppTools::SemanticInfo recalculateSemanticInfo(); // TODO: Remove me CppTools::SemanticInfo recalculateSemanticInfo(); // TODO: Remove me

View File

@@ -149,8 +149,7 @@ bool CppEditorPlugin::initialize(const QStringList & /*arguments*/, QString *err
addAutoReleasedObject(new CppIncludeHierarchyFactory); addAutoReleasedObject(new CppIncludeHierarchyFactory);
addAutoReleasedObject(new CppSnippetProvider); addAutoReleasedObject(new CppSnippetProvider);
m_quickFixProvider = new CppQuickFixAssistProvider; m_quickFixProvider = new CppQuickFixAssistProvider(this);
addAutoReleasedObject(m_quickFixProvider);
registerQuickFixes(this); registerQuickFixes(this);
Context context(Constants::CPPEDITOR_ID); Context context(Constants::CPPEDITOR_ID);

View File

@@ -71,6 +71,7 @@ private:
class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider class CppQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider
{ {
public: public:
CppQuickFixAssistProvider(QObject *parent = 0) : TextEditor::QuickFixAssistProvider(parent) {}
IAssistProvider::RunType runType() const override; IAssistProvider::RunType runType() const override;
bool supportsEditor(Core::Id editorId) const override; bool supportsEditor(Core::Id editorId) const override;
TextEditor::IAssistProcessor *createProcessor() const override; TextEditor::IAssistProcessor *createProcessor() const override;

View File

@@ -37,6 +37,10 @@ using namespace CppTools;
// --------------------------- // ---------------------------
// CppCompletionAssistProvider // CppCompletionAssistProvider
// --------------------------- // ---------------------------
CppCompletionAssistProvider::CppCompletionAssistProvider(QObject *parent)
: TextEditor::CompletionAssistProvider(parent)
{}
bool CppCompletionAssistProvider::supportsEditor(Core::Id editorId) const bool CppCompletionAssistProvider::supportsEditor(Core::Id editorId) const
{ {
return editorId == CppEditor::Constants::CPPEDITOR_ID; return editorId == CppEditor::Constants::CPPEDITOR_ID;

View File

@@ -48,6 +48,7 @@ class CPPTOOLS_EXPORT CppCompletionAssistProvider : public TextEditor::Completio
Q_OBJECT Q_OBJECT
public: public:
CppCompletionAssistProvider(QObject *parent = 0);
bool supportsEditor(Core::Id editorId) const override; bool supportsEditor(Core::Id editorId) const override;
int activationCharSequenceLength() const override; int activationCharSequenceLength() const override;
bool isActivationCharSequence(const QString &sequence) const override; bool isActivationCharSequence(const QString &sequence) const override;

View File

@@ -27,7 +27,9 @@
#include "qmljseditorconstants.h" #include "qmljseditorconstants.h"
#include "qmljseditordocument_p.h" #include "qmljseditordocument_p.h"
#include "qmljseditorplugin.h"
#include "qmljshighlighter.h" #include "qmljshighlighter.h"
#include "qmljsquickfixassist.h"
#include "qmljssemantichighlighter.h" #include "qmljssemantichighlighter.h"
#include "qmljssemanticinfoupdater.h" #include "qmljssemanticinfoupdater.h"
#include "qmloutlinemodel.h" #include "qmloutlinemodel.h"
@@ -580,6 +582,11 @@ Internal::QmlOutlineModel *QmlJSEditorDocument::outlineModel() const
return d->m_outlineModel; return d->m_outlineModel;
} }
TextEditor::QuickFixAssistProvider *QmlJSEditorDocument::quickFixAssistProvider() const
{
return Internal::QmlJSEditorPlugin::instance()->quickFixAssistProvider();
}
void QmlJSEditorDocument::setDiagnosticRanges(const QVector<QTextLayout::FormatRange> &ranges) void QmlJSEditorDocument::setDiagnosticRanges(const QVector<QTextLayout::FormatRange> &ranges)
{ {
d->m_diagnosticRanges = ranges; d->m_diagnosticRanges = ranges;

View File

@@ -52,6 +52,8 @@ public:
void setDiagnosticRanges(const QVector<QTextLayout::FormatRange> &ranges); void setDiagnosticRanges(const QVector<QTextLayout::FormatRange> &ranges);
Internal::QmlOutlineModel *outlineModel() const; Internal::QmlOutlineModel *outlineModel() const;
TextEditor::QuickFixAssistProvider *quickFixAssistProvider() const override;
signals: signals:
void updateCodeWarnings(QmlJS::Document::Ptr doc); void updateCodeWarnings(QmlJS::Document::Ptr doc);
void semanticInfoUpdated(const QmlJSTools::SemanticInfo &semanticInfo); void semanticInfoUpdated(const QmlJSTools::SemanticInfo &semanticInfo);

View File

@@ -182,8 +182,7 @@ bool QmlJSEditorPlugin::initialize(const QStringList & /*arguments*/, QString *e
cmd = ActionManager::command(TextEditor::Constants::UN_COMMENT_SELECTION); cmd = ActionManager::command(TextEditor::Constants::UN_COMMENT_SELECTION);
contextMenu->addAction(cmd); contextMenu->addAction(cmd);
m_quickFixAssistProvider = new QmlJSQuickFixAssistProvider; m_quickFixAssistProvider = new QmlJSQuickFixAssistProvider(this);
addAutoReleasedObject(m_quickFixAssistProvider);
errorMessage->clear(); errorMessage->clear();

View File

@@ -66,7 +66,8 @@ QmlJSRefactoringFilePtr QmlJSQuickFixAssistInterface::currentFile() const
// --------------------------- // ---------------------------
// QmlJSQuickFixAssistProvider // QmlJSQuickFixAssistProvider
// --------------------------- // ---------------------------
QmlJSQuickFixAssistProvider::QmlJSQuickFixAssistProvider() QmlJSQuickFixAssistProvider::QmlJSQuickFixAssistProvider(QObject *parent)
: TextEditor::QuickFixAssistProvider(parent)
{} {}
QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider() QmlJSQuickFixAssistProvider::~QmlJSQuickFixAssistProvider()

View File

@@ -55,7 +55,7 @@ private:
class QmlJSQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider class QmlJSQuickFixAssistProvider : public TextEditor::QuickFixAssistProvider
{ {
public: public:
QmlJSQuickFixAssistProvider(); QmlJSQuickFixAssistProvider(QObject *parent = 0);
~QmlJSQuickFixAssistProvider(); ~QmlJSQuickFixAssistProvider();
IAssistProvider::RunType runType() const override; IAssistProvider::RunType runType() const override;

View File

@@ -34,6 +34,7 @@ namespace Internal {
class ClipboardAssistProvider: public IAssistProvider class ClipboardAssistProvider: public IAssistProvider
{ {
public: public:
ClipboardAssistProvider(QObject *parent = 0) : IAssistProvider(parent) {}
IAssistProvider::RunType runType() const override; IAssistProvider::RunType runType() const override;
bool supportsEditor(Core::Id editorId) const override; bool supportsEditor(Core::Id editorId) const override;
IAssistProcessor *createProcessor() const override; IAssistProcessor *createProcessor() const override;

View File

@@ -94,7 +94,6 @@ private:
private: private:
CodeAssistant *q; CodeAssistant *q;
TextEditorWidget *m_editorWidget; TextEditorWidget *m_editorWidget;
QList<QuickFixAssistProvider *> m_quickFixProviders;
Internal::ProcessorRunner *m_requestRunner; Internal::ProcessorRunner *m_requestRunner;
IAssistProvider *m_requestProvider; IAssistProvider *m_requestProvider;
IAssistProcessor *m_asyncProcessor; IAssistProcessor *m_asyncProcessor;
@@ -137,23 +136,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
void CodeAssistantPrivate::configure(TextEditorWidget *editorWidget) void CodeAssistantPrivate::configure(TextEditorWidget *editorWidget)
{ {
// @TODO: There's a list of providers but currently only the first one is used. Perhaps we
// should implement a truly mechanism to support multiple providers for an editor (either
// merging or not proposals) or just leave it as not extensible and store directly the one
// completion and quick-fix provider (getting rid of the list).
m_editorWidget = editorWidget; m_editorWidget = editorWidget;
m_quickFixProviders = ExtensionSystem::PluginManager::getObjects<QuickFixAssistProvider>();
Core::Id editorId = m_editorWidget->textDocument()->id();
auto it = m_quickFixProviders.begin();
while (it != m_quickFixProviders.end()) {
if ((*it)->supportsEditor(editorId))
++it;
else
it = m_quickFixProviders.erase(it);
}
m_editorWidget->installEventFilter(this); m_editorWidget->installEventFilter(this);
} }
@@ -216,8 +199,8 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
if (!provider) { if (!provider) {
if (kind == Completion) if (kind == Completion)
provider = m_editorWidget->textDocument()->completionAssistProvider(); provider = m_editorWidget->textDocument()->completionAssistProvider();
else if (!m_quickFixProviders.isEmpty()) else
provider = m_quickFixProviders.at(0); provider = m_editorWidget->textDocument()->quickFixAssistProvider();
if (!provider) if (!provider)
return; return;

View File

@@ -29,7 +29,8 @@
using namespace TextEditor; using namespace TextEditor;
CompletionAssistProvider::CompletionAssistProvider() CompletionAssistProvider::CompletionAssistProvider(QObject *parent)
: IAssistProvider(parent)
{} {}
CompletionAssistProvider::~CompletionAssistProvider() CompletionAssistProvider::~CompletionAssistProvider()

View File

@@ -35,7 +35,7 @@ class TEXTEDITOR_EXPORT CompletionAssistProvider : public IAssistProvider
Q_OBJECT Q_OBJECT
public: public:
CompletionAssistProvider(); CompletionAssistProvider(QObject *parent = 0);
~CompletionAssistProvider(); ~CompletionAssistProvider();
IAssistProvider::RunType runType() const override; IAssistProvider::RunType runType() const override;

View File

@@ -39,7 +39,7 @@ class TEXTEDITOR_EXPORT IAssistProvider : public QObject
Q_OBJECT Q_OBJECT
public: public:
IAssistProvider() {} IAssistProvider(QObject *parent = 0) : QObject(parent) {}
enum RunType { enum RunType {
Synchronous, Synchronous,

View File

@@ -27,7 +27,8 @@
using namespace TextEditor; using namespace TextEditor;
QuickFixAssistProvider::QuickFixAssistProvider() QuickFixAssistProvider::QuickFixAssistProvider(QObject *parent)
: IAssistProvider(parent)
{} {}
QuickFixAssistProvider::~QuickFixAssistProvider() QuickFixAssistProvider::~QuickFixAssistProvider()

View File

@@ -38,7 +38,7 @@ class TEXTEDITOR_EXPORT QuickFixAssistProvider : public IAssistProvider
Q_OBJECT Q_OBJECT
public: public:
QuickFixAssistProvider(); QuickFixAssistProvider(QObject *parent = 0);
~QuickFixAssistProvider(); ~QuickFixAssistProvider();
virtual QList<QuickFixFactory *> quickFixFactories() const; virtual QList<QuickFixFactory *> quickFixFactories() const;

View File

@@ -370,6 +370,11 @@ CompletionAssistProvider *TextDocument::completionAssistProvider() const
return d->m_completionAssistProvider; return d->m_completionAssistProvider;
} }
QuickFixAssistProvider *TextDocument::quickFixAssistProvider() const
{
return 0;
}
void TextDocument::applyFontSettings() void TextDocument::applyFontSettings()
{ {
d->m_fontSettingsNeedsApply = false; d->m_fontSettingsNeedsApply = false;

View File

@@ -45,6 +45,7 @@ class CompletionAssistProvider;
class ExtraEncodingSettings; class ExtraEncodingSettings;
class FontSettings; class FontSettings;
class Indenter; class Indenter;
class QuickFixAssistProvider;
class StorageSettings; class StorageSettings;
class SyntaxHighlighter; class SyntaxHighlighter;
class TabSettings; class TabSettings;
@@ -130,6 +131,7 @@ public:
void setCompletionAssistProvider(CompletionAssistProvider *provider); void setCompletionAssistProvider(CompletionAssistProvider *provider);
virtual CompletionAssistProvider *completionAssistProvider() const; virtual CompletionAssistProvider *completionAssistProvider() const;
virtual QuickFixAssistProvider *quickFixAssistProvider() const;
void setTabSettings(const TextEditor::TabSettings &tabSettings); void setTabSettings(const TextEditor::TabSettings &tabSettings);
void setFontSettings(const TextEditor::FontSettings &fontSettings); void setFontSettings(const TextEditor::FontSettings &fontSettings);