completion: enable multiple completors for different use cases.

Introduce CompletionPolicy enum, use 'TextCompletion' for the new plain
text completion, and 'SemanticCompletion' or 'QuickFixCompletion' for
the existing cases.

Reviewed-by: Erik Verbruggen
This commit is contained in:
hjk
2011-02-21 14:02:00 +01:00
parent 43c980e6a3
commit 9a6c4a42f7
25 changed files with 135 additions and 93 deletions

View File

@@ -510,7 +510,7 @@ int CodeCompletion::startPosition() const
bool CodeCompletion::shouldRestartCompletion()
{ return m_restartCompletion; }
bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor) const
{
if (qobject_cast<QmlJSTextEditor *>(editor->widget()))
return true;
@@ -518,6 +518,11 @@ bool CodeCompletion::supportsEditor(TextEditor::ITextEditable *editor)
return false;
}
bool CodeCompletion::supportsPolicy(TextEditor::CompletionPolicy policy) const
{
return policy == TextEditor::SemanticCompletion;
}
bool CodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
{
if (maybeTriggersCompletion(editor)) {

View File

@@ -69,7 +69,8 @@ public:
virtual TextEditor::ITextEditable *editor() const;
virtual int startPosition() const;
virtual bool shouldRestartCompletion();
virtual bool supportsEditor(TextEditor::ITextEditable *editor);
virtual bool supportsEditor(TextEditor::ITextEditable *editor) const;
virtual bool supportsPolicy(TextEditor::CompletionPolicy policy) const;
virtual bool triggersCompletion(TextEditor::ITextEditable *editor);
virtual int startCompletion(TextEditor::ITextEditable *editor);
virtual void completions(QList<TextEditor::CompletionItem> *completions);

View File

@@ -272,13 +272,11 @@ void QmlJSEditorPlugin::initializeEditor(QmlJSEditor::QmlJSTextEditor *editor)
TextEditor::TextEditorSettings::instance()->initializeEditor(editor);
// auto completion
connect(editor, SIGNAL(requestAutoCompletion(TextEditor::ITextEditable*, bool)),
TextEditor::CompletionSupport::instance(), SLOT(autoComplete(TextEditor::ITextEditable*, bool)));
// quick fix
connect(editor, SIGNAL(requestQuickFix(TextEditor::ITextEditable*)),
this, SLOT(quickFix(TextEditor::ITextEditable*)));
// auto completion and quick fix
connect(editor,
SIGNAL(requestCompletion(TextEditor::ITextEditable*,TextEditor::CompletionPolicy,bool)),
TextEditor::CompletionSupport::instance(),
SLOT(autoComplete(TextEditor::ITextEditable*,TextEditor::CompletionPolicy,bool)));
}
void QmlJSEditorPlugin::followSymbolUnderCursor()
@@ -340,7 +338,8 @@ void QmlJSEditorPlugin::quickFixNow()
// ### FIXME: m_quickFixTimer->start(QUICKFIX_INTERVAL);
m_quickFixTimer->stop();
} else {
TextEditor::CompletionSupport::instance()->quickFix(m_currentTextEditable);
TextEditor::CompletionSupport::instance()
->complete(m_currentTextEditable, TextEditor::QuickFixCompletion, true);
}
}
}

View File

@@ -141,11 +141,16 @@ QmlJSQuickFixCollector::~QmlJSQuickFixCollector()
{
}
bool QmlJSQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editable)
bool QmlJSQuickFixCollector::supportsEditor(TextEditor::ITextEditable *editable) const
{
return qobject_cast<QmlJSTextEditor *>(editable->widget()) != 0;
}
bool QmlJSQuickFixCollector::supportsPolicy(TextEditor::CompletionPolicy policy) const
{
return policy == TextEditor::QuickFixCompletion;
}
TextEditor::QuickFixState *QmlJSQuickFixCollector::initializeCompletion(TextEditor::BaseTextEditor *editor)
{
if (QmlJSTextEditor *qmljsEditor = qobject_cast<QmlJSTextEditor *>(editor)) {

View File

@@ -152,7 +152,8 @@ public:
QmlJSQuickFixCollector();
virtual ~QmlJSQuickFixCollector();
virtual bool supportsEditor(TextEditor::ITextEditable *editor);
virtual bool supportsEditor(TextEditor::ITextEditable *editor) const;
virtual bool supportsPolicy(TextEditor::CompletionPolicy policy) const;
virtual TextEditor::QuickFixState *initializeCompletion(TextEditor::BaseTextEditor *editor);
virtual QList<TextEditor::QuickFixFactory *> quickFixFactories() const;