From eb53e71d95287d2de3029daaf3dfbb66d942f2ce Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 19 May 2010 10:38:09 +0200 Subject: [PATCH] QmlJSEditor: Simplify Qml completion code. --- .../qmljseditor/qmljscodecompletion.cpp | 101 +++++++----------- src/plugins/qmljseditor/qmljscodecompletion.h | 11 ++ 2 files changed, 48 insertions(+), 64 deletions(-) diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index b9e7bbbfdc0..4eb95f10d32 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 &newCompletions, + const QIcon &icon) +{ + QHashIterator 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 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 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 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 7129bce9007..6046f6f7d98 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 &newCompletions, + const QIcon &icon); + void addCompletions(const QStringList &newCompletions, + const QIcon &icon); + ModelManagerInterface *m_modelManager; TextEditor::ITextEditable *m_editor; int m_startPosition;