diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index b9e7bbbfdc0a6bf8e89356a7db0a9099cf5d069c..4eb95f10d32ad153e69a23a7ccca32cf2229ea06 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.cpp +++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp @@ -595,6 +595,31 @@ static bool isLiteral(AST::Node *ast) return false; } +void CodeCompletion::addCompletions(const QHash<QString, const Interpreter::Value *> &newCompletions, + const QIcon &icon) +{ + QHashIterator<QString, const Interpreter::Value *> it(newCompletions); + while (it.hasNext()) { + it.next(); + + TextEditor::CompletionItem item(this); + item.text = it.key(); + item.icon = icon; + m_completions.append(item); + } +} + +void CodeCompletion::addCompletions(const QStringList &newCompletions, + const QIcon &icon) +{ + foreach (const QString &text, newCompletions) { + TextEditor::CompletionItem item(this); + item.text = text; + item.icon = icon; + m_completions.append(item); + } +} + int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) { m_editor = editor; @@ -660,25 +685,8 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) enumerateProperties.setGlobalCompletion(true); enumerateProperties.setEnumerateGeneratedSlots(true); - QHashIterator<QString, const Interpreter::Value *> it(enumerateProperties(qmlScopeType)); - while (it.hasNext()) { - it.next(); - - TextEditor::CompletionItem item(this); - item.text = it.key(); - item.icon = symbolIcon; - m_completions.append(item); - } - - it = enumerateProperties(context.scopeChain().qmlTypes); - while (it.hasNext()) { - it.next(); - - TextEditor::CompletionItem item(this); - item.text = it.key(); - item.icon = symbolIcon; - m_completions.append(item); - } + addCompletions(enumerateProperties(qmlScopeType), symbolIcon); + addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon); } if (contextFinder.isInRhsOfBinding() && qmlScopeType) { @@ -713,30 +721,18 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) // It's a global completion. EnumerateProperties enumerateProperties(&context); enumerateProperties.setGlobalCompletion(true); - QHashIterator<QString, const Interpreter::Value *> it(enumerateProperties()); - while (it.hasNext()) { - it.next(); - - TextEditor::CompletionItem item(this); - item.text = it.key(); - item.icon = symbolIcon; - m_completions.append(item); - } + addCompletions(enumerateProperties(), symbolIcon); } if (doJsKeywordCompletion) { // add js keywords - foreach (const QString &word, Scanner::keywords()) { - TextEditor::CompletionItem item(this); - item.text = word; - item.icon = keywordIcon; - m_completions.append(item); - } + addCompletions(Scanner::keywords(), keywordIcon); } // add qml extra words if (doQmlKeywordCompletion && isQmlFile) { static QStringList qmlWords; + static QStringList qmlWordsAlsoInJs; if (qmlWords.isEmpty()) { qmlWords << QLatin1String("property") @@ -744,29 +740,14 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) << QLatin1String("signal") << QLatin1String("import"); } - - foreach (const QString &word, qmlWords) { - TextEditor::CompletionItem item(this); - item.text = word; - item.icon = keywordIcon; - m_completions.append(item); + if (qmlWordsAlsoInJs.isEmpty()) { + qmlWordsAlsoInJs << QLatin1String("default") + << QLatin1String("function"); } - if (!doJsKeywordCompletion) { - { - TextEditor::CompletionItem item(this); - item.text = QLatin1String("default"); - item.icon = keywordIcon; - m_completions.append(item); - } - - { - TextEditor::CompletionItem item(this); - item.text = QLatin1String("function"); - item.icon = keywordIcon; - m_completions.append(item); - } - } + addCompletions(qmlWords, keywordIcon); + if (!doJsKeywordCompletion) + addCompletions(qmlWordsAlsoInJs, keywordIcon); } } @@ -787,15 +768,7 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) if (value && completionOperator == QLatin1Char('.')) { // member completion EnumerateProperties enumerateProperties(&context); - QHashIterator<QString, const Interpreter::Value *> it(enumerateProperties(value)); - while (it.hasNext()) { - it.next(); - - TextEditor::CompletionItem item(this); - item.text = it.key(); - item.icon = symbolIcon; - m_completions.append(item); - } + addCompletions(enumerateProperties(value), symbolIcon); } else if (value && completionOperator == QLatin1Char('(') && m_startPosition == editor->position()) { // function completion if (const Interpreter::FunctionValue *f = value->asFunctionValue()) { diff --git a/src/plugins/qmljseditor/qmljscodecompletion.h b/src/plugins/qmljseditor/qmljscodecompletion.h index 7129bce9007d0c114effd61df54e7add5ad48dcb..6046f6f7d98fa8624f42657e8ef6eb11b4cfea97 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.h +++ b/src/plugins/qmljseditor/qmljscodecompletion.h @@ -39,6 +39,12 @@ namespace TextEditor { class ITextEditable; } +namespace QmlJS { + namespace Interpreter { + class Value; + } +} + namespace QmlJSEditor { class ModelManagerInterface; @@ -74,6 +80,11 @@ private: bool maybeTriggersCompletion(TextEditor::ITextEditable *editor); bool isDelimiter(const QChar &ch) const; + void addCompletions(const QHash<QString, const QmlJS::Interpreter::Value *> &newCompletions, + const QIcon &icon); + void addCompletions(const QStringList &newCompletions, + const QIcon &icon); + ModelManagerInterface *m_modelManager; TextEditor::ITextEditable *m_editor; int m_startPosition;